blueslmjandClaude Opus 5 0e85433a5d feat: 多站点磁力搜索工具(网页版 + 命令行)
聚合 TPB(apibay) / therarbg / knaben / EZTV 四个站点的 JSON API,
按 infohash 跨站去重,seeders 取各站最大值,0 种子明确标出。

绕过的几个实测问题:
- 站点关键词搜索按整词匹配,"s03" 搜不到(标题里是 S03E07),
  裸季号自动展开成 s03e01..e30 逐集补搜(TPB 实测 0 条 -> 193 条)
- 放宽查询会撞分页天花板,所以三条路互补:knaben 用原查询、
  TPB 用逐集补搜、EZTV 用 IMDb id 列出全剧
- IMDb id 必须从未过滤的结果里推断,只看命中项的话季号一过滤就没了
- therarbg 的 keywords: 必须用 %20 编码,用 + 多词查询返回 0 条

匹配支持智能/完全两种模式,完全匹配按「从标题开头连续对上」判定
(发布名规范是 剧名.SxxExx.质量.小组,剧名永远在开头)。
输入可直接粘发布名,pawn.stars.s24 和 pawn stars s24 等价。

网页版走 SSE 实时推进度,Windows 下双击 .bat 即可启动。
零运行时依赖,48 个测试全部不联网。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-10 22:42:42 +08:00

magnet-finder

多站点磁力搜索:输入关键词,同时问 4 个站点的 API,按种子数排序去重。 Multi-site torrent search with seeder counts. Web UI + CLI, zero dependencies.

零依赖(连 node_modules 都没有),只要 Node.js 18+。有网页版和命令行两种用法。

核心问题很简单:搜出来一堆结果,但大半是 0 种子下不动的。 这个工具把各站结果合并去重, 把种子数摆在最显眼的位置,让你一眼看出哪些还活着。

种子  下载     大小  来源           标题
  46    29   146 MB  therarbg+EZTV  Pawn Stars S03E06 Ready Set Pawn iNTERNAL HDTV x264 W4F
  42    46  95.4 MB  therarbg+EZTV  Pawn Stars S03E26 Wise Guys iNTERNAL 480p x264 mSD
  41    11   126 MB  therarbg+EZTV  Pawn Stars S03E13 Never Surrender iNTERNAL HDTV x264 W4F

快速开始

Windows 用户:双击 启动搜索.bat,它会起服务并自动打开浏览器。没装 Node.js 会提示你去装。

其他系统 / 手动启动:

git clone https://github.com/blueslmj/magnet-finder.git
cd magnet-finder

npm start                          # 网页版,浏览器打开 http://127.0.0.1:5173
npm run search -- "pawn stars s03" # 命令行版

不需要 npm install —— 这个项目真的没有依赖。

网页版

界面是本地网页,抓取在服务端做(浏览器直接调 apibay 等会被 CORS 拦)。搜索过程通过 Server-Sent Events 实时推进度 —— 一次搜索要跑几十秒(逐集补搜 + EZTV 翻十几页), 不用憋着干等。只监听 127.0.0.1,不会暴露给局域网。

  • 数据源开关在顶部一排:TPB / therarbg / knaben / EZTV(rargb 慢,默认关)
  • 匹配模式:智能(关键词出现即可)/ 完全(从标题开头连续对上)。 搜 friends s01 时选「完全」,就不会再混进 Your.Friends.and.Neighbors 了
  • 存活条:绿=≥5 种子、黄=1-4、红=0。点某一段只看那一类
  • 表格点表头换排序;点标题直接复制磁力;勾选后可批量复制
  • 「至少 N 种子」输入框过滤死种

想换端口:node cli/serve.js --port 8080

命令行版

node cli/search.js "pawn stars s03"
node cli/search.js "friends s01" --exact --min-seeds 1
node cli/search.js "pawn stars s03" --csv out.csv
node cli/search.js "pawn stars s03" --magnets m.txt   # 只导磁力,整段粘进 qBittorrent
node cli/search.js --help

进度信息走 stderr、表格走 stdout,所以 node cli/search.js "x" > list.txt 只会拿到结果。

匹配模式

输入不区分大小写,. _ - + 等分隔符都当空格 —— 所以可以直接粘发布名: pawn.stars.s24 和 pawn stars s24 等价。

模式 规则 适合
智能(默认) 每个关键词在标题里出现即可 不确定完整片名,想广撒网
--exact 从标题开头连续对上 明确要找某个剧,别被别的剧干扰
--loose 标题含第一个关键词即可 只看剧名、不限定季

完全匹配为什么按「开头连续」判定:发布名的规范是 剧名.SxxExx.质量.小组,剧名永远在开头。 开头的 the/a/an 会先剥掉,所以 big bang theory 照样命中 The.Big.Bang.Theory.S01E01。

实测 friends s01:智能模式 297 条(其中 258 条是别的剧),完全模式 35 条、0 条误命中。

数据源

源 接口 说明
tpb apibay.org The Pirate Bay 官方接口,一次返回全部命中
therarbg therarbg.com ?format=json RARBG 数据库的延续,带分页
knaben api.knaben.org/v1 聚合几十个站点的索引,返回里带 tracker 说明来自哪个站
eztv eztvx.to/api 只能按 IMDb id 查,id 会从其它源的结果里自动推断
rargb 抓 HTML 没有 API,列表页也没磁力,要逐个进详情页,默认不启用(--sites all 才开)

前四个都走站点自己的 JSON API —— 这些接口不挂 Cloudflare(而 eztvx.to 的网页是挂的), 而且直接返回 seeders,比抓 HTML 又快又准。

为什么不是又一个种子搜索脚本

这些站点各有各的坑。代码里每一处绕路都对应一个实测踩出来的问题,且都有回归测试:

1. 站点的关键词搜索按整词匹配。 标题里是 S03E07,所以搜 s03 一条都搜不到,搜 s03e07 就有。 工具检测到裸季号会自动展开成 s03e01..e30 逐集补搜(--no-expand 关掉)。 实测 pawn stars s03:TPB 直接搜 0 条,逐集补搜后 193 条。

2. 放宽查询会撞上分页天花板。 把查询放宽成 pawn stars 确实有结果,但站点按新到旧 只给前 100 条,S03 这种老剧集根本翻不到。所以三条路互补:knaben 用原查询(它的索引能匹配季号)、 TPB 用逐集补搜、EZTV 用 IMDb id 直接列出全剧所有集。

3. IMDb id 必须从未过滤的结果里推断。 一开始只从「命中项」里找 id,结果季号一过滤就啥都不剩, EZTV 永远拿不到 id 直接跳过。剧集的身份和季号无关。

4. therarbg 的 keywords: 必须用 %20 编码,用 + 的话多词查询直接返回 0 条。

5. 结果按 infohash 跨站去重,seeders 取各站最大值,来源 列显示 therarbg+EZTV 这样 —— 多站都收录通常也更容易连上。

输出

终端表格按种子数降序(--sort size|date|title 可改),末尾提示有多少条是 0 种子。

导出选项:

参数 内容
--csv 种子数/大小/来源/磁力/详情页全都有,带 BOM,Excel 不乱码
--txt 标题 + Tab + 磁力
--magnets 只有磁力,一行一个,可整段粘进 qBittorrent
--json 完整字段

关于种子数

页面上的「种子」是正在做种的人数(seeders),「下载」是正在下载的人数(leechers)。 两者都是实时快照,不是累计下载次数。

这些数字来自各站点自己抓的 tracker 统计,所以可能过时、也可能不全(DHT 和 PEX 里的节点不算在内)。 0 种子不等于绝对下不动,但确实是很强的信号。

项目结构

cli/
  search.js    命令行入口
  serve.js     网页版 HTTP 服务(SSE 推进度)
  launch.js    双击启动器(起服务 + 开浏览器)
  engine.js    搜索流程本体,命令行和网页共用
  sources.js   各站点适配器
  match.js     关键词匹配、跨站去重合并(纯函数)
  format.js    终端表格 / CSV / txt 输出(纯函数)
  parse.js     HTML 解析层(rargb 源用;这是个通用的列表页解析器,搜索工具只用到其中一部分)
  web/         网页界面
tests/         48 个测试,全部不联网

测试

npm test

48 个测试,覆盖关键词匹配、放宽查询、逐集展开、跨站合并、体积格式化、表格对齐、HTML 解析层。 全部不联网,改规则前先跑一遍 —— 这些测试是拿真实页面的坑固化下来的。

贡献

站点结构变化很快。如果某个站点搜不出结果,欢迎提 issue 并附上:

  1. 你搜的关键词和用的数据源
  2. 终端输出或网页版的进度日志
  3. 如果是 rargb(HTML 抓取),再附上那个页面 F12 控制台跑这行的输出:
(()=>{const r=document.querySelectorAll('tr'),m=document.querySelectorAll('a[href^="magnet:"]');console.log('行数',r.length,'磁力',m.length);console.log(r[1]?.outerHTML.slice(0,800))})()

免责声明

本项目只做一件事:聚合这些站点自己公开的搜索 API,把结果整理后展示出来。 它不托管、不分发、不索引任何文件内容,也不参与任何数据传输 —— 拿到磁力链接之后的事情, 跟本项目无关。

请自行确认你下载的内容在你所在的司法管辖区是合法的。BitTorrent 本身是中性技术, 有大量正当用途(Linux 发行版、公共领域影音、开放数据集分发等)。 使用者自行承担全部责任。

许可证

MIT

S
Description
No description provided
Readme MIT
81 KiB
0 Stars 1 Watchers 0 Forks
Languages
JavaScript 77.7%
HTML 21.7%
Batchfile 0.6%