今天,哥哥用Python代码带来了在各个平台上设置socks5代理的方法。
因为互联网上各个平台设置的文章很分散,各个平台设置时都有一些漏洞,所以代码哥决定写一篇总结文章。
声明:本文不介绍socks5代理服务的实现,而是介绍如何在Windows、Linux和OSX上使用代码设置socks5配置。
在某些情况下,某些桌面程序可能需要代理配置功能,例如企业中的某些工具软件访问内部资源。 在这种情况下,必须将该软件的本机流量转发给公司指定的内部服务。
当然,我们日常使用桌面系统时,可以手动进行代理设置。 但是,对于需要用户手动设置的软件,由于增加了用户的学习难度,降低了软件的用户体验,开发人员需要知道如何在代码中更改设置。
本文以Python为例进行说明。 由于Python库的实现特点,库函数接口与c版本接口的原型基本一致,因此也可以作为C/C开发人员的参考。
下面是每个平台的一个示例。 设置代理的方法各种各样,代码的哥哥一次也没有尝试过,所以只展示曾经尝试过的可行方案。
OSX(Mac)
导入操作系统# #打开代理
OS.popen (网络设置-网络安全代理' wi-fi ' socks5_代理_ IP套接字5 _代理_端口' ) )
# #关闭代理
OS.popen (网络设置-网络安全代理' wi-fi '关闭' ) .其中,套接字5 _代理IP是代理的IP添加
Mac实际上通过命令行方式进行设定。 OSX有一个叫做网络设置的工具,可以设置代理。
Linux
导入操作系统# #打开代理
操作系统(gsettingssetorg.gnome .系统.代理模式'手动' ) .关闭) )。
操作系统(全球通用名称.系统.代理.套接字主机'套接字5 _代理_ IP ' ) .关闭) ) ) ) ) )
OS.popen (gsettingssetorg.gnome.system.proxy.socksportsocks5_ proxy _ port .格式) conf.listen端口)
操作系统(gsettingssetorg.gnome .系统.代理合并-主机'合并_ IPS ' .格式)合并) ) ) )。
# #关闭代理
操作系统(gsettingssetorg.gnome .系统.代理模式'无' ).close )其中,套接字5 _代理_ IP和套接字5 _代理
['localhost ',' 127.0.0.0/8 ',' :1']请注意,这里写的是字符串而不是Python数组。 可以在“”中添加不离开代理的IP,并用引号将其与其他地址分隔。
Windows
#编码=utf8从类型导入*
从类型导入*
汇入视窗
导入设置为连接
lw str=点对点(wchar ) (注) ) (注) ) (注) ) ) ) (注) ) (注) ) (注) ) ) (注) ) ) (注) ) ) ) (注)
h互联网=lpvoid
互联网连接代理服务器=2
互联网_选项_刷新=37
互联网_选项_设置_已更改=39
互联网连接选项=75
互联网连接代理=3
互联网连接标志=1
类互联网连接选项(结构) :
等级值(联合) :
字段=[
(dw值)、DWORD )、
(pszValue )、LPWSTR )、
(' ftValue ',文件时间),
]
字段=[
(d
wOption', 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(serverIp, status='off'): whitelist = "IGNORED_IPs" if status == 'on': setting = create_unicode_buffer("SOCKS5_PROXY_IP:SOCKS5_PROXY_PORT") whitelist += ';{};{}'.format(serverIp, conf.WEBHOST) 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 status=='on' else 1) 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(whitelist) 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) if status == 'on': key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r'SoftwareMicrosoftWindowsCurrentVersionInternet Settings', 0, winreg.KEY_WRITE) winreg.SetValueEx(key, 'ProxyServer', 0, 1, 'socks://SOCKS5_PROXY_IP:SOCKS5_PROXY_PORT') winreg.CloseKey(key) 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不相同,参见如下:
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.*即地址与地址间以分号相隔,且无括号括起。
虽然我们也可以使用命令行形式修改注册表来达到,但是这样在pyinstaller打包后的程序会被系统防火墙直接干掉,且即便可以运行,代理配置修改生效时间至少需要10分钟,体验非常差。
同时,Windows比较坑的一点是,当手工去设置socks代理后,看到注册表项ProxyServer的值为socks=SOCKS5_PROXY_IP:SOCKS5_PROXY_PORT,但如果真的这样设置,那么代理收到的一定是socks4报文,而不是socks5。
喜欢的朋友可以关注码哥,也可以在下方评论区给码哥留言讨论,谢谢观看!