【问题标题】:UDP tracker scrape request returns zero for all hashesUDP 跟踪器抓取请求为所有哈希返回零
【发布时间】:2016-06-09 17:18:34
【问题描述】:

我成功连接到跟踪器。连接建立后,我请求抓取。 Tracker 以正确的字节顺序返回响应,但种子的 (Seeder, Leecher, Completed) 信息始终为零,这看起来很愚蠢。

我怀疑哈希信息编码有问题,但我想不出解决方案。我使用以下 python 代码块进行抓取。

import os
import bencode
import struct
import socket
import urlparse
import binascii


def loadFile(f_name):
    user_home = os.path.expanduser('~')
    path = user_home+'/completetorrent/data/'+ f_name
    return open(path,'rb')

def getSocket():
    sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
    sock.settimeout(8)
    return sock

def getConnection(url):
    parsed = urlparse.urlparse(url)
    hostname = socket.gethostbyname(parsed.hostname)
    port = parsed.port
    return (hostname,port)

def main():
    f = loadFile('test1.torrent')
    decoded = bencode.bdecode(f.read())

    #Connect request starts
    buff = ''
    buff += struct.pack('!q',0x41727101980)
    buff += struct.pack('!i',0)
    buff += struct.pack('!i',123456789)

    sock = getSocket()
    conn = getConnection("udp://tracker.coppersurfer.tk:6969/announce")
    sock.sendto(buff,conn)

    #Connect Response starts
    response = sock.recvfrom(4096)[0]
    assert len(response) == 16, 'response len must be bigger than 16 but %d' % len(response)
    if struct.unpack('!i',response[0:4])[0] != 0:
        raise ValueError('Bad response')
    struct.unpack('!i',response[4:8]) #ignore transaction id

    #Scrape request starts  
    con_id = struct.unpack('!q',response[8:16])[0]
    buff = ''
    buff += struct.pack('!q',con_id)
    buff += struct.pack('!i',2)
    buff += struct.pack('!i',123456)
    hash_ = decoded['info']['pieces'][0:20]
    buff += struct.pack('!20s',hash_)
    sock.sendto(buff,conn)

    #Scrape response starts
    response = sock.recvfrom(4096)[0]

    if struct.unpack('!i',response[0:4])[0] != 2:
        raise ValueError('Bad scrape response')

    struct.unpack('!i',response[4:8]) #ignore transaction id
    seedrs = struct.unpack('!i',response[8:12])
    completed = struct.unpack('!i',response[12:16])
    leechers = struct.unpack('!i',response[16:20])

    print seedrs,completed,leechers

【问题讨论】:

  • 尝试使用正常工作的 bittorrent 客户端并使用 wiresharke 捕获流量。然后对您的代码执行相同的操作并进行比较。
  • 尝试发布请求。并非所有跟踪器都支持抓取请求。

标签: python udp bittorrent torrent


【解决方案1】:

将 info_hash 转换为十六进制值。

【讨论】:

    猜你喜欢
    • 2013-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多