用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中处理unchecked未捕获异常实例
Jan 17 Python
Python利用递归和walk()遍历目录文件的方法示例
Jul 14 Python
Python 中Pickle库的使用详解
Feb 24 Python
Django 跨域请求处理的示例代码
May 02 Python
Django中的ajax请求
Oct 19 Python
python实现简单flappy bird
Dec 24 Python
pyqt5之将textBrowser的内容写入txt文档的方法
Jun 21 Python
python 将日期戳(五位数时间)转换为标准时间
Jul 11 Python
Python BeautifulReport可视化报告代码实例
Apr 13 Python
基于python实现查询ip地址来源
Jun 02 Python
pytorch掉坑记录:model.eval的作用说明
Jun 23 Python
Python判断字符串是否为合法标示符操作
Sep 03 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 OPCode缓存 APC详细介绍
2010/10/12 PHP
PHP中copy on write写时复制机制介绍
2014/05/13 PHP
php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法
2015/10/20 PHP
laravel 修改.htaccess文件 重定向public的解决方法
2019/10/12 PHP
Javascript - HTML的request类
2007/01/09 Javascript
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
Javascript 代码也可以变得优美的实现方法
2009/06/22 Javascript
jquery 事件执行检测代码
2009/12/09 Javascript
合并table相同单元格的jquery插件分享(很精简)
2011/06/20 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
微信小程序实现顶部下拉菜单栏
2018/11/04 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
使用 Vue-TCB 快速在 Vue 应用中接入云开发的方法
2020/02/10 Javascript
Vue 3.0 全家桶抢先体验
2020/04/28 Javascript
python实现判断数组是否包含指定元素的方法
2015/07/15 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
2016/11/02 Python
Python 用Redis简单实现分布式爬虫的方法
2017/11/23 Python
浅谈Python2、Python3相对路径、绝对路径导入方法
2018/06/22 Python
Python安装selenium包详细过程
2019/07/23 Python
学python爬虫能做什么
2020/07/29 Python
python使用yaml 管理selenium元素的示例
2020/12/01 Python
KIKO MILANO荷兰网上商店:意大利专业化妆品品牌
2017/05/12 全球购物
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
物理系毕业生自荐信
2013/11/01 职场文书
秋季运动会广播稿
2014/02/22 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
幼儿园教研工作总结2015
2015/05/12 职场文书
社区结对共建协议书
2016/03/23 职场文书
Golang全局变量加锁的问题解决
2021/05/08 Golang
HTML5 语义化标签(移动端必备)
2021/08/23 HTML / CSS
JS数组去重详情
2021/11/07 Javascript