对cow stat文件的一些处理

最近使用了一段时间cow来试验翻墙,这个软件的好处是可以自动检测网站是否需要翻墙,默认直连,对于需要翻墙的网站再通过代理访问。具体的检测技术包括链接重置、服务器读超时等技术。客户端所有访问的域名会记录在.cow/stat这个文件中。由于场景需要,我需要解析这个文件,并对其中的域名进行dns解析,并获取其ip归属地,这里用一个简短的python程序来实现。

  • stat这个文件中的数据以json的格式存放,需要使用json模块来处理。
  • 对于dns解析,使用dnspython这个模块。
  • ip归属地则使用ipip.net提供的免费REST API来查询。

代码如下,具体见注释。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import json
import dns.resolver
import urllib2,time,sys
stat = open('my.stat','rU') #打开cow的stat文件
data = json.load(stat)
keydict = data[u'site_info'].keys() #获取所有的site
result = []
logfile = open('stat.parse.log','w') #输出结果保存在stat.parse.log文件中
def log_output(str,flag=False):
logfile.write(str)
if not flag:
print str
logfile.write('\n')
else:
print str,
for site in keydict:
val = int(data[u'site_info'][site][u'direct']) #统计可以直连的网站,即未被和谐的网站
# if val >= 100:
result.append((val,site))
for item in sorted(result,reverse=True): #按照递减顺序排序
feq = item[0] #网站访问频率
domain = item[1] #站点名
log_output('Site = %-s \t Frequency = %-3d' % (domain,feq))
try:
ans = dns.resolver.query(domain,'A') #A记录解析
log_output('A record of this site is:')
for ip in ans.rrset:
log_output('\t'+str(ip),True)
location=urllib2.urlopen('http://freeapi.ipip.net/'+str(ip)) #HTTP GET
log_output(location.read())
time.sleep(1) #免费API的速率限制
except KeyboardInterrupt: #用户中断
print 'User interrupt.\n'
logfile.close()
exit(1)
except:
log_output('Error on %-s' % (domain))
continue
print '\n'
logfile.close()
exit(0)

运行的结果如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Site = live.bilibili.com Frequency = 95
A record of this site is:
61.160.239.158["中国","江苏","常州","","电信"]
58.220.29.21["中国","江苏","扬州","","电信"]
Site = lc53.dsr.livefyre.com Frequency = 95
A record of this site is:
54.88.106.195["美国","弗吉尼亚州","阿什本","","amazon.com"]
Site = kwflvcdn.000dn.com Frequency = 95
A record of this site is:
49.79.232.224["中国","江苏","南通","","电信"]
221.230.141.78["中国","江苏","泰州","","电信"]
218.92.209.74["中国","江苏","盐城","","电信"]
218.92.209.100["中国","江苏","盐城","","电信"]
221.229.167.47["中国","江苏","徐州","","电信"]

如果您觉得这篇文章对您有帮助,不妨支持我一下!