从Python更改浏览器代理设置?

时间:2010-06-16 02:01:06

标签: python browser proxy settings

我编写了一个依赖代理来运行的程序。我现在需要一个脚本来检查浏览器是否设置为使用正确的代理,如果没有,则更改它以使用它。我需要为尽可能多的浏览器实现此功能,但只有 Internet Explorer,Google Chrome,Mozilla Firefox,Safari和Opera 才需要。我甚至不确定如何解决这个问题,但这是一个将在几天内完成的工作项目。如果有人可以提供帮助或提供建议,我将非常感激!

我正在编程:
MS Windows XP
Python 2.6

2 个答案:

答案 0 :(得分:17)

Windows将其系统范围的代理存储在注册表中,查看HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings。您可以使用Python _winreg模块来更改它(如果使用Python 3,则只使用winreg)。这是一个示例代码

import _winreg as winreg

INTERNET_SETTINGS = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
    r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
    0, winreg.KEY_ALL_ACCESS)

def set_key(name, value):
    _, reg_type = winreg.QueryValueEx(INTERNET_SETTINGS, name)
    winreg.SetValueEx(INTERNET_SETTINGS, name, 0, reg_type, value)

set_key('ProxyEnable', 1)
set_key('ProxyOverride', u'*.local;<local>')  # Bypass the proxy for localhost
set_key('ProxyServer', u'X.X.X.X:8080')

要禁用它,您只需将ProxyEnable键设置为0:

set_key('ProxyEnable', 0)

脚本运行后,浏览器仍然会将旧代理存储在内存中,因此您需要重新启动它们,以便他们可以从注册表中重新读取新的代理设置。我发现这非常烦人,所以我将this snippet转换为Python。

import ctypes

INTERNET_OPTION_REFRESH = 37
INTERNET_OPTION_SETTINGS_CHANGED = 39

internet_set_option = ctypes.windll.Wininet.InternetSetOptionW

internet_set_option(0, self.INTERNET_OPTION_REFRESH, 0, 0)
internet_set_option(0, self.INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)

这会刷新Windows设置,所以您只需在浏览器中点击F5即可获取新的代理设置。

我写了一个小脚本来打开或关闭我的代理,来自Bitbucket: https://bitbucket.org/canassa/switch-proxy

这适用于使用Windows系统范围代理的任何浏览器(例如:Chrome,IE)。某些浏览器(如Firefox)使用内部代理设置。如果你想更改它们,你将弄清楚它们存储设置的位置并编写代码来更改它。

答案 1 :(得分:0)

非常感谢@Cesar Canassa,但是有一个小问题,您应该始终在更改设置后刷新 ,否则您刚才在winreg中所做的更改将刷新时将其丢弃。所以应该是这样。

import ctypes

INTERNET_OPTION_REFRESH = 37
INTERNET_OPTION_SETTINGS_CHANGED = 39

internet_set_option = ctypes.windll.Wininet.InternetSetOptionW

internet_set_option(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)
internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0)