Not in the top 1,000 by GitHub stars

JuneYaooo/social-account-doctor

小红书/抖音/快手/视频号/B站 自媒体账号体检+爆款拆解工具。扫同赛道找对标、拆爆款为什么爆、诊断为什么没人看,顺手出可粘贴仿写初稿。支持带货电商模式。支持codex, claude code, workbuddy

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 Oct 26, 2026 · Line counts unavailable

Before Not checked yet → After Network or broad shell

First observation → 2438d5ae7c8e

No earlier version was observed for comparison.

Compare on GitHub

View on GitHubAdd to my skills

Verified commit 2438d5ae7c8e7d876ac89b5e621980fa50a5e0dd

351GitHub stars
40stars in 7 days
1skill in this repository
0commits in 30 days

Heat

6.6
  • 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

Oct 25, 2026Nov 6, 2026351

30-day change not yet available: not enough history.

Individual skills in this repository

How it works

social-account-doctor

When your agent uses it

小红书 / 抖音 / 快手 / 视频号 自媒体「(compose 素材打底 →) 找对标 → 拆爆款 → 套自己」四命令闭环,另支持带货账号诊断、带货视频链接拆解和证据驱动的脚本生成(commerce)。给账号 / 平台视频链接 / 本地视频 / 商品详情、SKU 与资质材料,输出账号与对标差距、内容拆解、商品事实卡、口播和分镜。当用户说"找对标"、"拆这条爆款"、"对着这条仿写"、"下一条该写什么"、"我这个号缺爆款选题"、"帮我写一条对标 XX 的笔记"、"我有素材帮我写一条能爆的"、"这份文档/这组图/这段视频能出一条爆款吗"时调用。诊断模式("为什么不爆")走 references/diagnostic-mode.md。带货触发词:带货账号诊断、带货视频链接、带货素材、商品详情截图、SKU 表、商品资质、带货脚本、口播、分镜、商品卡一致性 — 走 commerce 路由。商品链接不等于视频链接;本 Skill 不解析在线商品页,不提供选品、趋势监控或 GMV/佣金推断。

What it loads into context

Frontmatter

324 tokens

Always available to the agent

SKILL.md

18,190 tokens

When the skill is activated

Reference documents

60,373 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. 0A. 交付质量硬规则(防伪装完成)
  2. 0. 闭环图
  3. 1. 输入路由
  4. 1A. compose 命令 SOP(素材 → 初稿的新入口)
  5. 1B. commerce 命令 SOP(账号诊断 + 对标内容分析)
  6. 2. find 命令 SOP(5 步铁律)
  7. 3. crack 命令 SOP
  8. 4. adapt 命令 SOP
  9. 5. 输出位置铁律
  10. 6. L2 诊断模式(按需,不主推)
  11. 7. 工具速查
  12. 9. 接口稳定性表(按平台分小节)
  13. 9. 数据时效性说明

Scripts executed separately

  • install_as_skill.sh
  • mediacrawler/bin/mc
  • mediacrawler/lib/mc_client.py
  • scripts/analyze_document.py
  • scripts/analyze_image.py
  • scripts/analyze_video.py
  • scripts/build_commerce_package.py
  • scripts/dispatch_account.py
  • scripts/normalize_metrics.py
  • scripts/ocr_screenshot.py
  • scripts/render_report_pdf.py
  • tests/test_commerce_outputs.py
  • tests/test_mc_client.py
  • tests/test_multimodal_scripts.py
  • tests/test_render_report_pdf.py
  • tests/test_tikhub_rest.py
  • tikhub/bin/tikhub
  • tikhub/lib/tikhub_client.py
  • tikhub/scripts/refresh_tools.py

Files

  • .env.exampleasset1,952 bytes
  • .gitignoreasset5,197 bytes
  • LICENSEasset1,066 bytes
  • README.mddoc9,902 bytes
  • SKILL.mdcore60,390 bytes
  • SKILL.mdcore60,390 bytes
  • SKILL.mdcore60,390 bytes
  • SKILL.mdcore60,390 bytes
  • SKILL.mdcore60,390 bytes
  • SKILL.mdcore60,390 bytes
  • docs/images/demo-page-01.pngasset247,466 bytes
  • docs/images/demo-page-02.pngasset219,835 bytes
  • docs/images/demo-page-03.pngasset1,137,100 bytes
  • docs/images/demo-page-04.pngasset585,911 bytes
  • docs/images/demo-page-05.pngasset427,914 bytes
  • docs/images/demo-page-06.pngasset500,982 bytes
  • docs/images/demo-page-07.pngasset236,722 bytes
  • docs/install.mddoc4,593 bytes
  • install_as_skill.shruns10,926 bytes
  • mediacrawler/README.mddoc10,850 bytes
  • mediacrawler/bin/mcruns6,287 bytes
  • mediacrawler/lib/mc_client.pyruns54,436 bytes
  • mediacrawler/requirements-lean.txtdoc1,265 bytes
  • references/commerce-analysis-template.mddoc9,194 bytes
  • references/commerce-metrics.mddoc8,701 bytes
  • references/commerce-workflow.mddoc6,279 bytes
  • references/diagnostic-mode.mddoc39,201 bytes
  • references/platforms/bilibili.mddoc13,294 bytes
  • references/platforms/douyin-commerce.mddoc7,956 bytes
  • references/platforms/douyin.mddoc16,371 bytes
  • references/platforms/kuaishou.mddoc13,203 bytes
  • references/platforms/wechat-channels.mddoc16,241 bytes
  • references/platforms/xiaohongshu.mddoc16,521 bytes
  • references/product-video-framework.mddoc9,255 bytes
  • references/scoring-vocab.mddoc4,488 bytes
  • requirements.txtdoc196 bytes
  • scripts/analyze_document.pyruns5,859 bytes
  • scripts/analyze_image.pyruns11,475 bytes
  • scripts/analyze_video.pyruns37,969 bytes
  • scripts/build_commerce_package.pyruns14,227 bytes
  • scripts/dispatch_account.pyruns8,947 bytes
  • scripts/normalize_metrics.pyruns10,072 bytes
  • scripts/ocr_screenshot.pyruns9,950 bytes
  • scripts/render_report_pdf.pyruns30,566 bytes
  • tests/fixtures/commerce_video.jsonasset2,835 bytes
  • tests/fixtures/mc/bili/json/creator_contents_2026-09-16.jsonasset814 bytes
  • tests/fixtures/mc/dy/json/detail_comments_2026-09-16.jsonasset412 bytes
  • tests/fixtures/mc/dy/json/detail_contents_2026-09-16.jsonasset774 bytes
  • tests/fixtures/mc/ks/json/search_contents_2026-09-16.jsonasset637 bytes
  • tests/fixtures/mc/xhs/json/search_comments_2026-09-16.jsonasset830 bytes
  • tests/fixtures/mc/xhs/json/search_contents_2026-09-16.jsonasset1,739 bytes
  • tests/test_commerce_outputs.pyruns18,916 bytes
  • tests/test_mc_client.pyruns36,710 bytes
  • tests/test_multimodal_scripts.pyruns11,511 bytes
  • tests/test_render_report_pdf.pyruns7,401 bytes
  • tests/test_tikhub_rest.pyruns10,257 bytes
  • tikhub/README.mddoc2,258 bytes
  • tikhub/bin/tikhubruns8,650 bytes
  • tikhub/lib/tikhub_client.pyruns10,882 bytes
  • tikhub/references/tools-bilibili.jsonasset30,454 bytes
  • tikhub/references/tools-douyin.jsonasset352,387 bytes
  • tikhub/references/tools-kuaishou.jsonasset27,171 bytes
  • tikhub/references/tools-wechat.jsonasset38,406 bytes
  • tikhub/references/tools-xiaohongshu.jsonasset39,348 bytes
  • tikhub/scripts/refresh_tools.pyruns5,755 bytes
Read SKILL.md

# social-account-doctor — 找对标 / 拆爆款 / 套自己

> **不挖钩子建仓库,不写诊断报告。**
> 直接对着具体爆款 → 输出**我的下一条笔记初稿**(标题 + 封面大字 + 首段 + CTA)。

---

## 0A. 交付质量硬规则(防伪装完成)

这些规则适用于 find / crack / adapt / diagnostic。违反时不要硬写报告;在对话里明说缺哪一步、为什么缺、用户可以怎么补。

**H1 — find 必须有真对标搜索**
- `find` 模式至少跑过 1 次平台搜索,并拿到真实账号或作品候选:小红书 `xiaohongshu_app_v2_search_notes` / 抖音账号搜索或视频搜索 / 快手 `kuaishou_app_search_video_v2` / 视频号 `wechat_channels_v2_fetch_search_channel_videos` / B 站 `bilibili_web_fetch_general_search`;或 TikHub key 不可用时改跑 `mc search`(登录自己账号的 MediaCrawler 路径,见 §7.5)。
- 只拿了我的账号信息或作品列表就写“对标结论” = 违规。没有对标搜索,就只能标成“仅基于我方数据的初步判断”。
View the complete source on GitHub

Skills included

  • social-account-doctor

Repository facts

License
MIT
Created
Apr 21, 2026
Last pushed
Sep 19, 2026
Forks
40
Open issues
0
Project activity
Active

Before you install

Network or broad shell

Automated signals, not a guarantee

Checked Nov 7, 2026

Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.

Show 6 notes
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • tikhub/references/tools-douyin.json:10151 Analysis incomplete: regex work limit reached
Show all 473 signals by file

.env.example

  • Network accessline 3
    # Gemini 3.1 Pro via OpenAI-compatible endpoint # BASE_URL 必填:脚本不内置任何默认端点(防止 key 发到第三方域名)。 # 可填:OpenAI https://api.openai.com/v1 | SiliconFlow https://api.siliconflow.cn/v1
  • Network accessline 4
    # BASE_URL 必填:脚本不内置任何默认端点(防止 key 发到第三方域名)。 # 可填:OpenAI https://api.openai.com/v1 | SiliconFlow https://api.siliconflow.cn/v1 #       | Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai
  • Network accessline 5
    # 可填:OpenAI https://api.openai.com/v1 | SiliconFlow https://api.siliconflow.cn/v1
  • Network accessline 6
    #       | Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai
  • Network accessline 8
    [Credential-related source omitted]
  • Network accessline 9
    [Credential-related source omitted]
  • Access to secretsline 9
    [Credential-related source omitted]
  • Network accessline 10
    VIDEO_ANALYSIS_BASE_URL=https://your-gemini-proxy.example.com/v1
  • Network accessline 19
    # Audio transcription (only required for `analyze_video.py --mode talking`) # SenseVoice / Whisper via OpenAI-compatible endpoint # BASE_URL 必填(如用 SiliconFlow:https://api.siliconflow.cn/v1)
  • Network accessline 20
    # SenseVoice / Whisper via OpenAI-compatible endpoint # BASE_URL 必填(如用 SiliconFlow:https://api.siliconflow.cn/v1) # =============================================================
  • Network accessline 21
    # BASE_URL 必填(如用 SiliconFlow:https://api.siliconflow.cn/v1)
  • Network accessline 22
    [Credential-related source omitted]
  • Network accessline 23
    [Credential-related source omitted]
  • Access to secretsline 23
    [Credential-related source omitted]
  • Network accessline 24
    AUDIO_TRANSCRIPTION_BASE_URL=https://your-asr-proxy.example.com/v1
  • Network accessline 30
    # 优先级:agent 自带 computer use / 浏览器(首选,零配置)> opencli > 本 key # (付费,稳定,五平台含视频号)> mc(最后手段:上游反爬加剧,账号风控风险最高) # 申请: https://tikhub.io/
  • Network accessline 31
    # (付费,稳定,五平台含视频号)> mc(最后手段:上游反爬加剧,账号风控风险最高) # 申请: https://tikhub.io/ # =============================================================
  • Network accessline 32
    # 申请: https://tikhub.io/
  • Access to secretsline 34
    [Credential-related source omitted]

.gitignore

  • Network accessline 114
    #   This is especially recommended for binary packages to ensure reproducibility, and is more #   commonly ignored for libraries. #   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
  • Network accessline 115
    #   commonly ignored for libraries. #   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control #poetry.lock
  • Network accessline 116
    #   https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
  • Network accessline 121
    #   Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. #   pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. #   https://pdm-project.org/en/latest/usage/pro
  • Network accessline 122
    #   pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python. #   https://pdm-project.org/en/latest/usage/project/#working-with-version-control #pdm.lock
  • Network accessline 123
    #   https://pdm-project.org/en/latest/usage/project/#working-with-version-control
  • Access to secretsline 147
    [Credential-related source omitted]
  • Network accessline 180
    # PyCharm #  JetBrains specific template is maintained in a separate JetBrains.gitignore that can #  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
  • Network accessline 181
    #  JetBrains specific template is maintained in a separate JetBrains.gitignore that can #  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore #  and can be added to the global gitignore or merged into this 
  • Network accessline 182
    #  be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
  • Network accessline 188
    # Abstra is an AI-powered process automation framework. # Ignore directories containing user credentials, local state, and settings. # Learn more at https://abstra.io/docs
  • Network accessline 189
    # Ignore directories containing user credentials, local state, and settings. # Learn more at https://abstra.io/docs .abstra/
  • Network accessline 190
    # Learn more at https://abstra.io/docs
  • Network accessline 193
    # Visual Studio Code #  Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore  #  that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
  • Network accessline 194
    #  Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore  #  that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore #  and can be added to the global gitign
  • Network accessline 195
    #  that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
  • Network accessline 207
    #  Cursor is an AI-powered code editor. `.cursorignore` specifies files/directories to #  exclude from AI features like autocomplete and code analysis. Recommended for sensitive data #  refer to https://docs.cursor.com/context/ignore-files
  • Network accessline 208
    #  exclude from AI features like autocomplete and code analysis. Recommended for sensitive data #  refer to https://docs.cursor.com/context/ignore-files .cursorignore
  • Network accessline 209
    #  refer to https://docs.cursor.com/context/ignore-files

README.md

  • Network accessline 79
    帮我安装 social-account-doctor: https://raw.githubusercontent.com/JuneYaooo/social-account-doctor/main/docs/install.md
  • Network accessline 80
    https://raw.githubusercontent.com/JuneYaooo/social-account-doctor/main/docs/install.md
  • Network accessline 91
    - **① agent 自带 computer use / 浏览器工具(首选)** —— 装完 skill 直接让 agent 用宿主自带的浏览器能力访问平台页面,像真人一样浏览读数,无需任何配置    - **② opencli**    - **③ [tikhub.io](https://tikhub.io/) 的 API key** —— 付费但稳定,结构化 JSON,一个 key 通吃五平台(含视频号),适合批量场景
  • Network accessline 92
    - **② opencli**    - **③ [tikhub.io](https://tikhub.io/) 的 API key** —— 付费但稳定,结构化 JSON,一个 key 通吃五平台(含视频号),适合批量场景    - **④ mc 扫码登录(最后手段)** —— 用自己的小红书 / 抖音 / 快手 / B 站账号登录抓取;上游 MediaCrawler 反爬加剧、账号风控风险最高,仅当以上都不可用时使用。详见 [mediacrawler/README.md]
  • Network accessline 93
    - **③ [tikhub.io](https://tikhub.io/) 的 API key** —— 付费但稳定,结构化 JSON,一个 key 通吃五平台(含视频号),适合批量场景

SKILL.md

  • Network accessline 566
    > 调用走 `tikhub <platform> <endpoint> --args`。CLI 自包含在仓库 `tikhub/` 目录,底层直接请求 TikHub REST API(`https://api.tikhub.io/api/v1/...`),**禁止调用 TikHub MCP 或 `mcp.tikhub.io`**。不知道端点名时用 `tikhub list <platform> <关键词>`;看 HTTP 方法、REST 路径和参数 schema 用 `tikh
  • Access to secretsline 587
    [Credential-related source omitted]
  • Access to secretsline 828
    [Credential-related source omitted]
  • Network accessline 840
    11. **TikHub 只走直接 REST API,不走 MCP**:所有数据抓取通过 `tikhub <platform> <endpoint> --args` CLI 调用;CLI 直接请求 `https://api.tikhub.io/api/v1/...`,使用 Bearer API key。**禁止请求 `mcp.tikhub.io`,禁止 `claude mcp add tikhub-*`,禁止任何 TikHub MCP 工具调用**。
  • Network accessline 842
    - 非中国大陆默认基础域名:`https://api.tikhub.io`
  • Network accessline 843
    - 中国大陆可设置:`TIKHUB_API_BASE_URL=https://api.tikhub.dev`
  • Access to secretsline 851
    [Credential-related source omitted]
  • Access to secretsline 858
    [Credential-related source omitted]
  • Access to secretsline 859
    [Credential-related source omitted]

docs/install.md

  • Network accessline 9
    git clone --depth 1 https://github.com/JuneYaooo/social-account-doctor.git
  • Network accessline 34
    |---|---|---|---|    | `VIDEO_ANALYSIS_API_KEY` + `VIDEO_ANALYSIS_BASE_URL` | ✅ 必选 | 看图 / 看视频的多模态大模型(OpenAI 兼容协议) | 用户自己的 key 或代理站 |    | `TIKHUB_API_KEY` | ⚪ 可选(付费) | 量大 / 需要视频号时的平台数据抓取(五平台全支持) | https://tikhub.io/ |
  • Network accessline 35
    [Credential-related source omitted]
  • Access to secretsline 35
    [Credential-related source omitted]
  • Network accessline 36
    [Credential-related source omitted]
  • Access to secretsline 36
    [Credential-related source omitted]
  • Access to secretsline 37
    [Credential-related source omitted]
  • Access to secretsline 41
    [Credential-related source omitted]
  • Network accessline 72
    PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple   # 强制 pip 源
  • Network accessline 73
    PLAYWRIGHT_DOWNLOAD_HOST=https://registry.npmmirror.com/-/binary/playwright  # 强制 Chromium 源
  • Network accessline 74
    MC_GIT_URL=https://gh-proxy.com/https://github.com/NanmiCoder/MediaCrawler.git  # 强制克隆地址

install_as_skill.sh

  • Executable scriptline 1
    #!/bin/bash
  • Network accessline 38
    return     fi     command_exists curl || { print_info "pip 源:无 curl 不探测,用默认源"; return; }
  • Network accessline 39
    fi     command_exists curl || { print_info "pip 源:无 curl 不探测,用默认源"; return; }     local best_url="" best_t="" url t
  • Network accessline 40
    command_exists curl || { print_info "pip 源:无 curl 不探测,用默认源"; return; }
  • Network accessline 41
    local best_url="" best_t="" url t     for url in "https://pypi.org/simple/" "https://pypi.tuna.tsinghua.edu.cn/simple/" "https://mirrors.aliyun.com/pypi/simple/"; do         t="$(curl -o /dev/null -sk -m 4 -w '%{time_total}' "$url" 2>/dev/n
  • Network accessline 42
    for url in "https://pypi.org/simple/" "https://pypi.tuna.tsinghua.edu.cn/simple/" "https://mirrors.aliyun.com/pypi/simple/"; do         t="$(curl -o /dev/null -sk -m 4 -w '%{time_total}' "$url" 2>/dev/null)" || continue         [ -n "$t" ] 
  • Network accessline 43
    t="$(curl -o /dev/null -sk -m 4 -w '%{time_total}' "$url" 2>/dev/null)" || continue
  • Network accessline 53
    fi     case "$best_url" in         https://pypi.org/*) print_info "pip 源:官方 PyPI(探测最快,${best_t}s)" ;;
  • Network accessline 54
    case "$best_url" in         https://pypi.org/*) print_info "pip 源:官方 PyPI(探测最快,${best_t}s)" ;;         *) PIP_INDEX_ARGS="-i $best_url"
  • Network accessline 55
    https://pypi.org/*) print_info "pip 源:官方 PyPI(探测最快,${best_t}s)" ;;
  • Dangerous shell operationline 85
    rm -f "$ENV_BACKUP"
  • Access to secretsline 151
    [Credential-related source omitted]
  • Access to secretsline 153
    [Credential-related source omitted]
  • Access to secretsline 154
    [Credential-related source omitted]
  • Dangerous shell operationline 156
    rm -rf "$SKILL_DIR"
  • Access to secretsline 165
    [Credential-related source omitted]
  • Access to secretsline 175
    [Credential-related source omitted]
  • Access to secretsline 180
    [Credential-related source omitted]
  • Access to secretsline 182
    [Credential-related source omitted]
  • Access to secretsline 231
    [Credential-related source omitted]
  • Access to secretsline 234
    [Credential-related source omitted]
  • Access to secretsline 235
    [Credential-related source omitted]
  • Network accessline 239
    [Credential-related source omitted]
  • Access to secretsline 239
    [Credential-related source omitted]
  • Network accessline 240
    [Credential-related source omitted]
  • Access to secretsline 240
    [Credential-related source omitted]
  • Network accessline 241
    [Credential-related source omitted]
  • Access to secretsline 241
    [Credential-related source omitted]
  • Access to secretsline 251
    [Credential-related source omitted]
  • Access to secretsline 255
    [Credential-related source omitted]

mediacrawler/README.md

  • Network accessline 3
    > ⚠<U+FE0F> **定位:数据源五档里的最后一档**。上游 MediaCrawler 近期被平台反爬重点盯防(用户报告验证码、限流、账号风控),**只在 agent 自带 computer use / 浏览器工具、opencli、TikHub 都不可用时才用本路径**。平台数据优先级:agent 自带 computer use > agent 自带浏览器 > opencli > TikHub(付费)> **本路径**。 > 对接 [NanmiCoder/MediaCrawler](
  • Network accessline 4
    > 对接 [NanmiCoder/MediaCrawler](https://github.com/NanmiCoder/MediaCrawler)(Playwright 真实浏览器爬虫)。用自己的小红书 / 抖音 / 快手 / B 站账号扫码登录跑数据。
  • Network accessline 34
    PIP_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple          # 强制 pip 源
  • Network accessline 35
    PLAYWRIGHT_DOWNLOAD_HOST=https://registry.npmmirror.com/-/binary/playwright  # 强制 Chromium 源
  • Network accessline 36
    MC_GIT_URL=https://gh-proxy.com/https://github.com/NanmiCoder/MediaCrawler.git  # 强制克隆地址

mediacrawler/bin/mc

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 96
    [Credential-related source omitted]

mediacrawler/lib/mc_client.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 44
    [Credential-related source omitted]
  • Access to secretsline 49
    [Credential-related source omitted]
  • Access to secretsline 52
    [Credential-related source omitted]
  • Network accessline 56
    MC_GIT_URL = "https://github.com/NanmiCoder/MediaCrawler.git"
  • Access to secretsline 64
    [Credential-related source omitted]
  • Access to secretsline 67
    [Credential-related source omitted]
  • Access to secretsline 72
    [Credential-related source omitted]
  • Access to secretsline 73
    [Credential-related source omitted]
  • Access to secretsline 74
    [Credential-related source omitted]
  • Access to secretsline 90
    [Credential-related source omitted]
  • Access to secretsline 131
    [Credential-related source omitted]
  • Network accessline 184
    PIP_INDEX_CANDIDATES: list[tuple[str, str]] = [     ("官方 PyPI", "https://pypi.org/simple"),
  • Network accessline 185
    ("官方 PyPI", "https://pypi.org/simple"),
  • Network accessline 186
    ("清华 PyPI 镜像", "https://pypi.tuna.tsinghua.edu.cn/simple"),
  • Network accessline 187
    ("阿里 PyPI 镜像", "https://mirrors.aliyun.com/pypi/simple"),
  • Network accessline 188
    ] PLAYWRIGHT_OFFICIAL_HOST = "https://cdn.playwright.dev" PLAYWRIGHT_MIRROR_HOST = "https://registry.npmmirror.com/-/binary/playwright"
  • Network accessline 189
    PLAYWRIGHT_OFFICIAL_HOST = "https://cdn.playwright.dev"
  • Network accessline 190
    PLAYWRIGHT_MIRROR_HOST = "https://registry.npmmirror.com/-/binary/playwright"
  • Network accessline 191
    GIT_MIRROR_PREFIXES = [     "https://gh-proxy.com/",     "https://ghfast.top/",
  • Network accessline 192
    "https://gh-proxy.com/",
  • Network accessline 193
    "https://ghfast.top/",
  • Access to secretsline 199
    [Credential-related source omitted]
  • Network accessline 208
    started = time.time()     try:         req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "social-account-doctor"})
  • Network accessline 209
    try:         req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "social-account-doctor"})         urllib.request.urlopen(req, timeout=timeout)
  • Network accessline 210
    req = urllib.request.Request(url, method="HEAD", headers={"User-Agent": "social-account-doctor"})
  • Network accessline 211
    urllib.request.urlopen(req, timeout=timeout)
  • Access to secretsline 231
    [Credential-related source omitted]
  • Access to secretsline 248
    [Credential-related source omitted]
  • Access to secretsline 264
    [Credential-related source omitted]
  • Network accessline 270
    return [direct]     mirrors = [(prefix + MC_GIT_URL, f"gh 代理 {prefix}") for prefix in GIT_MIRROR_PREFIXES]     if _probe_ms("https://github.com", timeout=5.0) is None:
  • Network accessline 271
    mirrors = [(prefix + MC_GIT_URL, f"gh 代理 {prefix}") for prefix in GIT_MIRROR_PREFIXES]     if _probe_ms("https://github.com", timeout=5.0) is None:         log("[mc] github.com 探测不可达,优先尝试 gh 代理镜像")
  • Network accessline 272
    if _probe_ms("https://github.com", timeout=5.0) is None:
  • Access to secretsline 688
    [Credential-related source omitted]

references/commerce-metrics.md

  • Network accessline 12
    - 抖音电商学习中心 — [school.jinritemai.com](https://school.jinritemai.com/doudian/web/home)

references/commerce-workflow.md

  • Network accessline 72
    商品名称: 示例商品 商品链接: https://example.com/item/123  # 可选,仅记录
  • Network accessline 73
    商品链接: https://example.com/item/123  # 可选,仅记录

references/diagnostic-mode.md

  • Access to secretsline 24
    [Credential-related source omitted]
  • Access to secretsline 32
    [Credential-related source omitted]
  • Access to secretsline 38
    [Credential-related source omitted]
  • Access to secretsline 260
    [Credential-related source omitted]
  • Access to secretsline 319
    [Credential-related source omitted]

references/platforms/douyin-commerce.md

  • Network accessline 12
    - 抖音电商学习中心 — [school.jinritemai.com](https://school.jinritemai.com/doudian/web/home)
  • Network accessline 13
    - 巨量千川 — 广告素材规范 - 飞书课程《低质素材避坑指南》— 跃狐未来达人商业化社群(P3 级,经验案例,不等同官方规则) - 抖音规则中心 — [douyin.com/rule/policy](https://www.douyin.com/rule/policy)
  • Network accessline 15
    - 抖音规则中心 — [douyin.com/rule/policy](https://www.douyin.com/rule/policy)
  • Network accessline 180
    - 抖音电商学习中心:https://school.jinritemai.com/doudian/web/home
  • Network accessline 181
    - 抖音规则中心:https://www.douyin.com/rule/policy
  • Network accessline 182
    - 巨量千川帮助中心:https://www.oceanengine.com/
  • Network accessline 183
    - 抖店后台:https://fxg.jinritemai.com/
  • Network accessline 184
    - 巨量创意(素材参考):https://cc.oceanengine.com/

references/platforms/douyin.md

  • Network accessline 12
    - 蝉妈妈数据 — [完播率话题](https://www.chanmama.com/yunyingquan/topic/3126.html) / [核心数据指标](https://www.chanmama.com/yunyingquan/question/4274.html) / [完播率多少算正常](https://www.chanmama.com/yunyingquan/question/4338.html)
  • Network accessline 13
    - 知乎运营拆解 — [5s完播率定义](https://zhuanlan.zhihu.com/p/608114574) / [完播率视频时长](https://zhuanlan.zhihu.com/p/690186906) / [运营关键指标](https://zhuanlan.zhihu.com/p/411261710) / [2025 抖音算法首次公开](https://zhuanlan.zhihu.com/p/1897014736534631373)
  • Network accessline 14
    - 鸟哥笔记 — [比起完播率更重要的指标](https://www.niaogebiji.com/article-31701-1.html)
  • Network accessline 15
    - 巨量算数 — [trendinsight.oceanengine.com](https://trendinsight.oceanengine.com/)(官方但未公开账号诊断阈值表)

references/platforms/kuaishou.md

  • Network accessline 12
    - 券商研究报告 — [东方财富《抖音、快手生态成因》](http://pdf.dfcfw.com/pdf/H3_AP202010201422479434_1.pdf) / [《快手商业化的进化与突围》](https://pdf.dfcfw.com/pdf/H3_AP202101211452765930_1.pdf) / [《快手:由慢向快》](https://wallstreetcn.com/articles/3607502)(多份均提到"同城/关注流量占比远高于抖音",但
  • Network accessline 13
    - 知乎运营拆解 — [《快手短视频流量及推荐算法解析》](https://zhuanlan.zhihu.com/p/362863254) / [《不同短视频平台流量本质区别》](https://zhuanlan.zhihu.com/p/1911060707308450483)
  • Network accessline 14
    - 经验数字 — [亿专 5《快手五秒完播率》](https://www.yizhuan5.com/yarticle/4552.html) / [搜狐《快手养号注意事项》](https://www.sohu.com/a/886622464_122317756)
  • Network accessline 105
    券商研报普遍认同"快手同城/关注流量占比远高于抖音"([东方财富研报](http://pdf.dfcfw.com/pdf/H3_AP202010201422479434_1.pdf)),但**未给具体百分比**。社区流传的"快手 30-50% 来自同城页、抖音 10-20%"是经验估算,方向稳,具体数字别当真。
  • Network accessline 148
    2. **分享链接两步走**:`v.kuaishou.com/<code>` / `c.kuaishou.com/fw/...` 类短链,`kuaishou_web_fetch_one_video_by_url` 对账号分享链接经常返回空 data。兜底:`curl -sL <url> -A "Mozilla/5.0 ... iPhone ..." -w '%{url_effective}'` follow 302,从最终 URL 路径里抠 `user_id` / `phot

references/platforms/xiaohongshu.md

  • Network accessline 12
    - **半官方口径**:[新浪财经《小红书 70% 月活主动搜索》](https://finance.sina.com.cn/tech/2025-04-10/doc-inesschw5906564.shtml)(COO 柯南公开发言)/ [电商派同主题](https://www.pai.com.cn/234841.html) / [亿邦动力 2023《日均搜索量3亿次》](https://www.ebrun.com/20230728/524264.shtml)
  • Network accessline 13
    - **CES 公式**(业界共识但非官方):[新红《CES 评分标准》](https://xh.newrank.cn/product/article/article-detail/5c98308b368a4b64) / [飞书《小红书流量机制》](https://docs.feishu.cn/v/wiki/wikcnSCw7FSsYPdSkTlAg4wHTEP/aj) / [凡象品牌《CES 模型解析》](https://www.brandcarecn.com/yingxi
  • Network accessline 14
    - **流量/CTR/收藏经验值**:[迅课《权重影响因素》](https://www.ixunke.com/article/704) / [人人都是产品经理《爆款笔记底层逻辑》](https://www.woshipm.com/share/6082130.html) / [千瓜数据](https://www.qian-gua.com/qg/informations/1/3/0)
  • Network accessline 15
    - **限流/关键词**:[知乎《小红书限流全解》](https://zhuanlan.zhihu.com/p/687026429) / [人人都是产品经理《阅读量上不去七点自查》](https://www.woshipm.com/share/6186712.html)

scripts/analyze_document.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/analyze_image.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 97
    [Credential-related source omitted]
  • Access to secretsline 131
    [Credential-related source omitted]
  • Access to secretsline 155
    [Credential-related source omitted]
  • Access to secretsline 183
    [Credential-related source omitted]
  • Network accessline 185
    }     try:         r = requests.post(
  • Network accessline 186
    try:         r = requests.post(             chat_completions_url(base_url),
  • Network accessline 187
    r = requests.post(
  • Access to secretsline 220
    [Credential-related source omitted]
  • Access to secretsline 222
    [Credential-related source omitted]
  • Access to secretsline 223
    [Credential-related source omitted]
  • Access to secretsline 226
    [Credential-related source omitted]
  • Access to secretsline 227
    [Credential-related source omitted]
  • Network accessline 229
    return {"error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。"                          "在 shell 环境或 Skill 的 .env 里填你的 OpenAI 兼容端点,例如 "                          "https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini 
  • Network accessline 230
    [Credential-related source omitted]
  • Access to secretsline 230
    [Credential-related source omitted]
  • Network accessline 231
    "https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini 官方兼容端点 "
  • Network accessline 232
    "https://generativelanguage.googleapis.com/v1beta/openai"}
  • Access to secretsline 244
    [Credential-related source omitted]

scripts/analyze_video.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 20
    [Credential-related source omitted]
  • Access to secretsline 23
    [Credential-related source omitted]
  • Access to secretsline 66
    [Credential-related source omitted]
  • Access to secretsline 84
    [Credential-related source omitted]
  • Access to secretsline 310
    [Credential-related source omitted]
  • Access to secretsline 312
    [Credential-related source omitted]
  • Access to secretsline 313
    [Credential-related source omitted]
  • Access to secretsline 314
    [Credential-related source omitted]
  • Access to secretsline 315
    [Credential-related source omitted]
  • Network accessline 317
    return {"error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。"                          "在 shell 环境或 Skill 的 .env 里填你的 OpenAI 兼容端点,例如 "                          "https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini 
  • Network accessline 318
    [Credential-related source omitted]
  • Access to secretsline 318
    [Credential-related source omitted]
  • Network accessline 319
    "https://api.openai.com/v1、https://api.siliconflow.cn/v1,或 Gemini 官方兼容端点 "
  • Network accessline 320
    "https://generativelanguage.googleapis.com/v1beta/openai"}
  • Network accessline 328
    [Credential-related source omitted]
  • Access to secretsline 328
    [Credential-related source omitted]
  • Network accessline 329
    try:         r = requests.post(chat_completions_url(base_url), headers=headers,                           json=payload, timeout=analysis_timeout_seconds())
  • Network accessline 330
    r = requests.post(chat_completions_url(base_url), headers=headers,
  • Access to secretsline 635
    [Credential-related source omitted]
  • Access to secretsline 636
    [Credential-related source omitted]
  • Access to secretsline 639
    [Credential-related source omitted]
  • Access to secretsline 641
    [Credential-related source omitted]
  • Access to secretsline 642
    [Credential-related source omitted]
  • Network accessline 645
    raise RuntimeError(                 "talking 模式必须设 AUDIO_TRANSCRIPTION_BASE_URL"                 "(如用 SiliconFlow:https://api.siliconflow.cn/v1)"
  • Network accessline 646
    "talking 模式必须设 AUDIO_TRANSCRIPTION_BASE_URL"                 "(如用 SiliconFlow:https://api.siliconflow.cn/v1)"             )
  • Network accessline 647
    "(如用 SiliconFlow:https://api.siliconflow.cn/v1)"
  • Access to secretsline 650
    [Credential-related source omitted]
  • Network accessline 658
    [Credential-related source omitted]
  • Network accessline 659
    [Credential-related source omitted]
  • Access to secretsline 659
    [Credential-related source omitted]
  • Network accessline 660
    r = requests.post(
  • Access to secretsline 719
    [Credential-related source omitted]
  • Access to secretsline 720
    [Credential-related source omitted]
  • Access to secretsline 767
    [Credential-related source omitted]
  • Access to secretsline 866
    [Credential-related source omitted]
  • Access to secretsline 889
    [Credential-related source omitted]
  • Access to secretsline 890
    [Credential-related source omitted]
  • Dangerous shell operationline 893
    return {"error": f"{tool} not installed (sudo apt install ffmpeg)"}

scripts/build_commerce_package.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/dispatch_account.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Network accessline 16
    示例 URL:     小红书 web:    https://www.xiaohongshu.com/user/profile/5e7f...abc
  • Network accessline 17
    小红书 web:    https://www.xiaohongshu.com/user/profile/5e7f...abc
  • Network accessline 18
    小红书短链:    https://xhslink.com/A/xxxxx
  • Network accessline 19
    抖音 web:      https://www.douyin.com/user/MS4wLjABAAAA...
  • Network accessline 20
    抖音短链:      https://v.douyin.com/xxxxx
  • Network accessline 21
    快手 web:      https://www.kuaishou.com/profile/3xabcdef...

scripts/normalize_metrics.py

  • Executable scriptline 1
    #!/usr/bin/env python3

scripts/ocr_screenshot.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 31
    [Credential-related source omitted]
  • Access to secretsline 94
    [Credential-related source omitted]
  • Access to secretsline 115
    [Credential-related source omitted]
  • Access to secretsline 118
    [Credential-related source omitted]
  • Access to secretsline 119
    [Credential-related source omitted]
  • Access to secretsline 127
    [Credential-related source omitted]
  • Access to secretsline 154
    [Credential-related source omitted]
  • Access to secretsline 159
    [Credential-related source omitted]
  • Network accessline 170
    },         }         resp = requests.post(url, json=payload, timeout=analysis_timeout_seconds())
  • Network accessline 171
    }         resp = requests.post(url, json=payload, timeout=analysis_timeout_seconds())         resp.raise_for_status()
  • Network accessline 172
    resp = requests.post(url, json=payload, timeout=analysis_timeout_seconds())
  • Network accessline 190
    [Credential-related source omitted]
  • Network accessline 191
    [Credential-related source omitted]
  • Access to secretsline 191
    [Credential-related source omitted]
  • Network accessline 192
    resp = requests.post(url, json=payload, headers=headers, timeout=analysis_timeout_seconds())
  • Access to secretsline 208
    [Credential-related source omitted]
  • Access to secretsline 209
    [Credential-related source omitted]
  • Access to secretsline 210
    [Credential-related source omitted]
  • Access to secretsline 213
    [Credential-related source omitted]
  • Network accessline 215
    print(json.dumps({             "error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。"                      "填你的 OpenAI 兼容端点,例如 https://api.openai.com/v1 或 "
  • Network accessline 216
    "error": "VIDEO_ANALYSIS_BASE_URL not set(不内置默认端点,防止 key 发到第三方域名)。"                      "填你的 OpenAI 兼容端点,例如 https://api.openai.com/v1 或 "                      "Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai",
  • Network accessline 217
    "填你的 OpenAI 兼容端点,例如 https://api.openai.com/v1 或 "
  • Network accessline 218
    "Gemini 官方兼容端点 https://generativelanguage.googleapis.com/v1beta/openai",
  • Access to secretsline 221
    [Credential-related source omitted]
  • Access to secretsline 226
    [Credential-related source omitted]

scripts/render_report_pdf.py

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 143
    [Credential-related source omitted]
  • Access to secretsline 348
    [Credential-related source omitted]
  • Access to secretsline 717
    [Credential-related source omitted]

tests/fixtures/mc/bili/json/creator_contents_2026-09-16.json

  • Network accessline 17
    "video_comment": "1500",         "last_modify_ts": 1758002400005,         "video_url": "https://www.bilibili.com/video/av1200000000000001",
  • Network accessline 18
    "last_modify_ts": 1758002400005,         "video_url": "https://www.bilibili.com/video/av1200000000000001",         "video_cover_url": "https://i0.hdslb.com/bfs/archive/cover1.jpg",
  • Network accessline 19
    "video_url": "https://www.bilibili.com/video/av1200000000000001",
  • Network accessline 20
    "video_cover_url": "https://i0.hdslb.com/bfs/archive/cover1.jpg",

tests/fixtures/mc/dy/json/detail_contents_2026-09-16.json

  • Network accessline 13
    "share_count": "210",         "last_modify_ts": 1758002400002,         "aweme_url": "https://www.douyin.com/video/7428000000000001234",
  • Network accessline 14
    "last_modify_ts": 1758002400002,         "aweme_url": "https://www.douyin.com/video/7428000000000001234",         "cover_url": "https://p3-sign.douyinpic.com/cover1.jpeg",
  • Network accessline 15
    "aweme_url": "https://www.douyin.com/video/7428000000000001234",
  • Network accessline 16
    "cover_url": "https://p3-sign.douyinpic.com/cover1.jpeg",
  • Network accessline 17
    "video_download_url": "https://v26-web.douyinvod.com/video1.mp4",

tests/fixtures/mc/ks/json/search_contents_2026-09-16.json

  • Network accessline 11
    "viewd_count": "152000",         "last_modify_ts": 1758002400004,         "video_url": "https://www.kuaishou.com/short-video/3xkuaishou001",
  • Network accessline 12
    "last_modify_ts": 1758002400004,         "video_url": "https://www.kuaishou.com/short-video/3xkuaishou001",         "video_cover_url": "https://cover.kuaishou.com/001.jpg",
  • Network accessline 13
    "video_url": "https://www.kuaishou.com/short-video/3xkuaishou001",
  • Network accessline 14
    "video_cover_url": "https://cover.kuaishou.com/001.jpg",
  • Network accessline 15
    "video_play_url": "https://play.kuaishou.com/001.mp4",

tests/fixtures/mc/xhs/json/search_contents_2026-09-16.json

  • Network accessline 5
    "title": "三分钟学会低卡便当",         "desc": "上班族低卡便当教程,一周不重样 #低卡便当 #减脂餐",         "video_url": "http://sns-video-bd.xhscdn.com/sv_video_key",
  • Network accessline 6
    "desc": "上班族低卡便当教程,一周不重样 #低卡便当 #减脂餐",         "video_url": "http://sns-video-bd.xhscdn.com/sv_video_key",         "time": 1758002400000,
  • Network accessline 7
    "video_url": "http://sns-video-bd.xhscdn.com/sv_video_key",
  • Network accessline 14
    "comment_count": "89",         "share_count": "12",         "image_list": "http://sns-img.xhscdn.com/img1.jpg,http://sns-img.xhscdn.com/img2.jpg",
  • Network accessline 15
    "share_count": "12",         "image_list": "http://sns-img.xhscdn.com/img1.jpg,http://sns-img.xhscdn.com/img2.jpg",         "tag_list": "低卡便当,减脂餐,上班族",
  • Network accessline 16
    "image_list": "http://sns-img.xhscdn.com/img1.jpg,http://sns-img.xhscdn.com/img2.jpg",
  • Network accessline 17
    [Credential-related source omitted]
  • Network accessline 18
    [Credential-related source omitted]
  • Network accessline 19
    [Credential-related source omitted]
  • Network accessline 35
    "comment_count": "1",         "share_count": "0",         "image_list": "http://sns-img.xhscdn.com/img3.jpg",
  • Network accessline 36
    "share_count": "0",         "image_list": "http://sns-img.xhscdn.com/img3.jpg",         "tag_list": "便当",
  • Network accessline 37
    "image_list": "http://sns-img.xhscdn.com/img3.jpg",
  • Network accessline 38
    [Credential-related source omitted]
  • Network accessline 39
    [Credential-related source omitted]
  • Network accessline 40
    [Credential-related source omitted]

tests/test_commerce_outputs.py

  • Executable scriptline 1
    Executable file
  • Network accessline 240
    商品链接: https://example.com/product/123
  • Network accessline 270
    result = module.extract_fact_card(md)     assert result["product_name"] == "测试玻尿酸精华"     assert result["product_url"] == "https://example.com/product/123"
  • Network accessline 271
    assert result["product_name"] == "测试玻尿酸精华"     assert result["product_url"] == "https://example.com/product/123"     assert result["captured_at"] == "2026-08-10T14:30:00"
  • Network accessline 272
    assert result["product_url"] == "https://example.com/product/123"
  • Network accessline 416
    商品链接: https://example.com/product/test
  • Network accessline 475
    assert package["metadata"]["version"] == "2.0.0"     assert "source_files" in package["metadata"]     assert package["product_fact"]["product_url"] == "https://example.com/product/test"
  • Network accessline 476
    assert "source_files" in package["metadata"]     assert package["product_fact"]["product_url"] == "https://example.com/product/test"     assert len(package["titles"]) == 1
  • Network accessline 477
    assert package["product_fact"]["product_url"] == "https://example.com/product/test"
  • Network accessline 490
    output_json = tmp_path / "commerce-package.json"     fact_md.write_text("""商品名称: 测试精华 商品链接: https://example.com/product/test
  • Network accessline 491
    fact_md.write_text("""商品名称: 测试精华 商品链接: https://example.com/product/test 抓取时间: 2026-08-10T14:30:00
  • Network accessline 492
    商品链接: https://example.com/product/test
  • Access to secretsline 539
    [Credential-related source omitted]
  • Access to secretsline 540
    [Credential-related source omitted]
  • Access to secretsline 541
    [Credential-related source omitted]
  • Access to secretsline 544
    [Credential-related source omitted]

tests/test_mc_client.py

  • Executable scriptline 1
    Executable file
  • Network accessline 76
    def test_build_args_detail_uses_specified_id():     args = mc.build_crawler_args(         "detail", "dy", ids=["https://v.douyin.com/abc/", "7428000000000001234"],
  • Network accessline 77
    args = mc.build_crawler_args(         "detail", "dy", ids=["https://v.douyin.com/abc/", "7428000000000001234"],         comments=False, out_dir="/tmp/mc-out",
  • Network accessline 78
    "detail", "dy", ids=["https://v.douyin.com/abc/", "7428000000000001234"],
  • Network accessline 81
    joined = " ".join(args)     assert "--type detail" in joined     assert "--specified_id https://v.douyin.com/abc/,7428000000000001234" in joined
  • Network accessline 82
    assert "--type detail" in joined     assert "--specified_id https://v.douyin.com/abc/,7428000000000001234" in joined     assert "--get_comment false" in joined
  • Network accessline 83
    assert "--specified_id https://v.douyin.com/abc/,7428000000000001234" in joined
  • Network accessline 87
    def test_build_args_creator_uses_creator_id():     args = mc.build_crawler_args(         "creator", "xhs", ids=["https://www.xiaohongshu.com/user/profile/5e7fabc"],
  • Network accessline 88
    args = mc.build_crawler_args(         "creator", "xhs", ids=["https://www.xiaohongshu.com/user/profile/5e7fabc"],         out_dir="/tmp/mc-out",
  • Network accessline 89
    "creator", "xhs", ids=["https://www.xiaohongshu.com/user/profile/5e7fabc"],
  • Network accessline 163
    assert video["publish_time"] == 1758002400  # ms → s     assert len(video["image_urls"]) == 2     assert video["cover_url"].startswith("http://sns-img")
  • Network accessline 164
    assert len(video["image_urls"]) == 2     assert video["cover_url"].startswith("http://sns-img")     assert video["tags"] == ["低卡便当", "减脂餐", "上班族"]
  • Network accessline 165
    assert video["cover_url"].startswith("http://sns-img")
  • Network accessline 185
    assert item["liked_count"] == 23000     assert item["publish_time"] == 1758002400  # already seconds     assert item["video_url"].startswith("https://v26-web")
  • Network accessline 186
    assert item["publish_time"] == 1758002400  # already seconds     assert item["video_url"].startswith("https://v26-web")     assert item["cover_url"].startswith("https://p3-sign")
  • Network accessline 187
    assert item["video_url"].startswith("https://v26-web")
  • Network accessline 188
    assert item["cover_url"].startswith("https://p3-sign")
  • Network accessline 198
    assert item["view_count"] == 152000     assert item["collected_count"] is None  # ks 搜索结果不提供收藏数     assert item["video_url"].startswith("https://play.kuaishou.com")
  • Network accessline 199
    assert item["collected_count"] is None  # ks 搜索结果不提供收藏数     assert item["video_url"].startswith("https://play.kuaishou.com")     assert item["publish_time"] == 1758002400  # ms → s
  • Network accessline 200
    assert item["video_url"].startswith("https://play.kuaishou.com")
  • Network accessline 340
    def test_pip_index_respects_user_env(monkeypatch):     monkeypatch.setenv("PIP_INDEX_URL", "https://example.com/simple")
  • Network accessline 341
    monkeypatch.setenv("PIP_INDEX_URL", "https://example.com/simple")
  • Network accessline 348
    _clear_mirror_env(monkeypatch)     speeds = {         "https://pypi.org/simple": 800.0,
  • Network accessline 349
    speeds = {         "https://pypi.org/simple": 800.0,         "https://pypi.tuna.tsinghua.edu.cn/simple": 50.0,
  • Network accessline 350
    "https://pypi.org/simple": 800.0,
  • Network accessline 351
    "https://pypi.tuna.tsinghua.edu.cn/simple": 50.0,
  • Network accessline 352
    "https://mirrors.aliyun.com/pypi/simple": 60.0,
  • Network accessline 354
    monkeypatch.setattr(mc, "_probe_ms", lambda url, timeout=4.0: speeds[url])     args, label = mc.pip_index_args(log=lambda m: None)     assert args == ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"]
  • Network accessline 355
    args, label = mc.pip_index_args(log=lambda m: None)     assert args == ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"]     assert label == "清华 PyPI 镜像"
  • Network accessline 356
    assert args == ["-i", "https://pypi.tuna.tsinghua.edu.cn/simple"]
  • Network accessline 361
    _clear_mirror_env(monkeypatch)     speeds = {         "https://pypi.org/simple": 40.0,
  • Network accessline 362
    speeds = {         "https://pypi.org/simple": 40.0,         "https://pypi.tuna.tsinghua.edu.cn/simple": 500.0,
  • Network accessline 363
    "https://pypi.org/simple": 40.0,
  • Network accessline 364
    "https://pypi.tuna.tsinghua.edu.cn/simple": 500.0,
  • Network accessline 365
    "https://mirrors.aliyun.com/pypi/simple": 600.0,
  • Network accessline 407
    def test_playwright_mirror_respects_user_env(monkeypatch):     _clear_mirror_env(monkeypatch)     monkeypatch.setenv("PLAYWRIGHT_DOWNLOAD_HOST", "https://my-host.example")
  • Network accessline 408
    _clear_mirror_env(monkeypatch)     monkeypatch.setenv("PLAYWRIGHT_DOWNLOAD_HOST", "https://my-host.example")     assert mc.playwright_mirror_env(log=lambda m: None) == {}
  • Network accessline 409
    monkeypatch.setenv("PLAYWRIGHT_DOWNLOAD_HOST", "https://my-host.example")
  • Network accessline 413
    def test_clone_candidates_env_url_wins(monkeypatch):     _clear_mirror_env(monkeypatch)     monkeypatch.setenv("MC_GIT_URL", "https://mirror.example/MediaCrawler.git")
  • Network accessline 414
    _clear_mirror_env(monkeypatch)     monkeypatch.setenv("MC_GIT_URL", "https://mirror.example/MediaCrawler.git")     assert mc.clone_url_candidates(log=lambda m: None) == [
  • Network accessline 415
    monkeypatch.setenv("MC_GIT_URL", "https://mirror.example/MediaCrawler.git")
  • Network accessline 416
    assert mc.clone_url_candidates(log=lambda m: None) == [         ("https://mirror.example/MediaCrawler.git", "MC_GIT_URL")     ]
  • Network accessline 417
    ("https://mirror.example/MediaCrawler.git", "MC_GIT_URL")
  • Network accessline 421
    def test_clone_candidates_direct_first_when_github_reachable(monkeypatch):     _clear_mirror_env(monkeypatch)     probes = {"https://github.com": 300.0}
  • Network accessline 422
    _clear_mirror_env(monkeypatch)     probes = {"https://github.com": 300.0}     monkeypatch.setattr(mc, "_probe_ms", lambda url, timeout=4.0: probes.get(url))
  • Network accessline 423
    probes = {"https://github.com": 300.0}
  • Network accessline 430
    def test_clone_candidates_mirrors_first_when_github_down(monkeypatch):     _clear_mirror_env(monkeypatch)     probes = {"https://github.com": None}
  • Network accessline 431
    _clear_mirror_env(monkeypatch)     probes = {"https://github.com": None}     monkeypatch.setattr(mc, "_probe_ms", lambda url, timeout=4.0: probes.get(url))
  • Network accessline 432
    probes = {"https://github.com": None}
  • Network accessline 481
    def test_crawl_detail_and_creator_default_comments_on(monkeypatch, tmp_path):     captured = _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 482
    captured = _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None)     assert "--get_comment true" in " ".join(captured["args"])
  • Network accessline 483
    mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 486
    mc.crawl("creator", "douyin", ids=["http://x/user/1"], log=lambda m: None)
  • Network accessline 496
    def test_crawl_comment_cap_defaults_to_upstream_ten(monkeypatch, tmp_path):     captured = _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 497
    captured = _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None)     assert "--max_comments_count_singlenotes 10" in " ".join(captured["args"])
  • Network accessline 498
    mc.crawl("detail", "xhs", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 502
    def test_crawl_max_comments_propagates(monkeypatch, tmp_path):     captured = _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("detail", "xhs", ids=["http://x/1"], max_comments=5, log=lambda m: None)
  • Network accessline 503
    captured = _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("detail", "xhs", ids=["http://x/1"], max_comments=5, log=lambda m: None)     assert "--max_comments_count_singlenotes 5" in " ".join(captured["args"])
  • Network accessline 504
    mc.crawl("detail", "xhs", ids=["http://x/1"], max_comments=5, log=lambda m: None)
  • Network accessline 550
    result = mc.crawl("detail", "douyin", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 606
    lock.write_text("999999 123", encoding="utf-8")     with pytest.raises(mc.McError, match="单实例|并行"):         mc.crawl("detail", "bilibili", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 608
    mc.crawl("detail", "bilibili", ids=["http://x/1"], log=lambda m: None)
  • Network accessline 638
    def test_volume_cap_rejects_too_many_detail_ids(monkeypatch, tmp_path):     monkeypatch.setattr(mc, "DATA_DIR", tmp_path)     ids = [f"http://x/{i}" for i in range(6)]
  • Network accessline 639
    monkeypatch.setattr(mc, "DATA_DIR", tmp_path)     ids = [f"http://x/{i}" for i in range(6)]     with pytest.raises(mc.McError, match="detail"):
  • Network accessline 640
    ids = [f"http://x/{i}" for i in range(6)]
  • Network accessline 645
    def test_volume_cap_rejects_too_many_creators(monkeypatch, tmp_path):     monkeypatch.setattr(mc, "DATA_DIR", tmp_path)     ids = [f"http://x/u/{i}" for i in range(3)]
  • Network accessline 646
    monkeypatch.setattr(mc, "DATA_DIR", tmp_path)     ids = [f"http://x/u/{i}" for i in range(3)]     with pytest.raises(mc.McError, match="creator"):
  • Network accessline 647
    ids = [f"http://x/u/{i}" for i in range(3)]
  • Network accessline 653
    _capture_crawl_args(monkeypatch, tmp_path)     mc.crawl("search", "xhs", keywords="a,b,c", log=lambda m: None)  # 3 词 = 上限,放行     mc.crawl("detail", "dy", ids=[f"http://x/{i}" for i in range(5)], log=lambda m: None)
  • Network accessline 655
    mc.crawl("detail", "dy", ids=[f"http://x/{i}" for i in range(5)], log=lambda m: None)
  • Network accessline 783
    "aiofiles~=23.2.1  # inline comment\n"         "-r other.txt\n"         "--index-url https://example.com\n",
  • Network accessline 784
    "-r other.txt\n"         "--index-url https://example.com\n",         encoding="utf-8",
  • Network accessline 785
    "--index-url https://example.com\n",

tests/test_multimodal_scripts.py

  • Executable scriptline 1
    Executable file
  • Possible obfuscationline 35
    assert base64.b64decode(b64).startswith(b"\xff\xd8")
  • Possible obfuscationline 41
    assert base64.b64decode(b64).startswith(b"\x89PNG")
  • Network accessline 47
    make_png(img_path)     monkeypatch.setenv("VIDEO_ANALYSIS_API_KEY", "test-key")     monkeypatch.setenv("VIDEO_ANALYSIS_BASE_URL", "https://proxy.example.com/v1")
  • Network accessline 48
    [Credential-related source omitted]
  • Access to secretsline 48
    [Credential-related source omitted]
  • Network accessline 49
    monkeypatch.setenv("VIDEO_ANALYSIS_BASE_URL", "https://proxy.example.com/v1")
  • Access to secretsline 52
    [Credential-related source omitted]
  • Network accessline 240
    assert base64.b64decode(b64).startswith(b"\xff\xd8")     assert (         module.chat_completions_url("https://proxy.example.com/v1")
  • Possible obfuscationline 240
    assert base64.b64decode(b64).startswith(b"\xff\xd8")
  • Network accessline 241
    assert (         module.chat_completions_url("https://proxy.example.com/v1")         == "https://proxy.example.com/v1/chat/completions"
  • Network accessline 242
    module.chat_completions_url("https://proxy.example.com/v1")
  • Network accessline 243
    == "https://proxy.example.com/v1/chat/completions"
  • Network accessline 244
    )     assert (         module.gemini_generate_content_url("https://generativelanguage.googleapis.com/v1beta", "gemini", "key")
  • Network accessline 245
    assert (         module.gemini_generate_content_url("https://generativelanguage.googleapis.com/v1beta", "gemini", "key")         == "https://generativelanguage.googleapis.com/v1beta/models/gemini:generateContent?key=key"
  • Network accessline 246
    module.gemini_generate_content_url("https://generativelanguage.googleapis.com/v1beta", "gemini", "key")
  • Network accessline 247
    == "https://generativelanguage.googleapis.com/v1beta/models/gemini:generateContent?key=key"
  • Access to secretsline 259
    [Credential-related source omitted]
  • Access to secretsline 269
    [Credential-related source omitted]
  • Access to secretsline 278
    [Credential-related source omitted]
  • Access to secretsline 281
    [Credential-related source omitted]
  • Access to secretsline 286
    [Credential-related source omitted]
  • Network accessline 296
    def test_chat_completions_url_accepts_google_official_compat():     expected = "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions"
  • Network accessline 297
    expected = "https://generativelanguage.googleapis.com/v1beta/openai/chat/completions"
  • Network accessline 299
    module = load_script(name)         assert module.chat_completions_url(             "https://generativelanguage.googleapis.com/v1beta/openai") == expected
  • Network accessline 300
    assert module.chat_completions_url(             "https://generativelanguage.googleapis.com/v1beta/openai") == expected         assert module.chat_completions_url(
  • Network accessline 301
    "https://generativelanguage.googleapis.com/v1beta/openai") == expected
  • Network accessline 303
    "https://proxy.example.com/v1") == "https://proxy.example.com/v1/chat/completions"

tests/test_render_report_pdf.py

  • Executable scriptline 1
    Executable file

tests/test_tikhub_rest.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 75
    [Credential-related source omitted]
  • Access to secretsline 105
    [Credential-related source omitted]
  • Access to secretsline 127
    [Credential-related source omitted]

tikhub/README.md

  • Access to secretsline 20
    [Credential-related source omitted]
  • Network accessline 23
    [Credential-related source omitted]
  • Network accessline 24
    `https://api.tikhub.io`; use `TIKHUB_API_BASE_URL=https://api.tikhub.dev` when
  • Network accessline 45
    Catalogs are generated from `https://api.tikhub.io/openapi.json`:
  • Access to secretsline 61
    [Credential-related source omitted]

tikhub/bin/tikhub

  • Executable scriptline 1
    #!/usr/bin/env python3
  • Access to secretsline 20
    [Credential-related source omitted]
  • Access to secretsline 21
    [Credential-related source omitted]

tikhub/lib/tikhub_client.py

  • Executable scriptline 1
    Executable file
  • Network accessline 22
    DEFAULT_API_BASE_URL = "https://api.tikhub.io"
  • Access to secretsline 25
    [Credential-related source omitted]
  • Access to secretsline 27
    [Credential-related source omitted]
  • Access to secretsline 28
    [Credential-related source omitted]
  • Network accessline 30
    CLIENT_NAME = "tikhub-rest-cli" CLIENT_VERSION = "0.2.0" USER_AGENT = f"{CLIENT_NAME}/{CLIENT_VERSION} (+https://api.tikhub.io)"
  • Network accessline 31
    CLIENT_VERSION = "0.2.0" USER_AGENT = f"{CLIENT_NAME}/{CLIENT_VERSION} (+https://api.tikhub.io)" DEFAULT_PLATFORMS = (
  • Network accessline 32
    USER_AGENT = f"{CLIENT_NAME}/{CLIENT_VERSION} (+https://api.tikhub.io)"
  • Access to secretsline 49
    [Credential-related source omitted]
  • Access to secretsline 74
    [Credential-related source omitted]
  • Access to secretsline 76
    [Credential-related source omitted]
  • Access to secretsline 79
    [Credential-related source omitted]
  • Access to secretsline 90
    [Credential-related source omitted]
  • Access to secretsline 128
    [Credential-related source omitted]
  • Access to secretsline 130
    [Credential-related source omitted]
  • Access to secretsline 173
    [Credential-related source omitted]
  • Network accessline 182
    for attempt in range(1, 4):             _debug(f"{method} {path} attempt={attempt}")             request = urllib.request.Request(url, data=data, headers=headers, method=method)
  • Network accessline 183
    _debug(f"{method} {path} attempt={attempt}")             request = urllib.request.Request(url, data=data, headers=headers, method=method)             try:
  • Network accessline 184
    request = urllib.request.Request(url, data=data, headers=headers, method=method)
  • Network accessline 185
    try:                 with urllib.request.urlopen(request, timeout=self.timeout) as response:                     return _decode_json(response.read(), f"{method} {path}")
  • Network accessline 186
    with urllib.request.urlopen(request, timeout=self.timeout) as response:
  • Access to secretsline 230
    [Credential-related source omitted]
  • Access to secretsline 231
    [Credential-related source omitted]
  • Access to secretsline 232
    [Credential-related source omitted]
  • Network accessline 274
    def _get_public_json(path: str, label: str) -> Any:     url = f"{api_base_url()}{path}"     request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
  • Network accessline 275
    url = f"{api_base_url()}{path}"     request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})     try:
  • Network accessline 276
    request = urllib.request.Request(url, headers={"User-Agent": USER_AGENT})
  • Network accessline 277
    try:         with urllib.request.urlopen(request, timeout=20) as response:             return _decode_json(response.read(), label)
  • Network accessline 278
    with urllib.request.urlopen(request, timeout=20) as response:

tikhub/references/tools-douyin.json

  • Network accessline 8632
    "example": "https://www.douyin.com/aweme/v1/web/general/search/single/?device_platform=webapp&aid=6383&channel=channel_pc_web&search_channel=aweme_general&enable_history=1&keyword=%E4%B8%AD%E5%8D%8E%E5%A8%98&search_source=normal_search&quer
  • Network accessline 8779
    "example": "https://www.douyin.com/aweme/v1/web/aweme/detail/?aweme_id=7148736076176215311&device_platform=webapp&aid=6383&channel=channel_pc_web&pc_client_type=1&version_code=170400&version_name=17.4.0&cookie_enabled=true&screen_width=1920

tikhub/references/tools-wechat.json

  • Network accessline 523
    ],           "title": "Share Url",           "description": "视频号分享短链(https://weixin.qq.com/sph/…),仅在 object_id 与 export_id 都为空时使用/Share URL (https://weixin.qq.com/sph/…), used only when object_id and export_id are empty",
  • Network accessline 524
    "title": "Share Url",           "description": "视频号分享短链(https://weixin.qq.com/sph/…),仅在 object_id 与 export_id 都为空时使用/Share URL (https://weixin.qq.com/sph/…), used only when object_id and export_id are empty",           "default": ""
  • Network accessline 525
    "description": "视频号分享短链(https://weixin.qq.com/sph/…),仅在 object_id 与 export_id 都为空时使用/Share URL (https://weixin.qq.com/sph/…), used only when object_id and export_id are empty",
  • Network accessline 706
    "title": "Url",           "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 707
    "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 708
    "example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  • Network accessline 736
    "title": "Url",           "description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)",
  • Network accessline 737
    "description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)",
  • Network accessline 738
    "example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  • Network accessline 780
    "title": "Url",           "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 781
    "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 782
    "example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  • Network accessline 810
    "title": "Url",           "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 811
    "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 812
    "example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"
  • Network accessline 840
    "title": "Url",           "description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)",
  • Network accessline 841
    "description": "公众号文章链接(https://mp.weixin.qq.com/s/…)/WeChat MP article URL (https://mp.weixin.qq.com/s/…)",
  • Network accessline 842
    "example": "http://mp.weixin.qq.com/s?__biz=Mzk3NTA0MzM5NA==&mid=2247483745&idx=1&sn=3f34e768cf457a501038991ed30be1f4#rd"
  • Network accessline 899
    "title": "Url",           "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 900
    "description": "公众号文章链接(https://mp.weixin.qq.com/s/… 或带 __biz 的长链)/WeChat MP article URL (https://mp.weixin.qq.com/s/… or long URL with __biz)",
  • Network accessline 901
    "example": "https://mp.weixin.qq.com/s/TSNQKkRpN1qbKsT7BvzqIw"

tikhub/scripts/refresh_tools.py

  • Executable scriptline 1
    #!/usr/bin/env python3

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.

Combined signals: 1 fact
Declared and executed: 18 facts
Signal confidence: 383 facts

and 333 more

Works with

Agent compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeCompatibleStandard SKILL.md SKILL.md.claude/skills/<skill-name>/
CodexCompatibleStandard SKILL.md SKILL.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.