通过关键词搜索磁力链接资源

通过关键词搜索磁力链接资源,支持多站点切换与国产资源搜索。
作者: 蜥蜴


⚠️ 免责声明

本插件仅用于学习与研究目的。请勿配置于 QQ 或其他国内社交平台,由此产生的后果由使用者自行承担。

  • 数据来源于第三方磁力资源站点
  • 需搭配 koishi-plugin-puppeteer 使用

背景

在相关社群中通过关键词检索磁力资源,传统流程通常为:

  1. 打开浏览器访问磁力资源站点
  2. 输入关键词或番号搜索
  3. 在搜索结果中逐条点开查看详情
  4. 手动复制磁力链接并转发至群聊

该流程操作繁琐,尤其在移动端不便。koishi-plugin-magnet-get-lizard 将上述步骤整合为一条聊天指令,可在群聊或私聊中直接完成查询。


工具定位

koishi-plugin-magnet-get-lizard 是一款基于 Koishi 框架的磁链搜索插件,当前版本为 0.0.2,依赖 Koishi 4.18.8 与 koishi-plugin-puppeteer。

能力 说明
关键词搜索 通过关键词检索磁力资源
模糊匹配 无需严格输入番号,支持模糊搜索
中文搜索 支持中文关键词,如「某某探花」等
多站点切换 内置多个资源站点,搜索失败时可切换
数量控制 可配置单次返回的搜索结果数量
影片信息 可选展示发布日期、影片信息、演员等

安装

前置条件

  • 已搭建并可正常运行的 Koishi 项目(koishi-app)
  • 已安装并启用 puppeteer 插件(插件声明 inject: ['puppeteer'],页面抓取依赖该服务)
  • 部署环境具备访问磁力资源站点的网络条件(必要时配置代理)

方式一:通过插件市场安装(推荐)

  1. 启动 Koishi 项目,打开控制台(默认地址 http://localhost:5140)。
  2. 进入左侧「插件市场」。
  3. 在搜索框中输入 magnet-get-lizard。
  4. 找到插件后点击「添加」,Koishi 会自动完成依赖安装与配置写入。

方式二:通过 npm 安装

在 Koishi 项目根目录执行:

1
npm install koishi-plugin-magnet-get-lizard

随后在 koishi.yml 中手动添加配置:

1
2
3
4
5
plugins:
magnet-get-lizard:
site: 'https://18mag.net'
maxResults: 5
ifMessage: false

方式三:通过 yarn / pnpm 安装

若项目使用 yarn 或 pnpm,可执行:

1
2
3
4
5
# yarn
yarn add koishi-plugin-magnet-get-lizard

# pnpm
pnpm add koishi-plugin-magnet-get-lizard

安装 puppeteer

插件声明了 inject: ['puppeteer'],页面抓取依赖 puppeteer 服务。若尚未安装,可执行:

1
npm install koishi-plugin-puppeteer

在 koishi.yml 中相应配置:

1
2
3
plugins:
puppeteer:
# 按需配置

首次使用 puppeteer 时,Koishi 会自动下载 Chromium,请确保网络可用。

验证安装

在任意已接入机器人的聊天窗口输入:

1
搜片 sone111

若能返回磁链查询结果,则说明安装成功。


配置

配置项

配置项 类型 默认值 取值范围 说明
site string https://18mag.net 见下文站点列表 搜索使用的资源站点,搜索失败时可切换
maxResults number 5 ≥ 1 搜索结果展示数量
ifMessage boolean false — 是否展示影片信息(发布日期、影片信息、演员)

内置站点

site 可取值如下:

站点
https://18mag.net
https://xcili.com
https://1cili.com
https://cili.info
https://cili.uk
https://wuji.me

若某个站点持续搜索失败,可在配置中更换其他站点后重试。

配置示例

1
2
3
4
5
plugins:
magnet-get-lizard:
site: 'https://18mag.net'
maxResults: 5
ifMessage: false

maxResults 控制单次搜索返回的候选条数,默认 5 条。ifMessage 开启后会一并展示发布日期、影片信息与演员,但并非每条结果都包含完整信息。


使用流程

指令列表

指令 说明 示例
搜片 <关键词> 关键词搜索磁链资源 搜片 sone111

流程一:关键词搜索

步骤 1:发送搜索指令

在群聊或私聊中输入关键词:

1
搜片 sone111

关键词支持模糊匹配,无需严格输入番号;亦支持中文搜索,例如:

1
搜片 某某探花

步骤 2:接收搜索结果

机器人逐条返回搜索结果,每条包含标题与影片信息:

1
2
3
4
5
标题:SONE-111 〇〇〇
磁链 :magnet:?xt=urn:btih:...

标题:SONE-111 校正版
磁链 :magnet:?xt=urn:btih:...

ifMessage: false 时仅展示标题与磁链;ifMessage: true 时额外展示发布日期、影片信息与演员。

步骤 3:无结果处理

若无匹配结果,机器人返回「没有找到相关信息,请更换关键词重试」。可尝试更换关键词或切换 site 后重试。

步骤 4:异常处理

若抓取过程中发生异常,机器人返回「获取失败,请稍后重试。」,并在控制台记录错误详情。


使用场景

场景一:群聊内快速查询

群聊中提及某个番号或资源名时,可直接通过 搜片 <关键词> 获取磁链,并分享至群内。

场景二:国产资源检索

插件支持中文关键词模糊搜索,可直接检索国产资源,例如「某某探花」等。

场景三:与 javbus-lizard 配合使用

本插件采集速度较快,但影片信息不够完整。若需要完整的影片详情,可结合 javbus-lizard 使用:先通过本插件获取磁链,再通过 javbus-lizard 查询影片详情。


技术实现

技术栈

技术 用途
Koishi 机器人框架
TypeScript 开发语言
koishi-plugin-puppeteer 页面抓取与数据提取
第三方磁力站点 数据来源

与站点的交互

插件通过 site 配置拼接访问资源站点,涉及两个页面:

页面 路径 用途
搜索页 /search?q=<关键词> 关键词搜索,返回结果列表
详情页 搜索结果中的链接 获取标题与磁链等详情

搜索页的拼接方式为:

1
const searchUrl = `${config.site}/search?q=${encodeURIComponent(keyword)}`

关键词通过 encodeURIComponent 编码后拼接,以适配中文与特殊字符。

核心设计

页面抓取

插件通过 puppeteer 打开页面,并以 domcontentloaded 作为等待条件:

1
2
const page = await ctx.puppeteer.page()
await page.goto(searchUrl, { waitUntil: 'domcontentloaded' })

抓取完成后调用 page.close() 释放页面资源。

搜索结果筛选

搜索结果从 .file-list tr a 中提取。插件仅保留包含 <b> 子节点的链接,取其 href,拼接站点前缀后反转并截取:

1
2
3
4
5
6
7
8
9
10
11
let links = await page.$$eval('.file-list tr a', (elements, max, site) => {
return elements
.filter(el => {
return Array.from(el.childNodes).some(node => node.nodeName === 'B')
})
.map(el => (el as HTMLAnchorElement).getAttribute('href'))
.filter(href => href)
.map(href => site + href)
.reverse()
.slice(0, max)
}, config.maxResults, config.site)

reverse() 用于调整结果的先后顺序,slice(0, max) 按 maxResults 截取。

详情信息解析

逐条访问详情页,从 .magnet-title 与 .torrent-info dt 中提取信息:

1
2
const title = document.querySelector('.magnet-title')?.textContent?.trim()
const dtElements = Array.from(document.querySelectorAll('.torrent-info dt'))

dt 元素的「种子特征码」会被转换为磁链:

1
2
3
4
if (key === '种子特征码') {
key = '磁链'
dd = `magnet:?xt=urn:btih:${dd}`
}

ifMessage 为 false 时,会过滤掉「发布日期」「影片信息」「演员」三项;「推荐网盘」在所有情况下均被过滤。

错误处理

抓取过程包裹在 try / catch 中,异常时在控制台记录错误并返回统一文案「获取失败,请稍后重试。」。


注意事项

1. puppeteer 依赖

插件声明了 inject: ['puppeteer'],页面抓取依赖 puppeteer 服务。若未启用该插件,指令将不可用。首次使用时会自动下载 Chromium。

2. 站点可用性

内置站点均为第三方服务,可能出现:

  • 站点无法访问或响应缓慢
  • 页面结构变动导致解析失败
  • 内容收录范围有限,部分关键词搜索不到结果

若某个站点持续失败,可在配置中更换其他站点后重试。

3. 影片信息不完整

ifMessage 开启后展示的影片信息由站点提供,并非每条结果都包含完整信息。若需要完整的影片详情,建议结合 javbus-lizard 使用。

4. 抓取速度

插件需逐条访问详情页以提取信息,maxResults 越大,耗时越长。建议按需设置,避免单次请求过多页面。

5. 平台选择

请勿将本插件配置于 QQ 或其他国内社交平台。建议部署于自建的、受控的机器人实例中。


常见问题

Q1:提示「没有找到相关信息,请更换关键词重试」?

可能原因包括:

  • 关键词与实际资源不匹配
  • 当前站点未收录相关资源
  • 站点页面结构变动导致解析失败

可尝试更换关键词,或在配置中切换 site 后重试。

Q2:提示「获取失败,请稍后重试。」?

说明抓取过程中发生异常。可检查:

  • puppeteer 是否正常运行
  • 部署环境能否访问 site 配置的站点
  • 站点是否响应缓慢或触发限流

Q3:为什么搜索结果条数少于 maxResults?

maxResults 为上限而非固定值。实际返回条数取决于站点返回的结果数量与筛选条件。

Q4:为什么开启 ifMessage 后影片信息仍不完整?

影片信息由站点提供,并非每条结果都包含完整信息。若需要完整的影片详情,可结合 javbus-lizard 使用。

Q5:安装后指令无响应?

依次检查以下项:

  • 插件是否已在控制台启用
  • koishi-plugin-puppeteer 是否已安装并启用
  • 机器人是否已成功连接至目标平台
  • 指令是否完整输入(搜片 与关键词之间以空格分隔)

Q6:磁链的有效性由谁决定?

磁力链接的有效性取决于种子资源本身,与插件无关。


开发计划

  • 支持更多资源站点
  • 增加搜索结果排序选项
  • 优化抓取速度,减少页面访问次数
  • 支持结果缓存

获取工具