手把手教你科学上网系列之四:更漂亮的智能PAC!–Flora

相信不少筒子们看过了咱写的《手把手教你科学上网系列》已经能够得心应手地游刃与高墙内外。但是你们有没有发现我写的里面有一个智能pac的东西?这个东西是有缺陷的(至少我这么觉得呃),你们使用的这个东西来自于autoproxy2pac,它是一个精准记录被墙网站的数据库,由无数志愿者维护,网站收集完全依靠网民的撞墙经验,据说含3000多个网站,数量如此多,但被墙网站还是不可能都收集进去,当你上小众网站的时候,仍旧有可能撞墙。当然这个时候你也可以手工来添加,若你使用Firefox、Chrome等,添加不是问题,如果用的是其他的浏览器,那可能就悲剧鸟。

所以,虽然一棒子打死是不对,不过我想天朝就是这么做的,所以,Flora诞生了。如果你经常游走于国外服务器的各种小网站,或许它才是你的菜,它使用 Python 开发,能自动抓取 apnic.net 的 IP 数据,找出所有国内的 IP 地址段,生成能让浏览器自动判断国内外 IP 地址的 pac 文件,让代理用户有等价于 VPN + chnroutes 的翻墙体验。简单地说,就是所有国外网站,搭桥;所有国内网站,直连。

Flora_Pac 使用十分简单,兼容各种平台,所以不论是linux,还是lion,还是windows,统统可以。下面,咱们来说说使用方法。

#!/usr/bin/env python
#
# Flora_Pac by @leaskh
# www.leaskh.com, i@leaskh.com
#
# based on chnroutes project (by Numb.Majority@gmail.com)
#

import re
import urllib2
import argparse
import math

def generate_pac(proxy):
results = fetch_ip_data()
pacfile = ‘flora_pac.pac’
rfile = open(pacfile, ‘w’)
strLines = (
“// Flora_Pac by @leaskh”
“\n// www.leaskh.com, i@leaskh.com”
“\n”
“\nfunction FindProxyForURL(url, host)”
“\n{”
“\n”
“\n var list = [”
)
intLines = 0
for ip,mask,_ in results:
if intLines > 0:
strLines = strLines + ‘,’
intLines = intLines + 1
strLines = strLines + “\n [‘%s’, ‘%s’]”%(ip, mask)
strLines = strLines + (
“\n ];”
“\n”
“\n var ip = dnsResolve(host);”
“\n”
“\n for (var i in list) {”
“\n if (isInNet(ip, list[i][0], list[i][1])) {”
“\n return ‘DIRECT’;”
“\n }”
“\n }”
“\n”
“\n return ‘%s’;”
“\n”
“\n}”
“\n”%(proxy)
)
rfile.write(strLines)
rfile.close()
print (“Rules: %d items.\n”
“Usage: Use the newly created %s as your web browser’s automatic ”
“proxy configuration (.pac) file.”%(intLines, pacfile))

def fetch_ip_data():
#fetch data from apnic
print “Fetching data from apnic.net, it might take a few minutes, please wait…”
url=r’http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest’
data=urllib2.urlopen(url).read()

cnregex=re.compile(r’apnic\|cn\|ipv4\|[0-9\.]+\|[0-9]+\|[0-9]+\|a.*’,re.IGNORECASE)
cndata=cnregex.findall(data)

results=[]

for item in cndata:
unit_items=item.split(‘|’)
starting_ip=unit_items[3]
num_ip=int(unit_items[4])

imask=0xffffffff^(num_ip-1)
#convert to string
imask=hex(imask)[2:]
mask=[0]*4
mask[0]=imask[0:2]
mask[1]=imask[2:4]
mask[2]=imask[4:6]
mask[3]=imask[6:8]

#convert str to int
mask=[ int(i,16 ) for i in mask]
mask=”%d.%d.%d.%d”%tuple(mask)

#mask in *nix format
mask2=32-int(math.log(num_ip,2))

results.append((starting_ip,mask,mask2))

return results

if __name__==’__main__’:
parser=argparse.ArgumentParser(description=”Generate proxy auto-config rules.”)
parser.add_argument(‘-x’, ‘–proxy’,
dest = ‘proxy’,
default = ‘PROXY 127.0.0.1:8086’,
nargs = ‘?’,
help = “Proxy Server, examples: ”
“SOCKS 127.0.0.1:8964; ”
“SOCKS5 127.0.0.1:8964; ”
“PROXY 127.0.0.1:8964”)

args = parser.parse_args()

generate_pac(args.proxy)

将上面引用的部分复制下来写到一个新的文本文档里,直接保存为 flora_pac.py
然后运行就好了,当然,如果你是windows用户你可能需要去下载python运行库什么的XD
lion用户可能也需要下载吧,我忘记我以前因为什么反正是已经下载过了,所以,我直接点击右键选择打开方式,然后python启动器就好了。
运行之后,会这个脚本旁边生成一个全新的pac,这个就是我们将要使用的东西!哦,别心急,还得来设置设置。因为我们使用的是goagent,默认的端口与我们使用的不符,不过我已经预先改好了。
如果依旧不能用,请自行用文本模式打开这个pac,然把最后的

改为

如果你实在懒得改= =就请下载我刚刚生成的吧,时间差不多就是文章发布的日期了。
flora_pac.pac
(把这个 flora_pac.pac随手替换为之前你使用的那个pac就可以了。。。。。。)
(另外,这个pac来自这里,另外文章的部分内容还借鉴于这里。感谢他们。)

“手把手教你科学上网系列之四:更漂亮的智能PAC!–Flora”的一个回复

发表评论

电子邮件地址不会被公开。 必填项已用*标注