现在的位置: 首页 > 综合 > 正文

用Bittorrent和PHP搭建BT Tracker服务器和发布页

2013年08月22日 ⁄ 综合 ⁄ 共 2769字 ⁄ 字号 评论关闭

这玩意可真是困扰了我好几天,终于基本搞定了。

很早前就想整个BT服务器玩玩,一直都是最后半途而废。这次总算是把整个过程都弄明白了,其实根本就不是什么难事情,就是资料太难找了,在GOOGLE搜的关于架设BT服务器的文章还是几年前的那几篇老掉牙的文章,英文又菜得不得了,看文章得用星际译霸一个个翻译。搞得头大了好几天。

现在国内网络
比较常见的track主要是Bitcomettrack,94BT,还有个btmas,全都不开源,当然也就不在我的选择范围之内了


国外网络上的track主要是bittorrent,BNBT,还有一些完全用PHP做的tracker.

Bittorrent是最原版的BT track了,虽然除了一个 track的功能,但是你可以在上面做很轻易的扩充,也是我的最终选择。

BNBT是用C++编写的track,还带了PHP的发布页面,但感觉发布系统做得太粗糙了,本来想拿过来改一下,看了看代码发现C的部分把很多功能都已经包括进去了,也懒得去研究它的代码,于是作罢。

至于纯粹用PHP做的tracker和发布系统,经过连续几天在sf.net 上的搜索,找到了一个非常优秀的,BT系统 :Tbsource 。做的超级优秀!其功能齐全程度几乎相当于一个论坛了,看了下代码,好象主要是通过把种子和连接信息写入MYSQL种来实现的,种子信息还好,但是连接信息是时刻在变化的,这样对数据库的操作会不会太频繁了?可能是我没完全看懂它的原理。我经常上的www.filemp3.org
和bmtorrents.net就是用Tbsource作的,速度和稳定性都很好啊!但是正因为T bsource做的太完善了,我都不知道
如何去修改。以后有时间再详细研究下,把其中核心的部分抽出来作成DISCUZ的BT插件,应该是个好主意。
最后还是回到了bittorrent,就用个 tracke就可以了,自己用PHP写个BT发布索引页,应该很简单,省得去研究别人得代码。

安装 Bittorrent

#apt-get install bittorrent

启动 track

#bttrack –dfile downloadlogfile.txt –port 8099
意思就是启动TRACKER,并在当前目录建立日志文件, downloadlogfile.txt ,设置端口为8099

以折种方式启动 tracker的话是不论谁都可以拿你的 tracker做服务器的,如果你想限制只允许上传到本站的种子才能用该服务器的话,可以用下面这种方式启动。

#bttrack –port 8099 –show_names l –allowed_dir /mytorrents –dfile downloadlog.txt

这样的话就只对已经上传到本站/mytorrents目录下的种子提供track服务。

track这样就 可以以了,下面的问题就是如何编写发布系统了

思路很简单,上传BT种子到制定的目录,分析BT种子文件,获得文件名,文件大小等信息并插入数据库,这些信息都是很好搞定的。难搞定的是做种人数目,下载人数等信息
,这些数据都是即时的。是直接通过track插入数据库好还是通过PHP 定时查询tracker再在索引页面现实。通过track直接插入数据库的效率肯定要高一点,但觉得这样的即时信息有必要做这样平凡的插入工作么,还不如通过PHP定时查寻track并生成静态页面现时出来。


OK暂时就这么干了!

首先是BT种子文件的分析问题 ,网络上有牛人用PHP编写的两个流传甚广的种子解析文件,

BDecode.php 和BEncode.php.

把这两个文件 include 后

$array=BDecode(path/to/you/down.torrent);

$array返回的是你种子文件信息的数组。

其中$array[”announce-list”]是该种子使用的 tracker 列表

$infohash=sha1(BEncode($array[”info”] )返回数组的 hash信息(hash要用sha1()解码)

$filesize=$array[”info”][”length”]/1048576返回文件大小

如果是用文件夹做的种子,可以通过下面的方法来获得文件大小


获得文件名:$filename
= $array[”info”][”name”]


把上面的种子信息整理下就可以放到数据库里面去了

接下来的问题就是BT的即时信息的获得问题啦。

这些信息可以通过向BT服务器发送GET请求来获得

例如假如你用 bittorrent track 的地址是 http://www.mybt.com:8099/announcd

那么你应该向这个地址发送请求:http://www.mybt.com:8099/scrape

要取得一个种子的信息你需要提供种子的info_hash(这在我们分析种子信息时已得到了)

例如: http://www.mybt.com:8099/scrape?info_hash=……………..

一开始我不管怎么样都没办法取回返回信息,在网上逛了好几天才找到答案

原来在分析种子时得到的info_hash 不能直接用与发送GET请求,还需要经过unicode编码

算法如下:

php种可以通过函数很简单得实现

$s = ‘4686AA54744019E3B44C6E8F5E90F47F3E8E87F8′;

$t = pack(’H*’, $s);

$url_hash=urlencode($t);

ok 现在就可以向track 发送请求了。

require_once (”BEncode.php”);

require_once (”BDecode.php”);

$info = BDecode(file_get_contents(”http://www.mybt.com:8099/scrape?info_hash=”.$url_hash));

返回来的$info是一个数组,我们可以从中取得想要的信息

例如:

完成数:$info[’files’][0][’complete’];《/破》

下载数:$info[’files’][addslashes(hex2bin($hash))][’incomplete’];

其中 hex2bin()是一个16进制转2进制的函数,网上有很多的。

核心内容就这么多,扩展起来就很简单了,可以就做一个索应页面,也可以做个强大的发布系统。

这里有一篇比较详细的结合MYSQL 的代码

http://www.norskwebforum.no/pastebin/976

完!


转自疯狂小强的博客
原文地址:
http://my.donews.com/xiaoqiang/2
... %e9%a1%b5%e3%80%82/

http://my.donews.com/xiaoqiang/2
... %e4%b8%8b%ef%bc%89/

抱歉!评论已关闭.