소스 정보
- 저장소
- QianJinGuo/wiki
- 최근 소스 활동
- 2026년 8월 18일 04:55
- 감지된 SKILL.md 언어
- 영어
- 스타
- 1
- 포크
- 1
설치 방법
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
소스 파일 검토
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
메뉴
기본적으로 소스를 먼저 확인하는 Prompt가 선택됩니다. 직접 명령으로 전환하거나 로컬 사본을 다운로드할 수도 있습니다.
설치 여부를 결정하기 전에 SKILL.md와 SkillsMP에 표시된 보조 파일을 읽어 보세요.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
직접 명령은 검토 Prompt를 거치지 않습니다. 실행하기 전에 소스를 확인하세요.
npx skills add https://github.com/QianJinGuo/wiki --skill upstream-ban-mirror-fallback명령은 한 줄로 유지됩니다. 복사하기 전에 가로로 스크롤해 전체 내용을 확인하세요.
로컬 사본을 원하시나요? SkillsMP에서 현재 제공할 수 있는 파일을 다운로드하세요.
SKILL.md 표시 중
SOC 직업 분류 기준
| name | upstream-ban-mirror-fallback |
| description | Upstream API ban (200013)? Mirror RSS + unban watchdog. |
| version | 1.0.0 |
| author | Hermes Agent |
| tags | ["wechat","rss","mirror","ban","fallback","watchdog","cron",200013] |
Trigger: an upstream content source's account gets API-banned (WeChat MP ret=200013 freq control, or analogous account-level blocks on X/Twitter, RSSHub targets, etc.), and you need to keep the content flow alive without the native account.
Run the split test BEFORE assuming a ban is permanent:
ret:0 to ret=200003 invalid session, the ban is escalating — expect the long tier.For WeChat MP, the ecosystem options, ranked by verified experience:
| Option | Verdict |
|---|---|
| wechat2rss.xlab.app (online) | ✅ Best: free, 395+ accounts, own collection channel, ~6h latency, full-text. Zero account risk (uses its own accounts). |
| WeWe RSS self-host | ⚠️ Archived 2026-05; all requests proxy through the AUTHOR's server (weread.111965.xyz/api/v2/...) — single point of failure outside your control. Needs a WeChat-Read account (separate from the banned MP account, so unaffected by 200013). |
| RSSHub wechat routes | ⚠️ Needs gateway, heavy anti-scrape. |
| Self-implement (reverse-engineer i.weread.qq.com) | ❌ Not worth it: weread MP-article API is undocumented + volatile; you'd own the maintenance + account risk. |
Decision rule: use the free online mirror first. Self-host only if (a) coverage insufficient AND (b) the mirror's forwarding-server dependency is acceptable. Verify the mirror's feed actually returns content before wiring it in (curl the .xml, count <item>, check latest pubDate).
Verified end-to-end for the wiki RSS pipeline (blogwatcher → rss-inbox-recovery.py → inbox-screener):
blogs table): insert one row per mirror feed, name prefixed to identify origin (e.g. WeChat-机器之心). ⚠️ Do NOT use blogwatcher-cli add — it dedupes by URL and mirror feeds share one domain, so only the first insert succeeds. Direct SQL INSERT with the unique .xml feed_url.rss-inbox-recovery.py GOOD_FEEDS dict): hardcoded feed list — mirror entries MUST be added here or recovery never fetches them (it does NOT read the source registry DB).--unsafe-client to allow loopback proxy for GFW-blocked mirror domains).Pitfalls hit:
blogwatcher-cli scan with HTTPS_PROXY=127.0.0.1:10808 fails ... not authorized by the client: "127.0.0.1" address is loopback. Fix: --unsafe-client. Python (urllib) paths are unaffected.headers={"Cookie": ...} raises 'latin-1' codec can't encode characters. Split into a dict and pass cookies=....Keep the banned account at ZERO collection requests (stop internal scheduler + pause discover cron) so the ban window isn't extended. Then add a watchdog that does the waiting for you:
Design (verified as ~/.hermes/scripts/wechat-unblock-probe.py, cron wechat-unblock-probe, daily 09:20, no_agent=True):
appmsgpublish request, count=1, fixed fakeid. Single daily request does NOT refresh the rate-limit window (window is minute-scale).ret=200013 → exit silently (no_agent empty stdout = no alert). Keep it quiet — the ban is expected.ret=0 → auto-restore: (1) re-enable the collection task (UPDATE message_tasks SET status=1 + container restart), (2) resume the paused discover cron (hermes cron resume <job_id> — a no_agent script CAN shell out to hermes CLI), (3) send notification email via the verified SMTP fallback chain (direct 587 ×3 retries → send-report.py 465 fallback).running in executions.db with no subprocess (agent died mid-run), verify with ps aux | grep <job_id> (empty = dead) and re-trigger via cronjob action=run.Probe BEFORE enabling the cron: run the script once manually — banned state must exit 0 with zero stdout, and the restore path must be verified (function imports + job IDs match DB) without actually flipping the DB.
The 9-day silent WeChat outage was caused by three false-healthy layers, ALL of which must be present in any pipeline:
processed += 1 per non-exception reports "30/30 ok" while yielding 0 articles. Count DB rows before/after; ALERT + exit 1 on zero new.slave_sid exists) ≠ server-side valid session. Check the home-page URL token (token=\d+ in the dashboard URL) — logged-out sessions have no token.alerted=True) when the send actually succeeds, else a failed send suppresses future alerts forever.wechat-monitor.py (cron wechat-pipeline-monitor) kept polling the OLD direct-crawl DB (/Users/jinguo/data/we_mp_rss.db → MAX(create_time) stuck at the ban date) → fired bogus "481h stale" alerts for 20 days while the mirror channel was healthy. Diagnosis: compute the mirror's real freshness from raw/rss-inbox/ — a file counts as WeChat-mirror if feed_name: starts with WeChat- OR source_url: contains mp.weixin.qq.com; latest mtime among them = last discovery. If that is <48h old while the monitor says stale, the monitor is watching the wrong source → repoint it (re-verify with a dry run that prints the channel + hours). Rule: when a channel is parked under a ban, EVERY downstream monitor/alert that read it must be checked and redirected to the live mirror.we-mp-rss-troubleshooting (user-owned) — WeChat-specific container/cookie/endpoint fix details, 200013 history, wechat2rss integration specificscron-management (user-owned) — cron error debugging, provider-failure waves, zombie roundsrss-to-wiki-pipeline (user-owned) — blogwatcher/recovery pipeline operational details, WeChat-* mirror feed management