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

12
我写了一个依赖代理的程序。现在我需要一个脚本来检查浏览器是否设置了正确的代理,如果没有,就将其更改为使用正确的代理。我需要尽可能实现多种浏览器,但只需要支持 Internet Explorer、Google Chrome、Mozilla Firefox、Safari 和 Opera。我甚至不知道如何着手处理这个问题,但这是一个工作项目,几天后就要交付了。如果有人能提供帮助或建议,我将非常感激!
我在以下环境下进行编程:
MS Windows XP
Python 2.6

1
这里有一个关于读取代理设置的讨论,你可能会感兴趣: http://old.nabble.com/using-windows-wide-proxy-settings-td20822378.html不过我不确定是否应该自动更改用户的代理设置(除非它是某种配置快捷方式?)此外,还有http://stackoverflow.com/questions/1201771/how-to-set-proxy-with-python - anton.burger
是的,我看过那些。我正在找一些示例代码或其他东西。不过谢谢。 - Zac Brown
Pythonwin扩展能帮助解决这个问题吗? - Zac Brown
3个回答

22

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)

脚本运行后,浏览器仍然会在内存中保留旧的代理,因此您需要重新启动它们,以便它们可以从注册表中重新读取新的代理设置。我发现这非常令人烦恼,因此我将此片段转换为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使用内部代理设置。如果您想更改这些设置,则需要找出它们存储设置的位置并编写代码进行更改。


如果有人在9年后想知道,根据_winreg文档,它已经在Python 3.0中更名为winreg - Rishav
@Rishav 是的,答案提到了 :) - Cesar Canassa
我使用了pyinstaller制作可执行文件,但是该文件没有更改代理设置。我需要设置特殊权限吗? - Sergei Krivosheenko

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)

0

- IE代理(适用于Python 3.9):

import winreg
import ctypes

# On or Off - IE Proxy   (On=1 or Off=0)
proxyOnOff = 0

# Modification
INTERNET_SETTINGS = winreg.OpenKey(winreg.HKEY_CURRENT_USER,
    r'Software\Microsoft\Windows\CurrentVersion\Internet Settings',
    0, winreg.KEY_ALL_ACCESS)
_, reg_type = winreg.QueryValueEx(INTERNET_SETTINGS, 'ProxyEnable')
winreg.SetValueEx(INTERNET_SETTINGS, 'ProxyEnable', 0, reg_type, proxyOnOff)

# Implementation
INTERNET_OPTION_REFRESH = 37
INTERNET_OPTION_SETTINGS_CHANGED = 39
internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0)
internet_set_option(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)

# Read state - ProxyEnable
proxyEnable = winreg.QueryValueEx(INTERNET_SETTINGS, 'ProxyEnable')[0]
print(f"proxyEnable = {proxyEnable}")

input("Press Enter to continue...")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接