Proxifier 是我现在用的最频繁的代理工具,与 XRay 配合使用,可以实现非常灵活且方便的代理上网分流。
脚本
import requests import base64 import xml.etree.ElementTree as ET # 获取GFWList数据 url = "https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt" response = requests.get(url) if response.status_code == 200: # 获取成功,进行base64解码 encoded_data = response.text decoded_data = base64.b64decode(encoded_data).decode('utf-8') # 提取域名 domains = set() for line in decoded_data.splitlines(): if line.startswith('||'): domain = line.strip('|^') # 检查域名是否只包含英文字母和点 if all(c.isalpha() or c == '.' for c in domain): domains.add(domain) # 读取现有的Proxifier配置文件 tree = ET.parse('default.ppx') root = tree.getroot() # 找到RuleList元素 rule_list = root.find('RuleList') # 创建一个新规则,包含所有GFWList域名 new_rule = ET.Element("Rule") new_rule.set("enabled", "true") name = ET.SubElement(new_rule, "Name") name.text = "GFWList Domains" targets = ET.SubElement(new_rule, "Targets") targets.text = ';'.join(f"*{domain}" for domain in sorted(domains)) action = ET.SubElement(new_rule, "Action") action.set("type", "Proxy") action.text = "100" # 使用ID为100的代理 # 将新规则插入到倒数第二个位置 rules = list(rule_list) rule_list.insert(-1, new_rule) # 将更新后的XML保存到文件 tree.write("updated_proxifier_rules.ppx", encoding="utf-8", xml_declaration=True) print("Proxifier规则已更新并保存到 updated_proxifier_rules.ppx") else: print(f"获取GFWList数据失败,状态码: {response.status_code}")
其中 default.ppx
updated_proxifier_rules.ppx
我这里的参考 default.ppx
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <ProxifierProfile version="101" platform="MacOSX" product_id="2" product_minver="200"> <Options> <Resolve> <AutoModeDetection enabled="true"/> <ViaProxy enabled="false"> <TryLocalDnsFirst enabled="false"/> </ViaProxy> <ExclusionList ExcludeSimpleHostnames="true" ExcludeLocalhost="true" ExcludeSelfHostname="true" ExcludeLocalDomain="true">localhost;%SimpleHostnames%;%ComputerName%;*.local; </ExclusionList> </Resolve> <Encryption mode="basic"/> <HttpProxiesSupport enabled="false"/> <HandleDirectConnections enabled="false"/> <ConnectionLoopDetection enabled="true"/> <ProcessServices enabled="true"/> <ProcessOtherUsers enabled="true"/> <BlockUDP443 enabled="false"/> </Options> <ProxyList> <Proxy id="100" type="SOCKS5"> <Address>127.0.0.1</Address> <Port>10808</Port> <Options>0</Options> </Proxy> </ProxyList> <ChainList/> <RuleList> <Rule enabled="true"> <Name>Localhost</Name> <Targets>localhost; 127.0.0.1; ::1; %ComputerName%</Targets> <Action type="Direct"/> </Rule> <Rule enabled="true"> <Name>v2ray</Name> <Applications>v2ray; xray</Applications> <Action type="Direct"/> </Rule> <Rule enabled="true"> <Name>Default</Name> <Action type="Direct"/> </Rule> </RuleList> </ProxifierProfile>
碎碎念
我现在使用的是 xray 作为流量出口,在 xray 中开放对应的 socks 流量入口后,在 Proxifier 中配置代理转发至 xray 的 socks 端口即可。
对于局域网内的其它设备,如果需要代理上网,则可以通过电脑的 socks 代理进行上网。
Proxifier 最主要的好处是代理足够 “下沉?”,它可以针对某个具体应用进行代理,可以很好控制代理的粒度。可惜只有 MacOS 和 Windows 版,如果 Linux 也有类似工具就好了。
Linux 一般我是用 Proxychains,但是还是没有 Proxifier 方便。