- radar_fetcher.py:呼叫 Function Server 抓 twpkinfo.com 資料後寫入 Redis (TTL 300s) - pokemon_radar_api.py:FastAPI /scan,從 Redis 讀取並依 request 即時二次篩選;Redis 不可用時回 200 空結果,不再 500 - pokemon_location_fetcher.py:舊版 CLI,仍由 fetch_and_upload.sh 使用 - 文件:README (參考手冊)、QUICKSTART (操作指南)、SUMMARY (故事線)、CLAUDE.md Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.6 KiB
QUICKSTART
從零把整條 pipeline 跑起來。大約 5 分鐘。
完整規格看 README.md,設計背景看 SUMMARY.md。
需求
uv(Python 套件管理)- Docker(用來跑本機 Redis)
- 能連到 Function Server
http://192.168.42.124:13000/function(內網) - 有效的
state.json(twpkinfo.com 登入快照,放 repo 根目錄)
1. 起本機 Redis
docker run -d --name pokemon-radar-redis \
--restart unless-stopped \
-p 6379:6379 \
redis:7-alpine
docker exec pokemon-radar-redis redis-cli PING # 應回 PONG
管理指令:docker stop/start/rm pokemon-radar-redis、docker logs -f pokemon-radar-redis。
2. 設定 .env
複製或編輯 .env,本機跑的最小設定:
FUNCTION_URL=http://192.168.42.124:13000/function
FUNCTION_TOKEN=6R0W53R135510
SCRIPT_PATH=twpk_radar.mjs
STATE_PATH=state.json
UA_FROM_STATE=true
RADAR_LAT=25.0478
RADAR_LNG=121.5170
RADAR_ZOOM=11
MIN_REMAINING=300
REDIS_HOST=127.0.0.1
REDIS_PORT=6379
REDIS_DB=0
REDIS_PASSWORD=
REDIS_TTL=300
REDIS_KEY=pokemon:radar:latest
連正式 Redis(192.168.42.211)時把 REDIS_HOST 和 REDIS_PASSWORD 改回去即可。
3. 拉一次資料進 Redis
uv run python radar_fetcher.py
成功的 log:
INFO ENV: RADAR_ZOOM=11, MIN_REMAINING=300, ...
INFO Loaded state: cookies=7, ls=2, ua=N
INFO Calling Function Server: http://192.168.42.124:13000/function
INFO Got 120 results (before filters)
SUCCESS Redis write OK host=127.0.0.1 key=pokemon:radar:latest ttl=300s
跑一次約 30-60 秒。
4. 檢查 Redis 內容
uv run python reader.py
會列出目前 TTL、總筆數,以及 rich 表格(名稱 / IV / CP-Lv / 技能 / 剩餘時間 / 座標)。
想看 raw JSON 用 uv run python check_redis.py。
5. 起 API
./run_pokemon_radar_api.sh
# 或:uv run uvicorn pokemon_radar_api:app --host 0.0.0.0 --port 8008 --log-config logging.ini
另開一個 shell 測:
curl -s http://127.0.0.1:8008/ping
# {"status":"ok","backend":"redis"}
curl -s -X POST http://127.0.0.1:8008/scan \
-H "Content-Type: application/json" \
-d '{"lat":25.0478,"lng":121.5170,"min_iv":90}'
看到 "source":"redis" 且 count_filtered > 0 就成功。
6.(選用)定期自動更新
Redis TTL 預設 300s,過期後 API 會回空陣列。要讓資料持續可用,把 fetcher 排成 cron:
*/3 * * * * cd /path/to/pokemon-radar-api && /root/.local/bin/uv run python radar_fetcher.py >> /var/log/radar_fetcher.log 2>&1
生產環境另有 fetch_and_upload.sh,走的是舊 pipeline(本地檔 + scp),不經 Redis,見 SUMMARY.md。
常見問題
FUNCTION_TOKEN 未設定
.env 少 FUNCTION_TOKEN。
Redis 連線失敗: Timeout connecting to server
Redis 連不到。確認容器在跑(docker ps | grep redis),或 .env 的 REDIS_HOST 是否正確。API 端此時會回 source: "redis (unreachable)" 不會 500。
Got 0 results 或 Filtered to 0
通常是 state.json 過期,網站把你擋下來。重新登入 twpkinfo.com 匯出新的 state。radar_fetcher 會印 remaining_min / remaining_max / perfect 做診斷;若 raw_items 本身就 0,就是 state 問題。
API 回 source: "redis (empty)"
Redis 裡沒資料或 key 已過期。跑 radar_fetcher.py 重灌。
MJS regex 沒套到(例如座標沒改)
表示 twpk_radar.mjs 裡的 const TARGET = {...}; 或 const DO_SCREENSHOT = ...; 格式被改動。Python 端用 regex 字串替換,形狀要維持。