2015-07-10 116 views
1

我寫了一個腳本,需要能夠使用Python啓用和禁用代理設置。現在我編輯註冊表來實現這一點,但它似乎不適用於所有版本的Windows,所以我寧願使用InternetSetOption。有關API的信息是真的稀缺,大部分的例子是C,我不知道: https://support.microsoft.com/en-us/kb/226473在Python中使用Python設置代理服務器設置(使用InternetSetOption)

它可能看起來有點像這樣(此代碼段實際上是刷新瀏覽器代理設置):

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) 

回答

0

我實際上通過大量的試驗和錯誤發現了這一點。工作示例:

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) 
相關問題