用Python编写脚本使IE实现代理上网的教程


Posted in Python onApril 23, 2015

厂里上个网需要设置代理服务器,切换各种环境『包括但不仅限于开发环境、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'
Python 相关文章推荐
python中合并两个文本文件并按照姓名首字母排序的例子
Apr 25 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
python celery分布式任务队列的使用详解
Jul 08 Python
浅谈Python_Openpyxl使用(最全总结)
Sep 05 Python
python3 求约数的实例
Dec 05 Python
Pytorch 多块GPU的使用详解
Dec 31 Python
Python Handler处理器和自定义Opener原理详解
Mar 05 Python
python实现QQ邮箱发送邮件
Mar 06 Python
Python如何转换字符串大小写
Jun 04 Python
Python+Kepler.gl实现时间轮播地图过程解析
Jul 20 Python
python 如何快速复制序列
Sep 07 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 #Python
最基础的Python的socket编程入门教程
Apr 23 #Python
利用Python实现简单的相似图片搜索的教程
Apr 23 #Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 #Python
Python中优化NumPy包使用性能的教程
Apr 23 #Python
python通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 #Python
用Python给文本创立向量空间模型的教程
Apr 23 #Python
You might like
我的论坛源代码(五)
2006/10/09 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
Yii框架中sphinx索引配置方法解析
2016/10/18 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
Jquery实现由下向上展开效果的例子
2014/12/08 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
JS实现单行文字不间断向上滚动的方法
2015/01/29 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
javascript表单验证大全
2015/08/12 Javascript
javascript实现拖动元素交换位置
2015/11/29 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
js 中获取制定的cook信息实现方法
2016/11/19 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
灵活使用console让js调试更简单的方法步骤
2019/04/23 Javascript
解决vue刷新页面以后丢失store的数据问题
2020/08/11 Javascript
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
python 字典 按key值大小 倒序取值的实例
2018/07/06 Python
Python递归函数实例讲解
2019/02/27 Python
解析python的局部变量和全局变量
2019/08/15 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
2020/02/15 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
Python的历史与优缺点整理
2020/05/26 Python
欧洲、亚洲、非洲和拉丁美洲的度假套餐:Great Value Vacations
2019/03/30 全球购物
英国家具、照明、家居用品网上商店:Wayfair.co.uk
2020/02/13 全球购物
vue+django实现下载文件的示例
2021/03/24 Vue.js
保险专业自荐信范文
2014/02/20 职场文书
海飞丝广告词
2014/03/20 职场文书
机关会计岗位职责
2014/04/08 职场文书
刑事申诉状范文
2015/05/20 职场文书
python OpenCV学习笔记
2021/03/31 Python
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python