[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4961":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":22,"archived":23,"fork":23,"defaultBranch":24,"hasWiki":25,"hasPages":23,"topics":26,"createdAt":10,"pushedAt":10,"updatedAt":27,"readmeContent":28,"aiSummary":29,"trendingCount":16,"starSnapshotCount":16,"syncStatus":30,"lastSyncTime":31,"discoverSource":32},4961,"pansou","fish2018\u002Fpansou","fish2018","PanSou是一款高性能的网盘资源搜索API服务，支持TG频道和插件搜索。系统设计以性能和可扩展性为核心，支持多频道多插件并发搜索、结果智能排序和网盘类型分类。docker集成前后端，一键启动，开箱即用。仅供学习研究，请勿以各种形式用于盈利目的。 ","",null,"Go",13434,3226,44,5,0,12,67,394,51,45,"MIT License",false,"main",true,[],"2026-06-12 02:01:06","# PanSou 网盘搜索API\n\nPanSou是一个高性能的网盘资源搜索API服务，支持TG搜索和自定义插件搜索。系统设计以性能和可扩展性为核心，支持并发搜索、结果智能排序和网盘类型分类。\n\n[\u002F\u002F]: # (MCP服务文档: [MCP-SERVICE.md]&#40;docs\u002FMCP-SERVICE.md&#41;)\n\n\n## 特性（[详见系统设计文档](docs\u002F%E7%B3%BB%E7%BB%9F%E5%BC%80%E5%8F%91%E8%AE%BE%E8%AE%A1%E6%96%87%E6%A1%A3.md)）\n\n- **高性能搜索**：并发执行多个TG频道及异步插件搜索，显著提升搜索速度；工作池设计，高效管理并发任务\n- **网盘类型分类**：自动识别多种网盘链接，按类型归类展示\n- **智能排序**：基于插件等级、时间新鲜度和优先关键词的多维度综合排序算法\n- **异步插件系统**：支持通过插件扩展搜索来源，支持\"尽快响应，持续处理\"的异步搜索模式，解决了某些搜索源响应时间长的问题。详情参考[**插件开发指南**](docs\u002F插件开发指南.md)\n- **二级缓存**：分片内存+分片磁盘缓存机制，大幅提升重复查询速度和并发性能  \n\n\n## 支持的网盘类型\n\n百度网盘 (`baidu`)、阿里云盘 (`aliyun`)、夸克网盘 (`quark`)、光鸭云盘 (`guangya`)、天翼云盘 (`tianyi`)、UC网盘 (`uc`)、移动云盘 (`mobile`)、115网盘 (`115`)、PikPak (`pikpak`)、迅雷网盘 (`xunlei`)、123网盘 (`123`)、磁力链接 (`magnet`)、电驴链接 (`ed2k`)、其他 (`others`)\n\n## 快速开始\n\n在 Github 上先[![Fork me on GitHub](https:\u002F\u002Fraw.githubusercontent.com\u002Ffishforks\u002Ffish2018\u002Frefs\u002Fheads\u002Fmain\u002Fforkme.png)](https:\u002F\u002Fgithub.com\u002Ffish2018\u002Fpansou\u002Ffork)\n本项目，并点上 Star !!!\n\n### 使用Docker部署\n[qqpd搜索插件文档](plugin\u002Fqqpd\u002FREADME.md)  \n[gying搜索插件文档](plugin\u002Fgying\u002FREADME.md)   \n[weibo搜索插件文档](plugin\u002Fweibo\u002FREADME.md)   \n[常见问题总结](https:\u002F\u002Fgithub.com\u002Ffish2018\u002Fpansou\u002Fissues\u002F46)  \n[TG\u002FQQ频道\u002F插件\u002F微博](https:\u002F\u002Fgithub.com\u002Ffish2018\u002Fpansou\u002Fissues\u002F4)\n\n#### **1、前后端集成版**\n\n##### 直接使用Docker命令\n\n一键启动，开箱即用\n\n```\ndocker run -d --name pansou -p 80:80 ghcr.io\u002Ffish2018\u002Fpansou-web\n```\n\n##### 使用Docker Compose（推荐）\n```\n# 下载配置文件\ncurl -o docker-compose.yml https:\u002F\u002Fraw.githubusercontent.com\u002Ffish2018\u002Fpansou-web\u002Frefs\u002Fheads\u002Fmain\u002Fdocker-compose.yml\n\n# 启动服务\ndocker-compose up -d\n\n# 查看日志\ndocker-compose logs -f\n```\n\n#### **2、纯后端API版**\n\n##### 直接使用Docker命令\n\n```bash\ndocker run -d --name pansou -p 8888:8888 ghcr.io\u002Ffish2018\u002Fpansou:latest\n```\n\n##### 使用Docker Compose（推荐）\n\n```bash\n# 下载配置文件\ncurl -o docker-compose.yml  https:\u002F\u002Fraw.githubusercontent.com\u002Ffish2018\u002Fpansou\u002Frefs\u002Fheads\u002Fmain\u002Fdocker-compose.yml\n\n# 启动服务\ndocker-compose up -d\n\n# 访问服务\nhttp:\u002F\u002Flocalhost:8888\n```\n\n### 从源码安装\n\n#### 环境要求\n\n- Go 1.18+\n- 可选：SOCKS5代理（用于访问受限地区的Telegram站点）\n\n1. 克隆仓库\n\n```bash\ngit clone https:\u002F\u002Fgithub.com\u002Ffish2018\u002Fpansou.git\ncd pansou\n```\n\n2. 配置环境变量（可选）\n\n#### 基础配置\n\n| 环境变量 | 描述 | 默认值 | 说明 |\n|----------|------|--------|------|\n| **PORT** | 服务端口 | `8888` | 修改服务监听端口 |\n| **PROXY** | SOCKS5代理 | 无 | 如：`PROXY=socks5:\u002F\u002F127.0.0.1:1080` |\n| **HTTPS_PROXY\u002FHTTP_PROXY** | HTTPS\u002FHTTP代理 | 无 | 如：`HTTPS_PROXY=http:\u002F\u002F127.0.0.1:1080`,`HTTP_PROXY=http:\u002F\u002F127.0.0.1:1080` |\n| **CHANNELS** | 默认搜索的TG频道 | `tgsearchers3` | 多个频道用逗号分隔 |\n| **ENABLED_PLUGINS** | 指定启用插件，多个插件用逗号分隔 | 无 | 必须显式指定 |\n\n#### 认证配置（可选）\n\nPanSou支持可选的安全认证功能，默认关闭。开启后，所有API接口（除登录接口外）都需要提供有效的JWT Token。详见[认证系统设计文档](docs\u002F认证系统设计.md)。\n\n| 环境变量 | 描述 | 默认值 | 说明 |\n|----------|------|--------|------|\n| **AUTH_ENABLED** | 是否启用认证 | `false` | 设置为`true`启用认证功能 |\n| **AUTH_USERS** | 用户账号配置 | 无 | 格式：`user1:pass1,user2:pass2` |\n| **AUTH_TOKEN_EXPIRY** | Token有效期（小时） | `24` | JWT Token的有效时长 |\n| **AUTH_JWT_SECRET** | JWT签名密钥 | 自动生成 | 用于签名Token，建议手动设置 |\n\n**认证配置示例：**\n\n```bash\n# 启用认证并配置单个用户\ndocker run -d --name pansou -p 8888:8888 \\\n  -e AUTH_ENABLED=true \\\n  -e AUTH_USERS=admin:admin123 \\\n  -e AUTH_TOKEN_EXPIRY=24 \\\n  ghcr.io\u002Ffish2018\u002Fpansou:latest\n\n# 配置多个用户\ndocker run -d --name pansou -p 8888:8888 \\\n  -e AUTH_ENABLED=true \\\n  -e AUTH_USERS=admin:pass123,user1:pass456,user2:pass789 \\\n  ghcr.io\u002Ffish2018\u002Fpansou:latest\n```\n\n**认证API接口：**\n\n- `POST \u002Fapi\u002Fauth\u002Flogin` - 用户登录，获取Token\n- `POST \u002Fapi\u002Fauth\u002Fverify` - 验证Token有效性\n- `POST \u002Fapi\u002Fauth\u002Flogout` - 退出登录（客户端删除Token）\n\n**使用Token调用API：**\n\n```bash\n# 1. 登录获取Token\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fauth\u002Flogin \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"username\":\"admin\",\"password\":\"admin123\"}'\n\n# 响应：{\"token\":\"eyJhbGc...\",\"expires_at\":1234567890,\"username\":\"admin\"}\n\n# 2. 使用Token调用搜索API\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch \\\n  -H \"Authorization: Bearer eyJhbGc...\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"kw\":\"速度与激情\"}'\n```\n\n#### 高级配置（默认值即可）\n\n\u003Cdetails>\n\u003Csummary>点击展开高级配置选项（通常不需要修改）\u003C\u002Fsummary>\n\n| 环境变量 | 描述 | 默认值 |\n|----------|------|--------|\n| CONCURRENCY | 并发搜索数 | 自动计算 |\n| CACHE_TTL | 缓存有效期（分钟） | `60` |\n| CACHE_MAX_SIZE | 最大缓存大小(MB) | `100` |\n| PLUGIN_TIMEOUT | 插件超时时间(秒) | `30` |\n| ASYNC_RESPONSE_TIMEOUT | 快速响应超时(秒) | `4` |\n| ASYNC_LOG_ENABLED | 异步插件详细日志 | `true` | \n| CACHE_PATH | 缓存文件路径 | `.\u002Fcache` |\n| SHARD_COUNT | 缓存分片数量 | `8` |\n| CACHE_WRITE_STRATEGY | 缓存写入策略(immediate\u002Fhybrid) | `hybrid` |\n| ENABLE_COMPRESSION | 是否启用压缩 | `false` |\n| MIN_SIZE_TO_COMPRESS | 最小压缩阈值(字节) | `1024` |\n| GC_PERCENT | Go GC触发百分比 | `50` |\n| ASYNC_MAX_BACKGROUND_WORKERS | 最大后台工作者数量 | CPU核心数×5 |\n| ASYNC_MAX_BACKGROUND_TASKS | 最大后台任务数量 | 工作者数×5 |\n| ASYNC_CACHE_TTL_HOURS | 异步缓存有效期(小时) | `1` |\n| ASYNC_PLUGIN_ENABLED | 异步插件是否启用 | `true` |\n| HTTP_READ_TIMEOUT | HTTP读取超时(秒) | 自动计算 |\n| HTTP_WRITE_TIMEOUT | HTTP写入超时(秒) | 自动计算 |\n| HTTP_IDLE_TIMEOUT | HTTP空闲超时(秒) | `120` |\n| HTTP_MAX_CONNS | HTTP最大连接数 | 自动计算 |\n\n\u003C\u002Fdetails>\n\n3. 构建\n\n```linux\nCGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags=\"-s -w -extldflags '-static'\" -o pansou .\n```\n\n4. 运行\n\n```bash\n.\u002Fpansou\n```\n\n### 其他配置参考\n\n\u003Cdetails>\n\u003Csummary>点击展开 supervisor 配置参考\u003C\u002Fsummary>\n\n```\n[program:pansou]\nenvironment=PORT=8888,CHANNELS=\"tgsearchers4,Aliyun_4K_Movies,bdbdndn11,yunpanx,bsbdbfjfjff,yp123pan,sbsbsnsqq,yunpanxunlei,tianyifc,BaiduCloudDisk,txtyzy,peccxinpd,gotopan,PanjClub,kkxlzy,baicaoZY,MCPH01,bdwpzhpd,ysxb48,jdjdn1111,yggpan,MCPH086,zaihuayun,Q66Share,Oscar_4Kmovies,ucwpzy,shareAliyun,alyp_1,dianyingshare,Quark_Movies,XiangxiuNBB,ydypzyfx,ucquark,xx123pan,yingshifenxiang123,zyfb123,tyypzhpd,tianyirigeng,cloudtianyi,hdhhd21,Lsp115,oneonefivewpfx,qixingzhenren,taoxgzy,Channel_Shares_115,tyysypzypd,vip115hot,wp123zy,yunpan139,yunpan189,yunpanuc,yydf_hzl,leoziyuan,pikpakpan,Q_dongman,yoyokuakeduanju\",ENABLED_PLUGINS=\"labi,zhizhen,shandian,duoduo,muou\"\ncommand=\u002Fhome\u002Fwork\u002Fpansou\u002Fpansou\ndirectory=\u002Fhome\u002Fwork\u002Fpansou\nautostart=true\nautorestart=true\nstartsecs=5\nstartretries=3\nexitcodes=0\nstopwaitsecs=10\nstopasgroup=true\nkillasgroup=true\n```\n\n\u003C\u002Fdetails>\n\n\u003Cdetails>\n\u003Csummary>点击展开 nginx 配置参考\u003C\u002Fsummary>\n\n```\nserver {\n    listen 80;\n    server_name pansou.252035.xyz;\n\n    # 将 HTTP 重定向到 HTTPS\n    return 301 https:\u002F\u002F$host$request_uri;\n}\n\nlimit_req_zone $binary_remote_addr zone=api_limit:10m rate=60r\u002Fm;\n\nserver {\n    listen 443 ssl http2;\n    server_name pansou.252035.xyz;\n\n    access_log \u002Fhome\u002Fwork\u002Flogs\u002Fpansou.log;\n\n    # 证书和密钥路径\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002F252035.xyz\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002F252035.xyz\u002Fprivkey.pem;\n\n    # 增强 SSL 安全性\n    ssl_protocols TLSv1.2 TLSv1.3;\n    ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;\n    ssl_prefer_server_ciphers on;\n\n    # 后端代理，应用限流\n    location \u002F {\n        # 应用限流规则\n        limit_req zone=api_limit burst=10 nodelay;\n        # 当超过限制时返回 429 状态码\n        limit_req_status 429;\n\n        proxy_pass http:\u002F\u002F127.0.0.1:8888;\n        proxy_set_header Host $host;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n## API文档\n\n### 认证说明\n\n当启用认证功能（`AUTH_ENABLED=true`）时，除登录和健康检测接口外的所有API接口都需要提供有效的JWT Token。\n\n**请求头格式**：\n```\nAuthorization: Bearer \u003Cyour-jwt-token>\n```\n\n**获取Token**：\n\n1. 调用登录接口获取Token（详见下方[认证API](#认证API)）\n2. 在后续所有API请求的Header中添加`Authorization: Bearer \u003Ctoken>`\n3. Token过期后需要重新登录获取新Token\n\n**示例**：\n```bash\n# 未启用认证时\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"kw\":\"速度与激情\"}'\n\n# 启用认证时\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer eyJhbGc...\" \\\n  -d '{\"kw\":\"速度与激情\"}'\n```\n\n### 认证API\n\n#### 用户登录\n\n获取JWT Token用于后续API调用。\n\n**接口地址**：`\u002Fapi\u002Fauth\u002Flogin`  \n**请求方法**：`POST`  \n**Content-Type**：`application\u002Fjson`  \n**是否需要认证**：否\n\n**请求参数**：\n\n| 参数名 | 类型 | 必填 | 描述 |\n|--------|------|------|------|\n| username | string | 是 | 用户名 |\n| password | string | 是 | 密码 |\n\n**请求示例**：\n```bash\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fauth\u002Flogin \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\"username\":\"admin\",\"password\":\"admin123\"}'\n```\n\n**成功响应**：\n```json\n{\n  \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n  \"expires_at\": 1234567890,\n  \"username\": \"admin\"\n}\n```\n\n**错误响应**：\n```json\n{\n  \"error\": \"用户名或密码错误\"\n}\n```\n\n#### 验证Token\n\n验证当前Token是否有效。\n\n**接口地址**：`\u002Fapi\u002Fauth\u002Fverify`  \n**请求方法**：`POST`  \n**是否需要认证**：是\n\n**请求示例**：\n```bash\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fauth\u002Fverify \\\n  -H \"Authorization: Bearer eyJhbGc...\"\n```\n\n**成功响应**：\n```json\n{\n  \"valid\": true,\n  \"username\": \"admin\"\n}\n```\n\n#### 退出登录\n\n退出当前登录（客户端删除Token即可）。\n\n**接口地址**：`\u002Fapi\u002Fauth\u002Flogout`  \n**请求方法**：`POST`  \n**是否需要认证**：否\n\n**请求示例**：\n```bash\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fauth\u002Flogout\n```\n\n**成功响应**：\n```json\n{\n  \"message\": \"退出成功\"\n}\n```\n\n### 搜索API\n\n搜索网盘资源。\n\n**接口地址**：`\u002Fapi\u002Fsearch`  \n**请求方法**：`POST` 或 `GET`  \n**Content-Type**：`application\u002Fjson`（POST方法）  \n**是否需要认证**：取决于`AUTH_ENABLED`配置\n\n**POST请求参数**：\n\n| 参数名 | 类型 | 必填 | 描述 |\n|--------|------|------|------|\n| kw | string | 是 | 搜索关键词 |\n| channels | string[] | 否 | 搜索的频道列表，不提供则使用默认配置 |\n| conc | number | 否 | 并发搜索数量，不提供则自动设置为频道数+插件数+10 |\n| refresh | boolean | 否 | 强制刷新，不使用缓存，便于调试和获取最新数据 |\n| res | string | 否 | 结果类型：all(返回所有结果)、results(仅返回results)、merge(仅返回merged_by_type)，默认为merge |\n| src | string | 否 | 数据来源类型：all(默认，全部来源)、tg(仅Telegram)、plugin(仅插件) |\n| plugins | string[] | 否 | 指定搜索的插件列表，不指定则搜索全部插件 |\n| cloud_types | string[] | 否 | 指定返回的网盘类型列表，支持：baidu、aliyun、quark、guangya、tianyi、uc、mobile、115、pikpak、xunlei、123、magnet、ed2k，不指定则返回所有类型 |\n| ext | object | 否 | 扩展参数，用于传递给插件的自定义参数，如{\"title_en\":\"English Title\", \"is_all\":true} |\n| filter | object | 否 | 过滤配置，用于过滤返回结果。格式：{\"include\":[\"关键词1\",\"关键词2\"],\"exclude\":[\"排除词1\",\"排除词2\"]}。include为包含关键词列表（OR关系），exclude为排除关键词列表（OR关系） |\n\n**GET请求参数**：\n\n| 参数名 | 类型 | 必填 | 描述 |\n|--------|------|------|------|\n| kw | string | 是 | 搜索关键词 |\n| channels | string | 否 | 搜索的频道列表，使用英文逗号分隔多个频道，不提供则使用默认配置 |\n| conc | number | 否 | 并发搜索数量，不提供则自动设置为频道数+插件数+10 |\n| refresh | boolean | 否 | 强制刷新，设置为\"true\"表示不使用缓存 |\n| res | string | 否 | 结果类型：all(返回所有结果)、results(仅返回results)、merge(仅返回merged_by_type)，默认为merge |\n| src | string | 否 | 数据来源类型：all(默认，全部来源)、tg(仅Telegram)、plugin(仅插件) |\n| plugins | string | 否 | 指定搜索的插件列表，使用英文逗号分隔多个插件名，不指定则搜索全部插件 |\n| cloud_types | string | 否 | 指定返回的网盘类型列表，使用英文逗号分隔多个类型，支持：baidu、aliyun、quark、guangya、tianyi、uc、mobile、115、pikpak、xunlei、123、magnet、ed2k，不指定则返回所有类型 |\n| ext | string | 否 | JSON格式的扩展参数，用于传递给插件的自定义参数，如{\"title_en\":\"English Title\", \"is_all\":true} |\n| filter | string | 否 | JSON格式的过滤配置，用于过滤返回结果。格式：{\"include\":[\"关键词1\",\"关键词2\"],\"exclude\":[\"排除词1\",\"排除词2\"]} |\n\n**POST请求示例**：\n\n```bash\n# 未启用认证\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"kw\": \"速度与激情\",\n    \"channels\": [\"tgsearchers3\", \"xxx\"],\n    \"conc\": 2,\n    \"refresh\": true,\n    \"res\": \"merge\",\n    \"src\": \"all\",\n    \"plugins\": [\"jikepan\"],\n    \"cloud_types\": [\"baidu\", \"quark\"],\n    \"ext\": {\n      \"title_en\": \"Fast and Furious\",\n      \"is_all\": true\n    }\n  }'\n\n# 启用认证时（需要添加Authorization头）\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\" \\\n  -d '{\n    \"kw\": \"速度与激情\",\n    \"res\": \"merge\"\n  }'\n\n# 使用过滤器（只返回包含“合集”或“全集”，且不包含“预告”或“花絮”的结果）\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"kw\": \"唐朝诡事录\",\n    \"filter\": {\n      \"include\": [\"合集\", \"全集\"],\n      \"exclude\": [\"预告\", \"花絮\"]\n    }\n  }'\n```\n\n**GET请求示例**：\n\n```bash\n# 未启用认证\ncurl \"http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch?kw=速度与激情&res=merge&src=tg\"\n\n# 启用认证时（需要添加Authorization头）\ncurl \"http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch?kw=速度与激情&res=merge\" \\\n  -H \"Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n\n# 使用过滤器（GET方式需要URL编码JSON）\ncurl \"http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fsearch?kw=唐朝诡事录&filter=%7B%22include%22%3A%5B%22合集%22%2C%22全集%22%5D%2C%22exclude%22%3A%5B%22预告%22%5D%7D\"\n```\n\n**成功响应**：\n\n```json\n{\n  \"total\": 15,\n  \"results\": [\n    {\n      \"message_id\": \"12345\",\n      \"unique_id\": \"channel-12345\",\n      \"channel\": \"tgsearchers3\",\n      \"datetime\": \"2023-06-10T14:23:45Z\",\n      \"title\": \"速度与激情全集1-10\",\n      \"content\": \"速度与激情系列全集，1080P高清...\",\n      \"links\": [\n        {\n          \"type\": \"baidu\",\n          \"url\": \"https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1abcdef\",\n          \"password\": \"1234\",\n          \"datetime\": \"2023-06-10T14:23:45Z\",\n          \"work_title\": \"速度与激情全集1-10\"\n        }\n      ],\n      \"tags\": [\"电影\", \"合集\"],\n      \"images\": [\n        \"https:\u002F\u002Fcdn1.cdn-telegram.org\u002Ffile\u002Fxxx.jpg\"\n      ]\n    },\n    \u002F\u002F 更多结果...\n  ],\n  \"merged_by_type\": {\n    \"baidu\": [\n      {\n        \"url\": \"https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1abcdef\",\n        \"password\": \"1234\",\n        \"note\": \"速度与激情全集1-10\",\n        \"datetime\": \"2023-06-10T14:23:45Z\",\n        \"source\": \"tg:频道名称\",\n        \"images\": [\n          \"https:\u002F\u002Fcdn1.cdn-telegram.org\u002Ffile\u002Fxxx.jpg\"\n        ]\n      },\n      \u002F\u002F 更多百度网盘链接...\n    ],\n    \"quark\": [\n      {\n        \"url\": \"https:\u002F\u002Fpan.quark.cn\u002Fs\u002Fxxxx\",\n        \"password\": \"\",\n        \"note\": \"凡人修仙传\",\n        \"datetime\": \"2023-06-10T15:30:22Z\",\n        \"source\": \"plugin:插件名\",\n        \"images\": []\n      }\n    ],\n    \"aliyun\": [\n      \u002F\u002F 阿里云盘链接...\n    ]\n    \u002F\u002F 更多网盘类型...\n  }\n}\n```\n\n**字段说明**：\n\n**SearchResult对象**：\n- `message_id`: 消息ID\n- `unique_id`: 全局唯一标识符\n- `channel`: 来源频道名称\n- `datetime`: 消息发布时间\n- `title`: 消息标题\n- `content`: 消息内容\n- `links`: 网盘链接数组\n- `tags`: 标签数组（可选）\n- `images`: TG消息中的图片链接数组（可选）\n\n**Link对象**：\n- `type`: 网盘类型（baidu、quark、aliyun等）\n- `url`: 网盘链接地址\n- `password`: 提取码\u002F密码\n- `datetime`: 链接更新时间（可选）\n- `work_title`: 作品标题（可选）\n  - 用于区分同一消息中多个作品的链接\n  - 当一条消息包含≤4个链接时，所有链接使用相同的work_title\n  - 当一条消息包含>4个链接时，系统会智能识别每个链接对应的作品标题\n\n**MergedLink对象**：\n- `url`: 网盘链接地址\n- `password`: 提取码\u002F密码\n- `note`: 资源说明\u002F标题\n- `datetime`: 链接更新时间\n- `source`: 数据来源标识\n  - `tg:频道名称`: 来自Telegram频道\n  - `plugin:插件名`: 来自指定插件\n  - `unknown`: 未知来源\n- `images`: TG消息中的图片链接数组（可选）\n  - 仅在来源为Telegram频道且消息包含图片时出现\n\n\n**错误响应**：\n\n```json\n\u002F\u002F 参数错误\n{\n  \"code\": 400,\n  \"message\": \"关键词不能为空\"\n}\n\n\u002F\u002F 未授权（启用认证但未提供Token）\n{\n  \"error\": \"未授权：缺少认证令牌\",\n  \"code\": \"AUTH_TOKEN_MISSING\"\n}\n\n\u002F\u002F Token无效或过期\n{\n  \"error\": \"未授权：令牌无效或已过期\",\n  \"code\": \"AUTH_TOKEN_INVALID\"\n}\n```\n\n### 链接检测API\n\n检测指定网盘分享链接当前是否有效，适合前端结果页按需做可见项检测，也支持批量调试和服务端缓存复用。\n\n**接口地址**：`\u002Fapi\u002Fcheck\u002Flinks`  \n**请求方法**：`POST`  \n**Content-Type**：`application\u002Fjson`  \n**是否需要认证**：取决于`AUTH_ENABLED`配置\n\n**请求参数**：\n\n| 参数名 | 类型 | 必填 | 描述 |\n|--------|------|------|------|\n| items | object[] | 是 | 待检测链接数组，至少提供一项 |\n| items[].disk_type | string | 是 | 网盘类型，支持：baidu、aliyun、quark、tianyi、uc、mobile、115、xunlei、123 |\n| items[].url | string | 是 | 完整分享链接 |\n| items[].password | string | 否 | 提取码\u002F密码，未拼接在链接中时可传 |\n| view_token | string | 否 | 视图标识，用于区分当前前端检测批次 |\n\n**请求示例**：\n\n```bash\n# 未启用认证\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fcheck\u002Flinks \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"items\": [\n      {\n        \"disk_type\": \"quark\",\n        \"url\": \"https:\u002F\u002Fpan.quark.cn\u002Fs\u002Fabcdefg\",\n        \"password\": \"1234\"\n      },\n      {\n        \"disk_type\": \"xunlei\",\n        \"url\": \"https:\u002F\u002Fpan.xunlei.com\u002Fs\u002Fabcdefg?pwd=1234\"\n      },\n      {\n        \"disk_type\": \"115\",\n        \"url\": \"https:\u002F\u002F115cdn.com\u002Fs\u002Fabcdefg?password=1234\"\n      }\n    ],\n    \"view_token\": \"quark-1710000000000\"\n  }'\n\n# 启用认证时\ncurl -X POST http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fcheck\u002Flinks \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -H \"Authorization: Bearer eyJhbGc...\" \\\n  -d '{\n    \"items\": [\n      {\n        \"disk_type\": \"baidu\",\n        \"url\": \"https:\u002F\u002Fpan.baidu.com\u002Fs\u002F1abcdef?pwd=1234\"\n      }\n    ]\n  }'\n```\n\n**成功响应**：\n\n```json\n{\n  \"results\": [\n    {\n      \"disk_type\": \"quark\",\n      \"url\": \"https:\u002F\u002Fpan.quark.cn\u002Fs\u002Fabcdefg\",\n      \"normalized_url\": \"https:\u002F\u002Fpan.quark.cn\u002Fs\u002Fabcdefg?pwd=1234\",\n      \"state\": \"ok\",\n      \"cache_hit\": false,\n      \"checked_at\": 1710000000000,\n      \"expires_at\": 1710086400000,\n      \"summary\": \"链接有效\"\n    },\n    {\n      \"disk_type\": \"xunlei\",\n      \"url\": \"https:\u002F\u002Fpan.xunlei.com\u002Fs\u002Fabcdefg?pwd=1234\",\n      \"normalized_url\": \"https:\u002F\u002Fpan.xunlei.com\u002Fs\u002Fabcdefg?pwd=1234\",\n      \"state\": \"bad\",\n      \"cache_hit\": true,\n      \"checked_at\": 1710000100000,\n      \"expires_at\": 1710021700000,\n      \"summary\": \"链接失效\"\n    }\n  ]\n}\n```\n\n**状态说明**：\n\n- `ok`：链接有效\n- `bad`：链接失效\n- `locked`：需要提取码或密码错误\n- `unsupported`：当前平台暂不支持检测\n- `uncertain`：检测失败或结果不确定\n\n**字段说明**：\n\n- `results`: 检测结果数组\n- `results[].disk_type`: 网盘类型\n- `results[].url`: 原始传入链接\n- `results[].normalized_url`: 规范化后的链接\n- `results[].state`: 检测状态\n- `results[].cache_hit`: 是否命中服务端检测缓存\n- `results[].checked_at`: 最近一次检测时间戳（毫秒）\n- `results[].expires_at`: 当前缓存过期时间戳（毫秒）\n- `results[].summary`: 状态说明文本\n\n**错误响应**：\n\n```json\n\u002F\u002F 请求参数无效\n{\n  \"code\": 400,\n  \"message\": \"无效的检测请求: Key: 'CheckRequest.Items' Error:Field validation for 'Items' failed on the 'required' tag\"\n}\n\n\u002F\u002F items 为空\n{\n  \"code\": 400,\n  \"message\": \"items不能为空\"\n}\n\n\u002F\u002F 未授权（启用认证但未提供Token）\n{\n  \"error\": \"未授权：缺少认证令牌\",\n  \"code\": \"AUTH_TOKEN_MISSING\"\n}\n```\n\n### 健康检查\n\n检查API服务是否正常运行。\n\n**接口地址**：`\u002Fapi\u002Fhealth`  \n**请求方法**：`GET`  \n**是否需要认证**：否（公开接口）\n\n**请求示例**：\n```bash\ncurl http:\u002F\u002Flocalhost:8888\u002Fapi\u002Fhealth\n```\n\n**成功响应**：\n\n```json\n{\n  \"status\": \"ok\",\n  \"auth_enabled\": true,\n  \"plugins_enabled\": true,\n  \"plugin_count\": 16,\n  \"plugins\": [\n    \"pansearch\",\n    \"panta\", \n    \"qupansou\",\n    \"hunhepan\",\n    \"jikepan\",\n    \"pan666\",\n    \"panyq\",\n    \"susu\",\n    \"xuexizhinan\",\n    \"hdr4k\",\n    \"labi\",\n    \"shandian\",\n    \"duoduo\",\n    \"muou\",\n    \"wanou\",\n    \"ouge\",\n    \"zhizhen\",\n    \"huban\"\n  ],\n  \"channels_count\": 1,\n  \"channels\": [\n    \"tgsearchers3\"\n  ]\n}\n```\n\n**字段说明**：\n- `status`: 服务状态，\"ok\"表示正常\n- `auth_enabled`: 是否启用认证功能\n- `plugins_enabled`: 是否启用插件\n- `plugin_count`: 已启用的插件数量\n- `plugins`: 已启用的插件列表\n- `channels_count`: 配置的频道数量\n- `channels`: 配置的频道列表\n\n## 📄 许可证\n\n本项目采用 MIT 许可证。详情请见 [LICENSE](LICENSE) 文件。\n\n## ⭐ Star 历史\n\n[![Star History Chart](https:\u002F\u002Fapi.star-history.com\u002Fsvg?repos=fish2018\u002Fpansou&type=Date)](https:\u002F\u002Fstar-history.com\u002F#fish2018\u002Fpansou&Date)\n","PanSou是一款高性能的网盘资源搜索API服务，支持TG频道和自定义插件搜索。其核心功能包括并发执行多个TG频道及异步插件搜索、基于多维度的智能排序算法、自动识别并分类多种网盘链接以及采用二级缓存机制以提升查询速度和并发性能。该项目使用Go语言开发，设计上注重性能与可扩展性，适合需要高效查找和管理各类网盘资源的应用场景。通过Docker集成前后端，用户可以一键启动，实现快速部署。",2,"2026-06-11 03:01:47","top_language"]