如何通过Python更改浏览器代理设置?

12 投票
3 回答
18039 浏览
提问于 2025-04-16 00:01

我写了一个程序,它需要通过代理才能正常工作。现在我需要一个脚本,来检查浏览器是否设置了正确的代理,如果没有,就把它改成正确的代理。我希望这个脚本能适用于尽可能多的浏览器,但至少要支持 Internet Explorer、Google Chrome、Mozilla Firefox、Safari 和 Opera。我其实也不知道该怎么做,但这是我工作上的一个项目,几天后就要交了。如果有人能帮忙或者给点建议,我会非常感激!

我是在以下环境下编程的:
MS Windows XP
Python 2.6

3 个回答

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...")
0

非常感谢 @Cesar Canassa,但这里有个小问题,就是在你修改设置之后,一定要记得刷新一下。否则你在注册表中所做的更改会在刷新时被丢弃。所以应该这样做。

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)
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使用的是内部的代理设置。如果你想更改这些设置,就需要找出它们存储设置的位置,并写代码去修改它。

撰写回答