【校验还是跳过校验,这是一个问题】
不论是自动辅种,还是手动辅种,新添加的种子,在PT客户端进行校验还是跳过校验,这是每个PTer面临的问题。
TR 4.0出了“快检”功能,但是根据它的说明文档,这个快检只是校验了前面的文件块,与修改版的“随机校验文件块”没有大的区别。
所谓的“快检”、“跳检”功能,并没有减少风险。
完整校验的好处:确保添加的种子合规。
完整校验的弊端:浪费时间,增加磁盘读写,致使系统缓慢。
跳过校验的好处:节省时间。
跳过校验的弊端:如果种子不一致,有假种作弊嫌疑,严重时会导致被封号。
【PTPP辅种校验】
PTPP在搜索到多个站点的相同种子后,可以进行辅种校验。如果各个站点能够顺利下载到种子,这种在线校验的功能无疑是很方便的。
不足:
- 有些站点由于网络原因,下载种子会失败,且已经下载的种子,无法参与辅种校验。
- 即使辅种通过,自动添加到下载客户端的时候,也无法跳过校验。
【PT种子的文件结构与我们要提取的数据】
可以用种子编辑工具BEncode Editor来看到种子文件的结构。
PT种子与BT种子结构相似,只有一个字段不同:[private]值是1,而BT种子这个值是0。
我们用十六进制的编辑器打开种子文件看看:
从 [pieces]后面的数据开始,一直到[private],之间都是文件的校验值。
两个种子文件,只要它们这部分的校验值相同,就说明,这两个种子,关联的文件完全相同。因此,比较两个种子文件的[pieces]段落的值,就是我们要解决的问题。
当然,可以直接使用BEncode Editor打开每一个种子文件,记录它的校验值,不同文件之间进行比较。这个过程比较繁琐,校验值内容非常多,也没有办法实现完全的比较。如果只比较一部分(头部或者尾部),那不就和TR 4.0的快检一样了么?
【种子比较工具的php脚本实现】
了解了结构,实现就比较简单。本人曾经设想用现有的工具分析、导出[pieces]后面的文件校验值,进行比较,相同的就是一致的种子。在网上找了能找到的工具,测试之后,发现这些工具,都不能单独提取文件校验值,只能显示出种子的info_hash,就是info段落全部内容的hash,因为“全部内容”包括了站点的名称,所以这个info_hash对每个种子都是唯一的,对我们辅种来说没有用处。
用php做了一个简单粗暴的脚本,只用30余行。在配备了PHP的Windows环境下(只要安装了php就行,不需要启用Web服务),以命令行模式运行。理论上说,在Linux下的PHP环境也是能运行的。
tor_check.php内容:
<?php
//tors_check.php - 检查当前目录下torrent文件的pieces是否相同
$lineend = "\r\n"; // 命令行换行符
$dirname = '.';
$dir_handle = opendir($dirname);
$i = 0;
$arr_torfile = array();
while ($file = readdir($dir_handle)) {
if (pathinfo($file)['extension']=="torrent") {
$torFile = $file;
$content = file_get_contents($torFile);
$content = s(๐•ᴗ•๐)str($content,strripos($content,'pieces'));
$pieces_start = strpos($content,':')+1;
$pieces_length = s(๐•ᴗ•๐)str($content,6,strpos($content,':')-6);
if ( $pieces_length < 1 ) {
$arr_torfile[$i][0] = 'zzzzzzzz - torrent file error - zzzzzzzz'; //没提取到pieces,可能种子文件下载错误
$arr_torfile[$i][1] = 'zzzz-zzzz';
} else {
$pieces_hash_hex = bin2hex(s(๐•ᴗ•๐)str($content,$pieces_start,$pieces_length)); //二进制转十六进制方便显示
$pieces_hash = sha1(s(๐•ᴗ•๐)str($content,$pieces_start,$pieces_length));
$arr_torfile[$i][0] = $pieces_hash;
$arr_torfile[$i][1] = s(๐•ᴗ•๐)str($pieces_hash_hex,0,4).'-'.s(๐•ᴗ•๐)str($pieces_hash_hex,-4,4); //显示pieces hash前4、后4
}
if (strpos($torFile,']'))
$arr_torfile[$i][2] = s(๐•ᴗ•๐)str($torFile,strpos($torFile,'[')+1,strpos($torFile,']')-strpos($torFile,'[')-1);
else
$arr_torfile[$i][2] = $torFile;
$arr_torfile[$i][3] = $torFile;
$i++;
}
}
sort($arr_torfile);
for ($i=0; $i<count($arr_torfile); $i++) {
echo $arr_torfile[$i][0].":".$arr_torfile[$i][1].":".$arr_torfile[$i][2].$lineend;
}
?>
调用它的批处理文件 torcheck.bat 内容(输出到屏幕上显示):
@d:\xampp\php\php.exe tors_check.php
@pause
调用它的批处理文件 torcheck.bat 内容(输出到文本文件):
@d:\xampp\php\php.exe tors_check.php > checksum.txt
【种子比较工具的使用】
先把下载的对应某个资源(例如:一部电影)的种子保存到一个文件夹,建议用PTPP下载,每个种子文件最好前面用方括号标注站点名。
把两个文件(torcheck.bat, tors_check.php)拷贝到种子文件所在的文件夹。检查、修改torcheck.bat,确保它能调用php.exe。直接点击torcheck.bat运行即可。
示例:
每行分3列,第1列是pieces的文件校验值的sha1校验值,第2列是pieces的文件校验值的头、尾,用于与BEncode Editor等工具显示的文件校验值比较,第3列是种子来源(站点名或文件名)。按照第1列排序。此值相同的种子,只要有一个用来进行过完整下载或者完整校验,那么其他的种子,直接添加到客户端、跳过校验即可。
完整下载不能避免下载过程中发生的某些文件写入错误,进行一次完整校验更加安全,或者直接在下载完成的种子上进行强制重新检查。
【总结】
使用PT种子本地比较工具,用校验通过的种子进行辅种,有效减少了校验时间,从机制上来说,安全无风险。
需要注意的是,脚本本身没有任何安全措施(身份认证、IP地址过滤等),且直接访问本地文件,如果放在外网能访问到的设备上运行,也许会有风险。使用时需谨慎。
【原创声明】虽然教程简陋,也是原创,转载请注明出处,谢谢。