用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 相关文章推荐
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
python使用tcp实现局域网内文件传输
Mar 20 Python
Python爬取商家联系电话以及各种数据的方法
Nov 10 Python
pandas基于时间序列的固定时间间隔求均值的方法
Jul 04 Python
解决Tensorboard可视化错误:不显示数据 No scalar data was found
Feb 15 Python
pytorch 中的重要模块化接口nn.Module的使用
Apr 02 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
PyQt5实现仿QQ贴边隐藏功能的实例代码
May 24 Python
pycharm 关闭search everywhere的解决操作
Jan 15 Python
使用pandas读取表格数据并进行单行数据拼接的详细教程
Mar 03 Python
python读取pdf格式文档的实现代码
Apr 01 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
PHP Token(令牌)设计
2008/03/15 PHP
php 删除cookie和浏览器重定向
2009/03/16 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
php中设置多级目录session的问题
2011/08/08 PHP
Yii中创建自己的Widget实例
2016/01/05 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
2017/09/30 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
超漂亮的jQuery图片轮播特效
2015/11/24 Javascript
AngularJS 单选框及多选框的双向动态绑定
2017/04/20 Javascript
NodeJS自定义模块写法(详解)
2017/06/27 NodeJs
js中less常用的方法小结
2017/08/09 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
JavaScript Image对象实现原理实例解析
2020/08/26 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
Python Queue模块详解
2014/11/30 Python
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
python广度优先搜索得到两点间最短路径
2019/01/17 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
python3爬取torrent种子链接实例
2020/01/16 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
python logging 重复写日志问题解决办法详解
2020/08/04 Python
使用python画出逻辑斯蒂映射(logistic map)中的分叉图案例
2020/12/11 Python
很酷的小工具和电子产品商城:GearBest
2016/11/19 全球购物
美国知名的网上鞋类及相关服装零售商:Shoes.com
2017/05/06 全球购物
Overload和Override的区别。Overloaded的方法是否可以改变返回值的类型
2013/10/30 面试题
工商学院毕业生自荐信
2013/11/12 职场文书
电子专业推荐信范文
2013/11/18 职场文书
禁止酒驾标语
2014/06/25 职场文书
党课培训心得体会
2014/09/02 职场文书
后勤工作个人总结
2015/02/28 职场文书
参加招聘会后的感想
2015/08/10 职场文书
房屋转让协议书(标准范本)
2016/03/21 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
JavaScript实现显示和隐藏图片
2021/04/29 Javascript