PanSou 網盤搜索API
PanSou是一個高性能的網盤資源搜索API服務,支持TG搜索和自定義插件搜索。系統設計以性能和可擴展性為核心,支持并發搜索、結果智能排序和網盤類型分類。
項目地址:https://github.com/fish2018/pansou
特性(詳見系統設計文檔)
- 高性能搜索:并發執行多個TG頻道及異步插件搜索,顯著提升搜索速度;工作池設計,高效管理并發任務
- 網盤類型分類:自動識別多種網盤鏈接,按類型歸類展示
- 智能排序:基于插件等級、時間新鮮度和優先關鍵詞的多維度綜合排序算法
- 異步插件系統:支持通過插件擴展搜索來源,支持"盡快響應,持續處理"的異步搜索模式,解決了某些搜索源響應時間長的問題。詳情參考插件開發指南
- 二級緩存:分片內存+分片磁盤緩存機制,大幅提升重復查詢速度和并發性能
支持的網盤類型
百度網盤 (baidu
)、阿里云盤 (aliyun
)、夸克網盤 (quark
)、天翼云盤 (tianyi
)、UC網盤 (uc
)、移動云盤 (mobile
)、115網盤 (115
)、PikPak (pikpak
)、迅雷網盤 (xunlei
)、123網盤 (123
)、磁力鏈接 (magnet
)、電驢鏈接 (ed2k
)、其他 (others
)
預覽
快速開始
在 Github 上先本項目,并點上 Star !!!
使用Docker部署
前后端集成版
直接使用Docker命令
一鍵啟動,開箱即用,無需任何配置
docker run -d --name pansou -p 80:80 ghcr.io/fish2018/pansou-web
使用Docker Compose(推薦)
# 下載配置文件
curl -o docker-compose.yml https://raw.githubusercontent.com/fish2018/pansou-web/refs/heads/main/docker-compose.yml# 啟動服務
docker-compose up -d# 查看日志
docker-compose logs -f
純后端API
直接使用Docker命令
docker run -d --name pansou -p 8888:8888 -v pansou-cache:/app/cache -e CHANNELS="tgsearchers2,xxx" ghcr.io/fish2018/pansou:latest
使用Docker Compose(推薦)
# 下載配置文件
curl -o docker-compose.yml https://raw.githubusercontent.com/fish2018/pansou/refs/heads/main/docker-compose.yml# 啟動服務
docker-compose up -d# 訪問服務
http://localhost:8888
從源碼安裝
環境要求
- Go 1.18+
- 可選:SOCKS5代理(用于訪問受限地區的Telegram站點)
- 克隆倉庫
git clone https://github.com/fish2018/pansou.git
cd pansou
- 配置環境變量(可選)
🚀 基礎配置
環境變量 | 描述 | 默認值 | 說明 |
---|---|---|---|
PORT | 服務端口 | 8888 | 修改服務監聽端口 |
PROXY | SOCKS5代理 | 無 | 如:socks5://127.0.0.1:1080 |
CHANNELS | 默認搜索的TG頻道 | tgsearchers2 | 多個頻道用逗號分隔 |
🔧 高級配置(默認值即可)
點擊展開高級配置選項(通常不需要修改)環境變量 | 描述 | 默認值 |
---|---|---|
CONCURRENCY | 并發搜索數 | 自動計算 |
CACHE_TTL | 緩存有效期(分鐘) | 60 |
CACHE_MAX_SIZE | 最大緩存大小(MB) | 100 |
PLUGIN_TIMEOUT | 插件超時時間(秒) | 30 |
ASYNC_RESPONSE_TIMEOUT | 快速響應超時(秒) | 4 |
ASYNC_LOG_ENABLED | 異步插件詳細日志 | true |
CACHE_PATH | 緩存文件路徑 | ./cache |
SHARD_COUNT | 緩存分片數量 | 8 |
CACHE_WRITE_STRATEGY | 緩存寫入策略(immediate/hybrid) | hybrid |
ENABLE_COMPRESSION | 是否啟用壓縮 | false |
MIN_SIZE_TO_COMPRESS | 最小壓縮閾值(字節) | 1024 |
GC_PERCENT | Go GC觸發百分比 | 100 |
ASYNC_MAX_BACKGROUND_WORKERS | 最大后臺工作者數量 | CPU核心數×5 |
ASYNC_MAX_BACKGROUND_TASKS | 最大后臺任務數量 | 工作者數×5 |
ASYNC_CACHE_TTL_HOURS | 異步緩存有效期(小時) | 1 |
HTTP_READ_TIMEOUT | HTTP讀取超時(秒) | 自動計算 |
HTTP_WRITE_TIMEOUT | HTTP寫入超時(秒) | 自動計算 |
HTTP_IDLE_TIMEOUT | HTTP空閑超時(秒) | 120 |
HTTP_MAX_CONNS | HTTP最大連接數 | 自動計算 |
- 構建
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -extldflags '-static'" -o pansou .
- 運行
./pansou
其他配置參考
點擊展開 supervisor 配置參考[program:pansou]
environment=PORT=8888,CHANNELS="tgsearchers2,yunpanxunlei,tianyifc,BaiduCloudDisk,txtyzy,peccxinpd,gotopan,xingqiump4,yunpanqk,PanjClub,kkxlzy,baicaoZY,MCPH01,share_aliyun,bdwpzhpd,ysxb48,jdjdn1111,yggpan,MCPH086,zaihuayun,Q66Share,NewAliPan,ypquark,Oscar_4Kmovies,ucwpzy,alyp_TV,alyp_4K_Movies,shareAliyun,alyp_1,dianyingshare,Quark_Movies,XiangxiuNBB,NewQuark,ydypzyfx,kuakeyun,ucquark,xx123pan,yingshifenxiang123,zyfb123,tyypzhpd,tianyirigeng,cloudtianyi,hdhhd21,Lsp115,oneonefivewpfx,Maidanglaocom,qixingzhenren,taoxgzy,tgsearchers115,Channel_Shares_115,tyysypzypd,vip115hot,wp123zy,yunpan139,yunpan189,yunpanuc,yydf_hzl,alyp_Animation,alyp_JLP,leoziyuan"
command=/home/work/pansou/pansou
directory=/home/work/pansou
autostart=true
autorestart=true
startsecs=5
startretries=3
exitcodes=0
stopwaitsecs=10
stopasgroup=true
killasgroup=true
點擊展開 nginx 配置參考
server {listen 80;server_name pansou.252035.xyz;# 將 HTTP 重定向到 HTTPSreturn 301 https://$host$request_uri;
}limit_req_zone $binary_remote_addr zone=api_limit:10m rate=60r/m;server {listen 443 ssl http2;server_name pansou.252035.xyz;access_log /home/work/logs/pansou.log;# 證書和密鑰路徑ssl_certificate /etc/letsencrypt/live/252035.xyz/fullchain.pem;ssl_certificate_key /etc/letsencrypt/live/252035.xyz/privkey.pem;# 增強 SSL 安全性ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH;ssl_prefer_server_ciphers on;# 后端代理,應用限流location / {# 應用限流規則limit_req zone=api_limit burst=10 nodelay;# 當超過限制時返回 429 狀態碼limit_req_status 429;proxy_pass http://127.0.0.1:8888;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}
API文檔
搜索API
搜索網盤資源。
接口地址:/api/search
請求方法:POST
或 GET
Content-Type:application/json
(POST方法)
POST請求參數:
參數名 | 類型 | 必填 | 描述 |
---|---|---|---|
kw | string | 是 | 搜索關鍵詞 |
channels | string[] | 否 | 搜索的頻道列表,不提供則使用默認配置 |
conc | number | 否 | 并發搜索數量,不提供則自動設置為頻道數+插件數+10 |
refresh | boolean | 否 | 強制刷新,不使用緩存,便于調試和獲取最新數據 |
res | string | 否 | 結果類型:all(返回所有結果)、results(僅返回results)、merge(僅返回merged_by_type),默認為merge |
src | string | 否 | 數據來源類型:all(默認,全部來源)、tg(僅Telegram)、plugin(僅插件) |
plugins | string[] | 否 | 指定搜索的插件列表,不指定則搜索全部插件 |
cloud_types | string[] | 否 | 指定返回的網盤類型列表,支持:baidu、aliyun、quark、tianyi、uc、mobile、115、pikpak、xunlei、123、magnet、ed2k,不指定則返回所有類型 |
ext | object | 否 | 擴展參數,用于傳遞給插件的自定義參數,如{“title_en”:“English Title”, “is_all”:true} |
GET請求參數:
參數名 | 類型 | 必填 | 描述 |
---|---|---|---|
kw | string | 是 | 搜索關鍵詞 |
channels | string | 否 | 搜索的頻道列表,使用英文逗號分隔多個頻道,不提供則使用默認配置 |
conc | number | 否 | 并發搜索數量,不提供則自動設置為頻道數+插件數+10 |
refresh | boolean | 否 | 強制刷新,設置為"true"表示不使用緩存 |
res | string | 否 | 結果類型:all(返回所有結果)、results(僅返回results)、merge(僅返回merged_by_type),默認為merge |
src | string | 否 | 數據來源類型:all(默認,全部來源)、tg(僅Telegram)、plugin(僅插件) |
plugins | string | 否 | 指定搜索的插件列表,使用英文逗號分隔多個插件名,不指定則搜索全部插件 |
cloud_types | string | 否 | 指定返回的網盤類型列表,使用英文逗號分隔多個類型,支持:baidu、aliyun、quark、tianyi、uc、mobile、115、pikpak、xunlei、123、magnet、ed2k,不指定則返回所有類型 |
ext | string | 否 | JSON格式的擴展參數,用于傳遞給插件的自定義參數,如{“title_en”:“English Title”, “is_all”:true} |
POST請求示例:
{"kw": "速度與激情","channels": ["tgsearchers2", "xxx"],"conc": 2,"refresh": true,"res": "merge","src": "all","plugins": ["jikepan"],"cloud_types": ["baidu", "quark"],"ext": {"title_en": "Fast and Furious","is_all": true}
}
GET請求示例:
GET /api/search?kw=速度與激情&channels=tgsearchers2,xxx&conc=2&refresh=true&res=merge&src=tg&cloud_types=baidu,quark&ext={"title_en":"Fast and Furious","is_all":true}
成功響應:
{"total": 15,"results": [{"message_id": "12345","unique_id": "channel-12345","channel": "tgsearchers2","datetime": "2023-06-10T14:23:45Z","title": "速度與激情全集1-10","content": "速度與激情系列全集,1080P高清...","links": [{"type": "baidu","url": "https://pan.baidu.com/s/1abcdef","password": "1234"}],"tags": ["電影", "合集"],"images": ["https://cdn1.cdn-telegram.org/file/xxx.jpg"]},// 更多結果...],"merged_by_type": {"baidu": [{"url": "https://pan.baidu.com/s/1abcdef","password": "1234","note": "速度與激情全集1-10","datetime": "2023-06-10T14:23:45Z","source": "tg:頻道名稱","images": ["https://cdn1.cdn-telegram.org/file/xxx.jpg"]},// 更多百度網盤鏈接...],"quark": [{"url": "https://pan.quark.cn/s/xxxx","password": "","note": "凡人修仙傳","datetime": "2023-06-10T15:30:22Z","source": "plugin:插件名","images": []}],"aliyun": [// 阿里云盤鏈接...]// 更多網盤類型...}
}
字段說明:
source
: 數據來源標識tg:頻道名稱
: 來自Telegram頻道plugin:插件名
: 來自指定插件unknown
: 未知來源
images
: TG消息中的圖片鏈接數組(可選字段)- 僅在來源為Telegram頻道且消息包含圖片時出現
錯誤響應:
{"code": 400,"message": "關鍵詞不能為空"
}
健康檢查
檢查API服務是否正常運行。
接口地址:/api/health
請求方法:GET
成功響應:
{"channels": ["tgsearchers2"],"plugin_count": 16,"plugins": ["pansearch","panta", "qupansou","hunhepan","jikepan","pan666","panyq","susu","xuexizhinan","hdr4k","labi","shandian","duoduo","muou","wanou","ouge","zhizhen","huban"],"plugins_enabled": true,"status": "ok"
}