【问题标题】:Setting proxy settings in Windows with Python (using InternetSetOption)使用 Python 在 Windows 中设置代理设置(使用 InternetSetOption)
【发布时间】:2015-07-10 18:44:31
【问题描述】:

我编写了一个小脚本,它需要能够使用 Python 启用和禁用代理设置。现在我编辑注册表来实现这一点,但它似乎不适用于所有版本的 Windows,所以我更愿意使用 InternetSetOption。关于 API 的信息真的很稀少,大多数例子都是 C 语言的,我不知道: https://support.microsoft.com/en-us/kb/226473

大概看起来有点像这样(这个sn-p其实是用来刷新浏览器代理设置的):

import ctypes
INTERNET_OPTION_REFRESH = 37
INTERNET_OPTION_SETTINGS_CHANGED = 39

internet_set_option = ctypes.windll.Wininet.InternetSetOptionW
internet_set_option(0, 38, 0, 0)    
internet_set_option(0, INTERNET_OPTION_REFRESH, 0, 0)
internet_set_option(0, INTERNET_OPTION_SETTINGS_CHANGED, 0, 0)

【问题讨论】:

    标签: python proxy wininet internetsetoption


    【解决方案1】:

    实际上,我自己通过大量试验和错误发现了这一点。工作示例:

    from ctypes import *
    from ctypes.wintypes import *
    
    LPWSTR = POINTER(WCHAR)
    HINTERNET = LPVOID
    
    INTERNET_PER_CONN_PROXY_SERVER = 2
    INTERNET_OPTION_REFRESH = 37
    INTERNET_OPTION_SETTINGS_CHANGED = 39
    INTERNET_OPTION_PER_CONNECTION_OPTION = 75
    INTERNET_PER_CONN_PROXY_BYPASS = 3
    INTERNET_PER_CONN_FLAGS = 1
    
    class INTERNET_PER_CONN_OPTION(Structure):
        class Value(Union):
            _fields_ = [
                ('dwValue', DWORD),
                ('pszValue', LPWSTR),
                ('ftValue', FILETIME),
            ]
    
        _fields_ = [
            ('dwOption', DWORD),
            ('Value', Value),
        ]
    
    class INTERNET_PER_CONN_OPTION_LIST(Structure):
        _fields_ = [
            ('dwSize', DWORD),
            ('pszConnection', LPWSTR),
            ('dwOptionCount', DWORD),
            ('dwOptionError', DWORD),
            ('pOptions', POINTER(INTERNET_PER_CONN_OPTION)),
        ]
    
    def set_proxy_settings(ip, port, on=True):
        if on:
            setting = create_unicode_buffer(ip+":"+str(port))
        else:
            setting = None
    
        InternetSetOption = windll.wininet.InternetSetOptionW
        InternetSetOption.argtypes = [HINTERNET, DWORD, LPVOID, DWORD]
        InternetSetOption.restype  = BOOL
    
        List = INTERNET_PER_CONN_OPTION_LIST()
        Option = (INTERNET_PER_CONN_OPTION * 3)()
        nSize = c_ulong(sizeof(INTERNET_PER_CONN_OPTION_LIST))
    
        Option[0].dwOption = INTERNET_PER_CONN_FLAGS
        Option[0].Value.dwValue = (2 if on else 1) # PROXY_TYPE_DIRECT Or 
        Option[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER
        Option[1].Value.pszValue = setting
        Option[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS
        Option[2].Value.pszValue = create_unicode_buffer("localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*")
    
        List.dwSize = sizeof(INTERNET_PER_CONN_OPTION_LIST)
        List.pszConnection = None
        List.dwOptionCount = 3
        List.dwOptionError = 0
        List.pOptions = Option
    
        InternetSetOption(None, INTERNET_OPTION_PER_CONNECTION_OPTION, byref(List), nSize)
        InternetSetOption(None, INTERNET_OPTION_SETTINGS_CHANGED, None, 0)
        InternetSetOption(None, INTERNET_OPTION_REFRESH, None, 0)
    
    set_proxy_settings("127.0.0.1", 52042)
    

    【讨论】:

    • 感谢您。我无法通过 Windows 注册表更改代理来工作
    • 为了让它在 Python 3.6 上运行,我不得不将 create_unicode_buffer 替换为 c_wchar_p
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 2014-08-08
    • 2011-02-08
    相关资源
    最近更新 更多