【问题标题】:Change browser proxy settings from Python?从 Python 更改浏览器代理设置?
【发布时间】:2011-03-04 06:39:04
【问题描述】:

我编写了一个依赖代理运行的程序。我现在需要一个脚本来检查浏览器是否设置为使用正确的代理,如果没有,请更改它以使用它。我需要为尽可能多的浏览器实现此功能,但只需要 Internet Explorer、Google Chrome、Mozilla Firefox、Safari 和 Opera。我什至不知道该怎么做,但这是一个几天后到期的工作项目。如果有人可以提供帮助或提供建议,我将不胜感激!

我正在编程:
微软视窗XP
Python 2.6

【问题讨论】:

  • 讨论 阅读 您可能感兴趣的代理设置:old.nabble.com/… 我不确定我是否会自动更改用户的代理设置(除非这意味着某种配置快捷方式?)还有stackoverflow.com/questions/1201771/…
  • 是的,我看过那些。我正在寻找一些示例代码或其他东西。不过还是谢谢。
  • pythonwin 扩展可以帮助解决这个问题吗?

标签: python browser proxy settings


【解决方案1】:

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)使用内部代理设置。如果你想改变这些,你必须弄清楚它们存储设置的位置并编写代码来改变它。

【讨论】:

  • 9 年后如果有人想知道,它在 _winreg 文档中说,它已在 Python 3.0 中重命名为 winreg
  • @Rishav 是的,答案提到:)
  • 我使用 pyinstaller 制作了一个可执行文件,但该可执行文件不会更改代理设置。我需要设置什么特殊权限吗?
【解决方案2】:

非常感谢@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2011-05-09
    • 1970-01-01
    • 2011-02-05
    • 2015-01-27
    • 2010-09-17
    • 2012-11-01
    相关资源
    最近更新 更多