Skip to content
Moe-SakuraPublic

About

Galgame 聚合搜索

Topics

Resources

Code of conduct

Stars

818 stars

Watchers

1 watching

Forks

Repository files navigation

🔍 SearchGal · Gal资源聚合搜索工具

🚀 极速响应 | 🌊 SSE 流式传输 | 🎮 26+ 平台聚合 | ☁️ 边缘部署

前端项目 • 在线预览 • 快速部署 • API 文档 • 开发者接入


🖥️ 在线预览

🌐 预览地址: searchgal.top

电脑端 移动端
电脑端 移动端

🌟 项目亮点

特性 说明
✅ 多端适配 PC/移动端完美适配,PC端支持展示游戏封面、介绍、标签
💡 多源聚合 实时聚合 25+ Gal资源平台 + 1+ 补丁站
🏷️ 智能标注 自动标注:🟢免登录 / 🟡需魔法 / ⚪特殊条件
☁️ 边缘部署 支持 Cloudflare Workers / Vercel Edge 等平台
🌊 流式响应 SSE 实时返回搜索结果,无需等待全部完成

📜 历史版本: Python 版本请查看 old 分支 (已停止维护)


🚀 已收录平台

🟢 免登录直链下载

VNS 真红小站 Galgamex 忧郁的loli GAL图书馆 鲲Galgame 未知云盘 梓澪の妙妙屋 猫猫网盘 稻荷GAL Koyso 月谣 05的资源小站 紫缘Gal SakuGAL TouchGal

🟢 补丁站

鲲Galgame补丁

⚪ 需登录/特殊条件

量子ACG FuFuGal ACG嘤嘤怪 喵源领域 玖黎ACG

🟡 需魔法访问

绅仕天堂 天游二次元 Nysoure xxacg


🚀 快速部署

☁️ 一键云部署

Deploy to Vercel

Deploy to Netlify

Deploy to Cloudflare Workers

Deploy to Koyeb

🧭 服务器配置参考

档位 CPU 内存 适用场景
最低 1 vCPU 512MB–1GB 低并发
推荐 2 vCPU 1–2GB 中小规模
高并发 4+ vCPU 2–4GB 高并发

💻 本地开发

pnpm install        # 安装依赖
pnpm wrangler dev   # 启动开发服务器

🔑 环境变量

变量 必需 说明
TOUCHGAL_API_TOKEN 可选 TouchGal 官方元数据 API token(tgal_live_...)。主站已整站开启 Cloudflare 质询,无法直接抓取,需在 developer.touchgal.com 申请、审核通过后创建 token。未配置时 TouchGal 平台会自动跳过(不报错),配置后即可恢复搜索。
CHARLOTTE_BASE_URL 可选 Charlotte 的 HTTPS 站点根地址,如 https://your-charlotte.example,不要填写 /api 路径。本地开发支持 http://localhost:3000。与 CHARLOTTE_API_KEY 同时配置后启用。
CHARLOTTE_API_KEY 可选 Charlotte 专用搜索密钥,值须与 Charlotte 服务端的 NUXT_SEARCHGAL_API_KEY 一致。仅供服务端使用,不要使用完整资源接口的私有密钥。缺少地址或密钥时自动跳过 Charlotte。

按部署平台设置:

# Cloudflare Workers:作为 secret 注入(本地开发放入 .dev.vars 文件,不要提交)
pnpm wrangler secret put TOUCHGAL_API_TOKEN
echo 'TOUCHGAL_API_TOKEN=tgal_live_xxx' >> .dev.vars

# Vercel:项目 Settings → Environment Variables,或
vercel env add TOUCHGAL_API_TOKEN

# Netlify:Site settings → Environment variables,或
netlify env:set TOUCHGAL_API_TOKEN tgal_live_xxx

# Docker / Podman Compose:通过容器环境变量传入(compose.yml 已透传)
TOUCHGAL_API_TOKEN=tgal_live_xxx podman-compose up -d

Charlotte 接入

先在 Charlotte 部署 GET /api/integration/search 接口,并配置独立的 NUXT_SEARCHGAL_API_KEY(至少 32 个 UTF-8 字节,推荐随机十六进制字符串)。SearchGal 的服务端配置如下:

CHARLOTTE_BASE_URL=https://your-charlotte.example
CHARLOTTE_API_KEY=与Charlotte专用搜索密钥相同的值
  • Cloudflare Workers:使用 pnpm wrangler secret put CHARLOTTE_BASE_URL 和 pnpm wrangler secret put CHARLOTTE_API_KEY 设置;本地开发将两项写入未提交的 .dev.vars。
  • Vercel / Netlify:在项目的服务端环境变量设置中添加以上两项,再按平台流程重新部署。
  • Docker / Podman Compose:在运行 Compose 的环境或未提交的 .env 中设置两项;Compose 会传入容器,容器启动时生成 Wrangler 所需的 .dev.vars。代码接入后需构建/使用包含本次变更的镜像,单独修改配置不会更新旧镜像。

每次搜索调用 /api/integration/search?q=关键词&limit=12,通过 X-API-Key 认证,不携带用户 Cookie。关键词 trim 后须为 1~100 个 Unicode 字符且不含空字符;不符合条件时跳过 Charlotte。结果只显示标题及 /games/{id} 详情页链接,标记为需登录(Login)。

R18 搜索摘要由 Charlotte 服务端的 NUXT_SEARCHGAL_INCLUDE_NSFW=true 启用,SearchGal 不发送覆盖该设置的参数;实际详情浏览和下载仍遵守 Charlotte 的登录与内容偏好规则。

接口应直接返回 JSON。若有 Cloudflare 人机质询,需为该 API 路径配置适合服务端调用的规则,并保留密钥验证与限流。SearchGal 不跟随接口重定向,请填写最终站点地址(包括正确的 www 子域名)。401、429、超时或格式错误会显示为 Charlotte 搜索源错误;429 不自动重试,也不会影响其他搜索源。

Charlotte 当前按专用密钥共享每分钟 120 次额度(命中缓存也计数),部署多个 SearchGal 实例时需要合并考虑调用量。SearchGal 沿用统一 15 秒请求超时,不额外缓存结果。

本地连通性验证(Windows PowerShell / Node.js 22+)

Charlotte 的 .env 应已配置可用的本地 PostgreSQL 数据库,数据库中需要至少一个有已审核、未删除、未标记失效资源的游戏。下面的固定密钥仅用于本机测试,不要用于线上。

终端一启动 Charlotte(目录按实际位置调整):

cd D:\MyProject\Charlotte
$env:NUXT_SEARCHGAL_API_KEY = "searchgal-local-test-key-2026-10-13"
$env:NUXT_SEARCHGAL_INCLUDE_NSFW = "true"
$env:NODE_APP_INSTANCE = "1" # 此测试进程不执行主实例定时任务
npm run dev -- --host 127.0.0.1 --port 3100

在 SearchGal 根目录的 .dev.vars 中添加或更新以下两项,保留已有的其他配置:

CHARLOTTE_BASE_URL=http://127.0.0.1:3100
CHARLOTTE_API_KEY=searchgal-local-test-key-2026-10-13

终端二启动 SearchGal:

cd D:\MyProject\SearchGal
pnpm dev --local --ip 127.0.0.1 --port 8787

终端三执行检查;将游戏名替换为本地数据库中已知有资源的条目:

cd D:\MyProject\SearchGal
pnpm check:charlotte --keyword "命运石之门"

检查脚本读取当前目录 .dev.vars,也支持环境变量(优先)。它会验证 Charlotte 直连有结果、响应字段和缓存头、缺少/错误密钥的 401、空关键词的 400,再请求 SearchGal /gal,确认 Charlotte 结果与直连一致、密钥未泄露且流正常结束。仅收到 HTTP 200 或空数组不会被判为全部通过。任一步失败退出码为 1;全部通过退出码为 0。其他外部搜索源错误单独提示。

SearchGal 使用其他端口时追加 --searchgal-url http://127.0.0.1:端口。修改 .dev.vars 后重启 SearchGal;修改 Charlotte 配置后重启 Charlotte。测试结束后在两个服务终端按 Ctrl+C。此流程验证本地 HTTP、真实数据库和 Worker 链路;生产 Redis、HTTPS、Cloudflare 规则仍需部署后验证。

🐳 Podman Compose 容器化部署

podman-compose up -d

📡 API 文档

接口说明

方法 路径 说明
POST /gal 搜索游戏资源
POST /patch 搜索补丁资源

请求参数

参数名 类型 必填 说明
game string ✅ 搜索关键词

支持的 Content-Type:

  • multipart/form-data (推荐)
  • application/x-www-form-urlencoded

请求示例

使用 cURL

# 搜索游戏资源
curl -X POST "https://your-api-domain.com/gal" \
  -F "game=千恋万花"

# 搜索补丁资源
curl -X POST "https://your-api-domain.com/patch" \
  -F "game=千恋万花"

使用 JavaScript (Fetch API)

// 搜索游戏资源并处理 SSE 流式响应
async function searchGal(keyword) {
  const formData = new FormData();
  formData.append('game', keyword);

  const response = await fetch('https://your-api-domain.com/gal', {
    method: 'POST',
    body: formData
  });

  const reader = response.body.getReader();
  const decoder = new TextDecoder();

  while (true) {
    const { done, value } = await reader.read();
    if (done) break;
    
    const lines = decoder.decode(value).split('\n').filter(Boolean);
    for (const line of lines) {
      const data = JSON.parse(line);
      
      if (data.total) {
        console.log(`总共 ${data.total} 个搜索源`);
      }
      if (data.progress) {
        console.log(`进度: ${data.progress.completed}/${data.progress.total}`);
      }
      if (data.result) {
        console.log('搜索结果:', data.result);
      }
      if (data.done) {
        console.log('搜索完成');
      }
    }
  }
}

searchGal('千恋万花');

响应格式 (SSE 流式)

{"total": 10}                                    // 总搜索源数量
{"progress": {"completed": 1, "total": 10}}      // 进度更新
{"progress": {"completed": 2, "total": 10}, "result": {"name": "xx资源站", "color": "lime", "tags": ["NoReq", "SuDrive"], "items": [{"name": "千恋万花", "url": "https://xx.com/game/12345"}]}}  // 搜索结果
{"done": true}                                   // 结束信号

🏷️ 标签说明

标签 含义 标签 含义
NoReq 无门槛 Login 需登录
LoginPay 需付费 LoginRep 需回复
SuDrive 自建盘 NoSplDrive 不限速盘
SplDrive 限速盘 MixDrive 混合盘
BTmag BT/磁力 magic 需魔法

🛠️ 使用指南

步骤 技巧
🔍 精准搜索 使用中文关键词效果最佳,如 Senren*Banka → 千恋万花 → 千恋
🎯 结果筛选 优先选择 🟢绿色标签 (免登录),🟡金色需代理,⚪白色需对应条件
⬇️ 下载建议 推荐 IDM/FDM 加速,遇 Cloudflare 验证耐心等待

🤝 开发者接入指南

想要将您的站点接入聚合搜索?只需三步:

1. 创建适配器 - 在 src/platforms/gal/ 下创建 YourSite.ts

2. 实现接口

import type { Platform, PlatformSearchResult } from "../../types";

const YourSite: Platform = {
  name: "站点名称",
  color: "lime",
  tags: ["NoReq"],
  magic: false,
  search: async (game) => {
    // 实现搜索逻辑
    return { count: 0, items: [] };
  },
};
export default YourSite;

3. 注册 & 提交

pnpm run generate   # 自动注册
git push && PR      # 提交贡献

⚠️ 注意事项

📢 广告白名单: 本站无广告,但收录的资源站建站不易,请加入广告白名单支持站长!
✉️ 写给站长: 本程序仅提供游戏发布页链接(非下载链接),不提供解压码。如不想被搜索,请过滤 UA 含 Searchgal 的请求。
🔐 安全声明: 本工具仅提供搜索聚合,不托管资源,请自行校验文件安全性。


📂 项目结构

SearchGal/
├── src/                     # 核心源码
│   ├── index.ts             # Cloudflare Workers 入口
│   ├── core.ts              # 搜索引擎核心逻辑
│   ├── types.ts             # TypeScript 类型定义
│   ├── platforms/           # 平台适配器目录
│   │   ├── gal/             # 游戏资源平台
│   │   └── patch/           # 补丁资源平台
│   └── utils/               # 工具函数
├── api/                     # Vercel Edge Functions
├── netlify/                 # Netlify Functions
├── scripts/                 # 构建脚本
├── docs/                    # 文档资源
├── wrangler.toml            # Cloudflare Workers 配置
├── vercel.json              # Vercel 部署配置
├── netlify.toml             # Netlify 部署配置
├── compose.yml              # Docker Compose 配置
└── Dockerfile               # Docker 镜像构建文件

🌱 支持正版

本工具旨在提供资源索引便利,请通过 Steam/DLSite 等正规渠道支持开发者!


欢迎各位 GalGame 爱好者优化本项目 ❤️

GNU AGPLv3 License © SearchGal

About

Galgame 聚合搜索

Topics

Resources

Code of conduct

Stars

818 stars

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages