如何从磁力链接或 infohash 创建种子文件

Posted

技术标签:

【中文标题】如何从磁力链接或 infohash 创建种子文件【英文标题】:How to create torrent files from magnet link or infohash 【发布时间】:2018-10-18 11:53:17 【问题描述】:

我正在尝试创建一个种子搜索引擎。但是我找到了一种从DHT 网络收集种子信息哈希的方法。我的问题是如何从中提取 .torrent 文件? 我有一个 MongoDB 集合包含 1M-1.5M(Growing Very Quickly) 洪流信息哈希。

【问题讨论】:

不可能从 infohash 中提取 .torrent 文件。见:***.com/questions/48873300/… 我通过 webtorrent npm 包解决了。 我正在从同行下载种子文件。它解决了这个问题! 【参考方案1】:

我自己解决了这个问题。 我使用了 webtorrent npm 包,还创建了一个算法来循环整个数据库,并在下载任务中添加了磁力链接。客户端获取元数据后,我将其保存到 torrent 文件并取消下载。

好吧,代码还没有完全准备好生产。之后我会在这里发布代码片段。谢谢!

更新:我正在使用此类从磁铁下载 Torrent 文件

const Discovery = require('torrent-discovery');
const Protocol = require('bittorrent-protocol');
const ut_metadata = require('ut_metadata');
const addrToIPPort = require('addr-to-ip-port');
const net = require('net');

class TorrentDownloader 
  constructor(port, trackers, timeout) 
    this.SELF_HASH = '4290a5ff50130a90f1de64b1d9cc7822799affd5';
    this.port = port | 6881;
    this.trackers = trackers;
    this.timeout = timeout | 80000;
  

  downloadTorrent(infoHash) 
    let self = this;
    return new Promise((resolve, reject) => 
      let dis = new Discovery(infoHash: infoHash, peerId: this.SELF_HASH, port: this.port, dht: true, announce: this.trackers)
          .on('peer', function (peer) 
            const peerAddress = address: addrToIPPort(peer)[0], port: addrToIPPort(peer)[1];
            // console.log(`download metadata from peer $peerAddress.address:$peerAddress.port`);
            self.getMetadata(peerAddress, infoHash, resolve);
          );
      setTimeout(() => 
        dis.destroy();
        reject(new Error("Torrent Timeout"))
      , this.timeout)
    )
  

  getMetadata(peerAddress, infoHash, resolve) 
    const socket = new net.Socket();
    socket.setTimeout(this.timeout);
    socket.connect(peerAddress.port, peerAddress.address, () => 
      const wire = new Protocol();

      socket.pipe(wire).pipe(socket);
      wire.use(ut_metadata());
      wire.handshake(infoHash, this.SELF_HASH, dht: true);
      wire.on('handshake', function (infoHash, peerId) 
        wire.ut_metadata.fetch();
      );
      wire.ut_metadata.on('metadata', function (rawMetadata) 
        resolve(rawMetadata);
        wire.destroy();
        socket.destroy()
      )
    );
    socket.on('error', err => 
      socket.destroy();
    );
  


module.exports = TorrentDownloader;

【讨论】:

【参考方案2】:

仅给出一个信息哈希,例如:

463e408429535139a0bbb5dd676db10d5963bf05

你可以使用:

BEP: 9 - Extension for Peers to Send Metadata Files

此扩展的目的是允许客户端加入群并完成下载,而​​无需先下载 .torrent 文件。相反,此扩展允许客户端从对等点下载元数据。它可以支持磁力链接,网页上的链接仅包含足够的信息以加入群(信息哈希)。

您使用 DHT 查找分布式跟踪器。 然后,您使用分布式跟踪器查找拥有种子的节点。 然后您可以从对等点下载 torrent 元数据

您将经过编码的元数据请求发送给对等方:

 
   "msg_type": 0,      ; 0==>request
   "piece": 0

【讨论】:

以上是关于如何从磁力链接或 infohash 创建种子文件的主要内容,如果未能解决你的问题,请参考以下文章

磁力链接与BT种子互转工具怎么用?使用方法

怎么在电脑上搜电影磁力链接

bt下载和磁力下载的文件是存在哪里的呢?怎么新建bt文件呢?

《迅雷》磁力种子BT链接搜索网站大全

如何把BT种子转换为磁力连接?最好是安卓手机的转换方法。

怎样在迅雷使用磁力链接下载文件?