Charles & Shadowsocks 美完并存方案

Charles是一个抓包软件,想必大家使用的同时也非常头疼,常会发生Charles开启的情况下https无法使用或是npm、brew之类的工具无法下载。

Shadowsocks不用说了大家懂的,但可惜的是这个软件和Charles并不能共同使用,因为两者同样是使用代理的方式来进行网络请求或是抓取数据包的,但代理服务器只能有一台。

了解Shadowsocks的人就知道Shadowsocks有自动代理模式,该模式中只有部分请求会走ss进行代理而国内网站则不进行代理,而自动代理是使用的PAC文件,PAC文件使用的是js的语法非常简单,如果你了解PAC你就会发现他有多强大。

可惜的是最新版本的SS并不支持修改PAC逻辑,所以我fork了一份自己修改了一下地址在我的github你可以clone下来并查看如果你觉得麻烦可以直接在下载.

我在菜单里添加了编辑PAC用户脚本来实现对PAC的修改。

image.png

点开以后输入你想输入的逻辑

1
2
3
if (dnsDomainIs(host, 'xxx.com')||shExpMatch(url, "xxx.com/*")) {
return "PROXY 127.0.0.1:8888;";
}

判断你想要用charles抓取的域名,dnsDomainIs和shExpMatch是PAC两个内置的函数相信你已经知道如何使用。上面这个是关于Charles和SS并存的解决。

接下来你就可以解决我开头说的问题很简单关掉Charlse的全局代理。就是Mozilla FireFox Proxy上面的那个选项。这样就只有你在PAC中设置的域名会转到Charles的代理中如果你没有开Charles会走SS或直连这里要看你SS是如何配置的。这时候Charles只会抓取你设定的请求,所以你再使用npm之类的的便不会受到影响。


当然你也可以直接改SS的gfwlist.js文件在

1
2
3
4
5
6
7
8
function FindProxyForURL(url, host) {
var uproxy = UserCustomProxy(url, host);
if (uproxy) return uproxy + " " + proxy;
if (defaultMatcher.matchesAny(url, host) instanceof BlockingFilter) {
return proxy;
}
return direct;
}

里面添加你想要的逻辑,只是每次更新PAC你的修改需要重做。
当然这个文件的目录在当前的用户目录下有一个.Shadowsocks[-NG]的文件夹[]里面的内容是可选,在旧版本中没有-NG。


题外话关于PAC

这里只说MAC情况linux&windows类似,PAC是系统本身的自带功能与SS无关细心的朋友就会知道当你开启SS的情况下 打开网络偏好设置->高级->代理 你就会发现系统已经选中了自动代理且后面有一个地址 http://127.0.0.1:1089/proxy.pac 端口号可能有所不同,你可以把这127.0.0.1换成你电脑IP然后就可以在手机上设置自动代理。至于效果你应该已经明白了。

本文作者: Sanchew
Email: sanchew@mail.com