Python編寫(xiě)腳本使IE實(shí)現(xiàn)代理上網(wǎng)的教程
來(lái)源:易賢網(wǎng) 閱讀:1135 次 日期:2015-04-28 14:36:36
溫馨提示:易賢網(wǎng)小編為您整理了“Python編寫(xiě)腳本使IE實(shí)現(xiàn)代理上網(wǎng)的教程”,方便廣大網(wǎng)友查閱!

Python編寫(xiě)腳本使IE實(shí)現(xiàn)代理上網(wǎng)的教程

這篇文章主要介紹了用Python編寫(xiě)腳本使IE實(shí)現(xiàn)代理上網(wǎng)的教程,“著名的”goagent代理也是基于同樣原理實(shí)現(xiàn),需要的朋友可以參考下

廠里上個(gè)網(wǎng)需要設(shè)置代理服務(wù)器,切換各種環(huán)境『包括但不僅限于開(kāi)發(fā)環(huán)境、QA、預(yù)上線、驗(yàn)收、生產(chǎn)環(huán)境、壓力測(cè)試、Demo……』都需要給瀏覽器設(shè)置不同的代理服務(wù)器。

雖然俺有神器Firefox+Change Host+HostAdmin+Proxy Selector的組合來(lái)輕松切換Host,切換瀏覽器代理,但是…凡是就怕『但是』。

但是碰到一些IE才有的bug時(shí)候不得不換瀏覽器啊!!還要開(kāi)虛擬機(jī)進(jìn)去搞IE6、IE8、360、搜狗這些奇葩瀏覽器啊!!!

有同事建議搞個(gè)bat腳本來(lái)做這些,但沒(méi)人肯動(dòng)手……而且bat能不能實(shí)現(xiàn)先不說(shuō),重點(diǎn)是咱不熟啊。

搞個(gè)C#寫(xiě)個(gè)winform或者console控制臺(tái)還需要.NET framework不是,虛擬機(jī)裝個(gè).NET framework4.0又要很多時(shí)間『而且不同的snapshot都要裝一遍…』

最最重要的,好久不寫(xiě)文章了不是,咱不想在博客里寫(xiě)C#相關(guān)的東西不是。所以,操刀Python寫(xiě)幾行代碼和廠里兄弟們顯擺一下『人生苦短,我用Python』的好處。

具體實(shí)現(xiàn)步驟如下:

安裝pywin32、WMI支持。具體下載地址Google一下,因?yàn)槲业氖?2位python2.7系列,下載到的文件名分別為(pywin32-218.win32-py2.7.exe、WMI-1.4.7.win32.exe)

開(kāi)搞。

首先,我們查資料知道,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的的東西,所以在文件最開(kāi)頭需要做import win32api, win32con,引入相關(guān)的class

修改系統(tǒng)注冊(cè)表的函數(shù)其實(shí)就這么幾行…當(dāng)然,因?yàn)槲覐S必須通過(guò)代理服務(wù)器上網(wǎng),所以修改系統(tǒng)注冊(cè)表的鍵值類(lèi)型我只用到了REG_SZ這一種,實(shí)際其他情況還會(huì)有REG_DWORD啊等等類(lèi)型。

然后咱需要一個(gè)配置文件,來(lái)保存各種場(chǎng)景『QA啊開(kāi)發(fā)環(huán)境啊』的不同的配置信息,這時(shí)候我使用的配置文件為ini格式,用Python自帶的ConfigParser就可以解析此種文件格式。

沒(méi)有采用以往我最熟悉的XML或者json純粹為了裝x,xml和json總覺(jué)著是web上用的東西,ini看起來(lái)比較像一個(gè).exe比較常用的配置文件格式。

也因?yàn)橐郧皼](méi)用過(guò)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,需要在文件最開(kāi)頭也import ConfigParser一下。

細(xì)心的小伙伴會(huì)注意到這段代碼中有一個(gè)_section的變量實(shí)際是沒(méi)有定義的,而這個(gè)變量俺給它的含義是前邊所寫(xiě)的『場(chǎng)景』,比如_section=='dev'表示開(kāi)發(fā)環(huán)境,_section=='qa'表示QA環(huán)境,而咱們這次既然做的是一個(gè)類(lèi)似exe的程序,所以_section需要在執(zhí)行exe時(shí)候當(dāng)作參數(shù)傳進(jìn)來(lái)。

這時(shí)候咱們就要用到Python的sys模塊了,同樣import sys,然后在程序中通過(guò):

_section = sys.argv[1] if len(sys.argv) > 1 else 'dev'

這樣的方式來(lái)獲取『場(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這倆東東了,寫(xiě)入到注冊(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瀏覽器并沒(méi)有生效,讓IE瀏覽器生效需要關(guān)閉重新打開(kāi)。

這時(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)問(wèn)題的,只關(guān)閉了IE沒(méi)有重新打開(kāi)……是因?yàn)榘惩祽辛?,俺可以接受手?dòng)打開(kāi)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()

#開(kāi)發(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'

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看網(wǎng)絡(luò)編程
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026國(guó)考·省考課程試聽(tīng)報(bào)名

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢 | 簡(jiǎn)要咨詢須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號(hào):hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)