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




    引用地址: