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

时间:2018-10-18 11:53:17

标签: node.js mongodb torrent

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

2 个答案:

答案 0 :(得分:0)

我自己解决了这个问题。 我使用了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;

答案 1 :(得分:0)

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

  • 463e408429535139a0bbb5dd676db10d5963bf05

您可以使用:

BEP: 9 - Extension for Peers to Send Metadata Files

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

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

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

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