关于种子hash以及iyuu和reseedpuppy辅种原理的说明
今天无意中看到reseedpuppy的作者半仙大佬也在坛子里,赶紧去关注下,顺便看了下大神的帖子.55楼大神耐心的解释了iyuu和puppy辅种原理的不同,
原理并不同,iyuu是基于种子hashinfo然后我在大卫爬的种子库检索,而我的基于pieceshash,用的np官方接口查询,不会漏,只是站点不会有iyuu那么多,属于相辅相成工具
对此,我有不同的看法. 鉴于此,写下本篇文章,给大家普及一下种子hash方面的知识,以及对于这两个国产辅种工具原理的推测. 先说结论把, iyuu肯定不是用的info hash,不然不会有辅出来那么多错种.
先举个种子:
鬼神童子
okpt版本的, 这个种子牛逼在除了官种是OKWeb结尾的,其他辅种都是OKPT结尾.
首先我们看下通常我们看到的种子hash是怎么回事,也就是qb里你看到的torrent hash是怎么来的,这里咱们用python库算下,需要使用库bencodepy,
[bencodepy]https://pypi.org/project/bencode.py/
简单写个代码:
import os
import bencodepy
import hashlib
import shutil
import time
from datetime import datetime
def getTorrentInfo(file_path):
bc = bencodepy.Bencode(
encoding='utf-8'
)
with open(file_path, 'rb') as f:
meta_info = bencodepy.decode(f.read())
#print(meta_info[b'info'][b'name'].decode('utf-8'))
info_hash = hashlib.sha1(bencodepy.encode(meta_info[b'info'])).hexdigest()
#print(meta_info[b'info'][b'source'].decode('utf-8'))
name = ''
announce =''
source = ''
length = 0
files = []
if( b'name' in meta_info[b'info']):
name = meta_info[b'info'][b'name'].decode('utf-8')
if(b'announce' in meta_info):
announce = meta_info[b'announce'].decode('utf-8')
if( b'source' in meta_info[b'info']):
source = meta_info[b'info'][b'source'].decode('utf-8')
if(b'length' in meta_info[b'info']):
length = meta_info[b'info'][b'length']
if(b'files' in meta_info[b'info']):
for file in meta_info[b'info'][b'files']:
if b'length' in file:
item_length = file[b'length']
length += item_length
if b'path' in file:
pathes = []
for path in file[b'path']:
pathes.append(path.decode('utf-8'))
files.append({"path": pathes, "length": item_length})
#print(f'{name} {source} {announce} {length} {len(files) if len(files) > 0 else 1}')
hash = hashlib.sha1(bencodepy.encode(meta_info[b'info'])).hexdigest()
print(hash)
getTorrentInfo("D:\\users\\ava\\Downloads\\[OKPT].鬼神童子.ZENKI.1995.S01.4K.WEB-DL.H.264.AAC-OKWeb.torrent")
getTorrentInfo("D:\\users\\ava\\Downloads\\[(๐•ᴗ•๐)]鬼神童子.ZENKI.1995.4K.Bilibili.WEB-DL.H.264.AAC-OKPT.torrent")
getTorrentInfo(""D:\\users\\ava\\Downloads\\[BUG].鬼神童子.ZENKI.1995.4K.Bilibili.WEB-DL.H.264.AAC-OKPT (1).torrent"")
if(window.hljsLoader && !document.currentScr(๐•ᴗ•๐).parentNode.hasAttribute('data-s9e-livepreview-onupdate')) {
window.hljsLoader.highlightBlocks(document.currentScr(๐•ᴗ•๐).parentNode);
}
返回结果如下:
PS D:\test1> python .\getTorrentInfo.py
okpt
a8bf227c5e57889b739e28d744aa3f5db1c26752
(๐•ᴗ•๐)
18ab7aabda85c5ce3de9130f35d26353bbf3ca9c
bug
5bfb45b179619c86090aff5830c9b34522a64d1b
if(window.hljsLoader && !document.currentScr(๐•ᴗ•๐).parentNode.hasAttribute('data-s9e-livepreview-onupdate')) {
window.hljsLoader.highlightBlocks(document.currentScr(๐•ᴗ•๐).parentNode);
}
是不是跟qb里种子显示的torrent hash一摸一样, 这个就是通常所说的info_hash.
(๐•ᴗ•๐)跟青虫的种子是一样的,但info_hash不一样.
用bencode editor打开okpt的种子,先看下种子信息结构吧:
我这里是把info字段sha1,这个也是iyuu提交的种子hash.种子的announce是不参与hash的.
name是就是咱们看到的下载文件夹名,如果是单个文件,就是文件名, 一般辅种出错,就是有人改了这个值.
files这个, 多文件才会出现,单个文件就是length
pieces是数据按照块划分的hash信息,常说的pieces_hash就是对该段进行sha1 hash。
piece length是块的大小
source是发布站点名
这里说下source这个,如果source一样,那么所有种子hash值就一样, 谈不上辅种了,加到qb就会提示种子已存在,要不要合并tracker.
piceces_hash其实就是上面pieces这段的hash值.
我们经常见到qb里刚添加种子时,有个fast resume check,就是根据这个length,或者files下所有item.length合计 ,先判断硬盘上的所有文件大小是否符合, 再根据files或name(单文件情况下)判断文件是否存在,如果通过, 要么转到暂停状态,要么进行完全校验.
有了上面这些知识,咱们应该知道, 如果多文件改了目录名而不改动里面的文件, pieces_hash值是不会变的,iyuu经常辅错,所以他应该也是基于pieces_hash来辅种的.,而半仙大佬之所以这么说,应该是开放pieces_hash接口的都是小站,或者半仙大佬的种子池比较纯净.
在此,在半仙大佬面前班门弄斧啦, 先道个歉.