2009-11-10
python取BT种子的hashinfo - [python]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://bbayou.blogbus.com/logs/50863708.html
折腾了1天,BT果然是变态,名副其实。
BT是python编写,他的种子文件时以Bencoding编码格式编码,具体如下
无论是web服务器提供的那个.torrent文件,还是peers和trackers进行的信息交互,都是基于Bencoding格式的。
1 字符串:首先是字符串长度,然后是一个:号,接着是串内容,比如5:hello,就是指hello这个字符串。
2 整数:以“i”开头(int的意思),然后是十进制数字,最后是一个“e”结尾,如i3e表示3,i-3e表示-3,i0e表示0,i-0e是非法的。
3 列表:以“l”开头(list的意思),以“e”结尾。比如 l5:hello5:worldi1234ee 代表 ["hello","world",1234]
4 字典:以“d”开头(dictionary),以“e”结尾。比如 d3:cow3:moo4:spam4:eggse,则代表{"cow":"moo", "spam","eggs"}
这里,我们要取的info是种子文件里‘字典’info后面的所有(包括d,到最后的包括e),很长一串。
最开始写了一个PHP脚本,只是分析的种子文件,只是把种子文件里的数据用数组的形式显,然后用函数sha1(),结果得到的hashinfo不正确。崩溃ing
后来google了下,发现用python比较靠谱,因为有现成的模块,代码如下:
#! /usr/bin/python
ffrom sys import *
from bencode import *
import hashlib
mySha1 = hashlib.sha1() //新建对象
if len(argv) != 2:
print "ERROR: use ./hash_info.py filename"
exit(2)
filename = argv[1]
metainfo_file = open(filename, 'rb')
try:
metainfo = bdecode(metainfo_file.read())
except ValueError:
print "ERROR: Not a valid torrent file"
exit(1)
metainfo_file.close()
info = metainfo['info'] //取列表的info
hahaha = bencode(info) //取torrent的info
mySha1.update(hahaha)
mySha1_Digest = mySha1.hexdigest()
print mySha1_Digest //得到info sha加密后的数据!!
---------------------------------------------------------------------
注意:在linux下自带的python里没有hashlib模块,和bencod模块
需要下载安装,hashlib http://code.krypto.org/python/hashlib/
bencod需要下载BitTorrent源码,或者下载单独文件:http://www.pinking.net.cn/scrip/bencode.py,跟脚本程序放在同一目录下即可
随机文章:
收藏到:Del.icio.us







