今天码哥带来了使用Python代码设置各平台下socks5代理配置的方法。由于网上各个平台设置的文章比较分散,个别平台的设置也存在一些坑,马哥决定写一篇总结文章,供大家参考。免责声明:本文不讲解socks5代理服务的实现,仅展示如何在Windows、Linux、OSX下使用代码设置socks5配置。有时,某些桌面程序可能需要使用代理配置功能。比如企业内部的一些工具软件访问公司内部资源。显然,我们在日常使用桌面系统时,可以手动设置代理配置。但是,如果一款软件需要用户手动设置,就会增加用户的学习难度,降低软件的用户体验。因此,开发人员需要知道如何使用代码来修改设置。本文仅以Python为例进行讲解。由于Python库的实现特点,其库函数接口与C版本接口原型几乎一致,因此也有助于C/C++开发者借鉴。下面我们逐平台举例。由于设置代理的方法有很多,码哥没有一一尝试,所以只给出尝试可行的方案:OSX(Mac)importos#Openproxyos.popen('networksetup-setsocksfirewallproxy"Wi-Fi"SOCKS5_PROXY_IPSOCKS5_PROXY_PORT').close()#关闭代理os.popen('networksetup-setsocksfirewallproxystate"Wi-Fi"off').close()其中SOCKS5_PROXY_IP为代理的IP地址,SOCKS5_PROXY_PORT为端口的代理。在Mac上,它实际上是通过命令行设置的。OSX中有一个名为networksetup的工具可以用来设置代理。Linuximportos#打开代理os.popen('gsettingssetorg.gnome.system.proxymode"manual"').close()os.popen('gsettingssetorg.gnome.system.proxy.sockshost"SOCKS5_PROXY_IP"').close()os.popen('gsettingssetorg.gnome.system.proxy.socksportSOCKS5_PROXY_PORT'.format(conf.LISTENPORT))。关闭()os.popen('gsettingssetorg.gnome.system.proxyignore-hosts“IGNORED_IPs”'.format(忽略))。close()#关闭代理os.popen('gsettingssetorg.gnome.system.proxymode"none"').close()其中SOCKS5_PROXY_IP和SOCKS5_PROXY_PORT和OSX一样,IGNORED_IPs是做的IP列表不经过代理,其格式如下:['localhost','127.0.0.0/8','::1']注意这里写的不是Python数组,而是字符串。我们可以在[]中加上不经过代理的IP,用引号括起来,和其他地址用逗号隔开。Windows#encoding=utf8fromctypesimport*fromctypes.wintypesimport*importwinregimportsettingsasconfLPWSTR=POINTER(WCHAR)HINTERNET=LPVOIDINTERNET_PER_CONN_PROXY_SERVER=2INTERNET_OPTION_REFRESH=37INTERNET_OPTION_SETTINGS_CHANGED=39INTERNET_OPTION_PER_CONNECTION_OPTION=75INTERNET_PER_CONN_PROXY_BYPASS=3INTERNET_PER_CONN_FLAGS=1classINTERNET_PER_CONN_OPTION(Structure):classValue(Union):_fields_=[('dwValue',DWORD),('pszValue',LPWSTR),('ftValue',FILETIME),]_fields_=[('dwOption',DWORD),('Value',Value),]classINTERNET_PER_CONN_OPTION_LIST(结构):_fields_=[('dwSize',DWORD),('pszConnection',LPWSTR),('dwOptionCount',DWORD),('dwOptionError',DWORD),('pOptions',POINTER(INTERNET_PER_CONN_OPTION)),]defset_proxy_settings(serverIp,status='off'):whitelist="IGNORED_IPs"ifstatus=='on':setting=create_unicode_buffer("SOCKS5_PROXY_IP:SOCKS5_PROXY_PORT")whitelist+=';{};{}'.format(serverIp,conf.WEBHOST)else:setting=NoneInternetSetOption=windll。网络。InternetSetOptionWInternetSetOption.argtypes=[HINTERNET,DWORD,LPVOID,DWORD]InternetSetOption.restype=BOOLList=INTERNET_PER_CONN_OPTION_LIST()选项=(INTERNET_PER_CONN_OPTION*3)()nSize=c_ulong(sizeof(INTERNET_PER_CONN_OPTION_LIST))Option[0].dwOption=INTERNET_PER_CONN_OPTION[N_FLAGSOption[N_FLAGS选项]].Value.dwValue=(2ifstatus=='on'else1)Option[1].dwOption=INTERNET_PER_CONN_PROXY_SERVEROption[1].Value.pszValue=settingOption[2].dwOption=INTERNET_PER_CONN_PROXY_BYPASSOption[2].Value.pszValue=create_unicode_buffer(白名单)List.dwSize=sizeof(INTERNET_PER_CONN_OPTION_LIST)List.pszConnection=NoneList.dwOptionCount=3List.dwOptionError=0List.pOptions=OptionInternetSetOption(None,INTERNET_OPTION_PER_CONNECTION_OPTION,byref(List),nSize)ifstatus=='on':key=winreg.OpenKey(winreg.HKEY_CURRENT_USER,r'Software\Microsoft\Windows\CurrentVersion\InternetSettings',0,winreg.KEY_WRITE)winreg.SetValueEx(key,'ProxyServer',0,1,'socks://SOCKS5_PROXY_IP:SOCKS5_PROXY_PORT')winreg.关闭键(键)InternetSetOption(None,INTERNET_OPTION_SETTINGS_CHANGED,None,0)InternetSetOption(None,INTERNET_OPTION_REFRESH,None,0)if__name__=="__main__":#开启代理set_proxy_settings('127.0.0.1','on')#关闭代理set_proxy_settings('')可见windows的设置比较复杂。其中,IGNORED_IPs是不经过代理的IP地址列表。它的形式不同于Linux。请参阅以下内容:本地主机;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.28.*;172.29.*;172.30.*;172.31.*;172.32.*;192.168.*即地址之间用分号隔开,没有括号。虽然我们也可以通过命令行修改注册表来实现,但是pyinstaller中打包的程序会被系统防火墙直接杀掉,即使能运行,代理配置修改也至少需要10分钟生效,体验很差。同时,Windows的一个坑是,手动设置socks代理后,可以看到注册表项ProxyServer的值为socks=SOCKS5_PROXY_IP:SOCKS5_PROXY_PORT,但如果真的这样设置,代理必须接收socks4数据包。而不是袜子5。
