Chrome 自某个版本开始,移除了对 pac file://
URL 的支持,至此只剩下 HTTP 能用了。本地 pac 文件用不了,还得给丢到 http 服务上,单独部署维护多麻烦,那么就写个本地专用的 pac 服务器好啦!
系统代理设置 PAC 脚本,用以自动分流浏览器和套壳浏览器应用的请求,爬墙好手大概对这个操作都很熟悉。pac 本身只是个简单的 js 脚本,系统设置里写好地址,浏览器就会拿普通 http 去请求到 pac。至于拿 gfwlist 自动生成 pac、自动更新等等操作,早在 ss 时代就已集成了。
自转向使用 v2ray 后,我只使用 v2ray-core 一个 exe 后台运行代理,它本身没有 pac 相关功能,所以我原本会在本地放一份 pac 文件,然后系统代理设置的脚本地址手动写成 file:///c/users/auto.pac
的形式,让浏览器直接访问本地文件。chrome/chromium 移除 file://
的支持后,图方便我把 pac 丢到了本网站服务器上,能用但是延迟高,导致打开国内网站都会经常卡住,一直在等 pac 请求完。直到今天 ———— 忍不了造个轮子出来啦!
程序很简单,就一个 pacserver.exe
,把 pac 文件命名成 autoproxy.pac
后放到跟 pacserver.exe
同一个文件夹里。运行以后,pac 地址固定为 http://127.0.0.1:9123/autoproxy.pac
,设置成系统自动代理地址。至于启动,可以跟 v2ray.exe
一样,用 vbs 脚本后台运行:
createObject("WScript.Shell").Run "c:\v2ray\pacserver.exe",0
pacserver.exe
点此下载,使用 Python3.7 编写,PyInstaller 打包,所有源码如下,五十行不到就搞定咯:
import http.server
import os
PACFILE_NAME = 'autoproxy.pac'
PACFILE = None
PORT = 9123
def prepare_pac():
global PACFILE
dir = os.path.dirname(os.path.abspath(__file__))
os.chdir(dir)
with open(PACFILE_NAME, 'rb') as f:
PACFILE = f.read()
class PacRequestHandler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
if self.client_address[0] not in ('::1', '127.0.0.1', 'localhost'):
return
if self.path != '/' + PACFILE_NAME:
return
self.send_response(200)
self.send_head()
self.wfile.write(PACFILE)
def main():
prepare_pac()
http.server.ThreadingHTTPServer(("127.0.0.1", PORT), PacRequestHandler).serve_forever()
if __name__ == '__main__':
main()