# LinkSmith **Repository Path**: gzkiko/LinkSmith ## Basic Information - **Project Name**: LinkSmith - **Description**: 种子/网盘链接处理桌面工具:种子转磁力、thunder:// 与 ed2k:// 多协议转换、网盘资源关键字搜索。转换逻辑纯本地运算。 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2026-10-03 - **Last Updated**: 2026-10-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # LinkSmith 种子 / 网盘链接处理桌面工具。把 `.torrent` 种子、`thunder://`、`ed2k://` 等下载链接转换为磁力链接或真实地址,并提供网盘资源关键字搜索。 全部转换逻辑**纯本地运算**,不上传任何文件。 ## 功能 ### 1. 种子文件 - 选择一个或多个 `.torrent` 文件,本地解析出 `info_hash` 并生成磁力链接 - `info_hash = SHA1(bencode(torrent.info))`,在浏览器 / WebView 内完成,不依赖后端 - 支持一键复制、导出 txt ### 2. 多协议转换 - 自动识别输入协议,支持一次粘贴多行批量转换 - `thunder://` → Base64 解码(`AA...ZZ` 包裹)还原真实地址;若内部是 `ed2k://` 则进一步输出磁力 - `ed2k://|file|名称|大小|哈希|/` → `magnet:?xt=urn:ed2k:` - `magnet:` → 原样输出并按选项标准化 - 两个默认勾选的开关: - **格式标准化**:哈希转小写、`tr` 去重、`xt`→`dn`→`tr` 重组;非法哈希原样返回 - **补全公共 tracker** - 输入非标准磁力链接时同样能输出标准化结果 ### 3. 网盘搜索 - 输入关键字,检索主流网盘(夸克 / 阿里 / 百度 / 迅雷 / 115 / 123 / 天翼 / 移动 / UC)的公开分享 - 返回**分享链接 + 提取码**,点「打开」直接用系统默认浏览器访问 - 数据来自第三方服务 iDataRiver(haisou),每天前 100 次免费 - 结果仅供查找公开、合法分享的资源 ## 运行与打包 项目有**两条打包路线**,目前推荐 PakePlus。 ### 路线 A:PakePlus(Tauri 静态打包,当前推荐) 产物 < 5MB,无需 Rust 环境、无需 GitHub Token。 ```bash node build-static.js # 生成 dist-static/(约 54KB) ``` 然后在 PakePlus 中: > 新建项目 → **静态文件** → 选择 `dist-static` 文件夹 → **本地打包** `build-static.js` 会读取 `config.local.json` 中的 API key 并注入 `dist-static/config.js`。 改完代码后重跑该脚本再打包即可。 **为什么能不依赖主进程直连 API**:iDataRiver 接口对任意 Origin 回显 `Access-Control-Allow-Origin`(含 `tauri://localhost`、`http://tauri.localhost`、`null`), 因此 Tauri 渲染层可以 `fetch` 直连,不需要 Electron 主进程转发。 ### 路线 B:Electron ```bash npm install npm start # 开发运行 npm run dist # 打包 ``` #### 恢复 Electron 路线的办法 `npm run dist` 若卡在 **NSIS / 7zip 从 GitHub 下载超时**(electron 本体能下完,但小包挂起), 原因是 electron-builder 制作 NSIS 安装包时要联网取工具包。 **最快的绕开方式:不制作安装包,改出免安装的 portable 单文件**——改 `package.json` 里 `build.win.target`, 把 `nsis` 换成 `portable`: ```json "win": { "target": ["portable"] } ``` `portable` 不需要 NSIS 工具包,可直接产出单个 exe。同理也可换成 `zip` / `dir`。 如果确实需要 NSIS 安装包,可尝试用国内镜像预置工具包: ```bash export ELECTRON_BUILDER_BINARIES_MIRROR="https://registry.npmmirror.com/-/binary/electron-builder-binaries/" ``` 或从镜像手动下载 `nsis-3.0.4.1.7z`、`nsis-resources-3.4.1.7z`、`7zip-win-x64.tar.gz` 预置到 `%LOCALAPPDATA%\electron-builder\Cache\\` 目录。 ## 架构说明 同一份 `index.html` 同时支持 Electron 与 Tauri / 纯浏览器,靠的是**能力桥接层**: - `linksmith-bridge.js` —— 非 Electron 环境下补齐 `searchPan`、`openExternal` 两个能力; **Electron 下检测到 preload 已注入就原样放行,绝不覆盖主进程实现** - 业务逻辑只依赖这两个 API,且都写了兜底分支 | 文件 | 作用 | | --- | --- | | `index.html` | 全部 UI 与业务逻辑(单文件) | | `torrent-core.js` | 种子解析、`info_hash` 计算 | | `src/pan/thunder.js` | 多协议转换(`thunder://` / `ed2k://` / 磁力标准化) | | `linksmith-bridge.js` | 非 Electron 环境能力桥接 | | `build-static.js` | 生成 PakePlus 静态包 `dist-static/` | | `main.js` / `preload.js` | Electron 主进程与 preload(路线 B 使用) | ## ⚠️ 两点提醒 ### 1. PakePlus 版本会把 API key 打进包里 静态包把内置 API key 写进 `dist-static/config.js` 随包分发,**可被反编译提取**; Electron 版的 key 存放在主进程侧的 `config.local.json`,隔离性更好。 这是纯静态包固有的代价。若介意: - 不注入内置 key(删除或不提供 `config.local.json` 后重跑 `build-static.js`) - 改用客户端内的铅笔图标填写自己的 key(保存在 localStorage,不随包分发) `config.local.json` 与 `dist-static/` 均已在 `.gitignore` 中忽略,不会进版本库。 ### 2. 「打开」按钮的实际行为取决于打包环境 结果列表的「打开」按钮优先调用系统默认浏览器。桥接层按可靠性依次尝试: 1. Tauri v1 `window.__TAURI__.shell.open` 2. Tauri v2 `invoke('plugin:shell|open')` 3. PakePlus 自有 API 4. `window.open`(Tauri 下通常会新建一个 WebView 窗口承载该页面) 若全部不可用则回退为**复制链接**。打包后请实际点一次结果里的「打开」验证, 若只是复制链接而非唤起浏览器,说明该环境未启用 Tauri shell 插件。 ## 配置 网盘搜索需要一个 iDataRiver(haisou)API key。两种方式二选一: - **内置**:在项目根目录建 `config.local.json` ```json { "idatariverApiKey": "idr_xxxxxxxx" } ``` - **客户端内填写**:点关键字输入框右侧的铅笔图标,录入后覆盖内置 key(存 localStorage) ## 免责声明 网盘搜索结果来自第三方公开分享索引,仅供查找合法、公开分享的资源。 请遵守相关法律法规与平台条款,勿用于传播受版权保护内容。 ## 许可证 [MIT](LICENSE) © 2026 gzkiko