|
| 1 | +<div align="center"> |
| 2 | + |
1 | 3 | # Wrangler-API |
2 | 4 |
|
3 | | -Cloudflare Workers 版 SearchGal 聚合搜索 API。 |
| 5 | +[](https://workers.cloudflare.com/) |
| 6 | +[](https://www.typescriptlang.org/) |
| 7 | +[](./LICENSE) |
| 8 | + |
| 9 | + |
| 10 | +**Cloudflare Workers 版 SearchGal 聚合搜索 API** |
| 11 | + |
| 12 | +🚀 **极速响应** | 🌊 **SSE 流式传输** | 🎮 **多平台聚合** |
| 13 | + |
| 14 | +[快速部署](#quick-start) • [API 文档](#api-doc) • [开发者接入指南](#dev-guide) |
| 15 | + |
| 16 | +</div> |
| 17 | + |
| 18 | +--- |
| 19 | + |
| 20 | +## 📖 简介 |
4 | 21 |
|
5 | | -提供 `/gal` 和 `/patch` 两个入口,接收游戏名并以 SSE 流式返回各平台搜索结果。 |
| 22 | +本项目是一个基于 Cloudflare Workers 的聚合搜索 API,专为 Galgame 资源搜索设计。它提供 `/gal` 和 `/patch` 两个主要入口,接收游戏名称后,通过 Server-Sent Events (SSE) 流式返回各大 Galgame 论坛和资源站的搜索结果。 |
6 | 23 |
|
7 | | -## 准备 |
| 24 | +<a id="quick-start"></a> |
8 | 25 |
|
9 | | -- Node.js(Win 需要) 与 pnpm |
10 | | -- Cloudflare 账号(发布时需要) |
| 26 | +## 🚀 快速部署 |
11 | 27 |
|
12 | | -## 安装 |
| 28 | +### ☁️ 一键云部署 |
13 | 29 |
|
14 | | -### POSIX |
| 30 | +[](https://deploy.workers.cloudflare.com/?url=https://github.com/Moe-Sakura/Wrangler-API) |
| 31 | +[](https://app.koyeb.com/deploy?type=git&name=wrangler-api&repository=github.com/Moe-Sakura/Wrangler-API&branch=main&builder=dockerfile&ports=8787;http;/) |
| 32 | +[](https://deploy.cloud.run?git_repo=https://github.com/Moe-Sakura/Wrangler-API&revision=main) |
15 | 33 |
|
16 | | -```sh |
17 | | -## 安装 pnpm |
18 | | -curl -fsSL https://get.pnpm.io/install.sh | sh - |
| 34 | +### 🧭 服务器性能参考(硬件配置) |
19 | 35 |
|
20 | | -## 安装依赖 |
| 36 | +> 以下为通用建议,适用于自建部署或容器化运行场景。此项目主要消耗在外部请求与解析,内存压力通常较低。 |
| 37 | +
|
| 38 | +| 档位 | CPU | 内存 | 网络 | 适用场景 | |
| 39 | +| :--- | :--- | :--- | :--- | :--- | |
| 40 | +| 最低 | 1 vCPU | 512 MB–1 GB | 1-5 Mbps | 低并发 | |
| 41 | +| 推荐 | 2 vCPU | 1–2 GB | 5-20 Mbps | 中小规模并发 | |
| 42 | +| 高并发 | 4 vCPU+ | 2–4 GB | 20 Mbps+ | 高并发 | |
| 43 | + |
| 44 | +--- |
| 45 | + |
| 46 | +### 环境准备 |
| 47 | + |
| 48 | +- **Node.js**: 推荐最新 LTS 版本 (Windows 用户必需) |
| 49 | +- **pnpm**: 包管理工具 |
| 50 | +- **Cloudflare 账号**: 用于发布 (本地开发可选) |
| 51 | + |
| 52 | +### 安装依赖 |
| 53 | + |
| 54 | +```bash |
| 55 | +# 安装 pnpm (如果未安装) |
| 56 | +npm install -g pnpm |
| 57 | + |
| 58 | +# 安装项目依赖 |
21 | 59 | pnpm install |
22 | 60 | ``` |
23 | 61 |
|
24 | | -## Podman Compose |
25 | | - |
26 | | -### 构建 |
| 62 | +### 本地开发 |
27 | 63 |
|
28 | | -先构建镜像(只需要一次,或代码变动时重建) |
| 64 | +```bash |
| 65 | +# 启动本地开发服务器 (模拟 Cloudflare 环境) |
| 66 | +npx wrangler dev |
29 | 67 |
|
30 | | -```sh |
31 | | -podman build -t cf-workers-dev . |
| 68 | +# 纯本地模式 (不连接 Cloudflare) |
| 69 | +npx wrangler dev --local |
32 | 70 | ``` |
33 | 71 |
|
34 | | -### 常用命令 |
| 72 | +### Docker / Podman 部署 |
35 | 73 |
|
36 | | -```sh |
37 | | -# 第一次启动(会自动构建镜像) |
38 | | -podman-compose up -d |
| 74 | +如果您更喜欢使用容器化部署: |
39 | 75 |
|
40 | | -# 停止 |
41 | | -podman-compose down |
| 76 | +```bash |
| 77 | +# 启动服务 |
| 78 | +podman-compose up -d |
42 | 79 |
|
43 | 80 | # 查看日志 |
44 | 81 | podman-compose logs -f |
45 | | - |
46 | | -# 重启(代码改动后一般不需要重建,只需重启容器) |
47 | | -podman-compose restart workers |
48 | 82 | ``` |
49 | 83 |
|
50 | | -### Windows |
| 84 | +--- |
51 | 85 |
|
52 | | -```sh |
53 | | -## 安装 Node.js |
54 | | -winget install -e --id OpenJS.NodeJS |
| 86 | +<a id="api-doc"></a> |
55 | 87 |
|
56 | | -## 安装 pnpm |
57 | | -npx pnpm@latest-10 dlx @pnpm/exe@latest-10 setup |
| 88 | +## 📡 API 文档 |
58 | 89 |
|
59 | | -## 安装依赖 |
60 | | -pnpm install |
61 | | -``` |
| 90 | +### 搜索接口 |
62 | 91 |
|
63 | | -## 开发 |
| 92 | +- **路径**: `POST /gal` (游戏) 或 `POST /patch` (补丁) |
| 93 | +- **Content-Type**: `multipart/form-data` 或 `application/json` |
| 94 | +- **参数**: `game` (string) - 搜索关键词 |
64 | 95 |
|
65 | | -```sh |
66 | | -# 纯本地(无 Cloudflare 登录) |
67 | | -npx wrangler dev --local |
| 96 | +### 响应格式 |
68 | 97 |
|
69 | | -# 实时连 Cloudflare |
70 | | -npx wrangler dev |
| 98 | +响应采用 **Server-Sent Events (SSE)** 流式传输,每行是一个 JSON 对象。 |
| 99 | + |
| 100 | +**示例流:** |
| 101 | + |
| 102 | +```json |
| 103 | +{"total": 10} // 1. 预计总搜索源数量 |
| 104 | +{"progress": {"completed": 1, "total": 10}} // 2. 进度更新 |
| 105 | +{"progress": {"completed": 2, "total": 10}, "result": { ... }} // 3. 搜索结果 (见下文) |
| 106 | +{"done": true} // 4. 结束信号 |
| 107 | +``` |
| 108 | + |
| 109 | +**Result 对象结构:** |
| 110 | + |
| 111 | +```json |
| 112 | +{ |
| 113 | + "name": "某平台", |
| 114 | + "color": "lime", |
| 115 | + "tags": ["NoReq"], |
| 116 | + "items": [ |
| 117 | + { |
| 118 | + "name": "游戏标题", |
| 119 | + "url": "https://example.com/detail/123" |
| 120 | + } |
| 121 | + ] |
| 122 | +} |
71 | 123 | ``` |
72 | 124 |
|
73 | | -## 运行 |
| 125 | +### 🏷️ 标签说明 (Tags) |
| 126 | + |
| 127 | +| 标签 | 含义 | 说明 | |
| 128 | +| :--- | :--- | :--- | |
| 129 | +| `NoReq` | **无门槛** | 无需登录、无需回复即可获取资源 | |
| 130 | +| `Login` | **需登录** | 需要注册并登录账号 | |
| 131 | +| `LoginPay` | **需付费** | 需要登录且消耗积分/货币 | |
| 132 | +| `LoginRep` | **需回复** | 需要登录并回复/评论 | |
| 133 | +| `Rep` | **需回复** | 需回复但无需登录 (较少见) | |
| 134 | +| `SuDrive` | **自建盘** | 站点自建网盘,速度通常较快 | |
| 135 | +| `NoSplDrive` | **不限速** | 使用 OneDrive, Mega, Google Drive 等不限速网盘 | |
| 136 | +| `SplDrive` | **限速盘** | 使用 百度网盘, 夸克, 天翼 等可能限速的网盘 | |
| 137 | +| `MixDrive` | **混合盘** | 包含多种网盘链接 | |
| 138 | +| `BTmag` | **BT/磁力** | 提供种子或磁力链接 | |
| 139 | +| `magic` | **魔法** | 站点可能被墙,需要代理访问 | |
| 140 | + |
| 141 | +--- |
| 142 | + |
| 143 | + |
| 144 | +<a id="dev-guide"></a> |
| 145 | + |
| 146 | +## 🤝 面向 Galgame 网站开发者:如何接入 |
| 147 | + |
| 148 | +如果您是 Galgame 资源站的站长或开发者,欢迎将您的站点接入到本聚合搜索中。接入过程非常简单,只需三步。 |
| 149 | + |
| 150 | +### 1. 创建适配器文件 |
| 151 | + |
| 152 | +在 `src/platforms/gal/` 目录下创建一个新的 TypeScript 文件,例如 `MyGalSite.ts`。 |
| 153 | + |
| 154 | +### 2. 实现 Platform 接口 |
| 155 | + |
| 156 | +复制以下模板代码,并根据您站点的搜索逻辑进行修改: |
| 157 | + |
| 158 | +```typescript |
| 159 | +import { fetchClient } from "../../utils/httpClient"; |
| 160 | +import type { Platform, PlatformSearchResult, SearchResultItem } from "../../types"; |
| 161 | + |
| 162 | +// 1. 定义站点配置 |
| 163 | +const SITE_NAME = "我的Gal站"; |
| 164 | +const API_URL = "https://api.mygalsite.com/search"; // 您的搜索接口或页面URL |
| 165 | +const DETAIL_BASE_URL = "https://mygalsite.com/game/"; |
| 166 | + |
| 167 | +// 2. 定义接口返回类型 (根据实际情况修改) |
| 168 | +interface MySiteResponse { |
| 169 | + code: number; |
| 170 | + data: { |
| 171 | + id: string; |
| 172 | + title: string; |
| 173 | + }[]; |
| 174 | +} |
| 175 | + |
| 176 | +// 3. 实现搜索函数 |
| 177 | +async function searchMySite(game: string): Promise<PlatformSearchResult> { |
| 178 | + const result: PlatformSearchResult = { count: 0, items: [] }; |
| 179 | + |
| 180 | + try { |
| 181 | + // 构造请求 |
| 182 | + const url = new URL(API_URL); |
| 183 | + url.searchParams.set("q", game); // 根据实际参数名修改 |
74 | 184 |
|
75 | | -```sh |
76 | | -npx wrangler dev --ip 0.0.0.0 |
| 185 | + // 发起请求 (fetchClient 已封装 User-Agent 等通用头) |
| 186 | + const response = await fetchClient(url); |
| 187 | + |
| 188 | + if (!response.ok) throw new Error(`HTTP ${response.status}`); |
| 189 | + |
| 190 | + // 解析数据 (如果是 HTML 页面,可以使用正则表达式提取) |
| 191 | + const data = await response.json() as MySiteResponse; |
| 192 | + |
| 193 | + // 转换为统一格式 |
| 194 | + const items: SearchResultItem[] = data.data.map(item => ({ |
| 195 | + name: item.title.trim(), |
| 196 | + url: `${DETAIL_BASE_URL}${item.id}`, |
| 197 | + })); |
| 198 | + |
| 199 | + result.items = items; |
| 200 | + result.count = items.length; |
| 201 | + |
| 202 | + } catch (error) { |
| 203 | + // 错误处理 |
| 204 | + result.error = error instanceof Error ? error.message : "Unknown error"; |
| 205 | + result.count = -1; // -1 表示搜索出错 |
| 206 | + } |
| 207 | + |
| 208 | + return result; |
| 209 | +} |
| 210 | + |
| 211 | +// 4. 导出配置对象 |
| 212 | +const MyGalSite: Platform = { |
| 213 | + name: SITE_NAME, |
| 214 | + color: "blue", // 也就是前端显示的颜色,支持 hex 或颜色名 |
| 215 | + tags: ["NoReq", "SuDrive"], // 标签见上文说明 |
| 216 | + magic: false, // 是否需要代理访问 |
| 217 | + search: searchMySite, |
| 218 | +}; |
| 219 | + |
| 220 | +export default MyGalSite; |
77 | 221 | ``` |
78 | 222 |
|
79 | | -## 发布 |
| 223 | +### 3. 注册适配器 |
| 224 | + |
| 225 | +无需手动修改代码,只需运行以下命令即可自动注册所有适配器: |
80 | 226 |
|
81 | | -```sh |
82 | | -npx wrangler login # 首次需要 |
83 | | -npx wrangler publish |
| 227 | +```bash |
| 228 | +npm run generate |
| 229 | +# 或者 |
| 230 | +pnpm run generate |
84 | 231 | ``` |
85 | 232 |
|
86 | | -## API 使用 |
| 233 | +该脚本会自动扫描 `src/platforms/gal/` 目录下的文件并更新索引。 |
87 | 234 |
|
88 | | -- 路径:`POST /gal` 或 `POST /patch` |
89 | | -- Content-Type:`multipart/form-data` |
90 | | -- 表单字段:`game` (string) |
91 | | -- 响应:`text/event-stream`,每行是一条 JSON,示例: |
| 235 | +### 4. 提交 Pull Request |
92 | 236 |
|
93 | | -```json |
94 | | -{"total":33} |
95 | | -{"progress":{"completed":1,"total":33}} |
96 | | -{"progress":{"completed":2,"total":33},"result":{"name":"某平台","color":"lime","tags":["NoReq"],"items":[{"name":"Title","url":"https://..."}]}} |
97 | | -{"done":true} |
| 237 | +完成上述步骤后,请将您的更改提交到 GitHub: |
| 238 | + |
| 239 | +1. Fork 本仓库 |
| 240 | +2. 提交您的更改 (`git commit -m "feat: add MyGalSite adapter"`) |
| 241 | +3. 推送到您的 Fork (`git push origin main`) |
| 242 | +4. 在 GitHub 上发起 Pull Request |
| 243 | + |
| 244 | +我们会尽快审核并合并您的代码,感谢您的贡献!🎉 |
| 245 | + |
| 246 | +--- |
| 247 | + |
| 248 | +## 📂 项目结构 |
| 249 | + |
| 250 | +```text |
| 251 | +src/ |
| 252 | +├── index.ts # Worker 入口,路由定义 |
| 253 | +├── core.ts # 核心逻辑:并行搜索与 SSE 组装 |
| 254 | +├── types.ts # 类型定义 |
| 255 | +├── utils/ |
| 256 | +│ └── httpClient.ts # 统一 HTTP 请求封装 |
| 257 | +└── platforms/ |
| 258 | + ├── gal/ # GAL 游戏平台适配器集合 |
| 259 | + │ ├── index.ts # GAL 平台注册表 |
| 260 | + │ └── ... # 各平台实现 |
| 261 | + └── patch/ # 补丁平台适配器集合 |
98 | 262 | ``` |
99 | 263 |
|
100 | | -## 标签说明(tags) |
101 | | - |
102 | | -- `NoReq`:无需登录/回复即可拿到下载信息 |
103 | | -- `Login`:需登录后访问 |
104 | | -- `LoginPay`:需登录且支付积分 |
105 | | -- `LoginRep`:需登录并回复/评论解锁 |
106 | | -- `Rep`:需回复/评论但无需登录 |
107 | | -- `SuDrive`:自建网盘盘源 |
108 | | -- `NoSplDrive`:不限速网盘盘源(如Onedrive/Mega等) |
109 | | -- `SplDrive`:限速网盘盘源(如百度/夸克/天翼等) |
110 | | -- `MixDrive`:不限速与限速网盘盘源混合,可能提供多种下载形式 |
111 | | -- `BTmag`:BT或磁力链接 |
112 | | -- `magic`:站点需要代理访问 |
113 | | - |
114 | | -## 目录速览 |
115 | | - |
116 | | -- `src/index.ts` Worker 入口,路由 `/gal`、`/patch` |
117 | | -- `src/core.ts` 处理并行搜索与 SSE 组装 |
118 | | -- `src/platforms/gal` GAL 平台搜集器 |
119 | | -- `src/platforms/patch` 补丁平台搜集器 |
120 | | -- `src/utils/httpClient.ts` 统一请求封装 |
121 | | -- `scripts/generate-indices.js` 可选的索引生成脚本 |
| 264 | +## 📜 许可证 |
| 265 | + |
| 266 | +[MIT](./LICENSE) © Wrangler-API |
0 commit comments