当前位置: 首页 > 工具软件 > LibTorrent > 使用案例 >

P2P-libtorrent python examples

齐俊贤
2023-12-01

 下面这段python是基于libtorrent.pyt写的demo,通过torrent文件下载。

 

import libtorrent as lt
import sys
import time
import scraper

def create_peerlist_data(peer_info):
    peer_dict = {}

    peer_dict['id'] = peer_info.pid
    peer_dict['extended_version'] = peer_info.client
    peer_dict['ip'] = peer_info.ip[0]
    peer_dict['port'] = peer_info.ip[1]
    # optimistic_unchoke = 0x800 seems unavailable in python bindings
    peer_dict['optimistic'] = bool(peer_info.flags & 2048)
    peer_dict['direction'] = 'L' if bool(peer_info.flags & peer_info.local_connection) else 'R'
    peer_dict['uprate'] = peer_info.payload_up_speed
    peer_dict['uinterested'] = bool(peer_info.flags & peer_info.remote_interested)
    peer_dict['uchoked'] = bool(peer_info.flags & peer_info.remote_choked)
    peer_dict['uhasqueries'] = peer_info.upload_queue_length > 0
    peer_dict['uflushed'] = peer_info.used_send_buffer > 0
    peer_dict['downrate'] = peer_info.payload_down_speed
    peer_dict['dinterested'] = bool(peer_info.flags & peer_info.interesting)
    peer_dict['dchoked'] = bool(peer_info.flags & peer_info.choked)
    # snubbed = 0x1000 seems unavailable in python bindings
    peer_dict['snubbed'] = bool(peer_info.flags & 4096)
    peer_dict['utotal'] = peer_info.total_upload
    peer_dict['dtotal'] = peer_info.total_download
    peer_dict['completed'] = peer_info.progress
    peer_dict['have'] = peer_info.pieces
    peer_dict['speed'] = peer_info.remote_dl_rate
    peer_dict['country'] = peer_info.country
    peer_dict['connection_type'] = peer_info.connection_type

    # add upload_only and/or seed
    peer_dict['seed'] = bool(peer_info.flags & peer_info.seed)
    peer_dict['upload_only'] = bool(peer_info.flags & peer_info.upload_only)

    return peer_dict

ti = lt.torrent_info("mytorrent.torrent")

print ti.info_hash()
for f in ti.files():
    print f.path
if ti.num_files() > 1:
    print(ti.name() )
else:
    print(ti.name())

hashlist = [str(ti.info_hash())]

try:
    res = scraper.scrape( 'http://127.0.0.1:6969/announce',hashlist)
except:
    print('scrape failed.')

print res

ses = lt.session()
ses.listen_on(6881,6891)
#ses.start_dht()

h = ses.add_torrent({'ti':ti, 'save_path': 'F:/torrent/download'})

if h.has_metadata():
    print 'torrent handler has metadata'

h.set_max_connections(10)

#h.scrape_tracker()

alive = True

while True:
    print 'running'
    alerts = ses.pop_alerts()
    for a in alerts:
        print "\r[%s] %s" % (type(a), a.__str__())
        if isinstance(a, lt.scrape_reply_alert):
            print '\rscrape_reply_alert'

        if isinstance(a,lt.scrape_failed_alert):
            print '\rscrape_failed_alert'
        

    if not h.is_seed():
        s = h.status()
        state_str = ['queued', 'checking', 'downloading metadata', \
                 'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
        print('\r%.2f%%  complete(down: %.1f kb/s up: %.1f kB/s  peers: %d) %s ' %  \
          ( s.progress * 100, s.download_rate / 1000, s.upload_rate /1000, s.num_peers, state_str[s.state]))
    time.sleep(1)


'''
while not h.is_seed():
    s = h.status()
    peerlist = h.get_peer_info()

    for p in peerlist:
        peer = create_peerlist_data(p)
        out = "%s ip:%s port:%s uprate:%s dwnrate:%s progress:%s seed/ul:%s/%s>> " \
              % (str(s.info_hash), peer['ip'], peer['port'], peer['uprate'], peer['downrate'],
                 peer['completed'], peer['seed'], peer['upload_only'])
        if peer['uinterested']:
            out += "INTERESTED in us |"
        if peer['uchoked']:
            out += "CHOKED on US |"
        if peer['dinterested']:
            out += "we are INTERESTED |"
        if peer['dchoked']:
            out += "we CHOKED him |"

        print out

    state_str = ['queued', 'checking', 'downloading metadata', \
                 'downloading', 'finished', 'seeding', 'allocating', 'checking fastresume']
    print('\r%.2f%%  complete(down: %.1f kb/s up: %.1f kB/s  peers: %d) %s ' %  \
          ( s.progress * 100, s.download_rate / 1000, s.upload_rate /1000, s.num_peers, state_str[s.state]))

    sys.stdout.flush()

    time.sleep(1)
'''

print h.name(), 'complete'
ses.remove_torrent(h)

Reference:

https://pypi.org/project/bcode/                      #bcode库

https://github.com/erindru/m2t/blob/master/m2t/scraper.py      # 独立scrape库

https://pypi.org/project/dispatcher/#files   #dispatcher  事件发送库

https://www.rasterbar.com/products/libtorrent/manual.html#big-number   #libtorrent API说明文档

 

 类似资料: