Not in the top 1,000 by GitHub stars
Moore-developers/moore-wechat-article-downloader
本地优先的微信内容情报库:同步公众号文章,保存精选评论和互动数据,供 Codex/Claude Code 做内容研究。
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Nov 2, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
dea919bdd639 → dea919bdd639
Week of Oct 26, 2026 · Line counts unavailable
Before Not checked yet → After Network or broad shell
First observation → dea919bdd639
No earlier version was observed for comparison.
Heat
0.4- Star growth, last 7 daysNot available
- Star growth, last 24 hoursNot available
- Rank movement, last 7 daysNot available
- Commits, last 30 daysNot available
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekNot available
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
30-day change not yet available: not enough history.
Individual skills in this repository
How it works
moore-wechat-article-downloader
When your agent uses it
当用户要下载或管理微信公众号文章时使用本技能。支持订阅同步、微信收藏和链接导入;互动数据仅在用户微信短时会话有效时补充指标与精选评论。优先本地运行;不要扩展成内容改写、总结、SaaS 或云服务。
What it loads into context
Frontmatter
80 tokensAlways available to the agent
SKILL.md
6,062 tokensWhen the skill is activated
Reference documents
27,976 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- 场景判断
- 范围
- 执行护栏
- 场景 1:直接下载已知文章
- 场景 2:公众号历史文章
- 场景 3:多账号订阅 + 定时同步
- Exporter 登录
- 路径和输出
- 输出约定
- 参考文件
Scripts executed separately
evals/test_credential_broker.pyevals/test_exporter_contract.pyevals/test_snapshot_attach_contract.pyevals/test_video_download_contract.pyevals/test_wizard_contract.pyscripts/inspect_context.pyscripts/validate_outputs.pyscripts/wechat_credential_broker.pyscripts/wechat_downloader.pyscripts/wechat_exporter.pyscripts/wechat_history_mitm_addon.pyscripts/wechat_video_crypto.pyscripts/wechat_video_downloader.pyscripts/wechat_video_models.pyscripts/wechat_video_registry.pyscripts/wechat_video_service.pyscripts/wechat_wizard.py
Files
.gitignoreasset162 bytesLICENSEasset1,073 bytesREADME.mddoc8,330 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesSKILL.mdcore23,234 bytesdocs/plans/2026-07-06-unified-wizard-gates.mddoc25,321 bytesdocs/plans/2026-07-08-skill-scenario-redesign.mddoc6,641 bytesdocs/plans/2026-07-09-proxy-snapshot-validation-plan.mddoc7,801 bytesdocs/plans/2026-07-10-wechat-collection-architecture.mddoc19,691 bytesdocs/plans/2026-07-10-wechat-collection-implementation-tasks.mddoc9,583 bytesevals/evals.jsonasset4,349 bytesevals/fixtures/exporter_fixture.jsonasset1,424 bytesevals/fixtures/html/demo-url-article-1.htmlasset768 bytesevals/fixtures/html/demo-url-article-2.htmlasset719 bytesevals/fixtures/html/demo-url-article-content-noencode.htmlasset923 bytesevals/test_credential_broker.pyruns8,233 bytesevals/test_exporter_contract.pyruns60,638 bytesevals/test_snapshot_attach_contract.pyruns4,891 bytesevals/test_video_download_contract.pyruns4,760 bytesevals/test_wizard_contract.pyruns103,014 bytesprompts/completion-report-template.mddoc452 bytesreferences/backend-design.mddoc8,462 bytesreferences/compliance.mddoc1,309 bytesreferences/output-formats.mddoc4,996 bytesreferences/skill-cli-flow.mddoc13,963 bytesreferences/troubleshooting.mddoc4,383 bytesscripts/inspect_context.pyruns1,086 bytesscripts/validate_outputs.pyruns3,749 bytesscripts/wechat_credential_broker.pyruns19,522 bytesscripts/wechat_downloader.pyruns247,746 bytesscripts/wechat_exporter.pyruns209,327 bytesscripts/wechat_history_mitm_addon.pyruns78,380 bytesscripts/wechat_video_crypto.pyruns4,099 bytesscripts/wechat_video_downloader.pyruns5,267 bytesscripts/wechat_video_models.pyruns6,427 bytesscripts/wechat_video_registry.pyruns1,832 bytesscripts/wechat_video_service.pyruns2,991 bytesscripts/wechat_wizard.pyruns109,126 bytes
Read SKILL.md
# 公众号归档器
## 场景判断
| 用户意图 | 场景 | 入口 |
|---------|------|------|
| 提供了完整文章 URL | 场景 1:直接下载 | `wechat_wizard.py run "下载:<url>"` |
| 给公众号名 / 样例 URL,想要历史文章 | 场景 2A:Exporter(默认) | `wechat_wizard.py run "历史文章:<名称或URL>"` |
| 明确说"不登录"或"用代理" | 场景 2B:代理(备选) | `wechat_wizard.py run "代理历史:<url>"` |
| 想抓评论/阅读/点赞/页面风格 | 场景 2C:微信收藏 | `wechat_downloader.py proxy-enhancer-session-start --yes` |
| 管理多个公众号 / 定时同步 | 场景 3:订阅同步 | 见场景 3 |
统一入口优先。wizard 返回以下 gate 时按表处理,不要立刻降级为底层命令:
View the complete source on GitHubSkills included
- moore-wechat-article-downloader
Repository facts
- License
- MIT
- Created
- Jul 8, 2026
- Last pushed
- Aug 1, 2026
- Forks
- 47
- Open issues
- 1
- Project activity
- Slowing
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 4, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 35 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- No dangerous shell commands
- 386 network referencesin 22 files: evals/test_wizard_contract.py:173 scripts/wechat_downloader.py:163 evals/test_credential_broker.py:30 and 19 more
- No hidden or obfuscated text
- No instruction overrides
- 17 executable scriptsin 17 files: evals/test_credential_broker.py:1 evals/test_exporter_contract.py:1 evals/test_snapshot_attach_contract.py:1 and 14 more
- 95 references to secretsin 13 files: evals/test_wizard_contract.py:51 scripts/wechat_exporter.py:167 evals/test_video_download_contract.py:91 and 10 more
- No requests to vote in Hot
Show all 498 signals by file
.gitignore
- Access to secretsline 9
[Credential-related source omitted]
README.md
- Network accessline 50
mkdir -p ~/.codex/skills git clone https://github.com/Moore-developers/moore-wechat-article-downloader.git \ - Network accessline 51
git clone https://github.com/Moore-developers/moore-wechat-article-downloader.git \ - Network accessline 58
mkdir -p ~/.claude/skills git clone https://github.com/Moore-developers/moore-wechat-article-downloader.git \ - Network accessline 59
git clone https://github.com/Moore-developers/moore-wechat-article-downloader.git \ - Network accessline 68
结合最近 5 篇文章的精选评论和互动数据,判断读者真正买账的点 开启微信收藏会话,边看边把正文、评论和互动信号保存到本地 把这些公众号文章链接导入本地:https://mp.weixin.qq.com/s/xxx - Network accessline 70
把这些公众号文章链接导入本地:https://mp.weixin.qq.com/s/xxx - Network accessline 132
把这些公众号文章链接导入本地:https://mp.weixin.qq.com/s/xxx
SKILL.md
- Network accessline 103
**硬性规则**: - 必须使用旧版历史入口:`https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=<biz>&scene=124#wechat_redirect` - Network accessline 104
- 必须使用旧版历史入口:`https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=<biz>&scene=124#wechat_redirect` - Access to secretsline 333
[Credential-related source omitted]
docs/plans/2026-07-06-unified-wizard-gates.md
- Network accessline 107
下载这些公众号文章: https://mp.weixin.qq.com/s/xxx - Network accessline 108
https://mp.weixin.qq.com/s/xxx - Network accessline 109
https://mp.weixin.qq.com/s/yyy - Network accessline 174
历史文章列表下载:https://mp.weixin.qq.com/s/xxx - Access to secretsline 270
[Credential-related source omitted] - Access to secretsline 385
[Credential-related source omitted] - Access to secretsline 506
[Credential-related source omitted] - Access to secretsline 727
[Credential-related source omitted]
docs/plans/2026-07-09-proxy-snapshot-validation-plan.md
- Network accessline 86
- POST 到 `https://mp.weixin.qq.com/__moore_capture`
evals/evals.json
- Network accessline 4
{ "id": 1, "prompt": "帮我下载这篇公众号文章,只要 Markdown 和图片:https://mp.weixin.qq.com/s/example", - Network accessline 5
"id": 1, "prompt": "帮我下载这篇公众号文章,只要 Markdown 和图片:https://mp.weixin.qq.com/s/example", "expected_output": "优先调用 scripts/wechat_wizard.py run 进入 URL 模式,执行输入、模式、环境、下载、验证门禁;输出到 ~/Downloads/wechat-articles/<run-id>/ 或用户指定目录,包含 index.c - Network accessline 6
"prompt": "帮我下载这篇公众号文章,只要 Markdown 和图片:https://mp.weixin.qq.com/s/example", - Network accessline 22
{ "id": 4, "prompt": "我想下载某个公众号的历史文章,这是其中一篇样例文章:https://mp.weixin.qq.com/s/example", - Network accessline 23
"id": 4, "prompt": "我想下载某个公众号的历史文章,这是其中一篇样例文章:https://mp.weixin.qq.com/s/example", "expected_output": "优先调用 scripts/wechat_wizard.py run 进入 history 模式,生成旧版 profile_ext?action=home 历史入口并停在 need_proxy_confirm;只有用户确认后才用 history-pro - Network accessline 24
"prompt": "我想下载某个公众号的历史文章,这是其中一篇样例文章:https://mp.weixin.qq.com/s/example", - Network accessline 46
{ "id": 8, "prompt": "下载这几篇公众号文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b,自动去重并给我 Markdown 输出目录。", - Network accessline 47
"id": 8, "prompt": "下载这几篇公众号文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b,自动去重并给我 Markdown 输出目录。", "expected_output": "优先调用 scripts/wechat_wizard.py run 进入统一 URL wizard;执行输入、模式、环境、下载、验证门禁;输出 task_id、run_id、output_ - Network accessline 48
"prompt": "下载这几篇公众号文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b,自动去重并给我 Markdown 输出目录。",
evals/fixtures/exporter_fixture.json
- Network accessline 4
"nickname": "哥飞", "alias": "gefei7", "round_head_img": "https://mmbiz.qpic.cn/demo/avatar.jpg", - Network accessline 5
"alias": "gefei7", "round_head_img": "https://mmbiz.qpic.cn/demo/avatar.jpg", "signature": "AI 工具与出海实践" - Network accessline 6
"round_head_img": "https://mmbiz.qpic.cn/demo/avatar.jpg", - Network accessline 15
"author_name": "哥飞", "digest": "一篇关于 AI 工具增长的文章", "link": "https://mp.weixin.qq.com/s/demo-exporter-article-1", - Network accessline 16
"digest": "一篇关于 AI 工具增长的文章", "link": "https://mp.weixin.qq.com/s/demo-exporter-article-1", "cover": "https://mmbiz.qpic.cn/demo/cover1.jpg", - Network accessline 17
"link": "https://mp.weixin.qq.com/s/demo-exporter-article-1", - Network accessline 18
"cover": "https://mmbiz.qpic.cn/demo/cover1.jpg", - Network accessline 27
"author_name": "哥飞", "digest": "一篇关于公众号运营的文章", "link": "https://mp.weixin.qq.com/s/demo-exporter-article-2", - Network accessline 28
"digest": "一篇关于公众号运营的文章", "link": "https://mp.weixin.qq.com/s/demo-exporter-article-2", "cover": "https://mmbiz.qpic.cn/demo/cover2.jpg", - Network accessline 29
"link": "https://mp.weixin.qq.com/s/demo-exporter-article-2", - Network accessline 30
"cover": "https://mmbiz.qpic.cn/demo/cover2.jpg", - Network accessline 39
"author_name": "哥飞", "digest": "一篇关于智能体工作流的文章", "link": "https://mp.weixin.qq.com/s/demo-exporter-article-3", - Network accessline 40
"digest": "一篇关于智能体工作流的文章", "link": "https://mp.weixin.qq.com/s/demo-exporter-article-3", "cover": "https://mmbiz.qpic.cn/demo/cover3.jpg", - Network accessline 41
"link": "https://mp.weixin.qq.com/s/demo-exporter-article-3", - Network accessline 42
"cover": "https://mmbiz.qpic.cn/demo/cover3.jpg",
evals/fixtures/html/demo-url-article-1.html
- Network accessline 4
<meta property="og:title" content="离线单篇下载测试"> <meta property="og:article:author" content="测试公众号"> <meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-1"> - Network accessline 5
<meta property="og:article:author" content="测试公众号"> <meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-1"> <title>离线单篇下载测试 - 微信公众平台</title> - Network accessline 6
<meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-1"> - Network accessline 19
<h2>第一节</h2> <p>这是离线 fixture 文章正文。</p> <p><a href="https://example.com">参考链接</a></p> - Network accessline 20
<p>这是离线 fixture 文章正文。</p> <p><a href="https://example.com">参考链接</a></p> </div> - Network accessline 21
<p><a href="https://example.com">参考链接</a></p>
evals/fixtures/html/demo-url-article-2.html
- Network accessline 4
<meta property="og:title" content="离线多篇下载测试"> <meta property="og:article:author" content="测试公众号"> <meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-2"> - Network accessline 5
<meta property="og:article:author" content="测试公众号"> <meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-2"> <title>离线多篇下载测试 - 微信公众平台</title> - Network accessline 6
<meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-2">
evals/fixtures/html/demo-url-article-content-noencode.html
- Network accessline 4
<meta property="og:title" content="贴图公众号正文提取测试"> <meta property="og:article:author" content="贴图测试公众号"> <meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-content-noencode"> - Network accessline 5
<meta property="og:article:author" content="贴图测试公众号"> <meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-content-noencode"> <title>贴图公众号正文提取测试 - 微信公众平台</title> - Network accessline 6
<meta property="og:url" content="https://mp.weixin.qq.com/s/demo-url-article-content-noencode"> - Network accessline 14
title: '贴图公众号正文提取测试', item_show_type: '8' * 1, content_noencode: '\x3csection\x3e\x3ch2\x3e隐藏字段正文\x3c/h2\x3e\x3cp\x3e这是从 content_noencode 提取的完整正文。\x3c/p\x3e\x3cp\x3eUnicode:\u6b63\u6587 \uD83D\uDDBC\x3c/p\x3e\x3cimg data-src=\x2 - Network accessline 15
item_show_type: '8' * 1, content_noencode: '\x3csection\x3e\x3ch2\x3e隐藏字段正文\x3c/h2\x3e\x3cp\x3e这是从 content_noencode 提取的完整正文。\x3c/p\x3e\x3cp\x3eUnicode:\u6b63\u6587 \uD83D\uDDBC\x3c/p\x3e\x3cimg data-src=\x22https://mmbiz.qpic.cn/test. - Network accessline 16
content_noencode: '\x3csection\x3e\x3ch2\x3e隐藏字段正文\x3c/h2\x3e\x3cp\x3e这是从 content_noencode 提取的完整正文。\x3c/p\x3e\x3cp\x3eUnicode:\u6b63\u6587 \uD83D\uDDBC\x3c/p\x3e\x3cimg data-src=\x22https://mmbiz.qpic.cn/test.png\x22 alt=\x22正文配图\x22\x3e\x3
evals/test_credential_broker.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 30
[Credential-related source omitted] - Network accessline 31
[Credential-related source omitted] - Network accessline 32
[Credential-related source omitted] - Network accessline 49
def test_expired_credential_is_removed(self) -> None: broker = WeChatCredentialBroker(self.tmp / "expired.sock", "session", "capability-test", ttl_seconds=60) broker.capture("https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin= - Network accessline 50
broker = WeChatCredentialBroker(self.tmp / "expired.sock", "session", "capability-test", ttl_seconds=60) broker.capture("https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12", {"cookie": "x"}) broker._credentials["MzDemo"]["e - Network accessline 51
broker.capture("https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12", {"cookie": "x"}) - Network accessline 64
broker = WeChatCredentialBroker(self.tmp / "engagement.sock", "session", "capability-test", http_get=fake_get) broker.capture( "https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12&key=key-secret&pass_ticket=ticket-secret - Network accessline 65
[Credential-related source omitted] - Network accessline 66
[Credential-related source omitted] - Network accessline 69
result = broker.fetch_engagement( "MzDemo", [{"article_id": 7, "msgid": "msg-7", "idx": 1, "comment_id": "comment-7", "url": "https://mp.weixin.qq.com/s/demo"}], - Network accessline 70
"MzDemo", [{"article_id": 7, "msgid": "msg-7", "idx": 1, "comment_id": "comment-7", "url": "https://mp.weixin.qq.com/s/demo"}], ) - Network accessline 71
[{"article_id": 7, "msgid": "msg-7", "idx": 1, "comment_id": "comment-7", "url": "https://mp.weixin.qq.com/s/demo"}], - Network accessline 85
broker = WeChatCredentialBroker(self.tmp / "capture.sock", "session", "capability-test") captured = broker.capture( "https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12&key=key-secret&pass_ticket=ticket-secret", - Network accessline 86
captured = broker.capture( "https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12&key=key-secret&pass_ticket=ticket-secret", {"cookie": "wap_sid2=cookie-secret"}, - Network accessline 87
"https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12&key=key-secret&pass_ticket=ticket-secret", - Network accessline 105
broker = WeChatCredentialBroker(self.tmp / "safe.sock", "session", "capability-test", http_get=fake_get) broker.capture( "https://mp.weixin.qq.com/s/demo?__biz=MzDemo&uin=12&key=key-secret&pass_ticket=ticket-secret&appms - Network accessline 106
[Credential-related source omitted] - Network accessline 107
[Credential-related source omitted] - Network accessline 109
) invalid = broker.fetch_engagement( "MzDemo", [{"article_id": 1, "msgid": "m", "idx": 1, "comment_id": "c", "url": "https://example.com/collect"}] - Network accessline 110
invalid = broker.fetch_engagement( "MzDemo", [{"article_id": 1, "msgid": "m", "idx": 1, "comment_id": "c", "url": "https://example.com/collect"}] ) - Network accessline 111
"MzDemo", [{"article_id": 1, "msgid": "m", "idx": 1, "comment_id": "c", "url": "https://example.com/collect"}] - Network accessline 112
) rejected = broker.fetch_engagement( "MzDemo", [{"article_id": 2, "msgid": "m", "idx": 1, "comment_id": "c", "url": "https://mp.weixin.qq.com/s/demo"}] - Network accessline 113
rejected = broker.fetch_engagement( "MzDemo", [{"article_id": 2, "msgid": "m", "idx": 1, "comment_id": "c", "url": "https://mp.weixin.qq.com/s/demo"}] ) - Network accessline 114
"MzDemo", [{"article_id": 2, "msgid": "m", "idx": 1, "comment_id": "c", "url": "https://mp.weixin.qq.com/s/demo"}] - Network accessline 130
article = {"article_id": 7, "msgid": "msg-7", "idx": 1, "comment_id": "comment-7", "url": "https://mp.weixin.qq.com/s/demo"} - Network accessline 133
[Credential-related source omitted] - Network accessline 134
[Credential-related source omitted] - Network accessline 135
[Credential-related source omitted] - Network accessline 162
broker.start() try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: - Network accessline 163
try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: client.connect(str(path)) - Network accessline 164
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
evals/test_exporter_contract.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 37
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Network accessline 218
{ "login_id": login_id, "base_url": "https://down.mptext.top", - Network accessline 219
"login_id": login_id, "base_url": "https://down.mptext.top", "qrcode_path": str(qrcode_path), - Network accessline 220
"base_url": "https://down.mptext.top", - Network accessline 414
payload = self.run_cli( "exporter-wizard", "根据这篇文章 URL 找公众号并列出历史文章:https://mp.weixin.qq.com/s/demo-exporter-article-1", - Network accessline 415
"exporter-wizard", "根据这篇文章 URL 找公众号并列出历史文章:https://mp.weixin.qq.com/s/demo-exporter-article-1", "--list-only", - Network accessline 416
"根据这篇文章 URL 找公众号并列出历史文章:https://mp.weixin.qq.com/s/demo-exporter-article-1", - Network accessline 440
{ "title": "含下划线短链", "link": "https://mp.weixin.qq.com/s/a_b", - Network accessline 441
"title": "含下划线短链", "link": "https://mp.weixin.qq.com/s/a_b", "update_time": 1783000000, - Network accessline 442
"link": "https://mp.weixin.qq.com/s/a_b", - Network accessline 450
code, payload = self.run_cli_allow_fail( "exporter-wizard", "根据这篇文章 URL 找公众号并列出历史文章:https://mp.weixin.qq.com/s/acb", - Network accessline 451
"exporter-wizard", "根据这篇文章 URL 找公众号并列出历史文章:https://mp.weixin.qq.com/s/acb", "--list-only", - Network accessline 452
"根据这篇文章 URL 找公众号并列出历史文章:https://mp.weixin.qq.com/s/acb", - Network accessline 460
[Credential-related source omitted] - Network accessline 462
[Credential-related source omitted] - Network accessline 509
{ "title": "第二账号文章", "link": "https://mp.weixin.qq.com/s/second-account-article", - Network accessline 510
"title": "第二账号文章", "link": "https://mp.weixin.qq.com/s/second-account-article", "update_time": 1783000000, - Network accessline 511
"link": "https://mp.weixin.qq.com/s/second-account-article", - Network accessline 636
{ "title": f"分页文章 {number}", "link": f"https://mp.weixin.qq.com/s/page-{number}", - Network accessline 637
"title": f"分页文章 {number}", "link": f"https://mp.weixin.qq.com/s/page-{number}", "update_time": 1783000000 - number, - Network accessline 638
"link": f"https://mp.weixin.qq.com/s/page-{number}", - Network accessline 714
"idx": 1, "title": "另一篇文章", "url": "https://mp.weixin.qq.com/s/other", - Network accessline 715
"title": "另一篇文章", "url": "https://mp.weixin.qq.com/s/other", "digest": "", - Network accessline 716
"url": "https://mp.weixin.qq.com/s/other", - Network accessline 863
context = wechat_exporter.extract_wechat_article_context( "var __biz = 'MzIxNTA1MDEwNg=='; var comment_id = '12345'; var key = 'secret';", "https://mp.weixin.qq.com/s/demo?pass_ticket=secret", - Network accessline 864
"var __biz = 'MzIxNTA1MDEwNg=='; var comment_id = '12345'; var key = 'secret';", "https://mp.weixin.qq.com/s/demo?pass_ticket=secret", ) - Network accessline 865
"https://mp.weixin.qq.com/s/demo?pass_ticket=secret", - Network accessline 1193
"warning", detail={ "url": "https://mp.weixin.qq.com/s/demo?pass_ticket=secret-ticket&key=secret-key", - Network accessline 1194
detail={ "url": "https://mp.weixin.qq.com/s/demo?pass_ticket=secret-ticket&key=secret-key", "cookie": "secret-cookie", - Network accessline 1195
"url": "https://mp.weixin.qq.com/s/demo?pass_ticket=secret-ticket&key=secret-key",
evals/test_snapshot_attach_contract.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 36
"publish_time": "2026年7月9日 20:00", "captured_at": "2026-07-09T12:00:00Z", "url": "https://mp.weixin.qq.com/s?__biz=testbiz&mid=1&idx=1&sn=abc", - Network accessline 37
"captured_at": "2026-07-09T12:00:00Z", "url": "https://mp.weixin.qq.com/s?__biz=testbiz&mid=1&idx=1&sn=abc", "js_content_html": "<p>正文第一段</p>", - Network accessline 38
"url": "https://mp.weixin.qq.com/s?__biz=testbiz&mid=1&idx=1&sn=abc", - Network accessline 64
"title": "页面数据测试", "account_name": "测试号", "url": "https://mp.weixin.qq.com/s?__biz=testbiz&mid=1&idx=1&sn=abc", - Network accessline 65
"account_name": "测试号", "url": "https://mp.weixin.qq.com/s?__biz=testbiz&mid=1&idx=1&sn=abc", } - Network accessline 66
"url": "https://mp.weixin.qq.com/s?__biz=testbiz&mid=1&idx=1&sn=abc",
evals/test_video_download_contract.py
- Executable scriptline 1
Executable file - Network accessline 32
"media": [ { "url": "https://finder.video.qq.com/video.mp4?encfilekey=a", - Network accessline 33
[Credential-related source omitted] - Network accessline 34
"url": "https://finder.video.qq.com/video.mp4?encfilekey=a", - Network accessline 40
[Credential-related source omitted] - Network accessline 41
[Credential-related source omitted] - Network accessline 42
[Credential-related source omitted] - Network accessline 65
"idx": 1, "title": "视频文章", "url": "https://mp.weixin.qq.com/s/video-demo", - Network accessline 66
"title": "视频文章", "url": "https://mp.weixin.qq.com/s/video-demo", "digest": "", - Network accessline 67
"url": "https://mp.weixin.qq.com/s/video-demo", - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 92
[Credential-related source omitted] - Access to secretsline 94
[Credential-related source omitted] - Access to secretsline 95
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted]
evals/test_wizard_contract.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 51
[Credential-related source omitted] - Network accessline 173
wechat_downloader.reset_wechat_webview_process = lambda: {"ok": True, "found": False} wechat_downloader.choose_proxy_port = lambda port=None: 23555 wechat_downloader.resolve_upstream_proxy = lambda value, port, base= - Network accessline 174
wechat_downloader.choose_proxy_port = lambda port=None: 23555 wechat_downloader.resolve_upstream_proxy = lambda value, port, base=None: "http://127.0.0.1:10808" wechat_downloader.start_proxy_enhancer = lambda base, p - Network accessline 175
wechat_downloader.resolve_upstream_proxy = lambda value, port, base=None: "http://127.0.0.1:10808" - Network accessline 198
self.assertEqual(result["port"], 23555) self.assertEqual(calls["start_port"], 23555) self.assertEqual(calls["start_upstream"], "http://127.0.0.1:10808") - Network accessline 199
self.assertEqual(calls["start_port"], 23555) self.assertEqual(calls["start_upstream"], "http://127.0.0.1:10808") self.assertEqual(calls["enable_port"], 23555) - Network accessline 200
self.assertEqual(calls["start_upstream"], "http://127.0.0.1:10808") - Network accessline 224
def test_proxy_enhancer_restart_preserves_active_port_and_upstream(self) -> None: state = {"pid": 1234, "port": 23555, "upstream_proxy": "http://127.0.0.1:10808"} - Network accessline 225
state = {"pid": 1234, "port": 23555, "upstream_proxy": "http://127.0.0.1:10808"} - Network accessline 267
"set:127.0.0.1:10808", "stop:1234:23555", "start:23555:http://127.0.0.1:10808", - Network accessline 268
"stop:1234:23555", "start:23555:http://127.0.0.1:10808", "set:127.0.0.1:23555", - Network accessline 269
"start:23555:http://127.0.0.1:10808", - Network accessline 383
code, payload = self.run_cli( "run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 384
"run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", "--dry-run", - Network accessline 385
"下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 408
_code, payload = self.run_cli( "run", "下载这篇公众号文章:https://mp.weixin.qq.com/s/demo-url-article-1", - Network accessline 409
"run", "下载这篇公众号文章:https://mp.weixin.qq.com/s/demo-url-article-1", "--output-dir", - Network accessline 410
"下载这篇公众号文章:https://mp.weixin.qq.com/s/demo-url-article-1", - Network accessline 438
_code, payload = self.run_cli( "run", "下载这篇公众号文章:https://mp.weixin.qq.com/s/demo-url-article-content-noencode", - Network accessline 439
"run", "下载这篇公众号文章:https://mp.weixin.qq.com/s/demo-url-article-content-noencode", "--output-dir", - Network accessline 440
"下载这篇公众号文章:https://mp.weixin.qq.com/s/demo-url-article-content-noencode", - Network accessline 459
self.assertIn("这是从 content_noencode 提取的完整正文。", markdown) self.assertIn("Unicode:正文 🖼", markdown) self.assertIn("", markdown) - Network accessline 460
self.assertIn("Unicode:正文 🖼", markdown) self.assertIn("", markdown) self.assertLess(markdown.index("![正文配图]"), markdown.index("这是从 content_noencode 提取的完整正文。")) - Network accessline 461
self.assertIn("", markdown) - Network accessline 468
_code, payload = self.run_cli( "run", "下载这些公众号文章:https://mp.weixin.qq.com/s/demo-url-article-1 https://mp.weixin.qq.com/s/demo-url-article-2", - Network accessline 469
"run", "下载这些公众号文章:https://mp.weixin.qq.com/s/demo-url-article-1 https://mp.weixin.qq.com/s/demo-url-article-2", "--output-dir", - Network accessline 470
"下载这些公众号文章:https://mp.weixin.qq.com/s/demo-url-article-1 https://mp.weixin.qq.com/s/demo-url-article-2", - Network accessline 499
_code, payload = self.run_cli( "run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 500
"run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", "--dry-run", - Network accessline 501
"下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 530
_code, payload = self.run_cli( "run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 531
"run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", "--dry-run", - Network accessline 532
"下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 544
_code, overridden = self.run_cli( "run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", - Network accessline 545
"run", "下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", "--dry-run", - Network accessline 546
"下载这些文章:https://mp.weixin.qq.com/s/a https://mp.weixin.qq.com/s/b", "--dry-run", "--download-assets", - Network accessline 597
wechat_downloader.download_one_markdown_only = fake_download manifest = wechat_downloader.run_markdown_only_download( ["https://mp.weixin.qq.com/s/a", "https://mp.weixin.qq.com/s/b"], - Network accessline 598
manifest = wechat_downloader.run_markdown_only_download( ["https://mp.weixin.qq.com/s/a", "https://mp.weixin.qq.com/s/b"], self.tmp / "parallel", - Network accessline 599
["https://mp.weixin.qq.com/s/a", "https://mp.weixin.qq.com/s/b"], - Network accessline 617
[Credential-related source omitted] - Network accessline 618
[Credential-related source omitted] - Network accessline 619
[Credential-related source omitted] - Network accessline 636
_code, payload = self.run_cli( "run", "用这篇文章 URL 获取公众号历史文章:https://mp.weixin.qq.com/s/a?__biz=MzIxNTA1MDEwNg==", - Network accessline 637
"run", "用这篇文章 URL 获取公众号历史文章:https://mp.weixin.qq.com/s/a?__biz=MzIxNTA1MDEwNg==", "--dry-run", - Network accessline 638
"用这篇文章 URL 获取公众号历史文章:https://mp.weixin.qq.com/s/a?__biz=MzIxNTA1MDEwNg==", - Network accessline 682
"history-preflight", "--url", "https://mp.weixin.qq.com/s/a?__biz=MzIxNTA1MDEwNg==", - Network accessline 683
"--url", "https://mp.weixin.qq.com/s/a?__biz=MzIxNTA1MDEwNg==", ) - Network accessline 684
"https://mp.weixin.qq.com/s/a?__biz=MzIxNTA1MDEwNg==", - Network accessline 1108
{ "article_id": "article-ok", "source_url": "https://mp.weixin.qq.com/s/ok", - Network accessline 1109
"article_id": "article-ok", "source_url": "https://mp.weixin.qq.com/s/ok", "status": "success", - Network accessline 1110
"source_url": "https://mp.weixin.qq.com/s/ok", - Network accessline 1116
"failed": [ { "source_url": "https://mp.weixin.qq.com/s/fail?pass_ticket=secret", - Network accessline 1117
{ "source_url": "https://mp.weixin.qq.com/s/fail?pass_ticket=secret", "status": "failed", - Network accessline 1118
"source_url": "https://mp.weixin.qq.com/s/fail?pass_ticket=secret", - Network accessline 1139
def test_url_mode_skips_already_downloaded_for_same_task(self) -> None: task_id = "task_skip" url = "https://mp.weixin.qq.com/s/already" - Network accessline 1140
task_id = "task_skip" url = "https://mp.weixin.qq.com/s/already" previous_dir = self.tmp / "previous" - Network accessline 1141
url = "https://mp.weixin.qq.com/s/already" - Network accessline 1191
def test_url_mode_skips_cross_task_previous_success_with_evidence(self) -> None: url = "https://mp.weixin.qq.com/s/cross-task" - Network accessline 1192
url = "https://mp.weixin.qq.com/s/cross-task" - Network accessline 1243
result = wechat_wizard.verify_run(output_dir, {"success_count": 0, "skipped": [{"source_url": "https://mp.weixin.qq.com/s/no-proof"}]}) - Network accessline 1261
"skipped": [ { "source_url": "https://mp.weixin.qq.com/s/no-proof", - Network accessline 1262
{ "source_url": "https://mp.weixin.qq.com/s/no-proof", "previous_run_id": "fake-run", - Network accessline 1263
"source_url": "https://mp.weixin.qq.com/s/no-proof", - Network accessline 1279
(output_dir / "articles.json").write_text("[]\n", encoding="utf-8") (output_dir / "errors.json").write_text("[]\n", encoding="utf-8") url = "https://mp.weixin.qq.com/s/proof" - Network accessline 1280
(output_dir / "errors.json").write_text("[]\n", encoding="utf-8") url = "https://mp.weixin.qq.com/s/proof" wechat_wizard.record_download_manifest( - Network accessline 1281
url = "https://mp.weixin.qq.com/s/proof" - Network accessline 1314
def test_retry_failed_urls_uses_failed_items(self) -> None: task_id = "task_retry" url = "https://mp.weixin.qq.com/s/retry-me" - Network accessline 1315
task_id = "task_retry" url = "https://mp.weixin.qq.com/s/retry-me" intent = wechat_wizard.parse_intent(f"下载:{url}") - Network accessline 1316
url = "https://mp.weixin.qq.com/s/retry-me" - Network accessline 1358
finally: db.close() intent = wechat_wizard.parse_intent("下载:https://mp.weixin.qq.com/s/locked") - Network accessline 1359
db.close() intent = wechat_wizard.parse_intent("下载:https://mp.weixin.qq.com/s/locked") wechat_wizard.decide_mode(intent) - Network accessline 1360
intent = wechat_wizard.parse_intent("下载:https://mp.weixin.qq.com/s/locked") - Access to secretsline 1388
[Credential-related source omitted] - Network accessline 1617
"success_count": 1, "failure_count": 0, "articles": [{"source_url": "https://mp.weixin.qq.com/s/a", "status": "success"}], - Network accessline 1618
"failure_count": 0, "articles": [{"source_url": "https://mp.weixin.qq.com/s/a", "status": "success"}], "failed": [], - Network accessline 1619
"articles": [{"source_url": "https://mp.weixin.qq.com/s/a", "status": "success"}], - Network accessline 1712
"port": 8899, "proxy": "127.0.0.1:8899", "upstream_proxy": "http://127.0.0.1:10808", - Network accessline 1713
"proxy": "127.0.0.1:8899", "upstream_proxy": "http://127.0.0.1:10808", "log": str(self.tmp / "old.proxy.log"), - Network accessline 1714
"upstream_proxy": "http://127.0.0.1:10808", - Network accessline 1720
try: wechat_downloader.history_proxy_process_running = lambda pid, port: int(pid) == 1234 and int(port) == 8899 wechat_downloader.resolve_upstream_proxy = lambda value, port, base=None: "http://127.0.0.1:10808" - Network accessline 1721
wechat_downloader.history_proxy_process_running = lambda pid, port: int(pid) == 1234 and int(port) == 8899 wechat_downloader.resolve_upstream_proxy = lambda value, port, base=None: "http://127.0.0.1:10808" result = w - Network accessline 1722
wechat_downloader.resolve_upstream_proxy = lambda value, port, base=None: "http://127.0.0.1:10808" - Network accessline 1749
8899, 1234, "http://127.0.0.1:10808", - Network accessline 1750
1234, "http://127.0.0.1:10808", wechat_downloader.session_proxy_state_path(self.tmp, "new-session"), - Network accessline 1751
"http://127.0.0.1:10808", - Access to secretsline 1818
[Credential-related source omitted] - Access to secretsline 1819
[Credential-related source omitted] - Access to secretsline 1820
[Credential-related source omitted] - Access to secretsline 1822
[Credential-related source omitted] - Access to secretsline 1823
[Credential-related source omitted] - Access to secretsline 1824
[Credential-related source omitted] - Access to secretsline 1831
[Credential-related source omitted] - Access to secretsline 1833
[Credential-related source omitted] - Access to secretsline 1835
[Credential-related source omitted] - Access to secretsline 1837
[Credential-related source omitted] - Access to secretsline 1839
[Credential-related source omitted] - Access to secretsline 1841
[Credential-related source omitted] - Access to secretsline 1849
[Credential-related source omitted] - Access to secretsline 1850
[Credential-related source omitted] - Access to secretsline 1852
[Credential-related source omitted] - Access to secretsline 1853
[Credential-related source omitted] - Access to secretsline 1858
[Credential-related source omitted] - Access to secretsline 1860
[Credential-related source omitted] - Access to secretsline 1862
[Credential-related source omitted] - Access to secretsline 1864
[Credential-related source omitted] - Access to secretsline 1882
[Credential-related source omitted] - Access to secretsline 1883
[Credential-related source omitted] - Access to secretsline 1885
[Credential-related source omitted] - Access to secretsline 1886
[Credential-related source omitted] - Access to secretsline 1891
[Credential-related source omitted] - Access to secretsline 1893
[Credential-related source omitted] - Access to secretsline 1895
[Credential-related source omitted] - Access to secretsline 1897
[Credential-related source omitted] - Network accessline 1898
[Credential-related source omitted] - Network accessline 1899
[Credential-related source omitted] - Network accessline 1900
" https://finder.video.qq.com/media.mp4?key=secret" - Network accessline 1902
self.assertEqual( links, ["https://channels.weixin.qq.com/web/pages/feed?finderUsername=demo"], - Network accessline 1903
links, ["https://channels.weixin.qq.com/web/pages/feed?finderUsername=demo"], ) - Network accessline 1904
["https://channels.weixin.qq.com/web/pages/feed?finderUsername=demo"], - Network accessline 1906
self.assertEqual(addon.sanitize_channels_url("https://channels.weixin.qq.com/static/app.js"), "") - Access to secretsline 1919
[Credential-related source omitted] - Access to secretsline 1920
[Credential-related source omitted] - Access to secretsline 1921
[Credential-related source omitted] - Access to secretsline 1923
[Credential-related source omitted] - Access to secretsline 1924
[Credential-related source omitted] - Access to secretsline 1925
[Credential-related source omitted] - Network accessline 1932
[Credential-related source omitted] - Network accessline 1933
[Credential-related source omitted] - Network accessline 1934
[Credential-related source omitted] - Network accessline 1935
"digest": "摘要", "cover": "https://mmbiz.qpic.cn/cover", "multi_app_msg_item_list": [ - Network accessline 1936
"cover": "https://mmbiz.qpic.cn/cover", - Network accessline 1938
{ "title": "首页次篇", "content_url": "https://mp.weixin.qq.com/s/def?pass_ticket=hidden&idx=2", - Network accessline 1939
"title": "首页次篇", "content_url": "https://mp.weixin.qq.com/s/def?pass_ticket=hidden&idx=2", } - Network accessline 1940
"content_url": "https://mp.weixin.qq.com/s/def?pass_ticket=hidden&idx=2", - Network accessline 1949
rows = addon.rows_from_any_payload( extracted, {"account_name": "测试号", "account_id": "biz", "sample_url": "https://mp.weixin.qq.com/s/source"}, - Network accessline 1950
extracted, {"account_name": "测试号", "account_id": "biz", "sample_url": "https://mp.weixin.qq.com/s/source"}, "biz", - Network accessline 1951
{"account_name": "测试号", "account_id": "biz", "sample_url": "https://mp.weixin.qq.com/s/source"}, - Access to secretsline 1956
[Credential-related source omitted] - Access to secretsline 1958
[Credential-related source omitted] - Access to secretsline 1960
[Credential-related source omitted] - Access to secretsline 1962
[Credential-related source omitted] - Access to secretsline 1964
[Credential-related source omitted] - Access to secretsline 1966
[Credential-related source omitted] - Network accessline 1974
result = wechat_downloader.prepare_history_capture( self.tmp, "https://mp.weixin.qq.com/s/sample", - Network accessline 1975
self.tmp, "https://mp.weixin.qq.com/s/sample", 8899, - Network accessline 1976
"https://mp.weixin.qq.com/s/sample", - Network accessline 2006
"ok": True, "session_id": session_id, "open_url": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=biz&scene=124#wechat_redirect", - Network accessline 2007
"session_id": session_id, "open_url": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=biz&scene=124#wechat_redirect", "copied_to_clipboard": copy, - Network accessline 2008
"open_url": "https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=biz&scene=124#wechat_redirect", - Network accessline 2013
"ok": True, "pid": 1234, "upstream_proxy": "http://127.0.0.1:10808", - Network accessline 2014
"pid": 1234, "upstream_proxy": "http://127.0.0.1:10808", "reused_existing_proxy": False, - Network accessline 2015
"upstream_proxy": "http://127.0.0.1:10808", - Network accessline 2025
result = wechat_downloader.prepare_history_capture( self.tmp, "https://mp.weixin.qq.com/s/sample", - Network accessline 2026
self.tmp, "https://mp.weixin.qq.com/s/sample", 8899, - Network accessline 2027
"https://mp.weixin.qq.com/s/sample", - Network accessline 2044
self.assertEqual(result["account_name"], "测试号") self.assertIn("profile_ext?action=home", result["open_url"]) self.assertEqual(result["upstream_proxy"], "http://127.0.0.1:10808") - Network accessline 2045
self.assertIn("profile_ext?action=home", result["open_url"]) self.assertEqual(result["upstream_proxy"], "http://127.0.0.1:10808") self.assertFalse(result["proxy_already_enabled"]) - Network accessline 2046
self.assertEqual(result["upstream_proxy"], "http://127.0.0.1:10808") - Network accessline 2067
"account_id": "biz", "title": "历史文章", "url": "https://mp.weixin.qq.com/s/a", - Network accessline 2068
"title": "历史文章", "url": "https://mp.weixin.qq.com/s/a", "publish_time": "2026-07-06 10:00:00", - Network accessline 2069
"url": "https://mp.weixin.qq.com/s/a", - Network accessline 2071
"digest": "", "cover": "", "source_article_url": "https://mp.weixin.qq.com/s/source", - Network accessline 2072
"cover": "", "source_article_url": "https://mp.weixin.qq.com/s/source", "fetch_method": "wechat-history-proxy", - Network accessline 2073
"source_article_url": "https://mp.weixin.qq.com/s/source",
references/backend-design.md
references/output-formats.md
- Network accessline 48
author: "..." publish_time: "..." source_url: "https://mp.weixin.qq.com/s/..." - Network accessline 49
publish_time: "..." source_url: "https://mp.weixin.qq.com/s/..." downloaded_at: "..." - Network accessline 50
source_url: "https://mp.weixin.qq.com/s/..." - Access to secretsline 171
[Credential-related source omitted]
references/skill-cli-flow.md
- Network accessline 89
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=<biz>&scene=124#wechat_redirect - Network accessline 114
Use `--upstream-proxy http://host:port` only for an explicit override. Use `--upstream-proxy none` only when direct outbound traffic is desired. - Access to secretsline 377
[Credential-related source omitted]
scripts/inspect_context.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/validate_outputs.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/wechat_credential_broker.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 85
except FileNotFoundError: pass server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - Network accessline 86
pass server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) server.bind(str(self.socket_path)) - Network accessline 87
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - Network accessline 197
headers = { "Cookie": raw["cookie"], "Referer": "https://mp.weixin.qq.com/", - Network accessline 198
"Cookie": raw["cookie"], "Referer": "https://mp.weixin.qq.com/", "User-Agent": "Mozilla/5.0 MicroMessenger", - Network accessline 199
"Referer": "https://mp.weixin.qq.com/", - Network accessline 252
if buffer: request_params["buffer"] = buffer text = self._http_get("https://mp.weixin.qq.com/mp/appmsg_comment?" + urllib.parse.urlencode(request_params), headers) - Network accessline 253
request_params["buffer"] = buffer text = self._http_get("https://mp.weixin.qq.com/mp/appmsg_comment?" + urllib.parse.urlencode(request_params), headers) payload = json.loads(text) - Network accessline 254
text = self._http_get("https://mp.weixin.qq.com/mp/appmsg_comment?" + urllib.parse.urlencode(request_params), headers) - Network accessline 327
@staticmethod def _default_http_get(url: str, headers: dict[str, str]) -> str: request = urllib.request.Request(url, headers=headers) - Network accessline 328
def _default_http_get(url: str, headers: dict[str, str]) -> str: request = urllib.request.Request(url, headers=headers) class NoRedirect(urllib.request.HTTPRedirectHandler): - Network accessline 329
request = urllib.request.Request(url, headers=headers) - Network accessline 418
return {"ok": False, "status": "unavailable", "error": "credential broker is not running"} try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: - Network accessline 419
try: with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client: client.settimeout(timeout_seconds) - Network accessline 420
with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as client:
scripts/wechat_downloader.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 163
class NoRedirectHandler(urllib.request.HTTPRedirectHandler): def redirect_request(self, req: urllib.request.Request, fp: Any, code: int, msg: str, headers: Any, newurl: str) -> None: - Network accessline 164
def redirect_request(self, req: urllib.request.Request, fp: Any, code: int, msg: str, headers: Any, newurl: str) -> None: - Access to secretsline 436
[Credential-related source omitted] - Network accessline 454
if fixture: return fixture.read_text(encoding="utf-8") req = urllib.request.Request( - Network accessline 455
return fixture.read_text(encoding="utf-8") req = urllib.request.Request( url, - Network accessline 456
req = urllib.request.Request( - Network accessline 458
headers={ "User-Agent": ua or WECHAT_HISTORY_USER_AGENT, "Referer": "https://mp.weixin.qq.com/", - Network accessline 459
"User-Agent": ua or WECHAT_HISTORY_USER_AGENT, "Referer": "https://mp.weixin.qq.com/", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8", - Network accessline 460
"Referer": "https://mp.weixin.qq.com/", - Network accessline 462
}, ) with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 463
) with urllib.request.urlopen(req, timeout=timeout) as resp: raw = resp.read() - Network accessline 464
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 880
return None digest = hashlib.sha256(url.encode()).hexdigest()[:16] req = urllib.request.Request( - Network accessline 881
digest = hashlib.sha256(url.encode()).hexdigest()[:16] req = urllib.request.Request( url, - Network accessline 882
req = urllib.request.Request( - Network accessline 884
headers={ "User-Agent": "Mozilla/5.0", "Referer": "https://mp.weixin.qq.com/", - Network accessline 885
"User-Agent": "Mozilla/5.0", "Referer": "https://mp.weixin.qq.com/", }, - Network accessline 886
"Referer": "https://mp.weixin.qq.com/", - Network accessline 914
if not allowed: return None, reason req = urllib.request.Request( - Network accessline 915
return None, reason req = urllib.request.Request( url, - Network accessline 916
req = urllib.request.Request( - Network accessline 918
headers={ "User-Agent": "Mozilla/5.0", "Referer": "https://mp.weixin.qq.com/", - Network accessline 919
"User-Agent": "Mozilla/5.0", "Referer": "https://mp.weixin.qq.com/", }, - Network accessline 920
"Referer": "https://mp.weixin.qq.com/", - Network accessline 1175
} ) return f"https://mp.weixin.qq.com/mp/profile_ext?{query}#wechat_redirect", "profile_history" - Network accessline 1176
) return f"https://mp.weixin.qq.com/mp/profile_ext?{query}#wechat_redirect", "profile_history" raise ValueError("cannot build legacy profile_ext history URL because __biz was not extracted from the sample article") - Network accessline 1177
return f"https://mp.weixin.qq.com/mp/profile_ext?{query}#wechat_redirect", "profile_history" - Network accessline 1521
"x5": first_query_value(values, "x5") or "0", } return "https://mp.weixin.qq.com/mp/profile_ext?" + urllib.parse.urlencode(query) - Network accessline 1523
return "https://mp.weixin.qq.com/mp/profile_ext?" + urllib.parse.urlencode(query) - Network accessline 1526
def fetch_json_url(url: str, referer: str, timeout: int = 20) -> dict[str, Any]: req = urllib.request.Request( - Network accessline 1527
req = urllib.request.Request( - Network accessline 1534
}, ) with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 1535
) with urllib.request.urlopen(req, timeout=timeout) as resp: raw = resp.read() - Network accessline 1536
with urllib.request.urlopen(req, timeout=timeout) as resp: - Network accessline 1554
url = "https:" + url elif url.startswith("/"): url = "https://mp.weixin.qq.com" + url - Network accessline 1555
elif url.startswith("/"): url = "https://mp.weixin.qq.com" + url return safe_display_url(url) - Network accessline 1556
url = "https://mp.weixin.qq.com" + url - Network accessline 1738
SELECT url, title, last_visit_time FROM urls WHERE url LIKE 'https://mp.weixin.qq.com/s/%' - Network accessline 1739
FROM urls WHERE url LIKE 'https://mp.weixin.qq.com/s/%' AND last_visit_time >= ? - Network accessline 1740
WHERE url LIKE 'https://mp.weixin.qq.com/s/%' - Network accessline 1900
if port < PROXY_PORT_MIN or port > PROXY_PORT_MAX: return False with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - Network accessline 1901
return False with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - Network accessline 1902
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - Network accessline 1994
parsed = urllib.parse.urlsplit(value) if parsed.scheme not in {"http", "https"} or not parsed.hostname or not parsed.port: raise ValueError("upstream proxy must look like http://host:port") - Network accessline 1995
if parsed.scheme not in {"http", "https"} or not parsed.hostname or not parsed.port: raise ValueError("upstream proxy must look like http://host:port") return urllib.parse.urlunsplit((parsed.scheme, parsed.netloc, "", "", "")) - Network accessline 1996
raise ValueError("upstream proxy must look like http://host:port") - Network accessline 2020
continue try: return normalize_upstream_proxy(f"http://{server}:{proxy_port}") - Network accessline 2021
try: return normalize_upstream_proxy(f"http://{server}:{proxy_port}") except ValueError: - Network accessline 2022
return normalize_upstream_proxy(f"http://{server}:{proxy_port}") - Network accessline 2043
if server in {"127.0.0.1", "localhost"} and proxy_port == str(port): return upstream_from_saved_proxy_state(base, port) return normalize_upstream_proxy(f"http://{server}:{proxy_port}") - Network accessline 2045
return normalize_upstream_proxy(f"http://{server}:{proxy_port}") - Access to secretsline 2235
[Credential-related source omitted] - Network accessline 2319
else "No upstream proxy is configured; mitmproxy connects directly." ), "certificate_step": "With the proxy enabled, open http://mitm.it in a browser and install/trust the mitmproxy certificate if you have not done this befo - Network accessline 2320
), "certificate_step": "With the proxy enabled, open http://mitm.it in a browser and install/trust the mitmproxy certificate if you have not done this before.", } - Network accessline 2321
"certificate_step": "With the proxy enabled, open http://mitm.it in a browser and install/trust the mitmproxy certificate if you have not done this before.", - Network accessline 3283
try: if sys.platform == "darwin": subprocess.run(["open", "http://mitm.it"], check=True) - Network accessline 3284
if sys.platform == "darwin": subprocess.run(["open", "http://mitm.it"], check=True) opened = True - Network accessline 3285
subprocess.run(["open", "http://mitm.it"], check=True) - Network accessline 3295
"install_result": install_result, "proxy": f"127.0.0.1:{port}", "cert_page": "http://mitm.it", - Network accessline 3296
"proxy": f"127.0.0.1:{port}", "cert_page": "http://mitm.it", "cert_files": cert_files, - Network accessline 3297
"cert_page": "http://mitm.it", - Network accessline 3301
"open_error": open_error, "next_step": ( "Start history-proxy-start, enable the proxy, then open http://mitm.it and trust the certificate." - Network accessline 3302
"next_step": ( "Start history-proxy-start, enable the proxy, then open http://mitm.it and trust the certificate." if mitmdump - Network accessline 3303
"Start history-proxy-start, enable the proxy, then open http://mitm.it and trust the certificate." - Network accessline 6042
"--upstream-proxy", default="auto", help="Upstream HTTP proxy for mitmproxy, e.g. http://host:port. Use auto to chain the current macOS HTTP proxy, or none to disable.", - Network accessline 6043
default="auto", help="Upstream HTTP proxy for mitmproxy, e.g. http://host:port. Use auto to chain the current macOS HTTP proxy, or none to disable.", ) - Network accessline 6044
help="Upstream HTTP proxy for mitmproxy, e.g. http://host:port. Use auto to chain the current macOS HTTP proxy, or none to disable.", - Network accessline 6051
p.add_argument("--install", action="store_true", help="Install mitmproxy with Homebrew if mitmdump is missing") p.add_argument("--yes", action="store_true", help="Actually run brew install mitmproxy when --install is set") p.add_arg - Network accessline 6052
p.add_argument("--yes", action="store_true", help="Actually run brew install mitmproxy when --install is set") p.add_argument("--open-cert-page", action="store_true", help="Open http://mitm.it in the default browser") p.set_defaults - Network accessline 6053
p.add_argument("--open-cert-page", action="store_true", help="Open http://mitm.it in the default browser")
scripts/wechat_exporter.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 63
DEFAULT_BASE_URL = "https://down.mptext.top" - Access to secretsline 167
[Credential-related source omitted] - Access to secretsline 405
[Credential-related source omitted] - Access to secretsline 577
[Credential-related source omitted] - Access to secretsline 578
[Credential-related source omitted] - Access to secretsline 583
[Credential-related source omitted] - Access to secretsline 588
[Credential-related source omitted] - Access to secretsline 603
[Credential-related source omitted] - Access to secretsline 651
[Credential-related source omitted] - Access to secretsline 652
[Credential-related source omitted] - Access to secretsline 654
[Credential-related source omitted] - Access to secretsline 655
[Credential-related source omitted] - Access to secretsline 660
[Credential-related source omitted] - Access to secretsline 666
[Credential-related source omitted] - Access to secretsline 671
[Credential-related source omitted] - Access to secretsline 672
[Credential-related source omitted] - Access to secretsline 734
[Credential-related source omitted] - Network accessline 767
) -> tuple[bytes, dict[str, Any], list[str], str]: url = normalize_base_url(base_url) + path req = urllib.request.Request( - Network accessline 768
url = normalize_base_url(base_url) + path req = urllib.request.Request( url, - Network accessline 769
req = urllib.request.Request( - Network accessline 1055
if query: url += "?" + query req = urllib.request.Request( - Network accessline 1056
url += "?" + query req = urllib.request.Request( url, - Network accessline 1057
req = urllib.request.Request( - Network accessline 1063
}, ) with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 1064
) with urllib.request.urlopen(req, timeout=30) as resp: raw = resp.read() - Network accessline 1065
with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 1951
if not port: return {"ok": False, "status": "needs_capture", "error": "no active proxy-enhancer session"} proxy = f"http://127.0.0.1:{port}" - Network accessline 1952
return {"ok": False, "status": "needs_capture", "error": "no active proxy-enhancer session"} proxy = f"http://127.0.0.1:{port}" opener = urllib.request.build_opener(urllib.request.ProxyHandler({"http": proxy, "https": proxy})) - Network accessline 1953
proxy = f"http://127.0.0.1:{port}" opener = urllib.request.build_opener(urllib.request.ProxyHandler({"http": proxy, "https": proxy})) data = None - Network accessline 1958
data = json.dumps(payload, ensure_ascii=False).encode("utf-8") headers["Content-Type"] = "application/json" req = urllib.request.Request(f"http://channels.weixin.qq.com{path}", data=data, headers=headers, method=method) - Network accessline 1959
headers["Content-Type"] = "application/json" req = urllib.request.Request(f"http://channels.weixin.qq.com{path}", data=data, headers=headers, method=method) try: - Network accessline 1960
req = urllib.request.Request(f"http://channels.weixin.qq.com{path}", data=data, headers=headers, method=method) - Access to secretsline 3436
[Credential-related source omitted] - Network accessline 3588
if (completed) return; try {{ const resp = await fetch('/login/status?login_id=' + encodeURIComponent(loginId)); - Network accessline 3589
try {{ const resp = await fetch('/login/status?login_id=' + encodeURIComponent(loginId)); const data = await resp.json(); - Network accessline 3590
const resp = await fetch('/login/status?login_id=' + encodeURIComponent(loginId)); - Network accessline 3791
server = ThreadingHTTPServer((host, port), ExporterHandler) server.runtime_base = base # type: ignore[attr-defined] url = f"http://{host}:{port}/" - Network accessline 3792
server.runtime_base = base # type: ignore[attr-defined] url = f"http://{host}:{port}/" if open_browser: - Network accessline 3793
url = f"http://{host}:{port}/" - Access to secretsline 3832
[Credential-related source omitted] - Access to secretsline 3890
[Credential-related source omitted] - Access to secretsline 3891
[Credential-related source omitted]
scripts/wechat_history_mitm_addon.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 121
} function refresh(btn) { fetch('/__moore_video_status').then(function (r) { return r.json(); }).then(function (data) { - Network accessline 122
function refresh(btn) { fetch('/__moore_video_status').then(function (r) { return r.json(); }).then(function (data) { var videos = data.videos || []; - Network accessline 123
fetch('/__moore_video_status').then(function (r) { return r.json(); }).then(function (data) { - Network accessline 146
} setText(btn, '下载中'); fetch('/__moore_video_download', { - Network accessline 147
setText(btn, '下载中'); fetch('/__moore_video_download', { method: 'POST', - Network accessline 148
fetch('/__moore_video_download', { - Network accessline 178
try{ if(!objectDesc||!objectDesc.media)return; fetch('/__moore_video_register',{ - Network accessline 179
if(!objectDesc||!objectDesc.media)return; fetch('/__moore_video_register',{ method:'POST', - Network accessline 180
fetch('/__moore_video_register',{ - Network accessline 196
function logClient(event, data) { try { fetch('/__moore_log', { - Network accessline 197
try { fetch('/__moore_log', { method: 'POST', - Network accessline 198
fetch('/__moore_log', { - Network accessline 361
setButtonState('loading'); setTimeout(function () { fetch('/__moore_capture', { - Network accessline 362
setTimeout(function () { fetch('/__moore_capture', { method: 'POST', - Network accessline 363
fetch('/__moore_capture', { - Network accessline 664
url = "https:" + url elif url.startswith("/"): url = "https://mp.weixin.qq.com" + url - Network accessline 665
elif url.startswith("/"): url = "https://mp.weixin.qq.com" + url parsed = urllib.parse.urlsplit(url) - Network accessline 666
url = "https://mp.weixin.qq.com" + url parsed = urllib.parse.urlsplit(url) if parsed.netloc.lower() != "mp.weixin.qq.com": - Access to secretsline 1173
[Credential-related source omitted] - Access to secretsline 1174
[Credential-related source omitted] - Access to secretsline 1175
[Credential-related source omitted] - Access to secretsline 1316
[Credential-related source omitted]
scripts/wechat_video_crypto.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/wechat_video_downloader.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 36
def request(url: str, method: str, headers: dict[str, str], timeout: int = 30) -> urllib.request.Request: - Network accessline 37
return urllib.request.Request(url, method=method, headers=headers) - Network accessline 40
def open_no_proxy(req: urllib.request.Request, timeout: int = 30):
scripts/wechat_video_models.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/wechat_video_registry.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/wechat_video_service.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/wechat_wizard.py
- Executable scriptline 1
#!/usr/bin/env python3 - Access to secretsline 73
[Credential-related source omitted] - Access to secretsline 1508
[Credential-related source omitted] - Network accessline 2255
def smoke_history_preflight(base: Path, sample_url: str) -> dict[str, Any]: url = sample_url or "https://mp.weixin.qq.com/s/offline-smoke?__biz=MzIxNTA1MDEwNg==" - Network accessline 2256
url = sample_url or "https://mp.weixin.qq.com/s/offline-smoke?__biz=MzIxNTA1MDEwNg==" - Network accessline 2304
task_id = "smoke_url_" + hashlib.sha256(utc_now().encode("utf-8")).hexdigest()[:12] output_dir = base / "smoke" / "url-fixture" / task_id url = "https://mp.weixin.qq.com/s/demo-url-article-1" - Network accessline 2305
output_dir = base / "smoke" / "url-fixture" / task_id url = "https://mp.weixin.qq.com/s/demo-url-article-1" intent = parse_intent(f"下载这篇公众号文章:{url}") - Network accessline 2306
url = "https://mp.weixin.qq.com/s/demo-url-article-1" - Access to secretsline 2310
[Credential-related source omitted] - Access to secretsline 2311
[Credential-related source omitted] - Access to secretsline 2316
[Credential-related source omitted] - Access to secretsline 2318
[Credential-related source omitted] - Access to secretsline 2508
[Credential-related source omitted]
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 3 facts
- Contacts host, which SKILL.md, the README and the plugin manifest do not mentionscripts/wechat_downloader.py:1996High confidence
- Contacts mitm.it, which SKILL.md, the README and the plugin manifest do not mentionscripts/wechat_downloader.py:2321High confidence
- Contacts down.mptext.top, which SKILL.md, the README and the plugin manifest do not mentionscripts/wechat_exporter.py:63High confidence
Signal confidence: 458 facts
- Network access in code of documentationREADME.md:50Low confidence
- Network access in code of documentationREADME.md:51Low confidence
- Network access in code of documentationREADME.md:58Low confidence
- Network access in code of documentationREADME.md:59Low confidence
- Network access in code of documentationREADME.md:68Low confidence
- Network access in code of documentationREADME.md:70Low confidence
- Network access in code of documentationREADME.md:132Low confidence
- Network access in prose of the SKILL.mdSKILL.md:103Low confidence
- Network access in prose of the SKILL.mdSKILL.md:104Low confidence
- Access to secrets in prose of the SKILL.mdSKILL.md:333Low confidence
- Network access in code of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:107Low confidence
- Network access in code of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:108Low confidence
- Network access in code of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:109Low confidence
- Network access in code of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:174Low confidence
- Access to secrets in prose of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:270Low confidence
- Access to secrets in prose of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:385Low confidence
- Access to secrets in prose of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:506Low confidence
- Access to secrets in code of documentationdocs/plans/2026-07-06-unified-wizard-gates.md:727Low confidence
- Network access in prose of documentationdocs/plans/2026-07-09-proxy-snapshot-validation-plan.md:86Low confidence
- Executable script in code of a testevals/test_credential_broker.py:1Low confidence
- Network access in code of a testevals/test_credential_broker.py:30Low confidence
- Network access in code of a testevals/test_credential_broker.py:31Low confidence
- Network access in code of a testevals/test_credential_broker.py:32Low confidence
- Network access in code of a testevals/test_credential_broker.py:49Low confidence
- Network access in code of a testevals/test_credential_broker.py:50Low confidence
- Network access in code of a testevals/test_credential_broker.py:51Low confidence
- Network access in code of a testevals/test_credential_broker.py:64Low confidence
- Network access in code of a testevals/test_credential_broker.py:65Low confidence
- Network access in code of a testevals/test_credential_broker.py:66Low confidence
- Network access in code of a testevals/test_credential_broker.py:69Low confidence
- Network access in code of a testevals/test_credential_broker.py:70Low confidence
- Network access in code of a testevals/test_credential_broker.py:71Low confidence
- Network access in code of a testevals/test_credential_broker.py:85Low confidence
- Network access in code of a testevals/test_credential_broker.py:86Low confidence
- Network access in code of a testevals/test_credential_broker.py:87Low confidence
- Network access in code of a testevals/test_credential_broker.py:105Low confidence
- Network access in code of a testevals/test_credential_broker.py:106Low confidence
- Network access in code of a testevals/test_credential_broker.py:107Low confidence
- Network access in code of a testevals/test_credential_broker.py:109Low confidence
- Network access in code of a testevals/test_credential_broker.py:110Low confidence
- Network access in code of a testevals/test_credential_broker.py:111Low confidence
- Network access in code of a testevals/test_credential_broker.py:112Low confidence
- Network access in code of a testevals/test_credential_broker.py:113Low confidence
- Network access in code of a testevals/test_credential_broker.py:114Low confidence
- Network access in code of a testevals/test_credential_broker.py:130Low confidence
- Network access in code of a testevals/test_credential_broker.py:133Low confidence
- Network access in code of a testevals/test_credential_broker.py:134Low confidence
- Network access in code of a testevals/test_credential_broker.py:135Low confidence
- Network access in code of a testevals/test_credential_broker.py:162Low confidence
- Network access in code of a testevals/test_credential_broker.py:163Low confidence
and 408 more
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Compatible | Standard SKILL.md SKILL.md | .claude/skills/<skill-name>/ |
| Codex | Compatible | Standard SKILL.md SKILL.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.