千家信息网

如何编写Python代码设置各平台下代理配置

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,如何编写Python代码设置各平台下代理配置,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。今天带来的是用Python代码设置各个平台
千家信息网最后更新 2026年11月03日如何编写Python代码设置各平台下代理配置

如何编写Python代码设置各平台下代理配置,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

今天带来的是用Python代码设置各个平台下socks5代理配置的方法。

由于网上各平台设置的文章较为分散,且有个别平台设置时存在一些坑,因此码哥决定写一篇汇总文章便于他人参考。

声明:本文不是讲解socks5代理服务实现的,而仅是展示在Windows、Linux、OSX下如何使用代码设置socks5配置。

有时,一些桌面程序可能需要用到代理配置功能,例如企业内部一些工具软件访问公司内部资源,此时需要将本机该软件的流量打到公司指定内部服务上。

很显然,我们日常使用桌面系统时,是可以手工设置代理配置的。但是如果一款软件还需要用户手工去设置,就会增加使用者的学习难度,降低软件的用户体验,因此开发者会有需求知道如何用代码来修改设置。

本文仅以Python为例进行讲解,由于Python库的实现特点,其库函数接口与C版本接口原型几乎保持了一致,因此也有助于C/C++开发人员来借鉴。


下面我们逐个平台给出示例。由于设置代理的方式有很多种,码哥没有逐个试过一遍,因此仅给出尝试过的可行方案:

OSX(Mac)

import os#打开代理os.popen('networksetup -setsocksfirewallproxy "Wi-Fi" SOCKS5_PROXY_IP SOCKS5_PROXY_PORT').close()#关闭代理os.popen('networksetup -setsocksfirewallproxystate "Wi-Fi" off').close()

其中,SOCKS5_PROXY_IP是代理的IP地址,SOCKS5_PROXY_PORT是代理的端口。

Mac上实际上是通过命令行方式进行设置的,OSX中有一个名为networksetup的工具可以用来设置代理。

Linux

import os#打开代理os.popen('gsettings set org.gnome.system.proxy mode "manual"').close()os.popen('gsettings set org.gnome.system.proxy.socks host "SOCKS5_PROXY_IP"').close()os.popen('gsettings set org.gnome.system.proxy.socks port SOCKS5_PROXY_PORT'.format(conf.LISTENPORT)).close()os.popen('gsettings set org.gnome.system.proxy ignore-hosts "IGNORED_IPs"'.format(ignore)).close()#关闭代理os.popen('gsettings set org.gnome.system.proxy mode "none"').close()

其中,SOCKS5_PROXY_IP与SOCKS5_PROXY_PORT与OSX的一样,IGNORED_IPs是不走代理的IP名单,其格式如下:

['localhost', '127.0.0.0/8', '::1']

注意,这里写的不是Python数组,而是字符串。我们可以在[]中加入不走代理的IP,并用引号括起,以逗号将其与其他地址隔开。

Windows

#encoding=utf8from ctypes import *from ctypes.wintypes import *import winregimport settings as confLPWSTR = 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 = 1class 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(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'Software\Microsoft\Windows\CurrentVersion\Internet 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。

关于如何编写Python代码设置各平台下代理配置问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。

代理 配置 平台 代码 地址 软件 手工 问题 公司 命令 工具 形式 接口 文章 方式 方法 更多 桌面 注册表 用户 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技巨头监管 重庆互联网络科技 互联网与新科技 互联网 视角下的科技创新 金融科技和互联网金融 恒生科技互联网指数分析 银川新华互联网科技学校地址 宁夏科技产业互联网案例 千方科技属于互联网企业吗 本届互联网博览会上的黑科技 华夏恒生互联网科技013171 华夏恒生科技与互联网科技 互联网行业科技股 银行科技岗属于互联网吗 互联网科技资金流入 互联网科技年终奖 有人说阿里系是互联网科技企业 易企秀互联网科技是做什么的 云南互联网科技学费 知域互联网科技有限公司官网 哈尔滨大商圈互联网科技有限公司 中关村互联网科技集团 互联网科技大会 未来五年的互联网科技 搜狐科技互联网 互联网科技和法律行业 深圳市罗太互联网科技有限公司 滨湖区互联网智能科技产品有哪些 中天科技中国工业互联网 互联网科技企业商标注意事项
0