用Python編寫腳本使IE實(shí)現(xiàn)代理上網(wǎng)的教程
廠里上個(gè)網(wǎng)需要設(shè)置代理服務(wù)器,切換各種環(huán)境『包括但不僅限于開發(fā)環(huán)境、QA、預(yù)上線、驗(yàn)收、生產(chǎn)環(huán)境、壓力測(cè)試、Demo……』都需要給瀏覽器設(shè)置不同的代理服務(wù)器。
雖然俺有神器Firefox+Change Host+HostAdmin+Proxy Selector的組合來輕松切換Host,切換瀏覽器代理,但是…凡是就怕『但是』。
但是碰到一些IE才有的bug時(shí)候不得不換瀏覽器?。?!還要開虛擬機(jī)進(jìn)去搞IE6、IE8、360、搜狗這些奇葩瀏覽器?。。?!
有同事建議搞個(gè)bat腳本來做這些,但沒人肯動(dòng)手……而且bat能不能實(shí)現(xiàn)先不說,重點(diǎn)是咱不熟啊。
搞個(gè)C#寫個(gè)winform或者console控制臺(tái)還需要.NET framework不是,虛擬機(jī)裝個(gè).NET framework4.0又要很多時(shí)間『而且不同的snapshot都要裝一遍…』
最最重要的,好久不寫文章了不是,咱不想在博客里寫C#相關(guān)的東西不是。所以,操刀Python寫幾行代碼和廠里兄弟們顯擺一下『人生苦短,我用Python』的好處。
具體實(shí)現(xiàn)步驟如下:
安裝pywin32、WMI支持。具體下載地址Google一下,因?yàn)槲业氖?2位python2.7系列,下載到的文件名分別為(pywin32-218.win32-py2.7.exe、WMI-1.4.7.win32.exe)
開搞。
首先,我們查資料知道,IE瀏覽器的代理內(nèi)容在注冊(cè)表中『HKEYCURRENTUSER\Software\Microsoft\Windows\CurrentVersion\Internet Settings』這里存著,所以我們理論上只要修改這里相關(guān)的鍵值就可以切換IE代理。
所以,第一個(gè)函數(shù)就是修改注冊(cè)表鍵值:
def changeIEProxy(keyName, keyValue): pathInReg = 'Software\Microsoft\Windows\CurrentVersion\Internet Settings' key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,pathInReg, 0, win32con.KEY_ALL_ACCESS) win32api.RegSetValueEx(key, keyName, 0, win32con.REG_SZ, keyValue) win32api.RegCloseKey(key)
因此段代碼中用到了pywin32的的東西,所以在文件最開頭需要做import win32api, win32con,引入相關(guān)的class
修改系統(tǒng)注冊(cè)表的函數(shù)其實(shí)就這么幾行…當(dāng)然,因?yàn)槲覐S必須通過代理服務(wù)器上網(wǎng),所以修改系統(tǒng)注冊(cè)表的鍵值類型我只用到了REG_SZ這一種,實(shí)際其他情況還會(huì)有REG_DWORD啊等等類型。
然后咱需要一個(gè)配置文件,來保存各種場(chǎng)景『QA啊開發(fā)環(huán)境啊』的不同的配置信息,這時(shí)候我使用的配置文件為ini格式,用Python自帶的ConfigParser就可以解析此種文件格式。
沒有采用以往我最熟悉的XML或者json純粹為了裝x,xml和json總覺著是web上用的東西,ini看起來比較像一個(gè).exe比較常用的配置文件格式。
也因?yàn)橐郧皼]用過ini格式的配置文件,這次權(quán)當(dāng)又學(xué)會(huì)一種Python的玩法而已。
所以讀取ini配置文件的代碼為:
config = ConfigParser.ConfigParser() config.read('config.ini') if config.has_section(_section): _ProxyServer = config.get(_section, 'ProxyServer') _ProxyOverride = config.get(_section, 'ProxyOverride')
同樣,因?yàn)橛玫搅薈onfigParser,需要在文件最開頭也import ConfigParser一下。
細(xì)心的小伙伴會(huì)注意到這段代碼中有一個(gè)_section的變量實(shí)際是沒有定義的,而這個(gè)變量俺給它的含義是前邊所寫的『場(chǎng)景』,比如_section=='dev'表示開發(fā)環(huán)境,_section=='qa'表示QA環(huán)境,而咱們這次既然做的是一個(gè)類似exe的程序,所以_section需要在執(zhí)行exe時(shí)候當(dāng)作參數(shù)傳進(jìn)來。
這時(shí)候咱們就要用到Python的sys模塊了,同樣import sys,然后在程序中通過:
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev'
這樣的方式來獲取『場(chǎng)景』這個(gè)參數(shù),這一段代碼就會(huì)變成:
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev' config = ConfigParser.ConfigParser() config.read('config.ini') if config.has_section(_section): _ProxyServer = config.get(_section, 'ProxyServer') _ProxyOverride = config.get(_section, 'ProxyOverride')
既然已經(jīng)讀取到配置文件中的ProxyServer和ProxyOverride這倆東東了,寫入到注冊(cè)表理論上就能完成咱們的修改IE代理配置的大業(yè)了:
_section = sys.argv[1] if len(sys.argv) > 1 else 'dev' config = ConfigParser.ConfigParser() config.read('config.ini') if config.has_section(_section): _ProxyServer = config.get(_section, 'ProxyServer') _ProxyOverride = config.get(_section, 'ProxyOverride') changeIEProxy('ProxyServer', _ProxyServer) changeIEProxy('ProxyOverride', _ProxyOverride)
前一句為啥是『理論上』呢,因?yàn)樽?cè)表內(nèi)容雖然已經(jīng)修改了,但實(shí)際上IE瀏覽器并沒有生效,讓IE瀏覽器生效需要關(guān)閉重新打開。
這時(shí)候就用到前邊安裝的一個(gè)叫做WMI的東東,import wmi ctypes,然后:
def kill_ie(): c = wmi.WMI() kernel32 = ctypes.windll.kernel32 for process in c.Win32_Process(): if process.Name=='iexplore.exe': kernel32.TerminateProcess(kernel32.OpenProcess(1, 0, process.ProcessId), 0)
當(dāng)然,這段代碼是有一點(diǎn)點(diǎn)問題的,只關(guān)閉了IE沒有重新打開……是因?yàn)榘惩祽辛耍晨梢越邮苁謩?dòng)打開IE…
綜上所述:
完整的代碼為:
#coding=utf-8 import win32api, win32con, sys, ConfigParser, os, wmi, ctypes def kill_ie(): c = wmi.WMI() kernel32 = ctypes.windll.kernel32 for process in c.Win32_Process(): if process.Name=='iexplore.exe': kernel32.TerminateProcess(kernel32.OpenProcess(1, 0, process.ProcessId), 0) def changeIEProxy(keyName, keyValue): pathInReg = 'Software\Microsoft\Windows\CurrentVersion\Internet Settings' key = win32api.RegOpenKey(win32con.HKEY_CURRENT_USER,pathInReg, 0, win32con.KEY_ALL_ACCESS) win32api.RegSetValueEx(key, keyName, 0, win32con.REG_SZ, keyValue) win32api.RegCloseKey(key) def check_config(): if not os.path.isfile('config.ini'): cfg = ConfigParser.ConfigParser() #開發(fā)環(huán)境 cfg.add_section('dev') cfg.set('dev', 'ProxyServer', '192.168.0.6:3128') cfg.set('dev', 'ProxyOverride', 'localhost;127.0.0.1') #預(yù)上線 cfg.add_section('prepare') cfg.set('prepare', 'ProxyServer', '192.168.0.6:3128') cfg.set('prepare', 'ProxyOverride', 'localhost;127.0.0.1;') #線上 cfg.add_section('online') cfg.set('online', 'ProxyServer', '192.168.0.6:3128') cfg.set('online', 'ProxyOverride', 'localhost;127.0.0.1') #QA cfg.add_section('qa') cfg.set('qa', 'ProxyServer', '192.168.2.16:3128') cfg.set('qa', 'ProxyOverride', 'localhost;127.0.0.1') cfg.write(open('config.ini', 'a')) return False return True if __name__ == "__main__": _section = sys.argv[1] if len(sys.argv) > 1 else 'dev' if check_config(): kill_ie() config = ConfigParser.ConfigParser() config.read('config.ini') if config.has_section(_section): _ProxyServer = config.get(_section, 'ProxyServer') _ProxyOverride = config.get(_section, 'ProxyOverride') changeIEProxy('ProxyServer', _ProxyServer) changeIEProxy('ProxyOverride', _ProxyOverride) print 'done, open ie' else: print 'config.ini is created, modify config.ini and try again'
相關(guān)文章
Python的collections模塊中的OrderedDict有序字典
字典是無序的,但是collections的OrderedDict類為我們提供了一個(gè)有序的字典結(jié)構(gòu),名副其實(shí)的Ordered+Dict,下面通過兩個(gè)例子來簡單了解下Python的collections模塊中的OrderedDict有序字典:2016-07-07使用PyTorch實(shí)現(xiàn)MNIST手寫體識(shí)別代碼
今天小編就為大家分享一篇使用PyTorch實(shí)現(xiàn)MNIST手寫體識(shí)別代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01淺析Python 簡單工廠模式和工廠方法模式的優(yōu)缺點(diǎn)
這篇文章主要介紹了Python 工廠模式的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07Python調(diào)用ffmpeg開源視頻處理庫,批量處理視頻
本文主要介紹了如何用Python調(diào)用ffmpeg開源視頻處理庫,來實(shí)現(xiàn)視頻批量的處理:水印、背景音樂、剪輯、合并、幀率、速率、分辨率等操作2020-11-11簡單了解Django ContentType內(nèi)置組件
這篇文章主要介紹了簡單了解Django ContentType內(nèi)置組件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07python學(xué)習(xí)——內(nèi)置函數(shù)、數(shù)據(jù)結(jié)構(gòu)、標(biāo)準(zhǔn)庫的技巧(推薦)
這篇文章主要介紹了python學(xué)習(xí)——內(nèi)置函數(shù)、數(shù)據(jù)結(jié)構(gòu)、標(biāo)準(zhǔn)庫的技巧,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04安裝ElasticSearch搜索工具并配置Python驅(qū)動(dòng)的方法
這篇文章主要介紹了安裝ElasticSearch搜索工具并配置Python驅(qū)動(dòng)的方法,文中還介紹了其與Kibana數(shù)據(jù)顯示客戶端的配合使用,需要的朋友可以參考下2015-12-12TensorFlow實(shí)現(xiàn)簡單的CNN的方法
這篇文章主要介紹了TensorFlow實(shí)現(xiàn)簡單的CNN的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07pycharm訪問mysql數(shù)據(jù)庫的方法步驟
這篇文章主要介紹了pycharm訪問mysql數(shù)據(jù)庫的方法步驟。文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Django接受前端數(shù)據(jù)的幾種方法總結(jié)
下面小編就為大家?guī)硪黄狣jango接受前端數(shù)據(jù)的幾種方法總結(jié)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-11-11