厂里上个网需要设置代理服务器,切换各种环境『包括但不仅限于开发环境、qa、预上线、验收、生产环境、压力测试、demo……』都需要给浏览器设置不同的代理服务器。
虽然俺有神器firefox+change host+hostadmin+proxy selector的组合来轻松切换host,切换浏览器代理,但是…凡是就怕『但是』。
但是碰到一些ie才有的bug时候不得不换浏览器啊!!还要开虚拟机进去搞ie6、ie8、360、搜狗这些奇葩浏览器啊!!!
有同事建议搞个bat脚本来做这些,但没人肯动手……而且bat能不能实现先不说,重点是咱不熟啊。
搞个c#写个winform或者console控制台还需要.net framework不是,虚拟机装个.net framework4.0又要很多时间『而且不同的snapshot都要装一遍…』
最最重要的,好久不写文章了不是,咱不想在博客里写c#相关的东西不是。所以,操刀python写几行代码和厂里兄弟们显摆一下『人生苦短,我用python』的好处。
具体实现步骤如下:
安装pywin32、wmi支持。具体下载地址google一下,因为我的是32位python2.7系列,下载到的文件名分别为(pywin32-218.win32-py2.7.exe、wmi-1.4.7.win32.exe)
开搞。
首先,我们查资料知道,ie浏览器的代理内容在注册表中『hkeycurrentuser\software\microsoft\windows\currentversion\internet settings』这里存着,所以我们理论上只要修改这里相关的键值就可以切换ie代理。
所以,第一个函数就是修改注册表键值:
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,引入相关的class
修改系统注册表的函数其实就这么几行…当然,因为我厂必须通过代理服务器上网,所以修改系统注册表的键值类型我只用到了reg_sz这一种,实际其他情况还会有reg_dword啊等等类型。
然后咱需要一个配置文件,来保存各种场景『qa啊开发环境啊』的不同的配置信息,这时候我使用的配置文件为ini格式,用python自带的configparser就可以解析此种文件格式。
没有采用以往我最熟悉的xml或者json纯粹为了装x,xml和json总觉着是web上用的东西,ini看起来比较像一个.exe比较常用的配置文件格式。
也因为以前没用过ini格式的配置文件,这次权当又学会一种python的玩法而已。
所以读取ini配置文件的代码为:
config = configparser.configparser()
config.read(‘config.ini’)
if config.has_section(_section):
_proxyserver = config.get(_section, ‘proxyserver’)
_proxyoverride = config.get(_section, ‘proxyoverride’)
同样,因为用到了configparser,需要在文件最开头也import configparser一下。
细心的小伙伴会注意到这段代码中有一个_section的变量实际是没有定义的,而这个变量俺给它的含义是前边所写的『场景』,比如_section==’dev’表示开发环境,_section==’qa’表示qa环境,而咱们这次既然做的是一个类似exe的程序,所以_section需要在执行exe时候当作参数传进来。
这时候咱们就要用到python的sys模块了,同样import sys,然后在程序中通过:
_section = sys.argv[1] if len(sys.argv) > 1 else ‘dev’
这样的方式来获取『场景』这个参数,这一段代码就会变成:
_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’)
既然已经读取到配置文件中的proxyserver和proxyoverride这俩东东了,写入到注册表理论上就能完成咱们的修改ie代理配置的大业了:
_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)
前一句为啥是『理论上』呢,因为注册表内容虽然已经修改了,但实际上ie浏览器并没有生效,让ie浏览器生效需要关闭重新打开。
这时候就用到前边安装的一个叫做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)
当然,这段代码是有一点点问题的,只关闭了ie没有重新打开……是因为俺偷懒了,俺可以接受手动打开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()
#开发环境
cfg.add_section(‘dev’)
cfg.set(‘dev’, ‘proxyserver’, ‘192.168.0.6:3128’)
cfg.set(‘dev’, ‘proxyoverride’, ‘localhost;127.0.0.1’)
#预上线
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’