摘要:在中,格式是,所以需要把格式統一為注冊表的標準。注冊表的二進制值及關鍵信息如下開關長度地址是否跳過本地代理地址通過在中導入文件的方式執行并立即生效。本代碼可以根據需要自動設置代理。
思路及啟發聲明下:不同于網絡上千百篇方法,下文是經過各種嚴格測試都通過的,同時也是一個實驗的過程,排除了各種不靠譜的方法。有需要的可以評論來討論,想要源碼和相關參考文獻或筆記的,也可以找我。
先說一下我這一路實驗的思路吧,這個至關重要。
之前一直在用Python做爬蟲抓取數據,發現本機IP的問題不解決,爬蟲相當于白費了。然后各種百度,不管是用urllib2還是requests的代理設置,都不管用。然后又各種搜索Python更改windows代理的設置,還需要接觸windos底層API,有復雜又不好實現。于是爬蟲的學習就放棄了好長一段時間。
最近因為一直在用AutoHotkey大大加快電腦操作效率,各種快捷鍵和代替手動操作一些常規系統設置。突發奇想,想讓它自動打開IE的Internet設置,然后自動點擊“局域網設置”,在自動在代理框里輸入IP地址,按回車完成設置。這真是個好主意~
不過失敗了。。。因為AHK在IE設置彈出的框框中選擇某一個輸入框,很麻煩,我也沒法實現。所以就在想另一個辦法,因為AHK操作Windows的cmd命令很方便,所以在想能不能用它打開cmd然后用命令設置IE呢?
然后又各種百度。發現這是可以通過reg add注冊表設置來實現的!于是,就開啟了reg命令的百度之旅。
按照網上各種方法,都指向了注冊表的這個地方:
HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet Settings
大家都說在這個路徑下,有這么3個項非常重要:
ProxyEnable - 使用代理
ProxyServer - 代理IP的地址及端口號
AutoConfigURL - 自動配置腳本(PAC)的地址
于是試著用reg add命令操作:
reg add "HKCUSoftwareMicrosoftWindowsCurrentVersionInternet Settings" /v ProxyEnable /tREG_DWORD /d 1 /f reg add "HKCUSoftwareMicrosoftWindowsCurrentVersionInternet Settings" /v ProxyServer /d"192.168.1.1:8080" /f
這兩句第一個是打開“代理”,第二個是設置代理的IP地址。
先在命令行里敲了下命令,然后打開regedit注冊表,刷新下看,還真改了!
然后手動打開IE設置,發現里面的內容也確實改變了。然后再打開瀏覽器,打開IP查詢的網址,自己的IP真的變了!
至此以為大功告成了。結果再用時,發現大錯特錯——再次用命令行改我指定的IP地址后,網頁打不開了。。。
來回反復調試查錯之后,我發現一個“大秘密”:如果不手動打開IE設置里的局域網設置窗口的話,所有代理設置是不生效的。這是為什么呢?
百度里搜索不到。
于是我就用英文到Stackoverflow去搜,結果發現實際影響本機代理的注冊表項目并不是之前的那幾個!(真懷疑網上那些人說自己用這個項達到定時設置代理的人是不是玩真的。。。)
而是這個位置的項:
HKCUSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections
其中的DefaultConnectionSettings才是真正需要改的東西。打開以后各種亂碼,原來是二進制值。
不過用編輯器看二進制值,確實發現代理IP地址和自動配置腳本的地址都在里面。
那怎么辦呢?AHK可不會操作二進制,也沒什么方法能用reg add命令行直接把二進制值注入。然后又進入無盡的百度模式。
注冊表的二進制項修改方式的突發奇想忘了什么啟發的我吧,好像是自己無聊到在注冊表上亂點,發現我刻意導出注冊表。
然后導出了下試試,發現是個.reg文件。然后無聊雙擊一下,發現可以把這個文件導入到注冊表!于是靈光一閃,趕緊用文本編輯器打開這個.reg文件,發現里面是文字畫的十六進制碼,類似這樣的:
Windows Registry Editor Version 5.00 [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections] "DefaultConnectionSettings"=hex:46,00,00,00,03,00,00,00,07,00,00,00,0e,00,00, 00,31,39,32,2e,31,36,38,2e,31,2e,31,3a,38,30,00,00,00,00,21,00,00,00,68,74, 74,70,3a,2f,2f,78,64,75,6f,74,61,69,2e,63,6f,6d,2f,70,52,73,4f,33,4e,47,52, 33,2d,2e,70,61,63,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00,00,00,00,00,00 "SavedLegacySettings"=hex:46,00,00,00,c1,0c,00,00,07,00,00,00,0e,00,00,00,31, 39,32,2e,31,36,38,2e,31,2e,31,3a,38,30,00,00,00,00,21,00,00,00,68,74,74,70, 3a,2f,2f,78,64,75,6f,74,61,69,2e,63,6f,6d,2f,70,52,73,4f,33,4e,47,52,33,2d, 2e,70,61,63,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, 00,00,00,00,00,00,00,00,00,00,00于是最終答案就出來了(這里開始有Python介入)
這個時候我還不知道這是正確答案,只是想試一試:
用Python組成一段有效的二進制碼(其實是十六進制) -> 把注冊表值封裝為reg文件 -> 通過命令行的reg import命令導入reg文件 -> 成功!
然后問題就在于怎么安裝正確的格式組成
DefaultConnectionSettings十六進制值的分析于是繼續到Stackoverflow上搜索DefaultConnectionSettings這個項中十六進制的讀取問題。
發現有一個人大概總結了每一位字節是代表什么,不過不夠詳細。地址在這里【How to set "automatic configuration script" for a dial-up connection programmatically?】
然后開始做筆記:
接著開始嘗試對照著那段二進制值看一看。于是我把這段十六進制碼做成PDF,方便做筆記,大概是這樣的:
實際的十六進制值果然和網上的不同。經過實驗,后面一大段畫刪除線的,都是沒用的,刪除也沒關系。實際上,它只有在你手動打開IE設置面板時,才自動加上的。不管它,實際上有用的十六進制并不長。總結下也就這么幾位:
46 00 00 00 00 00 00 00 開關 00 00 00 IP長度 00 00 00 IP地址 00 00 00 是否跳過本地代理 21 00 00 00 PAC地址
其中,通過規律發現每個信息的分隔符是三個00,即00 00 00。上面有7個00的,因為沒什么用我就不講了(其實第四個代表自增數,直接為00就好了)
當然,其中漢字的部分是十六進制格式的。
這幾個漢字,是其中最重要的信息,具體如下:
開關(switcher): 主要代表IE設置中復選框的選中情況,你可以打開IE設置看看。以下是所有可用的值(括號中是我用的別名):
0F全部開啟(ALL);01全部禁用(Off)
03使用代理服務器(ProxyOnly);05使用自動腳本(PacOnly);
07使用腳本和代理(ProxyAndPac);09打開自動檢測設置(D);
0B打開自動檢測并使用代理(DIP);0D打開自動檢測并使用腳本(DS);
IP長度:必須是十六進制的,0就是00,7就是07,10就是0a,11是0b。在Python中,格式是0xa,所以需要把格式統一為注冊表的標準。
IP地址:直接把IP安裝每個字符轉十六進制就好了。如果IP為空的話,就直接為00。這時會看到switcher后面跟了11個00。。。
是否跳過本地代理:這段有點復雜,實際上我們幾乎不用。如果不用的話直接為00就好了。但是用的話,就必須寫為:附加信息長度00 00 00 附加信息這樣的。
附加信息:只能是這句話:
附加信息長度:因為附加信息是固定的,所以共7位,寫為07就好了。
PAC地址:這個簡單,直接把PAC地址翻譯為十六進制就好了。如果沒有則什么都不寫。
至此這段十六進制值就全部解析完畢了。
剩下的就是把你需要的代理IP地址和PAC地址作為參數傳進去就好了。然后把這段值封裝到reg文件中的對應位置就完全ok了~這步太簡單,就不用多說了。
增加更方便的功能各種測試成功后,非常高興。但是還有點余味不足,就想著多添加點方便的功能。
這個Python文件的最后成品可以做到這些事:
直接通過命令行傳參數達到各種設置代理的效果。這個很自豪~第一次用系統參數功能,哈哈哈!
在文件夾中直接雙擊達到效果
在別的Python文件中(如爬蟲)作為模塊被使用
被AHK調用
在Autohotkey中調用——極其方便極其傻瓜式操作!不忘初心嘛~
python處理一切完成后,又回到了AHK中。
這一步可能也就寫了幾分鐘,讓AHK直接帶參數打開python腳本就做到了。比如設置一個代理IP地址:
path = "D:setRegProxy.py" ;這里是python腳本的地址,隨便放哪都行。 key = "0.0.0.0:80" ;這里根據需要設置為代理地址 Run % path " -o ProxyOnly " key
這樣就齊活了~
當然,我的AHK腳本實現的功能比這個還要爽快——彈出一個小輸入框,直接粘貼一個ip地址,按回車就能實現代理設置。
Python腳本的源碼(setProxy.py)只要機器上安裝了Python 2.x版本就行,不需要依賴安裝和設置其他任何東西。
# coding:utf-8 """ # Title : setRegProxy # Author : Solomon Xie # Utility : Via Registry key of windows, change proxy settings of IE on Windows. # Require : Python 2.x, Windows 7 # Reg Path: HKUCSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections # Anlysis : 注冊表的二進制值(及關鍵信息)如下:"46 00 00 00 00 00 00 00 開關 00 00 00 IP長度 00 00 00 IP地址 00 00 00 是否跳過本地代理 21 00 00 00 PAC地址" # Method : 通過在cmd中導入reg文件的方式執行并立即生效。 # Notes : - 二進制值的設置選項在代碼中已經體現了。本代碼可以根據需要自動設置代理。 # switcher: 開關:0F全部開啟(ALL);01全部禁用(Off) 03使用代理服務器(ProxyOnly);05使用自動腳本(PacOnly); 07使用腳本和代理(ProxyAndPac);09自動檢測設置(D); 0B自動檢測并使用代理(DIP);0D自動檢測并使用腳本(DS); """ import os, sys, re, getopt def regIESettings(op, noLocal=False, ip="", pac=""): """ # 根據需求生成Windows代理設置注冊表的.reg文件內容 # DefaultConnectionSettings項是二進制項 # 而具體這個二進制文件怎么解析,在收藏的PDF中有詳細解釋。 """ if not op : return # 如果是設置IP代理的模式 則檢查IP地址的有效性(允許為空,但不允許格式錯誤) if "Proxy" in op and not ip == "": # if len(extractIp(ip))==0 if 1 > len(re.findall("([0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})s*:{0,1}s*([0-9]{1,5}){0,1}",ip)) : print "---Unexpected IP Address:%s---"%ip return options = {"On":"0F","Off":"01","ProxyOnly":"03","PacOnly":"05","ProxyAndPac":"07","D":"09","DIP":"0B","DS":"0D"} if op == "Off": reg_value = "46,00,00,00,00,00,00,00,01" else: switcher = options.get(op) if not switcher: print " ---Unexpected Option. Please check the value after [-o]--- " return skipLocal = "07,00,00,00,%s"%__toHex("Autohotkey源碼") if noLocal else "00" reg_value = "46,00,00,00,00,00,00,00,%(switcher)s,00,00,00,%(ipLen)s,00,00,00,%(ip)s00,00,00,%(skipLocal)s,21,00,00,00%(pac)s" % ({ "switcher":switcher,"ipLen":__toHex(len(ip)),"ip":__toHex(ip)+"," if ip else "","infoLen":__toHex(len(" ")),"skipLocal":skipLocal,"pac":","+__toHex(pac) if pac else "" }) settings = "Windows Registry Editor Version 5.00 [HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionInternet SettingsConnections] "DefaultConnectionSettings"=hex:%s" % reg_value # print "Using proxy address: %s" % ip print op, ip, pac print options[op] +" "+ __toHex(ip) +" "+ __toHex(pac) print settings # === 生成reg文件并導入到注冊表中 === filePath = "%sDefaultConnectionSettings.reg"%os.getcwd() with open(filePath, "w") as f: f.write( settings ) cmd = "reg import "%s"" %filePath result = os.popen(cmd) if len(result.readlines()) < 2 : print "---Successfully import proxy into Registry on this machine.---" return def __toHex(obj): if obj == "": return "" elif obj == 0 or obj == "0" or obj == "00": return "00" if isinstance(obj, str): rehex = [str(hex(ord(s))).replace("0x","") for s in obj] return ",".join(rehex) elif isinstance(obj, int): num = str(hex(obj)).replace("0x", "") return num if len(num)>1 else "0"+num # 如果是一位數則自動補上0,7為07,e為0e if __name__ == "__main__": # 獲取文件外部參數 # 用法:在命令行中輸入setRegProxy.py -o "ProxyOnly" -l --proxy"0.0.0.0:80" -l opts, args = getopt.getopt(sys.argv[1:], "o:p:a:l",["option=","proxy=","pac=","local"]) print opts, args #調試用 if len(opts) > 0: op, ip, pac = "", "", "" noLocal = False for o,a in opts: if o == "-o" or o == "--option": op = a elif o == "-p" or o == "--proxy" : ip = a elif o == "-a" or o == "--pac" : pac = a elif o == "-l" or o == "--local" : noLocal = False pac = "http://xduotai.com/pRsO3NGR3-.pac" if not pac else pac if op == "ProxyOff": regIESettings(op="Off", ip=ip, pac=pac, noLocal=noLocal) regIESettings(op="PacOnly", ip=ip, pac=pac, noLocal=noLocal) elif op == "PacOff": regIESettings(op="Off", ip=ip, pac=pac, noLocal=noLocal) regIESettings(op="ProxyOnly", ip=ip, pac=pac, noLocal=noLocal) else: regIESettings(op=op, ip=ip, pac=pac, noLocal=noLocal)
Autohotkey怎么用呢?太簡單了,傻到爆!
直接官網下載安裝一個Autohotkey軟件,也就幾M。然后呢,新建一個文本文件,把下面內容粘貼進去。把文件名后綴改為.ahk,然后雙擊就啟動了腳本哈哈!
這時你試著按一下鍵盤上的ScrollLock鍵,就會彈出來一個對話框。效果是這樣的:
你可以在這里輸入改代理的命令~ 我設計的命令都非常簡單,如下:
輸入proxy,就會打開IE設置的窗口
輸入proxy 192.168.1.1:8080 ,就會把代理設置為這個IP
輸入proxy on,就會打開代理(但是IP為空)
輸入proxy off,就會關閉代理
輸入pac http://abc.com/123.pac,就開啟某自動代理設置腳本
輸入pac off,就會關閉自動腳本
注意:
我這里注冊的鍵是鍵盤上的ScrollLock按鈕,按一下就有了。也可以自己設定一個。
下面的代碼是處理過的,實際上這個按鍵遠比它要方便的多:它是我的快速操作殺手锏,一條命令實現巨多功能。如有感興趣的可以聯系我討論,或者看我的下一篇專門針對AHK的文章(如果我不犯懶寫了的話)。
我設定的指令是proxy ??這樣的,如果嫌長或者不方便,可以改為別的自己用著舒服的。甚至不用彈出框,直接按一下F1之類的就完成設置都可以。不過這就需要稍微了解下AHK語法啦~(也不難)
ScrollLock:: { ; --- 獲取指令及關鍵詞 --- InputBox, fullCommand, (Command Line Interface), Please give me a command:, , 600, 130 ;獲取命令 if (fullcommand = "") Return ; -- 解析命令 --- split := " " StringGetPos , posi, fullCommand, %split% if (posi > 0) { StringMid, eng, fullCommand, 0 , posi ; StringMid, key, fullCommand, posi+2 , StrLen(fullCommand) } else { eng := fullCommand key := "" } ; === 打開IE設置窗口的命令 === ieSettings := "rundll32.exe shell32.dll, Control_RunDLL inetcpl.cpl, ,4L" ; === python腳本的地址 === path := "D:Solomon XieWorkspacesetRegProxy.py" ;Python設置代理腳本,可接收命令行參數 ; ---開始執行操作--- if (eng = "" and fullcommand != "") Run % ieSettings else if (eng = "Proxy"){ if (key = "") Return else if (key = "Off") Run % path " -o Off " else{ if (key = "On") key := "" ;“獲取”歷史IP值太麻煩 先為空吧 else key = "--proxy " %key% Run % path " -o ProxyOnly " key } } else if (eng = "Pac" and key != "") { if (key = "" or key = "On") key = "http://xduotai.com/pRsO3NGR3-.pac" if (key = "Off") Run % path " -o Off " else { key = "%key%" Run % path " -o PacOnly --pac " key } } Return }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/37724.html
摘要:通過本文的學習,可以快速掌握網絡爬蟲基礎,結合實戰練習,寫出一些簡單的爬蟲項目。從技術手段來說,網絡爬蟲有多種實現方案,如。二網絡爬蟲技術基礎在本次課中,將使用技術手段進行項目的編寫。 摘要:本文詳細講解了python網絡爬蟲,并介紹抓包分析等技術,實戰訓練三個網絡爬蟲案例,并簡單補充了常見的反爬策略與反爬攻克手段。通過本文的學習,可以快速掌握網絡爬蟲基礎,結合實戰練習,寫出一些簡單的...
摘要:代碼參考了這里上文對各種系統無法輸出奇葩編碼的字符做了總結,本文中只針對下編碼但想執行編碼的文件進行修改。這樣就實現了下和下兼容了當然如果不知道原來是什么編碼,但想轉成編碼的話,將上面的條件刪掉即可。 代碼參考了這里:http://wiki.python.org/moin/P... 上文對各種系統無法輸出奇葩編碼的字符做了總結,本文中只針對windows cmd下GBK編碼(cp936...
摘要:終極目標問題描述首先聲明,這是一次失敗的編譯經歷,僅供參考,歡迎討論。近期發現是一個很棒的編輯器,簡潔高效。所以,毅然決然,自己從源碼編譯一個。首先運行上面目錄樹中的。我猜想這可能和我的失敗有關。設置為,編譯結果是,則代表。 終極目標 VIM = Python multi-version IDE 問題描述 首先聲明,這是一次失敗的編譯經歷,僅供參考,歡迎討論。 近期發現VIM是一個很棒...
摘要:終極目標問題描述首先聲明,這是一次失敗的編譯經歷,僅供參考,歡迎討論。近期發現是一個很棒的編輯器,簡潔高效。所以,毅然決然,自己從源碼編譯一個。首先運行上面目錄樹中的。我猜想這可能和我的失敗有關。設置為,編譯結果是,則代表。 終極目標 VIM = Python multi-version IDE 問題描述 首先聲明,這是一次失敗的編譯經歷,僅供參考,歡迎討論。 近期發現VIM是一個很棒...
閱讀 1296·2023-04-25 19:33
閱讀 1180·2021-10-21 09:39
閱讀 3652·2021-09-09 09:32
閱讀 2631·2019-08-30 10:58
閱讀 1627·2019-08-29 16:17
閱讀 884·2019-08-29 15:29
閱讀 2895·2019-08-26 11:55
閱讀 2666·2019-08-26 10:33