厂里上个网需要设置代理服务器,切换各种环境『包括但不仅限于开发环境、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'
本文向大家介绍实现MySQL回滚的Python脚本的编写教程,包括了实现MySQL回滚的Python脚本的编写教程的使用技巧和注意事项,需要的朋友参考一下 操作数据库时候难免会因为“大意”而误操作,需要快速恢复的话通过备份来恢复是不太可能的,因为需要还原和binlog差来恢复,等不了,很费时。这里先说明下因为Delete 操作的恢复方法:主要还是通过binlog来进行恢复,前提是binlog_fo
本文向大家介绍使用Ruby编写脚本进行系统管理的教程,包括了使用Ruby编写脚本进行系统管理的教程的使用技巧和注意事项,需要的朋友参考一下 简介 Ruby 是一种功能极其丰富的、免费的、简单的、可扩展的、可移植的、面向对象的脚本编程语言。最近,它在 Web 领域广受欢迎。这在一定程度上要归因于非常强大的 Web 应用程序开发框架 Rails,Rails 正是用 Ruby 编写的。Rails,也称
本文向大家介绍Python编写memcached启动脚本代码实例,包括了Python编写memcached启动脚本代码实例的使用技巧和注意事项,需要的朋友参考一下 memcached是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但被许多网站使用。这是一套开放源代码软件,以BSD license授权发布。 memcached缺乏认证以及安全管制,这代表应
本文向大家介绍Python代码实现http/https代理服务器的脚本,包括了Python代码实现http/https代理服务器的脚本的使用技巧和注意事项,需要的朋友参考一下 一个几百行代码做出http/https代理服务器的脚本,启动即可做http https透明代理使用 python proxy.py 8992 使用非阻塞io模式,性能还可以。 可以和浏览器一样保持长连接,代码有点乱,不管那么
本文向大家介绍PowerShell入门教程之编写和使用脚本模块实例,包括了PowerShell入门教程之编写和使用脚本模块实例的使用技巧和注意事项,需要的朋友参考一下 现在通过编写模块就可以在PowerShell命令行或者脚本中管理大型、分布式软件系统,就像Exchange Server和SharePoint Server正在做的那样。你有这样的需求吗? 模块、脚本模块 模块是PowerShe
本文向大家介绍python爬虫_实现校园网自动重连脚本的教程,包括了python爬虫_实现校园网自动重连脚本的教程的使用技巧和注意事项,需要的朋友参考一下 一、背景 最近学校校园网不知道是什么情况,总出现掉线的情况。每次掉线都需要我手动打开web浏览器重新进行账号密码输入,重新进行登录。系统的问题我没办法解决,但是可以写一个简单的python脚本用于自动登录校园网。每次掉线后,再打开任意网页就是这