#523 by GitHub stars
Jesseovo/last30days-skill-cn
给 AI Agent 的中文互联网研究 Skill:检索 8 大平台最近 30 天的讨论,追踪跨平台热点,生成附原始来源的报告,并提供每日全网热榜。支持 Claude Code、Codex、OpenClaw。
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 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
af785c682de2 → af785c682de2
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/last30days/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
af785c682de2 → af785c682de2
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Verified commit af785c682de2fb9192e495daf061308a7a6799ec
git clone --filter=blob:none --no-checkout https://github.com/Jesseovo/last30days-skill-cn.git .hotskills/jesseovo-last30days-skill-cn && git -C .hotskills/jesseovo-last30days-skill-cn checkout --detach af785c682de2fb9192e495daf061308a7a6799ec
# Copy each selected skill directory from .hotskills/jesseovo-last30days-skill-cn into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/Jesseovo/last30days-skill-cn.git .hotskills/jesseovo-last30days-skill-cn && git -C .hotskills/jesseovo-last30days-skill-cn checkout --detach af785c682de2fb9192e495daf061308a7a6799ec
# Copy each selected skill directory from .hotskills/jesseovo-last30days-skill-cn into .agents/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/Jesseovo/last30days-skill-cn.git .hotskills/jesseovo-last30days-skill-cn && git -C .hotskills/jesseovo-last30days-skill-cn checkout --detach af785c682de2fb9192e495daf061308a7a6799ec
# Copy each selected skill directory from .hotskills/jesseovo-last30days-skill-cn into .gemini/skills/<skill-name>/Heat
7.5- Star growth, last 7 daysAhead of 94% of tracked repositories
- Star growth, last 24 hoursAhead of 97% of tracked repositories
- Rank movement, last 7 daysAhead of 59% of tracked repositories
- Commits, last 30 daysAhead of 84% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- last30days-cn
/ - last30days-cn
skills/last30days
How it works
last30days-cn
When your agent uses it
Research what Chinese internet users actually said in the last 30 days across Weibo, Xiaohongshu (RED), Bilibili, Zhihu, Douyin, WeChat public accounts, Baidu and Toutiao: engagement-weighted ranking, cross-platform clustering, cited Markdown/JSON/HTML reports. Also shows today's cross-platform hot-search board (全网热榜, --hot) and can add Hacker News / GitHub / Reddit or an installed upstream last30days for X/YouTube/TikTok.
What it loads into context
Frontmatter
374 tokensAlways available to the agent
SKILL.md
2,638 tokensWhen the skill is activated
Reference documents
18,179 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Core rule
- 1. Pick the mode
- 2. Topic research
- 3. Hot board (全网热榜)
- 4. Overseas sources (opt-in)
- 5. 输出契约 (output contract)
- 6. Login-gated platforms and diagnostics
- 7. Synthesis guidance
- Configuration
- Compliance
Scripts executed separately
hooks/scripts/check-config.shscripts/build_payload.pyscripts/last30days.pyscripts/lib/__init__.pyscripts/lib/baidu.pyscripts/lib/bilibili.pyscripts/lib/cache.pyscripts/lib/cjk.pyscripts/lib/cluster.pyscripts/lib/crawler_bridge.pyscripts/lib/dates.pyscripts/lib/dedupe.pyscripts/lib/doctor.pyscripts/lib/douyin.pyscripts/lib/env.pyscripts/lib/github.pyscripts/lib/hackernews.pyscripts/lib/hot_board.jsscripts/lib/hot_board.pyscripts/lib/http.pyscripts/lib/normalize.pyscripts/lib/pipeline.pyscripts/lib/query.pyscripts/lib/query_type.pyscripts/lib/reddit.pyscripts/lib/relevance.pyscripts/lib/render.pyscripts/lib/schema.pyscripts/lib/score.pyscripts/lib/setup_wizard.pyscripts/lib/sources.pyscripts/lib/toutiao.pyscripts/lib/trending.pyscripts/lib/upstream_bridge.pyscripts/lib/version.pyscripts/lib/websearch.pyscripts/lib/wechat.pyscripts/lib/weibo.pyscripts/lib/xiaohongshu.pyscripts/lib/zhihu.pyscripts/sync.shtests/__init__.pytests/test_baidu_antibot.pytests/test_bilibili_v4.pytests/test_cache.pytests/test_cjk.pytests/test_cluster.pytests/test_crawler_bridge.pytests/test_crawler_login.pytests/test_dates.pytests/test_dedupe.pytests/test_doctor.pytests/test_env_cli_v4.pytests/test_env_sources.pytests/test_global_sources.pytests/test_html_render.pytests/test_http.pytests/test_http_v4.pytests/test_normalize.pytests/test_platform_parsers_v4.pytests/test_query.pytests/test_query_type.pytests/test_relevance.pytests/test_render_v4.pytests/test_render_wechat.pytests/test_render_xss.pytests/test_score.pytests/test_search_fallbacks.pytests/test_skill_payload.pytests/test_sources_pipeline.pytests/test_trending.pytests/test_version.pytests/test_websearch.py
Files
.claude-plugin/marketplace.jsonasset1,022 bytes.claude-plugin/plugin.jsonasset686 bytes.clawhubignoreasset167 bytes.gitattributesasset431 bytes.github/dependabot.ymlasset144 bytes.github/workflows/ci.ymlasset1,641 bytes.github/workflows/daily-hot.ymlasset2,803 bytes.github/workflows/security-scan.ymlasset637 bytes.gitignoreasset120 bytesAGENTS.mddoc5,762 bytesCLAUDE.mddoc11 bytesLICENSEasset1,363 bytesREADME.en.mddoc6,277 bytesREADME.mddoc6,906 bytesSECURITY.mddoc1,586 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSPEC.mddoc8,153 bytesTASKS.mddoc2,196 bytesagents/openai.yamlasset500 bytesassets/banner.pngasset1,442,056 bytesassets/readme-board-dark.svgasset878 bytesassets/readme-board-light.svgasset878 bytesassets/readme-cover-dark.svgasset6,865 bytesassets/readme-cover-light.svgasset6,865 bytesassets/readme-discovery-dark.svgasset6,786 bytesassets/readme-discovery-light.svgasset6,786 bytesassets/readme-install-dark.svgasset846 bytesassets/readme-install-light.svgasset846 bytesassets/readme-typing-dark.svgasset1,462 bytesassets/readme-typing-light.svgasset1,462 bytesdocs/usage.en.mddoc10,765 bytesdocs/usage.zh-CN.mddoc13,067 bytesfixtures/bilibili_sample.jsonasset1,109 bytesfixtures/weibo_sample.jsonasset979 bytesfixtures/zhihu_sample.jsonasset1,289 bytesgemini-extension.jsonasset2,294 byteshooks/hooks.jsonasset280 byteshooks/scripts/check-config.shruns3,781 bytesrelease-notes.mddoc9,742 bytesrequirements.txtdoc682 bytesscripts/build_payload.pyruns2,979 bytesscripts/last30days.pyruns19,309 bytesscripts/lib/__init__.pyruns29 bytesscripts/lib/baidu.pyruns14,640 bytesscripts/lib/bilibili.pyruns12,740 bytesscripts/lib/cache.pyruns4,967 bytesscripts/lib/cjk.pyruns2,961 bytesscripts/lib/cluster.pyruns3,985 bytesscripts/lib/crawler_bridge.pyruns49,594 bytesscripts/lib/dates.pyruns3,907 bytesscripts/lib/dedupe.pyruns8,943 bytesscripts/lib/doctor.pyruns12,269 bytesscripts/lib/douyin.pyruns8,742 bytesscripts/lib/env.pyruns14,365 bytesscripts/lib/github.pyruns4,900 bytesscripts/lib/hackernews.pyruns3,747 bytesscripts/lib/hot_board.cssasset24,031 bytesscripts/lib/hot_board.jsruns11,869 bytesscripts/lib/hot_board.pyruns17,758 bytesscripts/lib/hot_board_cat.pngasset1,079 bytesscripts/lib/http.pyruns17,581 bytesscripts/lib/normalize.pyruns12,357 bytesscripts/lib/pipeline.pyruns13,277 bytesscripts/lib/query.pyruns7,998 bytesscripts/lib/query_type.pyruns5,821 bytesscripts/lib/reddit.pyruns3,577 bytesscripts/lib/relevance.pyruns6,073 bytesscripts/lib/render.pyruns32,075 bytesscripts/lib/schema.pyruns19,776 bytesscripts/lib/score.pyruns12,425 bytesscripts/lib/setup_wizard.pyruns6,397 bytesscripts/lib/sources.pyruns6,890 bytesscripts/lib/toutiao.pyruns9,874 bytesscripts/lib/trending.pyruns19,597 bytesscripts/lib/upstream_bridge.pyruns10,144 bytesscripts/lib/version.pyruns96 bytesscripts/lib/websearch.pyruns12,153 bytesscripts/lib/wechat.pyruns7,124 bytesscripts/lib/weibo.pyruns14,165 bytesscripts/lib/xiaohongshu.pyruns11,874 bytesscripts/lib/zhihu.pyruns10,872 bytesscripts/sync.shruns893 bytestests/__init__.pyruns19 bytestests/test_baidu_antibot.pyruns1,158 bytestests/test_bilibili_v4.pyruns4,984 bytestests/test_cache.pyruns4,131 bytestests/test_cjk.pyruns1,353 bytestests/test_cluster.pyruns2,019 bytestests/test_crawler_bridge.pyruns6,969 bytestests/test_crawler_login.pyruns6,131 bytestests/test_dates.pyruns6,009 bytestests/test_dedupe.pyruns4,233 bytestests/test_doctor.pyruns3,236 bytestests/test_env_cli_v4.pyruns7,541 bytestests/test_env_sources.pyruns1,787 bytestests/test_global_sources.pyruns9,072 bytestests/test_html_render.pyruns3,261 bytestests/test_http.pyruns3,514 bytestests/test_http_v4.pyruns4,121 bytestests/test_normalize.pyruns5,197 bytestests/test_platform_parsers_v4.pyruns14,370 bytestests/test_query.pyruns5,731 bytestests/test_query_type.pyruns7,070 bytestests/test_relevance.pyruns5,355 bytestests/test_render_v4.pyruns5,215 bytestests/test_render_wechat.pyruns1,325 bytestests/test_render_xss.pyruns1,399 bytestests/test_score.pyruns4,371 bytestests/test_search_fallbacks.pyruns3,716 bytestests/test_skill_payload.pyruns1,590 bytestests/test_sources_pipeline.pyruns7,214 bytestests/test_trending.pyruns10,477 bytestests/test_version.pyruns1,226 bytestests/test_websearch.pyruns5,565 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHublast30days-cn
When your agent uses it
Research what Chinese internet users actually said in the last 30 days across Weibo, Xiaohongshu (RED), Bilibili, Zhihu, Douyin, WeChat public accounts, Baidu and Toutiao: engagement-weighted ranking, cross-platform clustering, cited Markdown/JSON/HTML reports. Also shows today's cross-platform hot-search board (全网热榜, --hot) and can add Hacker News / GitHub / Reddit or an installed upstream last30days for X/YouTube/TikTok.
What it loads into context
Frontmatter
374 tokensAlways available to the agent
SKILL.md
2,638 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Core rule
- 1. Pick the mode
- 2. Topic research
- 3. Hot board (全网热榜)
- 4. Overseas sources (opt-in)
- 5. 输出契约 (output contract)
- 6. Login-gated platforms and diagnostics
- 7. Synthesis guidance
- Configuration
- Compliance
Scripts executed separately
scripts/build_payload.pyscripts/last30days.pyscripts/lib/__init__.pyscripts/lib/baidu.pyscripts/lib/bilibili.pyscripts/lib/cache.pyscripts/lib/cjk.pyscripts/lib/cluster.pyscripts/lib/crawler_bridge.pyscripts/lib/dates.pyscripts/lib/dedupe.pyscripts/lib/doctor.pyscripts/lib/douyin.pyscripts/lib/env.pyscripts/lib/github.pyscripts/lib/hackernews.pyscripts/lib/hot_board.jsscripts/lib/hot_board.pyscripts/lib/http.pyscripts/lib/normalize.pyscripts/lib/pipeline.pyscripts/lib/query.pyscripts/lib/query_type.pyscripts/lib/reddit.pyscripts/lib/relevance.pyscripts/lib/render.pyscripts/lib/schema.pyscripts/lib/score.pyscripts/lib/setup_wizard.pyscripts/lib/sources.pyscripts/lib/toutiao.pyscripts/lib/trending.pyscripts/lib/upstream_bridge.pyscripts/lib/version.pyscripts/lib/websearch.pyscripts/lib/wechat.pyscripts/lib/weibo.pyscripts/lib/xiaohongshu.pyscripts/lib/zhihu.pyscripts/sync.sh
Files
SKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesSKILL.mdcore10,150 bytesscripts/build_payload.pyruns2,979 bytesscripts/last30days.pyruns19,309 bytesscripts/lib/__init__.pyruns29 bytesscripts/lib/baidu.pyruns14,640 bytesscripts/lib/bilibili.pyruns12,740 bytesscripts/lib/cache.pyruns4,967 bytesscripts/lib/cjk.pyruns2,961 bytesscripts/lib/cluster.pyruns3,985 bytesscripts/lib/crawler_bridge.pyruns49,594 bytesscripts/lib/dates.pyruns3,907 bytesscripts/lib/dedupe.pyruns8,943 bytesscripts/lib/doctor.pyruns12,269 bytesscripts/lib/douyin.pyruns8,742 bytesscripts/lib/env.pyruns14,365 bytesscripts/lib/github.pyruns4,900 bytesscripts/lib/hackernews.pyruns3,747 bytesscripts/lib/hot_board.cssasset24,031 bytesscripts/lib/hot_board.jsruns11,869 bytesscripts/lib/hot_board.pyruns17,758 bytesscripts/lib/hot_board_cat.pngasset1,079 bytesscripts/lib/http.pyruns17,581 bytesscripts/lib/normalize.pyruns12,357 bytesscripts/lib/pipeline.pyruns13,277 bytesscripts/lib/query.pyruns7,998 bytesscripts/lib/query_type.pyruns5,821 bytesscripts/lib/reddit.pyruns3,577 bytesscripts/lib/relevance.pyruns6,073 bytesscripts/lib/render.pyruns32,075 bytesscripts/lib/schema.pyruns19,776 bytesscripts/lib/score.pyruns12,425 bytesscripts/lib/setup_wizard.pyruns6,397 bytesscripts/lib/sources.pyruns6,890 bytesscripts/lib/toutiao.pyruns9,874 bytesscripts/lib/trending.pyruns19,597 bytesscripts/lib/upstream_bridge.pyruns10,144 bytesscripts/lib/version.pyruns96 bytesscripts/lib/websearch.pyruns12,153 bytesscripts/lib/wechat.pyruns7,124 bytesscripts/lib/weibo.pyruns14,165 bytesscripts/lib/xiaohongshu.pyruns11,874 bytesscripts/lib/zhihu.pyruns10,872 bytesscripts/sync.shruns893 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- last30days-cn
- last30days-cn
Repository facts
- License
- No license detected
- Created
- Mar 31, 2026
- Last pushed
- Nov 3, 2026
- Forks
- 208
- Open issues
- 0
- Project activity
- Active
Rank over the last 12 weeks
Now #523 · best #434 · down 44 in 30 days
- #515 on Nov 1
- #519 on Nov 2
- #520 on Nov 3
- #521 on Nov 4
- #520 from Nov 5 to Nov 6
- #523 since Nov 7
82 earlier periods
- #457 on Aug 2
- #460 on Aug 8
- #456 on Aug 9
- #471 on Aug 10
- #469 on Aug 11
- #466 on Aug 12
- #476 on Aug 13
- #471 on Aug 14
- #459 on Aug 15
- #465 from Aug 16 to Aug 17
- #471 on Aug 18
- #469 on Aug 19
- #466 on Aug 20
- #467 on Aug 21
- #448 on Aug 22
- #456 on Aug 23
- #454 on Aug 24
- #455 on Aug 25
- #447 on Aug 26
- #452 on Aug 27
- #449 on Aug 28
- #442 on Aug 29
- #434 on Aug 30
- #445 on Aug 31
- #449 on Sep 1
- #442 on Sep 2
- #447 on Sep 3
- #434 on Sep 4
- #440 on Sep 5
- #439 on Sep 6
- #444 on Sep 7
- #455 on Sep 8
- #452 on Sep 9
- #455 on Sep 10
- #451 on Sep 11
- #449 on Sep 12
- #448 on Sep 13
- #460 on Sep 14
- #456 on Sep 15
- #465 on Sep 16
- #456 on Sep 17
- #466 on Sep 18
- #450 on Sep 19
- #463 on Sep 20
- #462 on Sep 21
- #470 on Sep 22
- #464 on Sep 23
- #453 from Sep 24 to Sep 25
- #447 on Sep 26
- #460 on Sep 27
- #468 on Sep 28
- #469 on Sep 29
- #468 on Sep 30
- #464 on Oct 1
- #460 on Oct 2
- #448 on Oct 3
- #444 on Oct 4
- #455 on Oct 5
- #463 on Oct 6
- #470 on Oct 7
- #479 on Oct 8
- #483 on Oct 9
- #477 on Oct 10
- #479 on Oct 11
- #490 on Oct 12
- #486 on Oct 13
- #488 on Oct 14
- #492 on Oct 15
- #495 on Oct 16
- #484 on Oct 17
- #486 on Oct 18
- #502 on Oct 19
- #505 on Oct 20
- #507 on Oct 21
- #502 on Oct 22
- #495 on Oct 23
- #484 on Oct 24
- #525 on Oct 25
- #523 on Oct 28
- #522 on Oct 29
- #521 on Oct 30
- #518 on Oct 31
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 3, 2026
Changed on Oct 27, 2026
No longer found: Possible obfuscation, Access to secrets
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 58 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
- 2 broad permissionsin 2 files: SKILL.md:1 last30days/SKILL.md:1
- No dangerous shell commands
- 892 network referencesin 111 files: tests/test_platform_parsers_v4.py:16 scripts/lib/crawler_bridge.py:3 last30days/scripts/lib/crawler_bridge.py:3 and 108 more
- No hidden or obfuscated text
- No instruction overrides
- 113 executable scriptsin 113 files: hooks/scripts/check-config.sh:1 scripts/build_payload.py:1 scripts/last30days.py:1 and 110 more
- 304 references to secretsin 53 files: scripts/lib/env.py:9 last30days/scripts/lib/env.py:9 docs/usage.en.md:65 and 50 more
- No requests to vote in Hot
Show all 1,311 signals by file
.claude-plugin/marketplace.json
- Network accessline 1
{ "$schema": "https://anthropic.com/claude-code/marketplace.schema.json", - Network accessline 2
"$schema": "https://anthropic.com/claude-code/marketplace.schema.json", - Network accessline 5
"owner": { "name": "Jesseovo", "url": "https://github.com/Jesseovo" - Network accessline 6
"name": "Jesseovo", "url": "https://github.com/Jesseovo" }, - Network accessline 7
"url": "https://github.com/Jesseovo" - Network accessline 14
"author": { "name": "Jesse", "url": "https://github.com/Jesseovo" - Network accessline 15
"name": "Jesse", "url": "https://github.com/Jesseovo" }, - Network accessline 16
"url": "https://github.com/Jesseovo" - Network accessline 18
"source": "./", "category": "productivity", "homepage": "https://github.com/Jesseovo/last30days-skill-cn" - Network accessline 19
"category": "productivity", "homepage": "https://github.com/Jesseovo/last30days-skill-cn" } - Network accessline 20
"homepage": "https://github.com/Jesseovo/last30days-skill-cn"
.claude-plugin/plugin.json
.github/workflows/daily-hot.yml
- Network accessline 6
# 3. 可选变量: # HOT_SOURCES 热榜来源,默认 boards,news,global(全部国内热榜 + 科技资讯 + Hacker News) # HOT_FEEDS 自定义 RSS,格式 "名称|https://url,名称|https://url"(例如自建 RSSHub 的 36 氪快讯) - Network accessline 7
# HOT_SOURCES 热榜来源,默认 boards,news,global(全部国内热榜 + 科技资讯 + Hacker News) # HOT_FEEDS 自定义 RSS,格式 "名称|https://url,名称|https://url"(例如自建 RSSHub 的 36 氪快讯) # HOT_TITLE 页面标题,默认「全网热榜」 - Network accessline 8
# HOT_FEEDS 自定义 RSS,格式 "名称|https://url,名称|https://url"(例如自建 RSSHub 的 36 氪快讯)
.gitignore
- Access to secretsline 12
[Credential-related source omitted]
AGENTS.md
- Network accessline 18
- `lib/sources.py`: source registry (id, label, section, ID prefix, group, aliases). Every source starts here. - `lib/pipeline.py`: per-source adapters, normalizers and scorers, plus the parallel run with per-source deadlines and status. - Network accessline 19
- `lib/pipeline.py`: per-source adapters, normalizers and scorers, plus the parallel run with per-source deadlines and status. - `lib/http.py`: browser-grade headers (`browser_headers()`), gzip/charset decoding, cookie `Session`, `fetch() - Network accessline 20
- `lib/http.py`: browser-grade headers (`browser_headers()`), gzip/charset decoding, cookie `Session`, `fetch()`, retry policy, 412 fast-fail. - Access to secretsline 42
[Credential-related source omitted]
LICENSE
README.en.md
- Network accessline 13
<p align="center"> <a href="https://jesseovo.github.io/last30days-skill-cn/">Open the daily hot board ↗</a>  ·  <a href="#start">Hand it to your agent</a> - Network accessline 14
<a href="https://jesseovo.github.io/last30days-skill-cn/">Open the daily hot board ↗</a>  ·  <a href="#start">Hand it to your agent</a> - Network accessline 30
Install and configure https://github.com/Jesseovo/last30days-skill-cn, check which sources are available, and use it to show me today's cross-platform hot board. - Network accessline 41
**One page, a view of today.** The [daily hot board](https://jesseovo.github.io/last30days-skill-cn/) brings together Chinese hot lists, tech news and Hacker News. Search a keyword, spot shared topics, or read through one source. - Network accessline 47
[**Open the daily hot board ↗**](https://jesseovo.github.io/last30days-skill-cn/) · Automatically collected at **08:00 / 12:00 / 20:00 Beijing time**. - Network accessline 78
<p align="center"> <a href="https://github.com/Jesseovo/last30days-skill-cn/stargazers"><img src="https://img.shields.io/github/stars/Jesseovo/last30days-skill-cn?style=flat&label=Stars&labelColor=eee8dc&color=9a7651" alt="Git - Network accessline 79
<a href="https://github.com/Jesseovo/last30days-skill-cn/stargazers"><img src="https://img.shields.io/github/stars/Jesseovo/last30days-skill-cn?style=flat&label=Stars&labelColor=eee8dc&color=9a7651" alt="GitHub Stars" /></a>&ens - Network accessline 82
<p align="center"> <a href="https://star-history.com/#Jesseovo/last30days-skill-cn&Date"> - Network accessline 83
<a href="https://star-history.com/#Jesseovo/last30days-skill-cn&Date"> - Network accessline 84
<picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&type=Date&theme=dark" /> <img src="https://api.star-history.com/svg?repos=Jesseovo/last30 - Network accessline 85
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&type=Date&theme=dark" /> - Network accessline 86
<img src="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&type=Date" width="680" alt="GitHub Star history for last30days-cn. Click to explore the interactive chart." /> - Network accessline 99
Based on Matt Van Horn's [last30days-skill](https://github.com/mvanhorn/last30days-skill), with Chinese localization by [Jesse](https://github.com/Jesseovo). Thanks to [MediaCrawler](https://github.com/NanmiCoder/MediaCrawler) for the reusa - Network accessline 105
<p align="center"> <sub>Made with curiosity, by <a href="https://github.com/Jesseovo">Jesse</a>.</sub><br /> - Network accessline 106
<sub>Made with curiosity, by <a href="https://github.com/Jesseovo">Jesse</a>.</sub><br />
README.md
- Network accessline 20
<p align="center"> <a href="https://jesseovo.github.io/last30days-skill-cn/"><picture> - Network accessline 21
<a href="https://jesseovo.github.io/last30days-skill-cn/"><picture> - Network accessline 43
帮我安装并配置 last30days-cn(https://github.com/Jesseovo/last30days-skill-cn),检查可用数据源,然后查看今天的全网热榜。 - Network accessline 54
**一次打开,看见今天。** [全网热榜](https://jesseovo.github.io/last30days-skill-cn/)聚合国内热搜、科技资讯和 Hacker News。搜索感兴趣的词,发现跨平台的「同频热点」,或者慢慢读完一个平台。 - Network accessline 60
[**打开全网热榜 ↗**](https://jesseovo.github.io/last30days-skill-cn/) · 每天北京时间 **08:00 / 12:00 / 20:00** 自动采集更新。 - Network accessline 91
<p align="center"> <a href="https://github.com/Jesseovo/last30days-skill-cn/stargazers"><img src="https://img.shields.io/github/stars/Jesseovo/last30days-skill-cn?style=flat&label=Stars&labelColor=eee8dc&color=9a7651" alt="Git - Network accessline 92
<a href="https://github.com/Jesseovo/last30days-skill-cn/stargazers"><img src="https://img.shields.io/github/stars/Jesseovo/last30days-skill-cn?style=flat&label=Stars&labelColor=eee8dc&color=9a7651" alt="GitHub Stars" /></a>&ens - Network accessline 95
<p align="center"> <a href="https://star-history.com/#Jesseovo/last30days-skill-cn&Date"> - Network accessline 96
<a href="https://star-history.com/#Jesseovo/last30days-skill-cn&Date"> - Network accessline 97
<picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&type=Date&theme=dark" /> <img src="https://api.star-history.com/svg?repos=Jesseovo/last30 - Network accessline 98
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&type=Date&theme=dark" /> - Network accessline 99
<img src="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&type=Date" width="680" alt="last30days-cn 的 GitHub Star 增长趋势,点击查看交互图表" /> - Network accessline 112
基于 Matt Van Horn 的 [last30days-skill](https://github.com/mvanhorn/last30days-skill),由 [Jesse](https://github.com/Jesseovo) 做中文本土化。感谢 [MediaCrawler](https://github.com/NanmiCoder/MediaCrawler) 的登录态思路、[xiaohongshu-mcp](https://github.com/xpzo - Network accessline 118
<p align="center"> <sub>Made with curiosity, by <a href="https://github.com/Jesseovo">Jesse</a>.</sub><br /> - Network accessline 119
<sub>Made with curiosity, by <a href="https://github.com/Jesseovo">Jesse</a>.</sub><br />
SECURITY.md
- Network accessline 13
If GitHub offers **Report a vulnerability** on this repository's [Security page](https://github.com/Jesseovo/last30days-skill-cn/security), use it - Network accessline 14
[Security page](https://github.com/Jesseovo/last30days-skill-cn/security), use it - Network accessline 15
to send a private report. Private reporting is not currently enabled. Until it is available, open a [security contact request](https://github.com/Jesseovo/last30days-skill-cn/issues/new?title=Security%20contact%20request) containing only a - Network accessline 16
is available, open a [security contact request](https://github.com/Jesseovo/last30days-skill-cn/issues/new?title=Security%20contact%20request)
SKILL.md
- Broad permissionsline 1
Bash, Read, Write, WebSearch - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 135
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Access to secretsline 161
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted]
SPEC.md
- Network accessline 3
> Author: Jesse (https://github.com/Jesseovo) - Network accessline 71
| 模块 | 职责 | |---|---| | `http.py` | 完整浏览器 UA / client hints(`browser_headers`)、gzip/deflate + 字符集解码、`Session`(Cookie)、`fetch()`(返回最终 URL)、重试与 Retry-After、412 快速失败、调试日志脱敏 | - Network accessline 72
|---|---| | `http.py` | 完整浏览器 UA / client hints(`browser_headers`)、gzip/deflate + 字符集解码、`Session`(Cookie)、`fetch()`(返回最终 URL)、重试与 Retry-After、412 快速失败、调试日志脱敏 | | `websearch.py` | 多引擎公开搜索(cn.bing / DuckDuckGo / www.bing)、跳转链接解析、节流、引擎拦截记忆、URL - Network accessline 73
| `http.py` | 完整浏览器 UA / client hints(`browser_headers`)、gzip/deflate + 字符集解码、`Session`(Cookie)、`fetch()`(返回最终 URL)、重试与 Retry-After、412 快速失败、调试日志脱敏 | - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Access to secretsline 122
[Credential-related source omitted]
assets/readme-board-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="208" height="56" viewBox="0 0 208 56" role="img" aria-labelledby="title"><title id="title">打开全网热榜</title>
assets/readme-board-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="208" height="56" viewBox="0 0 208 56" role="img" aria-labelledby="title"><title id="title">打开全网热榜</title>
assets/readme-cover-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="224" viewBox="0 0 900 224" role="img" aria-labelledby="title desc">
assets/readme-cover-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="224" viewBox="0 0 900 224" role="img" aria-labelledby="title desc">
assets/readme-discovery-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="160" viewBox="0 0 720 160" role="img" aria-labelledby="title desc">
assets/readme-discovery-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="160" viewBox="0 0 720 160" role="img" aria-labelledby="title desc">
assets/readme-install-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="208" height="56" viewBox="0 0 208 56" role="img" aria-labelledby="title"><title id="title">交给 Agent</title>
assets/readme-install-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="208" height="56" viewBox="0 0 208 56" role="img" aria-labelledby="title"><title id="title">交给 Agent</title>
assets/readme-typing-dark.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="560" height="32" viewBox="0 0 560 32" role="img" aria-labelledby="title"><title id="title">Stay curious. Follow the clues.</title><style>text{font:12px Consolas,'Liberation Mono',monospace;fill
assets/readme-typing-light.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="560" height="32" viewBox="0 0 560 32" role="img" aria-labelledby="title"><title id="title">Stay curious. Follow the clues.</title><style>text{font:12px Consolas,'Liberation Mono',monospace;fill
docs/usage.en.md
- Network accessline 3
[Back to the project](../README.en.md) · [Open the hot board](https://jesseovo.github.io/last30days-skill-cn/) - Network accessline 13
git clone https://github.com/Jesseovo/last30days-skill-cn.git - Network accessline 44
Platforms phrase the same event differently, so items are merged by shared key terms and ranked by how many boards they appear on. The page has a keyword filter, dark mode and a phone layout. To add your own feeds, set `LAST30DAYS_HOT_FEEDS - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 102
[Credential-related source omitted] - Access to secretsline 104
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Access to secretsline 108
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 127
[Credential-related source omitted]
docs/usage.zh-CN.md
- Network accessline 3
[返回项目首页](../README.md) · [打开全网热榜](https://jesseovo.github.io/last30days-skill-cn/) - Network accessline 13
git clone https://github.com/Jesseovo/last30days-skill-cn.git - Network accessline 43
**BL1** (得分:95) 某UP主 (2026-09-28) [1,446播放, 140收藏, 116点赞] 2026 最新 Codex 完整教程 https://www.bilibili.com/video/BV... - Network accessline 45
https://www.bilibili.com/video/BV... - Network accessline 65
- 同一件事在不同平台的叫法往往不同(「中国男足获亚运铜牌」/「拿下点球大战!U23国足获亚运铜牌」),热榜会按关键词把它们合并成一条「跨平台热点」,按登上的平台数排序。 - 热榜网页带关键词筛选、深色模式和手机布局。 - 自定义资讯源:设置 `LAST30DAYS_HOT_FEEDS="名称|RSS地址,名称|RSS地址"`,例如自建 [RSSHub](https://docs.rsshub.app/) 的 36 氪快讯或 X 列表。 - Network accessline 67
- 自定义资讯源:设置 `LAST30DAYS_HOT_FEEDS="名称|RSS地址,名称|RSS地址"`,例如自建 [RSSHub](https://docs.rsshub.app/) 的 36 氪快讯或 X 列表。 - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 135
[Credential-related source omitted] - Access to secretsline 136
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 156
[Credential-related source omitted] - Access to secretsline 157
[Credential-related source omitted] - Access to secretsline 158
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted] - Network accessline 244
> 💡 爬虫违法违规的案例频发,请务必合法合规使用。参考:[中国爬虫相关法律案例汇总](https://github.com/HiddenStrawberry/Crawler_Illegal_Cases_In_China)
fixtures/bilibili_sample.json
- Network accessline 17
"pubdate": 1710892800, "duration": "15:30", "arcurl": "https://www.bilibili.com/video/BV1xx411c7XY" - Network accessline 18
"duration": "15:30", "arcurl": "https://www.bilibili.com/video/BV1xx411c7XY" }, - Network accessline 19
"arcurl": "https://www.bilibili.com/video/BV1xx411c7XY" - Network accessline 34
"pubdate": 1711324800, "duration": "20:45", "arcurl": "https://www.bilibili.com/video/BV1yy411c8ZW" - Network accessline 35
"duration": "20:45", "arcurl": "https://www.bilibili.com/video/BV1yy411c8ZW" } - Network accessline 36
"arcurl": "https://www.bilibili.com/video/BV1yy411c8ZW"
fixtures/zhihu_sample.json
- Network accessline 20
"created_time": 1711065600, "updated_time": 1711152000, "url": "https://www.zhihu.com/question/678901234/answer/3456789012" - Network accessline 21
"updated_time": 1711152000, "url": "https://www.zhihu.com/question/678901234/answer/3456789012" } - Network accessline 22
"url": "https://www.zhihu.com/question/678901234/answer/3456789012" - Network accessline 37
"comment_count": 95, "created": 1710979200, "url": "https://zhuanlan.zhihu.com/p/789012345" - Network accessline 38
"created": 1710979200, "url": "https://zhuanlan.zhihu.com/p/789012345" } - Network accessline 39
"url": "https://zhuanlan.zhihu.com/p/789012345"
gemini-extension.json
- Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Network accessline 54
{ "name": "Xiaohongshu MCP Base URL", "description": "Optional self-hosted xiaohongshu-mcp base URL, e.g. http://127.0.0.1:18060.", - Network accessline 55
"name": "Xiaohongshu MCP Base URL", "description": "Optional self-hosted xiaohongshu-mcp base URL, e.g. http://127.0.0.1:18060.", "envVar": "XIAOHONGSHU_API_BASE", - Network accessline 56
"description": "Optional self-hosted xiaohongshu-mcp base URL, e.g. http://127.0.0.1:18060.", - Access to secretsline 63
[Credential-related source omitted]
hooks/scripts/check-config.sh
- Executable scriptline 1
#!/bin/bash - Network accessline 2
# Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 4
[Credential-related source omitted] - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 13
[Credential-related source omitted] - Access to secretsline 15
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 78
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted]
release-notes.md
scripts/build_payload.py
- Executable scriptline 1
#!/usr/bin/env python3
scripts/last30days.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 5
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 84
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 318
[Credential-related source omitted] - Access to secretsline 320
[Credential-related source omitted] - Access to secretsline 322
[Credential-related source omitted]
scripts/lib/__init__.py
- Executable scriptline 1
Executable file
scripts/lib/baidu.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 22
QIANFAN_SEARCH_URL = "https://qianfan.baidubce.com/v2/ai_search/web_search" - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Network accessline 173
pass params = {"wd": topic, "rn": str(min(limit, 20)), "gpc": f"stf={ago_ts},{now_ts}|stftype=1"} url = f"https://www.baidu.com/s?{urllib.parse.urlencode(params)}" - Network accessline 174
params = {"wd": topic, "rn": str(min(limit, 20)), "gpc": f"stf={ago_ts},{now_ts}|stftype=1"} url = f"https://www.baidu.com/s?{urllib.parse.urlencode(params)}" html = _fetch(url, _build_headers("https://www.baidu.com/")) - Network accessline 175
url = f"https://www.baidu.com/s?{urllib.parse.urlencode(params)}" - Network accessline 176
html = _fetch(url, _build_headers("https://www.baidu.com/")) - Access to secretsline 184
[Credential-related source omitted] - Network accessline 212
mu_match = re.search(r'\bmu="([^"]+)"', attrs) real_url = html_lib.unescape(mu_match.group(1)) if mu_match else "" if real_url.startswith("http://nourl.") or not real_url.startswith("http"): - Network accessline 213
real_url = html_lib.unescape(mu_match.group(1)) if mu_match else "" if real_url.startswith("http://nourl.") or not real_url.startswith("http"): real_url = "" - Network accessline 214
if real_url.startswith("http://nourl.") or not real_url.startswith("http"): - Network accessline 295
HOT_BOARD_HTML = "https://top.baidu.com/board?tab=realtime" - Network accessline 296
HOT_BOARD_API = "https://top.baidu.com/api/board?platform=wise&tab=realtime" - Network accessline 304
entries: List[Dict[str, Any]] = [] try: body = http.get_text(HOT_BOARD_HTML, headers=http.browser_headers(referer="https://top.baidu.com/"), timeout=12) - Network accessline 305
try: body = http.get_text(HOT_BOARD_HTML, headers=http.browser_headers(referer="https://top.baidu.com/"), timeout=12) match = re.search(r"<!--s-data:([\s\S]*?)-->", body) - Network accessline 306
body = http.get_text(HOT_BOARD_HTML, headers=http.browser_headers(referer="https://top.baidu.com/"), timeout=12) - Network accessline 313
http.log(f"[百度] 热搜 PC 页解析失败: {exc}") if not entries: data = http.get(HOT_BOARD_API, headers=http.browser_headers(kind="mobile", referer="https://top.baidu.com/", accept="json"), timeout=10, retries=1) - Network accessline 314
if not entries: data = http.get(HOT_BOARD_API, headers=http.browser_headers(kind="mobile", referer="https://top.baidu.com/", accept="json"), timeout=10, retries=1) for card in ((data or {}).get("data") or {}).get("cards") or - Network accessline 315
data = http.get(HOT_BOARD_API, headers=http.browser_headers(kind="mobile", referer="https://top.baidu.com/", accept="json"), timeout=10, retries=1) - Network accessline 331
"rank": len(out) + 1, "title": word, "url": entry.get("rawUrl") or entry.get("url") or f"https://www.baidu.com/s?wd={urllib.parse.quote(word)}", - Network accessline 332
"title": word, "url": entry.get("rawUrl") or entry.get("url") or f"https://www.baidu.com/s?wd={urllib.parse.quote(word)}", "hot_value": hot_value, - Network accessline 333
"url": entry.get("rawUrl") or entry.get("url") or f"https://www.baidu.com/s?wd={urllib.parse.quote(word)}",
scripts/lib/bilibili.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 26
SEARCH_REFERER = "https://search.bilibili.com/" - Network accessline 27
WBI_SEARCH_URL = "https://api.bilibili.com/x/web-interface/wbi/search/type" - Network accessline 28
LEGACY_SEARCH_URL = "https://api.bilibili.com/x/web-interface/search/type" - Network accessline 29
SPI_URL = "https://api.bilibili.com/x/frontend/finger/spi" - Network accessline 30
NAV_URL = "https://api.bilibili.com/x/web-interface/nav" - Network accessline 31
HOTWORD_URL = "https://s.search.bilibili.com/main/hotword" - Network accessline 305
return { "title": v.get("title", ""), "url": f"https://www.bilibili.com/video/{bvid}" if bvid else v.get("arcurl", ""), - Network accessline 306
"title": v.get("title", ""), "url": f"https://www.bilibili.com/video/{bvid}" if bvid else v.get("arcurl", ""), "bvid": bvid, - Network accessline 307
"url": f"https://www.bilibili.com/video/{bvid}" if bvid else v.get("arcurl", ""), - Network accessline 342
"rank": entry.get("pos") or idx, "title": title, "url": f"https://search.bilibili.com/all?keyword={urllib.parse.quote(word or title)}", - Network accessline 343
"title": title, "url": f"https://search.bilibili.com/all?keyword={urllib.parse.quote(word or title)}", "hot_value": entry.get("heat_score") or entry.get("score") or None, - Network accessline 344
"url": f"https://search.bilibili.com/all?keyword={urllib.parse.quote(word or title)}",
scripts/lib/cache.py
scripts/lib/cjk.py
- Executable scriptline 1
Executable file
scripts/lib/cluster.py
scripts/lib/crawler_bridge.py
- Executable scriptline 1
Executable file - Network accessline 3
灵感来源: https://github.com/NanmiCoder/MediaCrawler - Network accessline 23
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Network accessline 76
"xiaohongshu": { "label": "小红书", "url": "https://www.xiaohongshu.com/explore", - Network accessline 77
"label": "小红书", "url": "https://www.xiaohongshu.com/explore", "domain": ".xiaohongshu.com", - Network accessline 78
"url": "https://www.xiaohongshu.com/explore", - Network accessline 83
"weibo": { "label": "微博", "url": "https://passport.weibo.com/sso/signin?entry=wapsso&source=wapssowb&url=https%3A%2F%2Fm.weibo.cn%2F", - Network accessline 84
"label": "微博", "url": "https://passport.weibo.com/sso/signin?entry=wapsso&source=wapssowb&url=https%3A%2F%2Fm.weibo.cn%2F", "domain": ".weibo.cn", - Network accessline 85
"url": "https://passport.weibo.com/sso/signin?entry=wapsso&source=wapssowb&url=https%3A%2F%2Fm.weibo.cn%2F", - Network accessline 91
"zhihu": { "label": "知乎", "url": "https://www.zhihu.com/signin", - Network accessline 92
"label": "知乎", "url": "https://www.zhihu.com/signin", "domain": ".zhihu.com", - Network accessline 93
"url": "https://www.zhihu.com/signin", - Network accessline 97
"douyin": { "label": "抖音", "url": "https://www.douyin.com/", - Network accessline 98
"label": "抖音", "url": "https://www.douyin.com/", "domain": ".douyin.com", - Network accessline 99
"url": "https://www.douyin.com/", - Network accessline 103
"bilibili": { "label": "B站", "url": "https://passport.bilibili.com/login", - Network accessline 104
"label": "B站", "url": "https://passport.bilibili.com/login", "domain": ".bilibili.com", - Network accessline 105
"url": "https://passport.bilibili.com/login", - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 174
[Credential-related source omitted] - Access to secretsline 184
[Credential-related source omitted] - Access to secretsline 185
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 205
[Credential-related source omitted] - Access to secretsline 348
[Credential-related source omitted] - Network accessline 510
try: info = page.evaluate( "async () => { try { const r = await fetch('https://m.weibo.cn/api/config', {credentials: 'include'});" - Network accessline 511
info = page.evaluate( "async () => { try { const r = await fetch('https://m.weibo.cn/api/config', {credentials: 'include'});" " const j = await r.json(); return !!(j && j.data && j.data.login); } catch (e) { - Network accessline 512
"async () => { try { const r = await fetch('https://m.weibo.cn/api/config', {credentials: 'include'});" - Network accessline 588
try: with _launch_browser_context("weibo", mobile=True) as (browser, context, page): page.goto("https://m.weibo.cn/", wait_until="domcontentloaded", timeout=20000) - Network accessline 589
with _launch_browser_context("weibo", mobile=True) as (browser, context, page): page.goto("https://m.weibo.cn/", wait_until="domcontentloaded", timeout=20000) page.wait_for_timeout(1200) - Network accessline 590
page.goto("https://m.weibo.cn/", wait_until="domcontentloaded", timeout=20000) - Network accessline 591
page.wait_for_timeout(1200) logged_in = page.evaluate( "async () => { try { const r = await fetch('/api/config'); const j = await r.json();" - Network accessline 592
logged_in = page.evaluate( "async () => { try { const r = await fetch('/api/config'); const j = await r.json();" " return !!(j && j.data && j.data.login); } catch (e) { return false; } }" - Network accessline 593
"async () => { try { const r = await fetch('/api/config'); const j = await r.json();" - Network accessline 604
url = "/api/container/getIndex?" + urllib.parse.urlencode(params) response = page.evaluate( "async (url) => { const r = await fetch(url, {headers: {'X-Requested-With': 'XMLHttpRequest'}});" - Network accessline 605
response = page.evaluate( "async (url) => { const r = await fetch(url, {headers: {'X-Requested-With': 'XMLHttpRequest'}});" " return await r.json(); }", - Network accessline 606
"async (url) => { const r = await fetch(url, {headers: {'X-Requested-With': 'XMLHttpRequest'}});" - Network accessline 629
return { "text": text, "url": f"https://weibo.com/{user.get('id', '')}/{mid}", - Network accessline 630
"text": text, "url": f"https://weibo.com/{user.get('id', '')}/{mid}", "author_handle": user.get("screen_name", ""), - Network accessline 631
"url": f"https://weibo.com/{user.get('id', '')}/{mid}", - Network accessline 691
search_url = ( "https://www.xiaohongshu.com/search_result?" f"keyword={urllib.parse.quote(topic, safe='')}&source=web_search_result_notes" - Network accessline 692
"https://www.xiaohongshu.com/search_result?" f"keyword={urllib.parse.quote(topic, safe='')}&source=web_search_result_notes" ) - Network accessline 763
link = link_el.get_attribute("href") if link_el else "" if link and not link.startswith("http"): link = f"https://www.xiaohongshu.com{link}" - Network accessline 764
if link and not link.startswith("http"): link = f"https://www.xiaohongshu.com{link}" match = re.search(r"/(?:explore|search_result)/([0-9a-f]{24})", link or "") - Network accessline 765
link = f"https://www.xiaohongshu.com{link}" - Network accessline 766
match = re.search(r"/(?:explore|search_result)/([0-9a-f]{24})", link or "") if match and "xsec_token" not in link: link = f"https://www.xiaohongshu.com/explore/{match.group(1)}" - Network accessline 767
if match and "xsec_token" not in link: link = f"https://www.xiaohongshu.com/explore/{match.group(1)}" title_el = elem.query_selector("a.title span, span[class*='title'], div[class*='title']") - Network accessline 768
link = f"https://www.xiaohongshu.com/explore/{match.group(1)}" - Network accessline 926
page.on("response", _on_response) search_url = f"https://www.douyin.com/search/{urllib.parse.quote(topic)}?type=video" - Network accessline 927
search_url = f"https://www.douyin.com/search/{urllib.parse.quote(topic)}?type=video" - Network accessline 992
page.on("response", _on_response) search_url = f"https://search.bilibili.com/video?keyword={urllib.parse.quote(topic)}&order=totalrank" - Network accessline 993
search_url = f"https://search.bilibili.com/video?keyword={urllib.parse.quote(topic)}&order=totalrank" - Network accessline 1012
href = "https:" + href elif href.startswith("/"): href = "https://www.bilibili.com" + href - Network accessline 1013
elif href.startswith("/"): href = "https://www.bilibili.com" + href author_el = elem.query_selector("span.bili-video-card__info--author, span[class*='name']") - Network accessline 1014
href = "https://www.bilibili.com" + href - Network accessline 1059
page.on("response", _on_response) search_url = f"https://www.zhihu.com/search?type=content&q={urllib.parse.quote(topic)}" - Network accessline 1060
search_url = f"https://www.zhihu.com/search?type=content&q={urllib.parse.quote(topic)}" - Network accessline 1111
link = "https:" + link elif link and link.startswith("/"): link = f"https://www.zhihu.com{link}" - Network accessline 1112
elif link and link.startswith("/"): link = f"https://www.zhihu.com{link}" excerpt_el = elem.query_selector("span[class*='RichText'], div[class*='RichText']") - Network accessline 1113
link = f"https://www.zhihu.com{link}"
scripts/lib/dates.py
scripts/lib/dedupe.py
scripts/lib/doctor.py
- Executable scriptline 1
Executable file - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 136
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 152
[Credential-related source omitted] - Access to secretsline 153
[Credential-related source omitted]
scripts/lib/douyin.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 23
HOT_LIST_URL = ( "https://www.douyin.com/aweme/v1/web/hot/search/list/" - Network accessline 24
"https://www.douyin.com/aweme/v1/web/hot/search/list/" - Access to secretsline 29
[Credential-related source omitted] - Network accessline 110
try: encoded = urllib.parse.quote(topic) url = f"https://api.tikhub.io/api/v1/douyin/web/fetch_general_search?keyword={encoded}&count={limit}&sort_type=0" - Network accessline 111
encoded = urllib.parse.quote(topic) url = f"https://api.tikhub.io/api/v1/douyin/web/fetch_general_search?keyword={encoded}&count={limit}&sort_type=0" data = http.get( - Network accessline 112
url = f"https://api.tikhub.io/api/v1/douyin/web/fetch_general_search?keyword={encoded}&count={limit}&sort_type=0" - Network accessline 130
data = http.get( HOT_LIST_URL, headers=http.browser_headers(referer="https://www.douyin.com/", accept="json"), - Network accessline 131
HOT_LIST_URL, headers=http.browser_headers(referer="https://www.douyin.com/", accept="json"), timeout=10, - Network accessline 132
headers=http.browser_headers(referer="https://www.douyin.com/", accept="json"), - Network accessline 141
sentence_id = entry.get("sentence_id") url = ( f"https://www.douyin.com/hot/{sentence_id}" - Network accessline 142
url = ( f"https://www.douyin.com/hot/{sentence_id}" if sentence_id - Network accessline 143
f"https://www.douyin.com/hot/{sentence_id}" if sentence_id else f"https://www.douyin.com/search/{urllib.parse.quote(word)}" - Network accessline 144
if sentence_id else f"https://www.douyin.com/search/{urllib.parse.quote(word)}" ) - Network accessline 145
else f"https://www.douyin.com/search/{urllib.parse.quote(word)}" - Network accessline 225
return { "text": desc, "url": f"https://www.douyin.com/video/{aweme_id}" if aweme_id else "", - Network accessline 226
"text": desc, "url": f"https://www.douyin.com/video/{aweme_id}" if aweme_id else "", "author_name": author.get("nickname", ""), - Network accessline 227
"url": f"https://www.douyin.com/video/{aweme_id}" if aweme_id else "",
scripts/lib/env.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Network accessline 82
DEFAULT_XHS_MCP_CANDIDATES = ("http://127.0.0.1:18060",) - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 145
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Network accessline 198
for base in DEFAULT_XHS_MCP_CANDIDATES: try: with urllib.request.urlopen(f"{base}/health", timeout=timeout) as resp: - Network accessline 199
try: with urllib.request.urlopen(f"{base}/health", timeout=timeout) as resp: payload = json.loads(resp.read().decode("utf-8", "replace") or "{}") - Network accessline 200
with urllib.request.urlopen(f"{base}/health", timeout=timeout) as resp: - Access to secretsline 212
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted] - Access to secretsline 258
[Credential-related source omitted] - Access to secretsline 268
[Credential-related source omitted] - Access to secretsline 272
[Credential-related source omitted] - Access to secretsline 273
[Credential-related source omitted] - Access to secretsline 317
[Credential-related source omitted] - Network accessline 319
def run(): headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Network accessline 320
headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Access to secretsline 395
[Credential-related source omitted] - Access to secretsline 399
[Credential-related source omitted] - Access to secretsline 400
[Credential-related source omitted] - Access to secretsline 401
[Credential-related source omitted] - Access to secretsline 402
[Credential-related source omitted] - Access to secretsline 403
[Credential-related source omitted] - Access to secretsline 404
[Credential-related source omitted]
scripts/lib/github.py
scripts/lib/hackernews.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 15
SEARCH_URL = "https://hn.algolia.com/api/v1/search" - Network accessline 16
FRONT_PAGE_URL = "https://hn.algolia.com/api/v1/search?tags=front_page&hitsPerPage={limit}" - Network accessline 61
"platform": "hackernews", "title": title, "url": f"https://news.ycombinator.com/item?id={object_id}", - Network accessline 62
"title": title, "url": f"https://news.ycombinator.com/item?id={object_id}", "text": text, - Network accessline 63
"url": f"https://news.ycombinator.com/item?id={object_id}",
scripts/lib/hot_board.js
- Executable scriptline 1
Executable file
scripts/lib/hot_board.py
- Executable scriptline 1
Executable file - Network accessline 218
<div class="wrap"> <header class="nav"> <a class="brand" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{brand}<span>last30days<span style="opacity:.45"> / </span>热榜</span></a> - Network accessline 219
<header class="nav"> <a class="brand" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{brand}<span>last30days<span style="opacity:.45"> / </span>热榜</span></a> <span class="brand-note">A LITTLE CURIOSITY, EVERY DAY.</sp - Network accessline 220
<a class="brand" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{brand}<span>last30days<span style="opacity:.45"> / </span>热榜</span></a> - Network accessline 221
<span class="brand-note">A LITTLE CURIOSITY, EVERY DAY.</span> <div class="nav-actions"><a class="nav-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}GitHub</a> <button class="icon-button js-only" id="t - Network accessline 222
<div class="nav-actions"><a class="nav-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}GitHub</a> - Network accessline 262
</dialog> <footer class="footer"><div><p>榜单为定时采集快照,排名与热度以来源页面为准。</p> <p>由 <a href="https://github.com/Jesseovo/last30days-skill-cn" {external}>last30days-cn</a> 生成 · 数据来自各平台公开内容</p></div> - Network accessline 263
<footer class="footer"><div><p>榜单为定时采集快照,排名与热度以来源页面为准。</p> <p>由 <a href="https://github.com/Jesseovo/last30days-skill-cn" {external}>last30days-cn</a> 生成 · 数据来自各平台公开内容</p></div> <div class="footer-sign">Made with curiosity <span>✦</span - Network accessline 264
<p>由 <a href="https://github.com/Jesseovo/last30days-skill-cn" {external}>last30days-cn</a> 生成 · 数据来自各平台公开内容</p></div> - Network accessline 265
<div class="footer-sign">Made with curiosity <span>✦</span><br><a href="https://github.com/Jesseovo" {external}>a little corner by Jesse</a></div></footer> - Network accessline 268
<div class="star-badge" aria-hidden="true">{star}</div> <div class="star-copy"><h2 id="star-title">觉得好用?点颗 Star 吧</h2><p>让更多人发现这个小小热榜。</p> <a class="star-link" id="star-link" href="https://github.com/Jesseovo/last30days-skill-cn" {ext - Network accessline 269
<div class="star-copy"><h2 id="star-title">觉得好用?点颗 Star 吧</h2><p>让更多人发现这个小小热榜。</p> <a class="star-link" id="star-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}<span>去 GitHub Star</span>{external_icon}</ - Network accessline 270
<a class="star-link" id="star-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}<span>去 GitHub Star</span>{external_icon}</a></div>
scripts/lib/http.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 47
USER_AGENT = f"last30days-cn/{VERSION} (Research Skill; +https://github.com/Jesseovo/last30days-skill-cn)" - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Network accessline 249
def _open(req: urllib.request.Request, timeout: int, opener=None): - Network accessline 250
if opener is not None: return opener.open(req, timeout=timeout) return urllib.request.urlopen(req, timeout=timeout) - Network accessline 252
return urllib.request.urlopen(req, timeout=timeout) - Network accessline 255
def _send( req: urllib.request.Request, - Network accessline 256
req: urllib.request.Request, - Network accessline 363
req = urllib.request.Request(url, data=body_bytes, headers=headers, method=method) - Network accessline 395
def fetch( - Network accessline 408
merged = dict(headers or {}) merged.setdefault("User-Agent", USER_AGENT) req = urllib.request.Request(url, headers=merged, method="GET") - Network accessline 409
merged.setdefault("User-Agent", USER_AGENT) req = urllib.request.Request(url, headers=merged, method="GET") return _send(req, timeout=timeout, retries=retries, backoff=RETRY_BACKOFF, opener=opener) - Network accessline 410
req = urllib.request.Request(url, headers=merged, method="GET") - Access to secretsline 436
[Credential-related source omitted]
scripts/lib/normalize.py
scripts/lib/pipeline.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted]
scripts/lib/query.py
scripts/lib/query_type.py
scripts/lib/reddit.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 15
HOSTS = ("https://www.reddit.com", "https://old.reddit.com") - Network accessline 83
"platform": "reddit", "title": title, "url": f"https://www.reddit.com{permalink}", - Network accessline 84
"title": title, "url": f"https://www.reddit.com{permalink}", "text": (post.get("selftext") or "")[:300], - Network accessline 85
"url": f"https://www.reddit.com{permalink}",
scripts/lib/relevance.py
scripts/lib/render.py
scripts/lib/schema.py
scripts/lib/score.py
scripts/lib/setup_wizard.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 17
# last30days-cn 配置文件(所有项均为可选) # 文档: https://github.com/Jesseovo/last30days-skill-cn - Network accessline 18
# 文档: https://github.com/Jesseovo/last30days-skill-cn - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 32
# XIAOHONGSHU_API_BASE= # 自部署 xiaohongshu-mcp,例如 http://127.0.0.1:18060 - Network accessline 39
# INCLUDE_SOURCES=global # 默认附带 Hacker News/GitHub/Reddit # EXCLUDE_SOURCES=douyin # 默认排除某些平台 # LAST30DAYS_HOT_FEEDS=36氪快讯|https://your-rsshub/36kr/newsflashes - Network accessline 41
# LAST30DAYS_HOT_FEEDS=36氪快讯|https://your-rsshub/36kr/newsflashes - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted]
scripts/lib/sources.py
scripts/lib/toutiao.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 23
SO_SEARCH_URL = "https://so.toutiao.com/search" - Network accessline 24
HOT_BOARD_URL = "https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc" - Network accessline 120
params["page_num"] = str(page) url = f"{SO_SEARCH_URL}?{urllib.parse.urlencode(params)}" headers = http.browser_headers(referer="https://so.toutiao.com/") - Network accessline 122
headers = http.browser_headers(referer="https://so.toutiao.com/") - Network accessline 125
for attempt in range(3): _status, final_url, body = http.fetch(url, headers=headers, timeout=15) - Network accessline 126
_status, final_url, body = http.fetch(url, headers=headers, timeout=15) - Network accessline 186
toutiao_url = info.get("url") if isinstance(info, dict) else "" if not toutiao_url and group_id.isdigit(): toutiao_url = f"https://www.toutiao.com/group/{group_id}/" - Network accessline 187
if not toutiao_url and group_id.isdigit(): toutiao_url = f"https://www.toutiao.com/group/{group_id}/" article_url = data.get("article_url") or data.get("display_url") or "" - Network accessline 188
toutiao_url = f"https://www.toutiao.com/group/{group_id}/" - Network accessline 213
data = http.get( HOT_BOARD_URL, headers=http.browser_headers(referer="https://www.toutiao.com/", accept="json"), - Network accessline 214
HOT_BOARD_URL, headers=http.browser_headers(referer="https://www.toutiao.com/", accept="json"), timeout=10, - Network accessline 215
headers=http.browser_headers(referer="https://www.toutiao.com/", accept="json"),
scripts/lib/trending.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 11
自定义 RSS(例如自建 RSSHub 的 36 氪快讯、X/Twitter 列表): ``LAST30DAYS_HOT_FEEDS="36氪快讯|https://your-rsshub/36kr/newsflashes,..."`` - Network accessline 12
``LAST30DAYS_HOT_FEEDS="36氪快讯|https://your-rsshub/36kr/newsflashes,..."`` - Network accessline 38
]) FEEDS: "OrderedDict[str, Tuple[str, str]]" = OrderedDict([ ("ithome", ("IT之家", "https://www.ithome.com/rss/")), - Network accessline 39
FEEDS: "OrderedDict[str, Tuple[str, str]]" = OrderedDict([ ("ithome", ("IT之家", "https://www.ithome.com/rss/")), ("huxiu", ("虎嗅", "https://rss.huxiu.com/")), - Network accessline 40
("ithome", ("IT之家", "https://www.ithome.com/rss/")), - Network accessline 41
("huxiu", ("虎嗅", "https://rss.huxiu.com/")), - Network accessline 42
("sspai", ("少数派", "https://sspai.com/feed")), - Network accessline 43
("ifanr", ("爱范儿", "https://www.ifanr.com/feed")), - Network accessline 44
("solidot", ("Solidot", "https://www.solidot.org/index.rss")), - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted]
scripts/lib/upstream_bridge.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 209
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted]
scripts/lib/version.py
- Executable scriptline 1
Executable file
scripts/lib/websearch.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 70
[Credential-related source omitted] - Network accessline 195
else: params["setlang"] = "zh-Hans" url = f"https://{host}/search?{urllib.parse.urlencode(params)}" - Network accessline 196
params["setlang"] = "zh-Hans" url = f"https://{host}/search?{urllib.parse.urlencode(params)}" headers = http.browser_headers(referer=f"https://{host}/") - Network accessline 197
url = f"https://{host}/search?{urllib.parse.urlencode(params)}" - Network accessline 198
headers = http.browser_headers(referer=f"https://{host}/") _status, final_url, body = http.fetch(url, headers=headers, timeout=timeout) if _is_bing_homepage(final_url, body): - Network accessline 199
_status, final_url, body = http.fetch(url, headers=headers, timeout=timeout) - Network accessline 207
def _search_ddg(query: str, *, timeout: int) -> List[SearchResult]: url = f"https://html.duckduckgo.com/html/?{urllib.parse.urlencode({'q': query, 'kl': 'cn-zh'})}" - Network accessline 208
url = f"https://html.duckduckgo.com/html/?{urllib.parse.urlencode({'q': query, 'kl': 'cn-zh'})}" - Network accessline 209
headers = http.browser_headers(referer="https://html.duckduckgo.com/")
scripts/lib/wechat.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 21
SOGOU_BASE = "https://weixin.sogou.com" - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Network accessline 110
try: encoded = urllib.parse.quote(topic) url = f"https://api.jisuapi.com/weixin/search?keyword={encoded}&pagenum=1&pagesize={limit}&appkey={api_key}" - Network accessline 111
encoded = urllib.parse.quote(topic) url = f"https://api.jisuapi.com/weixin/search?keyword={encoded}&pagenum=1&pagesize={limit}&appkey={api_key}" data = http.get(url, headers=http.browser_headers(accept="json"), timeout=15, r - Network accessline 112
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Network accessline 135
params["page"] = str(page) url = f"{SOGOU_BASE}/weixin?{urllib.parse.urlencode(params)}" _status, final_url, body = http.fetch( - Network accessline 136
url = f"{SOGOU_BASE}/weixin?{urllib.parse.urlencode(params)}" _status, final_url, body = http.fetch( url, headers=http.browser_headers(referer=f"{SOGOU_BASE}/"), timeout=15 - Network accessline 137
_status, final_url, body = http.fetch( - Access to secretsline 141
[Credential-related source omitted]
scripts/lib/weibo.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 8
[Credential-related source omitted] - Network accessline 26
MOBILE_SEARCH_URL = "https://m.weibo.cn/api/container/getIndex" - Network accessline 27
HOT_SEARCH_URL = "https://weibo.com/ajax/side/hotSearch" - Network accessline 28
VISITOR_URL = "https://passport.weibo.com/visitor/genvisitor2" - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Network accessline 137
encoded = urllib.parse.quote(topic) url = ( f"https://api.weibo.com/2/search/statuses.json" - Network accessline 138
[Credential-related source omitted] - Network accessline 139
f"https://api.weibo.com/2/search/statuses.json" - Access to secretsline 140
[Credential-related source omitted] - Network accessline 151
def _mobile_session(cookie: Optional[str]) -> http.Session: session = http.Session(http.browser_headers(kind="mobile", referer="https://m.weibo.cn/", accept="json")) - Network accessline 152
session = http.Session(http.browser_headers(kind="mobile", referer="https://m.weibo.cn/", accept="json")) - Network accessline 166
VISITOR_URL, {"cb": "visitor_gray_callback", "tid": "", "from": "weibo"}, headers={"Referer": "https://passport.weibo.com/visitor/visitor"}, - Network accessline 167
{"cb": "visitor_gray_callback", "tid": "", "from": "weibo"}, headers={"Referer": "https://passport.weibo.com/visitor/visitor"}, timeout=8, - Network accessline 168
headers={"Referer": "https://passport.weibo.com/visitor/visitor"}, - Network accessline 216
data = http.get( HOT_SEARCH_URL, headers=http.browser_headers(referer="https://weibo.com/", accept="json"), - Network accessline 217
HOT_SEARCH_URL, headers=http.browser_headers(referer="https://weibo.com/", accept="json"), timeout=10, - Network accessline 218
headers=http.browser_headers(referer="https://weibo.com/", accept="json"), - Network accessline 231
"rank": entry.get("realpos") or (entry.get("rank", len(out)) + 1), "title": word, "url": f"https://s.weibo.com/weibo?q={urllib.parse.quote(query)}", - Network accessline 232
"title": word, "url": f"https://s.weibo.com/weibo?q={urllib.parse.quote(query)}", "hot_value": entry.get("num"), - Network accessline 233
"url": f"https://s.weibo.com/weibo?q={urllib.parse.quote(query)}", - Network accessline 292
return { "text": text, "url": f"https://weibo.com/{user.get('id', '')}/{s.get('mid', '')}", - Network accessline 293
"text": text, "url": f"https://weibo.com/{user.get('id', '')}/{s.get('mid', '')}", "author_handle": user.get("screen_name", ""), - Network accessline 294
"url": f"https://weibo.com/{user.get('id', '')}/{s.get('mid', '')}", - Network accessline 313
return { "text": text, "url": f"https://weibo.com/{user.get('id', '')}/{bid}", - Network accessline 314
"text": text, "url": f"https://weibo.com/{user.get('id', '')}/{bid}", "author_handle": user.get("screen_name", ""), - Network accessline 315
"url": f"https://weibo.com/{user.get('id', '')}/{bid}",
scripts/lib/xiaohongshu.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 63
[Credential-related source omitted] - Network accessline 124
if not note_id: return "" base = f"https://www.xiaohongshu.com/explore/{note_id}" - Network accessline 125
[Credential-related source omitted] - Network accessline 126
[Credential-related source omitted]
scripts/lib/zhihu.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 21
SEARCH_URL = "https://www.zhihu.com/api/v4/search_v3" - Network accessline 22
HOT_LIST_URLS = ( "https://api.zhihu.com/topstory/hot-lists/total?limit=50", "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50", - Network accessline 23
"https://api.zhihu.com/topstory/hot-lists/total?limit=50", - Network accessline 24
"https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50", - Network accessline 111
try: params = {"t": "general", "q": topic, "offset": 0, "limit": min(limit, 20)} headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Network accessline 112
params = {"t": "general", "q": topic, "offset": 0, "limit": min(limit, 20)} headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") if cookie: - Network accessline 113
headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Network accessline 143
for url in HOT_LIST_URLS: try: data = http.get(url, headers=http.browser_headers(referer="https://www.zhihu.com/hot", accept="json"), timeout=8, retries=1) - Network accessline 144
try: data = http.get(url, headers=http.browser_headers(referer="https://www.zhihu.com/hot", accept="json"), timeout=8, retries=1) except Exception as exc: - Network accessline 145
data = http.get(url, headers=http.browser_headers(referer="https://www.zhihu.com/hot", accept="json"), timeout=8, retries=1) - Network accessline 159
"rank": idx, "title": title, "url": f"https://www.zhihu.com/question/{qid}" if qid else "", - Network accessline 160
"title": title, "url": f"https://www.zhihu.com/question/{qid}" if qid else "", "hot_value": heat, - Network accessline 161
"url": f"https://www.zhihu.com/question/{qid}" if qid else "", - Network accessline 262
qid = question.get("id", "") aid = obj.get("id", "") url = f"https://www.zhihu.com/question/{qid}/answer/{aid}" if qid else "" - Network accessline 263
aid = obj.get("id", "") url = f"https://www.zhihu.com/question/{qid}/answer/{aid}" if qid else "" elif obj_type == "article": - Network accessline 264
url = f"https://www.zhihu.com/question/{qid}/answer/{aid}" if qid else "" - Network accessline 265
elif obj_type == "article": url = f"https://zhuanlan.zhihu.com/p/{obj.get('id', '')}" elif obj_type == "question": - Network accessline 266
url = f"https://zhuanlan.zhihu.com/p/{obj.get('id', '')}" - Network accessline 267
elif obj_type == "question": url = f"https://www.zhihu.com/question/{obj.get('id', '')}" else: - Network accessline 268
url = f"https://www.zhihu.com/question/{obj.get('id', '')}"
scripts/sync.sh
skills/last30days/SKILL.md
- Broad permissionsline 1
Bash, Read, Write, WebSearch - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 19
[Credential-related source omitted] - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 21
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 135
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Access to secretsline 161
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted]
skills/last30days/scripts/build_payload.py
- Executable scriptline 1
#!/usr/bin/env python3
skills/last30days/scripts/last30days.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 5
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 84
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Access to secretsline 129
[Credential-related source omitted] - Access to secretsline 318
[Credential-related source omitted] - Access to secretsline 320
[Credential-related source omitted] - Access to secretsline 322
[Credential-related source omitted]
skills/last30days/scripts/lib/__init__.py
- Executable scriptline 1
Executable file
skills/last30days/scripts/lib/baidu.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 22
QIANFAN_SEARCH_URL = "https://qianfan.baidubce.com/v2/ai_search/web_search" - Access to secretsline 38
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Network accessline 173
pass params = {"wd": topic, "rn": str(min(limit, 20)), "gpc": f"stf={ago_ts},{now_ts}|stftype=1"} url = f"https://www.baidu.com/s?{urllib.parse.urlencode(params)}" - Network accessline 174
params = {"wd": topic, "rn": str(min(limit, 20)), "gpc": f"stf={ago_ts},{now_ts}|stftype=1"} url = f"https://www.baidu.com/s?{urllib.parse.urlencode(params)}" html = _fetch(url, _build_headers("https://www.baidu.com/")) - Network accessline 175
url = f"https://www.baidu.com/s?{urllib.parse.urlencode(params)}" - Network accessline 176
html = _fetch(url, _build_headers("https://www.baidu.com/")) - Access to secretsline 184
[Credential-related source omitted] - Network accessline 212
mu_match = re.search(r'\bmu="([^"]+)"', attrs) real_url = html_lib.unescape(mu_match.group(1)) if mu_match else "" if real_url.startswith("http://nourl.") or not real_url.startswith("http"): - Network accessline 213
real_url = html_lib.unescape(mu_match.group(1)) if mu_match else "" if real_url.startswith("http://nourl.") or not real_url.startswith("http"): real_url = "" - Network accessline 214
if real_url.startswith("http://nourl.") or not real_url.startswith("http"): - Network accessline 295
HOT_BOARD_HTML = "https://top.baidu.com/board?tab=realtime" - Network accessline 296
HOT_BOARD_API = "https://top.baidu.com/api/board?platform=wise&tab=realtime" - Network accessline 304
entries: List[Dict[str, Any]] = [] try: body = http.get_text(HOT_BOARD_HTML, headers=http.browser_headers(referer="https://top.baidu.com/"), timeout=12) - Network accessline 305
try: body = http.get_text(HOT_BOARD_HTML, headers=http.browser_headers(referer="https://top.baidu.com/"), timeout=12) match = re.search(r"<!--s-data:([\s\S]*?)-->", body) - Network accessline 306
body = http.get_text(HOT_BOARD_HTML, headers=http.browser_headers(referer="https://top.baidu.com/"), timeout=12) - Network accessline 313
http.log(f"[百度] 热搜 PC 页解析失败: {exc}") if not entries: data = http.get(HOT_BOARD_API, headers=http.browser_headers(kind="mobile", referer="https://top.baidu.com/", accept="json"), timeout=10, retries=1) - Network accessline 314
if not entries: data = http.get(HOT_BOARD_API, headers=http.browser_headers(kind="mobile", referer="https://top.baidu.com/", accept="json"), timeout=10, retries=1) for card in ((data or {}).get("data") or {}).get("cards") or - Network accessline 315
data = http.get(HOT_BOARD_API, headers=http.browser_headers(kind="mobile", referer="https://top.baidu.com/", accept="json"), timeout=10, retries=1) - Network accessline 331
"rank": len(out) + 1, "title": word, "url": entry.get("rawUrl") or entry.get("url") or f"https://www.baidu.com/s?wd={urllib.parse.quote(word)}", - Network accessline 332
"title": word, "url": entry.get("rawUrl") or entry.get("url") or f"https://www.baidu.com/s?wd={urllib.parse.quote(word)}", "hot_value": hot_value, - Network accessline 333
"url": entry.get("rawUrl") or entry.get("url") or f"https://www.baidu.com/s?wd={urllib.parse.quote(word)}",
skills/last30days/scripts/lib/bilibili.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 26
SEARCH_REFERER = "https://search.bilibili.com/" - Network accessline 27
WBI_SEARCH_URL = "https://api.bilibili.com/x/web-interface/wbi/search/type" - Network accessline 28
LEGACY_SEARCH_URL = "https://api.bilibili.com/x/web-interface/search/type" - Network accessline 29
SPI_URL = "https://api.bilibili.com/x/frontend/finger/spi" - Network accessline 30
NAV_URL = "https://api.bilibili.com/x/web-interface/nav" - Network accessline 31
HOTWORD_URL = "https://s.search.bilibili.com/main/hotword" - Network accessline 305
return { "title": v.get("title", ""), "url": f"https://www.bilibili.com/video/{bvid}" if bvid else v.get("arcurl", ""), - Network accessline 306
"title": v.get("title", ""), "url": f"https://www.bilibili.com/video/{bvid}" if bvid else v.get("arcurl", ""), "bvid": bvid, - Network accessline 307
"url": f"https://www.bilibili.com/video/{bvid}" if bvid else v.get("arcurl", ""), - Network accessline 342
"rank": entry.get("pos") or idx, "title": title, "url": f"https://search.bilibili.com/all?keyword={urllib.parse.quote(word or title)}", - Network accessline 343
"title": title, "url": f"https://search.bilibili.com/all?keyword={urllib.parse.quote(word or title)}", "hot_value": entry.get("heat_score") or entry.get("score") or None, - Network accessline 344
"url": f"https://search.bilibili.com/all?keyword={urllib.parse.quote(word or title)}",
skills/last30days/scripts/lib/cache.py
skills/last30days/scripts/lib/cjk.py
- Executable scriptline 1
Executable file
skills/last30days/scripts/lib/cluster.py
skills/last30days/scripts/lib/crawler_bridge.py
- Executable scriptline 1
Executable file - Network accessline 3
灵感来源: https://github.com/NanmiCoder/MediaCrawler - Network accessline 23
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Network accessline 76
"xiaohongshu": { "label": "小红书", "url": "https://www.xiaohongshu.com/explore", - Network accessline 77
"label": "小红书", "url": "https://www.xiaohongshu.com/explore", "domain": ".xiaohongshu.com", - Network accessline 78
"url": "https://www.xiaohongshu.com/explore", - Network accessline 83
"weibo": { "label": "微博", "url": "https://passport.weibo.com/sso/signin?entry=wapsso&source=wapssowb&url=https%3A%2F%2Fm.weibo.cn%2F", - Network accessline 84
"label": "微博", "url": "https://passport.weibo.com/sso/signin?entry=wapsso&source=wapssowb&url=https%3A%2F%2Fm.weibo.cn%2F", "domain": ".weibo.cn", - Network accessline 85
"url": "https://passport.weibo.com/sso/signin?entry=wapsso&source=wapssowb&url=https%3A%2F%2Fm.weibo.cn%2F", - Network accessline 91
"zhihu": { "label": "知乎", "url": "https://www.zhihu.com/signin", - Network accessline 92
"label": "知乎", "url": "https://www.zhihu.com/signin", "domain": ".zhihu.com", - Network accessline 93
"url": "https://www.zhihu.com/signin", - Network accessline 97
"douyin": { "label": "抖音", "url": "https://www.douyin.com/", - Network accessline 98
"label": "抖音", "url": "https://www.douyin.com/", "domain": ".douyin.com", - Network accessline 99
"url": "https://www.douyin.com/", - Network accessline 103
"bilibili": { "label": "B站", "url": "https://passport.bilibili.com/login", - Network accessline 104
"label": "B站", "url": "https://passport.bilibili.com/login", "domain": ".bilibili.com", - Network accessline 105
"url": "https://passport.bilibili.com/login", - Access to secretsline 119
[Credential-related source omitted] - Access to secretsline 174
[Credential-related source omitted] - Access to secretsline 184
[Credential-related source omitted] - Access to secretsline 185
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 205
[Credential-related source omitted] - Access to secretsline 348
[Credential-related source omitted] - Network accessline 510
try: info = page.evaluate( "async () => { try { const r = await fetch('https://m.weibo.cn/api/config', {credentials: 'include'});" - Network accessline 511
info = page.evaluate( "async () => { try { const r = await fetch('https://m.weibo.cn/api/config', {credentials: 'include'});" " const j = await r.json(); return !!(j && j.data && j.data.login); } catch (e) { - Network accessline 512
"async () => { try { const r = await fetch('https://m.weibo.cn/api/config', {credentials: 'include'});" - Network accessline 588
try: with _launch_browser_context("weibo", mobile=True) as (browser, context, page): page.goto("https://m.weibo.cn/", wait_until="domcontentloaded", timeout=20000) - Network accessline 589
with _launch_browser_context("weibo", mobile=True) as (browser, context, page): page.goto("https://m.weibo.cn/", wait_until="domcontentloaded", timeout=20000) page.wait_for_timeout(1200) - Network accessline 590
page.goto("https://m.weibo.cn/", wait_until="domcontentloaded", timeout=20000) - Network accessline 591
page.wait_for_timeout(1200) logged_in = page.evaluate( "async () => { try { const r = await fetch('/api/config'); const j = await r.json();" - Network accessline 592
logged_in = page.evaluate( "async () => { try { const r = await fetch('/api/config'); const j = await r.json();" " return !!(j && j.data && j.data.login); } catch (e) { return false; } }" - Network accessline 593
"async () => { try { const r = await fetch('/api/config'); const j = await r.json();" - Network accessline 604
url = "/api/container/getIndex?" + urllib.parse.urlencode(params) response = page.evaluate( "async (url) => { const r = await fetch(url, {headers: {'X-Requested-With': 'XMLHttpRequest'}});" - Network accessline 605
response = page.evaluate( "async (url) => { const r = await fetch(url, {headers: {'X-Requested-With': 'XMLHttpRequest'}});" " return await r.json(); }", - Network accessline 606
"async (url) => { const r = await fetch(url, {headers: {'X-Requested-With': 'XMLHttpRequest'}});" - Network accessline 629
return { "text": text, "url": f"https://weibo.com/{user.get('id', '')}/{mid}", - Network accessline 630
"text": text, "url": f"https://weibo.com/{user.get('id', '')}/{mid}", "author_handle": user.get("screen_name", ""), - Network accessline 631
"url": f"https://weibo.com/{user.get('id', '')}/{mid}", - Network accessline 691
search_url = ( "https://www.xiaohongshu.com/search_result?" f"keyword={urllib.parse.quote(topic, safe='')}&source=web_search_result_notes" - Network accessline 692
"https://www.xiaohongshu.com/search_result?" f"keyword={urllib.parse.quote(topic, safe='')}&source=web_search_result_notes" ) - Network accessline 763
link = link_el.get_attribute("href") if link_el else "" if link and not link.startswith("http"): link = f"https://www.xiaohongshu.com{link}" - Network accessline 764
if link and not link.startswith("http"): link = f"https://www.xiaohongshu.com{link}" match = re.search(r"/(?:explore|search_result)/([0-9a-f]{24})", link or "") - Network accessline 765
link = f"https://www.xiaohongshu.com{link}" - Network accessline 766
match = re.search(r"/(?:explore|search_result)/([0-9a-f]{24})", link or "") if match and "xsec_token" not in link: link = f"https://www.xiaohongshu.com/explore/{match.group(1)}" - Network accessline 767
if match and "xsec_token" not in link: link = f"https://www.xiaohongshu.com/explore/{match.group(1)}" title_el = elem.query_selector("a.title span, span[class*='title'], div[class*='title']") - Network accessline 768
link = f"https://www.xiaohongshu.com/explore/{match.group(1)}" - Network accessline 926
page.on("response", _on_response) search_url = f"https://www.douyin.com/search/{urllib.parse.quote(topic)}?type=video" - Network accessline 927
search_url = f"https://www.douyin.com/search/{urllib.parse.quote(topic)}?type=video" - Network accessline 992
page.on("response", _on_response) search_url = f"https://search.bilibili.com/video?keyword={urllib.parse.quote(topic)}&order=totalrank" - Network accessline 993
search_url = f"https://search.bilibili.com/video?keyword={urllib.parse.quote(topic)}&order=totalrank" - Network accessline 1012
href = "https:" + href elif href.startswith("/"): href = "https://www.bilibili.com" + href - Network accessline 1013
elif href.startswith("/"): href = "https://www.bilibili.com" + href author_el = elem.query_selector("span.bili-video-card__info--author, span[class*='name']") - Network accessline 1014
href = "https://www.bilibili.com" + href - Network accessline 1059
page.on("response", _on_response) search_url = f"https://www.zhihu.com/search?type=content&q={urllib.parse.quote(topic)}" - Network accessline 1060
search_url = f"https://www.zhihu.com/search?type=content&q={urllib.parse.quote(topic)}" - Network accessline 1111
link = "https:" + link elif link and link.startswith("/"): link = f"https://www.zhihu.com{link}" - Network accessline 1112
elif link and link.startswith("/"): link = f"https://www.zhihu.com{link}" excerpt_el = elem.query_selector("span[class*='RichText'], div[class*='RichText']") - Network accessline 1113
link = f"https://www.zhihu.com{link}"
skills/last30days/scripts/lib/dates.py
skills/last30days/scripts/lib/dedupe.py
skills/last30days/scripts/lib/doctor.py
- Executable scriptline 1
Executable file - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 99
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 131
[Credential-related source omitted] - Access to secretsline 136
[Credential-related source omitted] - Access to secretsline 137
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 152
[Credential-related source omitted] - Access to secretsline 153
[Credential-related source omitted]
skills/last30days/scripts/lib/douyin.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 23
HOT_LIST_URL = ( "https://www.douyin.com/aweme/v1/web/hot/search/list/" - Network accessline 24
"https://www.douyin.com/aweme/v1/web/hot/search/list/" - Access to secretsline 29
[Credential-related source omitted] - Network accessline 110
try: encoded = urllib.parse.quote(topic) url = f"https://api.tikhub.io/api/v1/douyin/web/fetch_general_search?keyword={encoded}&count={limit}&sort_type=0" - Network accessline 111
encoded = urllib.parse.quote(topic) url = f"https://api.tikhub.io/api/v1/douyin/web/fetch_general_search?keyword={encoded}&count={limit}&sort_type=0" data = http.get( - Network accessline 112
url = f"https://api.tikhub.io/api/v1/douyin/web/fetch_general_search?keyword={encoded}&count={limit}&sort_type=0" - Network accessline 130
data = http.get( HOT_LIST_URL, headers=http.browser_headers(referer="https://www.douyin.com/", accept="json"), - Network accessline 131
HOT_LIST_URL, headers=http.browser_headers(referer="https://www.douyin.com/", accept="json"), timeout=10, - Network accessline 132
headers=http.browser_headers(referer="https://www.douyin.com/", accept="json"), - Network accessline 141
sentence_id = entry.get("sentence_id") url = ( f"https://www.douyin.com/hot/{sentence_id}" - Network accessline 142
url = ( f"https://www.douyin.com/hot/{sentence_id}" if sentence_id - Network accessline 143
f"https://www.douyin.com/hot/{sentence_id}" if sentence_id else f"https://www.douyin.com/search/{urllib.parse.quote(word)}" - Network accessline 144
if sentence_id else f"https://www.douyin.com/search/{urllib.parse.quote(word)}" ) - Network accessline 145
else f"https://www.douyin.com/search/{urllib.parse.quote(word)}" - Network accessline 225
return { "text": desc, "url": f"https://www.douyin.com/video/{aweme_id}" if aweme_id else "", - Network accessline 226
"text": desc, "url": f"https://www.douyin.com/video/{aweme_id}" if aweme_id else "", "author_name": author.get("nickname", ""), - Network accessline 227
"url": f"https://www.douyin.com/video/{aweme_id}" if aweme_id else "",
skills/last30days/scripts/lib/env.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 43
[Credential-related source omitted] - Access to secretsline 46
[Credential-related source omitted] - Access to secretsline 48
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 53
[Credential-related source omitted] - Access to secretsline 54
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Network accessline 82
DEFAULT_XHS_MCP_CANDIDATES = ("http://127.0.0.1:18060",) - Access to secretsline 126
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Access to secretsline 145
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 160
[Credential-related source omitted] - Network accessline 198
for base in DEFAULT_XHS_MCP_CANDIDATES: try: with urllib.request.urlopen(f"{base}/health", timeout=timeout) as resp: - Network accessline 199
try: with urllib.request.urlopen(f"{base}/health", timeout=timeout) as resp: payload = json.loads(resp.read().decode("utf-8", "replace") or "{}") - Network accessline 200
with urllib.request.urlopen(f"{base}/health", timeout=timeout) as resp: - Access to secretsline 212
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted] - Access to secretsline 258
[Credential-related source omitted] - Access to secretsline 268
[Credential-related source omitted] - Access to secretsline 272
[Credential-related source omitted] - Access to secretsline 273
[Credential-related source omitted] - Access to secretsline 317
[Credential-related source omitted] - Network accessline 319
def run(): headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Network accessline 320
headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Access to secretsline 395
[Credential-related source omitted] - Access to secretsline 399
[Credential-related source omitted] - Access to secretsline 400
[Credential-related source omitted] - Access to secretsline 401
[Credential-related source omitted] - Access to secretsline 402
[Credential-related source omitted] - Access to secretsline 403
[Credential-related source omitted] - Access to secretsline 404
[Credential-related source omitted]
skills/last30days/scripts/lib/github.py
skills/last30days/scripts/lib/hackernews.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 15
SEARCH_URL = "https://hn.algolia.com/api/v1/search" - Network accessline 16
FRONT_PAGE_URL = "https://hn.algolia.com/api/v1/search?tags=front_page&hitsPerPage={limit}" - Network accessline 61
"platform": "hackernews", "title": title, "url": f"https://news.ycombinator.com/item?id={object_id}", - Network accessline 62
"title": title, "url": f"https://news.ycombinator.com/item?id={object_id}", "text": text, - Network accessline 63
"url": f"https://news.ycombinator.com/item?id={object_id}",
skills/last30days/scripts/lib/hot_board.js
- Executable scriptline 1
Executable file
skills/last30days/scripts/lib/hot_board.py
- Executable scriptline 1
Executable file - Network accessline 218
<div class="wrap"> <header class="nav"> <a class="brand" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{brand}<span>last30days<span style="opacity:.45"> / </span>热榜</span></a> - Network accessline 219
<header class="nav"> <a class="brand" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{brand}<span>last30days<span style="opacity:.45"> / </span>热榜</span></a> <span class="brand-note">A LITTLE CURIOSITY, EVERY DAY.</sp - Network accessline 220
<a class="brand" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{brand}<span>last30days<span style="opacity:.45"> / </span>热榜</span></a> - Network accessline 221
<span class="brand-note">A LITTLE CURIOSITY, EVERY DAY.</span> <div class="nav-actions"><a class="nav-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}GitHub</a> <button class="icon-button js-only" id="t - Network accessline 222
<div class="nav-actions"><a class="nav-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}GitHub</a> - Network accessline 262
</dialog> <footer class="footer"><div><p>榜单为定时采集快照,排名与热度以来源页面为准。</p> <p>由 <a href="https://github.com/Jesseovo/last30days-skill-cn" {external}>last30days-cn</a> 生成 · 数据来自各平台公开内容</p></div> - Network accessline 263
<footer class="footer"><div><p>榜单为定时采集快照,排名与热度以来源页面为准。</p> <p>由 <a href="https://github.com/Jesseovo/last30days-skill-cn" {external}>last30days-cn</a> 生成 · 数据来自各平台公开内容</p></div> <div class="footer-sign">Made with curiosity <span>✦</span - Network accessline 264
<p>由 <a href="https://github.com/Jesseovo/last30days-skill-cn" {external}>last30days-cn</a> 生成 · 数据来自各平台公开内容</p></div> - Network accessline 265
<div class="footer-sign">Made with curiosity <span>✦</span><br><a href="https://github.com/Jesseovo" {external}>a little corner by Jesse</a></div></footer> - Network accessline 268
<div class="star-badge" aria-hidden="true">{star}</div> <div class="star-copy"><h2 id="star-title">觉得好用?点颗 Star 吧</h2><p>让更多人发现这个小小热榜。</p> <a class="star-link" id="star-link" href="https://github.com/Jesseovo/last30days-skill-cn" {ext - Network accessline 269
<div class="star-copy"><h2 id="star-title">觉得好用?点颗 Star 吧</h2><p>让更多人发现这个小小热榜。</p> <a class="star-link" id="star-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}<span>去 GitHub Star</span>{external_icon}</ - Network accessline 270
<a class="star-link" id="star-link" href="https://github.com/Jesseovo/last30days-skill-cn" {external}>{github}<span>去 GitHub Star</span>{external_icon}</a></div>
skills/last30days/scripts/lib/http.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 47
USER_AGENT = f"last30days-cn/{VERSION} (Research Skill; +https://github.com/Jesseovo/last30days-skill-cn)" - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Network accessline 249
def _open(req: urllib.request.Request, timeout: int, opener=None): - Network accessline 250
if opener is not None: return opener.open(req, timeout=timeout) return urllib.request.urlopen(req, timeout=timeout) - Network accessline 252
return urllib.request.urlopen(req, timeout=timeout) - Network accessline 255
def _send( req: urllib.request.Request, - Network accessline 256
req: urllib.request.Request, - Network accessline 363
req = urllib.request.Request(url, data=body_bytes, headers=headers, method=method) - Network accessline 395
def fetch( - Network accessline 408
merged = dict(headers or {}) merged.setdefault("User-Agent", USER_AGENT) req = urllib.request.Request(url, headers=merged, method="GET") - Network accessline 409
merged.setdefault("User-Agent", USER_AGENT) req = urllib.request.Request(url, headers=merged, method="GET") return _send(req, timeout=timeout, retries=retries, backoff=RETRY_BACKOFF, opener=opener) - Network accessline 410
req = urllib.request.Request(url, headers=merged, method="GET") - Access to secretsline 436
[Credential-related source omitted]
skills/last30days/scripts/lib/normalize.py
skills/last30days/scripts/lib/pipeline.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 111
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted]
skills/last30days/scripts/lib/query.py
skills/last30days/scripts/lib/query_type.py
skills/last30days/scripts/lib/reddit.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 15
HOSTS = ("https://www.reddit.com", "https://old.reddit.com") - Network accessline 83
"platform": "reddit", "title": title, "url": f"https://www.reddit.com{permalink}", - Network accessline 84
"title": title, "url": f"https://www.reddit.com{permalink}", "text": (post.get("selftext") or "")[:300], - Network accessline 85
"url": f"https://www.reddit.com{permalink}",
skills/last30days/scripts/lib/relevance.py
skills/last30days/scripts/lib/render.py
skills/last30days/scripts/lib/schema.py
skills/last30days/scripts/lib/score.py
skills/last30days/scripts/lib/setup_wizard.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 6
[Credential-related source omitted] - Network accessline 17
# last30days-cn 配置文件(所有项均为可选) # 文档: https://github.com/Jesseovo/last30days-skill-cn - Network accessline 18
# 文档: https://github.com/Jesseovo/last30days-skill-cn - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 29
[Credential-related source omitted] - Network accessline 30
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 31
[Credential-related source omitted] - Access to secretsline 31
[Credential-related source omitted] - Network accessline 32
# XIAOHONGSHU_API_BASE= # 自部署 xiaohongshu-mcp,例如 http://127.0.0.1:18060 - Network accessline 39
# INCLUDE_SOURCES=global # 默认附带 Hacker News/GitHub/Reddit # EXCLUDE_SOURCES=douyin # 默认排除某些平台 # LAST30DAYS_HOT_FEEDS=36氪快讯|https://your-rsshub/36kr/newsflashes - Network accessline 41
# LAST30DAYS_HOT_FEEDS=36氪快讯|https://your-rsshub/36kr/newsflashes - Access to secretsline 57
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted]
skills/last30days/scripts/lib/sources.py
skills/last30days/scripts/lib/toutiao.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 23
SO_SEARCH_URL = "https://so.toutiao.com/search" - Network accessline 24
HOT_BOARD_URL = "https://www.toutiao.com/hot-event/hot-board/?origin=toutiao_pc" - Network accessline 120
params["page_num"] = str(page) url = f"{SO_SEARCH_URL}?{urllib.parse.urlencode(params)}" headers = http.browser_headers(referer="https://so.toutiao.com/") - Network accessline 122
headers = http.browser_headers(referer="https://so.toutiao.com/") - Network accessline 125
for attempt in range(3): _status, final_url, body = http.fetch(url, headers=headers, timeout=15) - Network accessline 126
_status, final_url, body = http.fetch(url, headers=headers, timeout=15) - Network accessline 186
toutiao_url = info.get("url") if isinstance(info, dict) else "" if not toutiao_url and group_id.isdigit(): toutiao_url = f"https://www.toutiao.com/group/{group_id}/" - Network accessline 187
if not toutiao_url and group_id.isdigit(): toutiao_url = f"https://www.toutiao.com/group/{group_id}/" article_url = data.get("article_url") or data.get("display_url") or "" - Network accessline 188
toutiao_url = f"https://www.toutiao.com/group/{group_id}/" - Network accessline 213
data = http.get( HOT_BOARD_URL, headers=http.browser_headers(referer="https://www.toutiao.com/", accept="json"), - Network accessline 214
HOT_BOARD_URL, headers=http.browser_headers(referer="https://www.toutiao.com/", accept="json"), timeout=10, - Network accessline 215
headers=http.browser_headers(referer="https://www.toutiao.com/", accept="json"),
skills/last30days/scripts/lib/trending.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 11
自定义 RSS(例如自建 RSSHub 的 36 氪快讯、X/Twitter 列表): ``LAST30DAYS_HOT_FEEDS="36氪快讯|https://your-rsshub/36kr/newsflashes,..."`` - Network accessline 12
``LAST30DAYS_HOT_FEEDS="36氪快讯|https://your-rsshub/36kr/newsflashes,..."`` - Network accessline 38
]) FEEDS: "OrderedDict[str, Tuple[str, str]]" = OrderedDict([ ("ithome", ("IT之家", "https://www.ithome.com/rss/")), - Network accessline 39
FEEDS: "OrderedDict[str, Tuple[str, str]]" = OrderedDict([ ("ithome", ("IT之家", "https://www.ithome.com/rss/")), ("huxiu", ("虎嗅", "https://rss.huxiu.com/")), - Network accessline 40
("ithome", ("IT之家", "https://www.ithome.com/rss/")), - Network accessline 41
("huxiu", ("虎嗅", "https://rss.huxiu.com/")), - Network accessline 42
("sspai", ("少数派", "https://sspai.com/feed")), - Network accessline 43
("ifanr", ("爱范儿", "https://www.ifanr.com/feed")), - Network accessline 44
("solidot", ("Solidot", "https://www.solidot.org/index.rss")), - Access to secretsline 67
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted]
skills/last30days/scripts/lib/upstream_bridge.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 72
[Credential-related source omitted] - Access to secretsline 88
[Credential-related source omitted] - Access to secretsline 209
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted]
skills/last30days/scripts/lib/version.py
- Executable scriptline 1
Executable file
skills/last30days/scripts/lib/websearch.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 70
[Credential-related source omitted] - Network accessline 195
else: params["setlang"] = "zh-Hans" url = f"https://{host}/search?{urllib.parse.urlencode(params)}" - Network accessline 196
params["setlang"] = "zh-Hans" url = f"https://{host}/search?{urllib.parse.urlencode(params)}" headers = http.browser_headers(referer=f"https://{host}/") - Network accessline 197
url = f"https://{host}/search?{urllib.parse.urlencode(params)}" - Network accessline 198
headers = http.browser_headers(referer=f"https://{host}/") _status, final_url, body = http.fetch(url, headers=headers, timeout=timeout) if _is_bing_homepage(final_url, body): - Network accessline 199
_status, final_url, body = http.fetch(url, headers=headers, timeout=timeout) - Network accessline 207
def _search_ddg(query: str, *, timeout: int) -> List[SearchResult]: url = f"https://html.duckduckgo.com/html/?{urllib.parse.urlencode({'q': query, 'kl': 'cn-zh'})}" - Network accessline 208
url = f"https://html.duckduckgo.com/html/?{urllib.parse.urlencode({'q': query, 'kl': 'cn-zh'})}" - Network accessline 209
headers = http.browser_headers(referer="https://html.duckduckgo.com/")
skills/last30days/scripts/lib/wechat.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 21
SOGOU_BASE = "https://weixin.sogou.com" - Access to secretsline 30
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted] - Network accessline 110
try: encoded = urllib.parse.quote(topic) url = f"https://api.jisuapi.com/weixin/search?keyword={encoded}&pagenum=1&pagesize={limit}&appkey={api_key}" - Network accessline 111
encoded = urllib.parse.quote(topic) url = f"https://api.jisuapi.com/weixin/search?keyword={encoded}&pagenum=1&pagesize={limit}&appkey={api_key}" data = http.get(url, headers=http.browser_headers(accept="json"), timeout=15, r - Network accessline 112
[Credential-related source omitted] - Access to secretsline 112
[Credential-related source omitted] - Network accessline 135
params["page"] = str(page) url = f"{SOGOU_BASE}/weixin?{urllib.parse.urlencode(params)}" _status, final_url, body = http.fetch( - Network accessline 136
url = f"{SOGOU_BASE}/weixin?{urllib.parse.urlencode(params)}" _status, final_url, body = http.fetch( url, headers=http.browser_headers(referer=f"{SOGOU_BASE}/"), timeout=15 - Network accessline 137
_status, final_url, body = http.fetch( - Access to secretsline 141
[Credential-related source omitted]
skills/last30days/scripts/lib/weibo.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 8
[Credential-related source omitted] - Network accessline 26
MOBILE_SEARCH_URL = "https://m.weibo.cn/api/container/getIndex" - Network accessline 27
HOT_SEARCH_URL = "https://weibo.com/ajax/side/hotSearch" - Network accessline 28
VISITOR_URL = "https://passport.weibo.com/visitor/genvisitor2" - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Network accessline 137
encoded = urllib.parse.quote(topic) url = ( f"https://api.weibo.com/2/search/statuses.json" - Network accessline 138
[Credential-related source omitted] - Network accessline 139
f"https://api.weibo.com/2/search/statuses.json" - Access to secretsline 140
[Credential-related source omitted] - Network accessline 151
def _mobile_session(cookie: Optional[str]) -> http.Session: session = http.Session(http.browser_headers(kind="mobile", referer="https://m.weibo.cn/", accept="json")) - Network accessline 152
session = http.Session(http.browser_headers(kind="mobile", referer="https://m.weibo.cn/", accept="json")) - Network accessline 166
VISITOR_URL, {"cb": "visitor_gray_callback", "tid": "", "from": "weibo"}, headers={"Referer": "https://passport.weibo.com/visitor/visitor"}, - Network accessline 167
{"cb": "visitor_gray_callback", "tid": "", "from": "weibo"}, headers={"Referer": "https://passport.weibo.com/visitor/visitor"}, timeout=8, - Network accessline 168
headers={"Referer": "https://passport.weibo.com/visitor/visitor"}, - Network accessline 216
data = http.get( HOT_SEARCH_URL, headers=http.browser_headers(referer="https://weibo.com/", accept="json"), - Network accessline 217
HOT_SEARCH_URL, headers=http.browser_headers(referer="https://weibo.com/", accept="json"), timeout=10, - Network accessline 218
headers=http.browser_headers(referer="https://weibo.com/", accept="json"), - Network accessline 231
"rank": entry.get("realpos") or (entry.get("rank", len(out)) + 1), "title": word, "url": f"https://s.weibo.com/weibo?q={urllib.parse.quote(query)}", - Network accessline 232
"title": word, "url": f"https://s.weibo.com/weibo?q={urllib.parse.quote(query)}", "hot_value": entry.get("num"), - Network accessline 233
"url": f"https://s.weibo.com/weibo?q={urllib.parse.quote(query)}", - Network accessline 292
return { "text": text, "url": f"https://weibo.com/{user.get('id', '')}/{s.get('mid', '')}", - Network accessline 293
"text": text, "url": f"https://weibo.com/{user.get('id', '')}/{s.get('mid', '')}", "author_handle": user.get("screen_name", ""), - Network accessline 294
"url": f"https://weibo.com/{user.get('id', '')}/{s.get('mid', '')}", - Network accessline 313
return { "text": text, "url": f"https://weibo.com/{user.get('id', '')}/{bid}", - Network accessline 314
"text": text, "url": f"https://weibo.com/{user.get('id', '')}/{bid}", "author_handle": user.get("screen_name", ""), - Network accessline 315
"url": f"https://weibo.com/{user.get('id', '')}/{bid}",
skills/last30days/scripts/lib/xiaohongshu.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Access to secretsline 63
[Credential-related source omitted] - Network accessline 124
if not note_id: return "" base = f"https://www.xiaohongshu.com/explore/{note_id}" - Network accessline 125
[Credential-related source omitted] - Network accessline 126
[Credential-related source omitted]
skills/last30days/scripts/lib/zhihu.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 21
SEARCH_URL = "https://www.zhihu.com/api/v4/search_v3" - Network accessline 22
HOT_LIST_URLS = ( "https://api.zhihu.com/topstory/hot-lists/total?limit=50", "https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50", - Network accessline 23
"https://api.zhihu.com/topstory/hot-lists/total?limit=50", - Network accessline 24
"https://www.zhihu.com/api/v3/feed/topstory/hot-lists/total?limit=50", - Network accessline 111
try: params = {"t": "general", "q": topic, "offset": 0, "limit": min(limit, 20)} headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Network accessline 112
params = {"t": "general", "q": topic, "offset": 0, "limit": min(limit, 20)} headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") if cookie: - Network accessline 113
headers = http.browser_headers(referer="https://www.zhihu.com/search", accept="json") - Network accessline 143
for url in HOT_LIST_URLS: try: data = http.get(url, headers=http.browser_headers(referer="https://www.zhihu.com/hot", accept="json"), timeout=8, retries=1) - Network accessline 144
try: data = http.get(url, headers=http.browser_headers(referer="https://www.zhihu.com/hot", accept="json"), timeout=8, retries=1) except Exception as exc: - Network accessline 145
data = http.get(url, headers=http.browser_headers(referer="https://www.zhihu.com/hot", accept="json"), timeout=8, retries=1) - Network accessline 159
"rank": idx, "title": title, "url": f"https://www.zhihu.com/question/{qid}" if qid else "", - Network accessline 160
"title": title, "url": f"https://www.zhihu.com/question/{qid}" if qid else "", "hot_value": heat, - Network accessline 161
"url": f"https://www.zhihu.com/question/{qid}" if qid else "", - Network accessline 262
qid = question.get("id", "") aid = obj.get("id", "") url = f"https://www.zhihu.com/question/{qid}/answer/{aid}" if qid else "" - Network accessline 263
aid = obj.get("id", "") url = f"https://www.zhihu.com/question/{qid}/answer/{aid}" if qid else "" elif obj_type == "article": - Network accessline 264
url = f"https://www.zhihu.com/question/{qid}/answer/{aid}" if qid else "" - Network accessline 265
elif obj_type == "article": url = f"https://zhuanlan.zhihu.com/p/{obj.get('id', '')}" elif obj_type == "question": - Network accessline 266
url = f"https://zhuanlan.zhihu.com/p/{obj.get('id', '')}" - Network accessline 267
elif obj_type == "question": url = f"https://www.zhihu.com/question/{obj.get('id', '')}" else: - Network accessline 268
url = f"https://www.zhihu.com/question/{obj.get('id', '')}"
skills/last30days/scripts/sync.sh
tests/__init__.py
- Executable scriptline 1
Executable file
tests/test_baidu_antibot.py
- Executable scriptline 1
Executable file - Network accessline 9
ANTIBOT_HTML = '<html><title>百度安全验证</title><script src="https://wappass.baidu.com/static/verify"></script></html>' - Network accessline 10
NORMAL_HTML = '''<html><div class="result c-container new-pmd" id="1"> <h3 class="t"><a href="https://example.com/1" target="_blank">测试标题</a></h3> <span class="content-right_8Zs40">测试摘要内容</span> - Network accessline 11
<h3 class="t"><a href="https://example.com/1" target="_blank">测试标题</a></h3>
tests/test_bilibili_v4.py
- Executable scriptline 1
Executable file - Network accessline 37
} parsed = bilibili._parse_video(video) assert parsed["url"] == "https://www.bilibili.com/video/BV1xx411c7mD" - Network accessline 38
parsed = bilibili._parse_video(video) assert parsed["url"] == "https://www.bilibili.com/video/BV1xx411c7mD" assert parsed["duration"] == 3723 - Network accessline 39
assert parsed["url"] == "https://www.bilibili.com/video/BV1xx411c7mD" - Network accessline 76
NAV = {"data": {"wbi_img": {"img_url": f"https://i0.hdslb.com/bfs/wbi/{IMG_KEY}.png", - Network accessline 77
"sub_url": f"https://i0.hdslb.com/bfs/wbi/{SUB_KEY}.png"}}}
tests/test_cache.py
tests/test_cjk.py
- Executable scriptline 1
Executable file
tests/test_cluster.py
- Executable scriptline 1
Executable file - Network accessline 13
def _weibo(i, text, score): return schema.WeiboItem(id=i, text=text, url=f"https://weibo.com/{i}", - Network accessline 14
return schema.WeiboItem(id=i, text=text, url=f"https://weibo.com/{i}", - Network accessline 18
def _baidu(i, title, score): return schema.BaiduItem(id=i, title=title, snippet="", url=f"https://baidu.com/{i}", - Network accessline 19
return schema.BaiduItem(id=i, title=title, snippet="", url=f"https://baidu.com/{i}", - Network accessline 23
def _bili(i, title, score): return schema.BilibiliItem(id=i, title=title, url=f"https://b.com/{i}", - Network accessline 24
return schema.BilibiliItem(id=i, title=title, url=f"https://b.com/{i}",
tests/test_crawler_bridge.py
tests/test_crawler_login.py
tests/test_dates.py
- Executable scriptline 1
Executable file
tests/test_dedupe.py
- Executable scriptline 1
Executable file
tests/test_doctor.py
tests/test_env_cli_v4.py
- Executable scriptline 1
Executable file - Access to secretsline 20
[Credential-related source omitted] - Access to secretsline 23
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Network accessline 58
def test_xhs_mcp_base_only_when_configured_or_reachable(monkeypatch): assert env.get_xiaohongshu_api_base({}) is None assert env.get_xiaohongshu_api_base({"XIAOHONGSHU_API_BASE": "http://h:18060/"}) == "http://h:18060" - Network accessline 59
assert env.get_xiaohongshu_api_base({}) is None assert env.get_xiaohongshu_api_base({"XIAOHONGSHU_API_BASE": "http://h:18060/"}) == "http://h:18060" assert env.discover_xiaohongshu_mcp({"XIAOHONGSHU_API_BASE": "http://h:18060"}) == - Network accessline 60
assert env.get_xiaohongshu_api_base({"XIAOHONGSHU_API_BASE": "http://h:18060/"}) == "http://h:18060" - Network accessline 61
assert env.discover_xiaohongshu_mcp({"XIAOHONGSHU_API_BASE": "http://h:18060"}) == "http://h:18060" - Access to secretsline 65
[Credential-related source omitted] - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 124
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Network accessline 160
data = {"generated_at": "2026-10-03 22:00", "timezone": "Asia/Shanghai", "topic_filter": "国足", "boards": {"weibo": {"label": "微博热搜", "kind": "board", "items": [{"rank": 1, "title": "国足夺铜", "url": - Network accessline 161
"boards": {"weibo": {"label": "微博热搜", "kind": "board", "items": [{"rank": 1, "title": "国足夺铜", "url": "https://s.weibo.com/x"}]}}, "topics": []} - Network accessline 162
"items": [{"rank": 1, "title": "国足夺铜", "url": "https://s.weibo.com/x"}]}},
tests/test_env_sources.py
- Executable scriptline 1
Executable file
tests/test_global_sources.py
- Executable scriptline 1
Executable file - Network accessline 45
def test_hackernews_hit_parsing(): hit = {"objectID": "49814947", "title": "Claude Code reads AGENTS.md", "url": "https://blog.test/p", - Network accessline 46
hit = {"objectID": "49814947", "title": "Claude Code reads AGENTS.md", "url": "https://blog.test/p", - Network accessline 47
"author": "pszypowicz", "points": 486, "num_comments": 284, "created_at_i": 1790000000} parsed = hackernews.parse_hit(hit) assert parsed["url"] == "https://news.ycombinator.com/item?id=49814947" - Network accessline 48
parsed = hackernews.parse_hit(hit) assert parsed["url"] == "https://news.ycombinator.com/item?id=49814947" assert parsed["container"] == "blog.test" - Network accessline 49
assert parsed["url"] == "https://news.ycombinator.com/item?id=49814947" - Network accessline 72
def test_github_repo_and_issue_parsing(): repo = github.parse_repo({"full_name": "anthropics/claude-code", "description": "Agentic coding", "html_url": "https://github.com/anthropics/claude-code", "stargaze - Network accessline 73
repo = github.parse_repo({"full_name": "anthropics/claude-code", "description": "Agentic coding", "html_url": "https://github.com/anthropics/claude-code", "stargazers_count": 59000, - Network accessline 74
"html_url": "https://github.com/anthropics/claude-code", "stargazers_count": 59000, - Network accessline 78
assert repo["title"].startswith("anthropics/claude-code: ") assert repo["engagement"]["stars"] == 59000 and repo["date"] == "2026-10-01" issue = github.parse_issue({"title": "Bug", "html_url": "https://github.com/o/r/issues/1", - Network accessline 79
assert repo["engagement"]["stars"] == 59000 and repo["date"] == "2026-10-01" issue = github.parse_issue({"title": "Bug", "html_url": "https://github.com/o/r/issues/1", "repository_url": "https://api.githu - Network accessline 80
issue = github.parse_issue({"title": "Bug", "html_url": "https://github.com/o/r/issues/1", - Network accessline 81
"repository_url": "https://api.github.com/repos/o/r", "comments": 3, - Network accessline 103
items = reddit.search_reddit("Claude Code", "2026-09-03", "2026-10-03") assert len(items) == 1 assert items[0]["url"] == "https://www.reddit.com/r/ClaudeAI/comments/1/x/" - Network accessline 104
assert len(items) == 1 assert items[0]["url"] == "https://www.reddit.com/r/ClaudeAI/comments/1/x/" assert items[0]["container"] == "r/ClaudeAI" and items[0]["id"] == "RD1" - Network accessline 105
assert items[0]["url"] == "https://www.reddit.com/r/ClaudeAI/comments/1/x/" - Network accessline 152
payload = { "items_by_source": { "x": [{"source": "x", "title": "Thread", "url": "https://x.com/a/status/1", "author": "a", - Network accessline 153
"items_by_source": { "x": [{"source": "x", "title": "Thread", "url": "https://x.com/a/status/1", "author": "a", "published_at": "2026-09-30T12:00:00Z", "engagement": {"likes": 10, "retweets": 2, "replies": 3}} - Network accessline 154
"x": [{"source": "x", "title": "Thread", "url": "https://x.com/a/status/1", "author": "a", - Network accessline 155
"published_at": "2026-09-30T12:00:00Z", "engagement": {"likes": 10, "retweets": 2, "replies": 3}}], "youtube": [{"title": "Video", "url": "https://youtu.be/1", "engagement": {"views": 1000}}, {"title": "" - Network accessline 156
"youtube": [{"title": "Video", "url": "https://youtu.be/1", "engagement": {"views": 1000}}, - Network accessline 176
def test_search_upstream_parses_subprocess_json(tmp_path, monkeypatch): script = _fake_upstream(tmp_path) payload = {"items_by_source": {"x": [{"title": "Claude Code thread", "url": "https://x.com/a/status/1"}]}} - Network accessline 178
payload = {"items_by_source": {"x": [{"title": "Claude Code thread", "url": "https://x.com/a/status/1"}]}}
tests/test_html_render.py
- Executable scriptline 1
Executable file - Network accessline 15
title="测试文章", snippet="这是一条测试摘要", url="https://example.com/a", - Network accessline 16
snippet="这是一条测试摘要", url="https://example.com/a", source_name="测试公众号", - Network accessline 17
url="https://example.com/a", - Network accessline 40
title="百度测试结果", snippet="测试摘要", url="https://example.com/b", - Network accessline 41
snippet="测试摘要", url="https://example.com/b", source_domain="example.com", - Network accessline 42
url="https://example.com/b", - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted]
tests/test_http.py
- Executable scriptline 1
Executable file - Network accessline 32
[Credential-related source omitted] - Network accessline 33
[Credential-related source omitted] - Network accessline 34
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Network accessline 63
def test_404_does_not_retry(self): opener = Mock(side_effect=make_http_error(404)) with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: - Network accessline 64
opener = Mock(side_effect=make_http_error(404)) with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: with self.assertRaises(http.HTTPError): - Network accessline 65
with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: - Network accessline 66
with self.assertRaises(http.HTTPError): http.get("https://example.test/missing", retries=3) self.assertEqual(opener.call_count, 1) - Network accessline 67
http.get("https://example.test/missing", retries=3) - Network accessline 74
FakeResponse(b'{"ok": true}'), ]) with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: - Network accessline 75
]) with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: result = http.get("https://example.test/rate-limited", retries=2) - Network accessline 76
with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: - Network accessline 77
result = http.get("https://example.test/rate-limited", retries=2) - Network accessline 87
with patch("lib.http.urllib.request.urlopen", opener), \ - Network accessline 88
patch("lib.http._compute_delay", return_value=4.0) as compute_delay, \ patch("lib.http.time.sleep") as sleep: result = http.get("https://example.test/transient", retries=2, backoff=3.0) - Network accessline 89
patch("lib.http.time.sleep") as sleep: result = http.get("https://example.test/transient", retries=2, backoff=3.0) self.assertEqual(result, {"ok": True}) - Network accessline 90
result = http.get("https://example.test/transient", retries=2, backoff=3.0)
tests/test_http_v4.py
- Executable scriptline 1
Executable file - Network accessline 15
class FakeResponse: def __init__(self, body=b"{}", status=200, headers=None, url="https://example.test/"): - Network accessline 16
def __init__(self, body=b"{}", status=200, headers=None, url="https://example.test/"): - Network accessline 42
def test_browser_headers_are_consistent_with_ua(monkeypatch): monkeypatch.delenv("LAST30DAYS_USER_AGENT", raising=False) headers = http.browser_headers(referer="https://search.bilibili.com/", accept="json") - Network accessline 43
monkeypatch.delenv("LAST30DAYS_USER_AGENT", raising=False) headers = http.browser_headers(referer="https://search.bilibili.com/", accept="json") assert headers["User-Agent"] == http.DESKTOP_UA - Network accessline 44
headers = http.browser_headers(referer="https://search.bilibili.com/", accept="json") - Network accessline 45
assert headers["User-Agent"] == http.DESKTOP_UA assert f'v="{http.CHROME_MAJOR}"' in headers["Sec-Ch-Ua"] assert headers["Origin"] == "https://search.bilibili.com" - Network accessline 46
assert f'v="{http.CHROME_MAJOR}"' in headers["Sec-Ch-Ua"] assert headers["Origin"] == "https://search.bilibili.com" assert headers["Accept"].startswith("application/json") - Network accessline 47
assert headers["Origin"] == "https://search.bilibili.com" - Network accessline 59
def test_412_fails_fast_with_clear_message(): error = urllib.error.HTTPError("https://api.bilibili.com/x", 412, "Precondition Failed", {}, io.BytesIO(b"")) - Network accessline 60
error = urllib.error.HTTPError("https://api.bilibili.com/x", 412, "Precondition Failed", {}, io.BytesIO(b"")) - Network accessline 61
opener = Mock(side_effect=error) with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: try: - Network accessline 62
with patch("lib.http.urllib.request.urlopen", opener), patch("lib.http.time.sleep") as sleep: - Network accessline 63
try: http.get("https://api.bilibili.com/x", retries=3) except http.HTTPError as exc: - Network accessline 64
http.get("https://api.bilibili.com/x", retries=3) - Network accessline 77
raw = gzip.compress(text.encode("gbk")) response = FakeResponse(raw, headers={"Content-Encoding": "gzip", "Content-Type": "text/html; charset=GBK"}) with patch("lib.http.urllib.request.urlopen", Mock(return_value=response)): - Network accessline 78
response = FakeResponse(raw, headers={"Content-Encoding": "gzip", "Content-Type": "text/html; charset=GBK"}) with patch("lib.http.urllib.request.urlopen", Mock(return_value=response)): assert http.get_text("https://example.test/ - Network accessline 79
with patch("lib.http.urllib.request.urlopen", Mock(return_value=response)): - Network accessline 80
assert http.get_text("https://example.test/") == text - Network accessline 83
def test_fetch_returns_final_url(): response = FakeResponse(b"<html></html>", url="https://www.bing.com/?q=x") with patch("lib.http.urllib.request.urlopen", Mock(return_value=response)): - Network accessline 84
response = FakeResponse(b"<html></html>", url="https://www.bing.com/?q=x") with patch("lib.http.urllib.request.urlopen", Mock(return_value=response)): status, final_url, body = http.fetch("https://cn.bing.com/search?q=x") - Network accessline 85
with patch("lib.http.urllib.request.urlopen", Mock(return_value=response)): - Network accessline 86
status, final_url, body = http.fetch("https://cn.bing.com/search?q=x") - Network accessline 87
assert status == 200 assert final_url == "https://www.bing.com/?q=x" assert body == "<html></html>" - Network accessline 88
assert final_url == "https://www.bing.com/?q=x" - Network accessline 108
[Credential-related source omitted] - Network accessline 109
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted] - Access to secretsline 110
[Credential-related source omitted]
tests/test_normalize.py
- Executable scriptline 1
Executable file - Network accessline 3
Author: Jesse (https://github.com/Jesseovo) - Network accessline 54
"bvid": "BV1xx", "title": "测试视频", "url": "https://bilibili.com/video/BV1xx", - Network accessline 55
"title": "测试视频", "url": "https://bilibili.com/video/BV1xx", "channel_name": "UP主", - Network accessline 56
"url": "https://bilibili.com/video/BV1xx", - Network accessline 79
"mid": "123", "text": "测试微博", "url": "https://weibo.com/123", - Network accessline 80
"text": "测试微博", "url": "https://weibo.com/123", "author_handle": "test_user", - Network accessline 81
"url": "https://weibo.com/123", - Network accessline 100
"title": "测试问题", "excerpt": "测试摘要", "url": "https://zhihu.com/q/123", - Network accessline 101
"excerpt": "测试摘要", "url": "https://zhihu.com/q/123", "author": "知友", - Network accessline 102
"url": "https://zhihu.com/q/123",
tests/test_platform_parsers_v4.py
- Executable scriptline 1
Executable file - Network accessline 16
SOGOU_HTML = """ <div class="header"><a href="http://pic.sogou.com/pics?query=x">图片</a><a href="http://zhihu.sogou.com/zhihu?query=x">知乎</a></div> - Network accessline 17
<div class="header"><a href="http://pic.sogou.com/pics?query=x">图片</a><a href="http://zhihu.sogou.com/zhihu?query=x">知乎</a></div> - Network accessline 31
</li> </ul> <div class="footer"><a href="https://www.sogou.com/web?m2web=mingyi.sogou.com">医疗</a></div> - Network accessline 32
</ul> <div class="footer"><a href="https://www.sogou.com/web?m2web=mingyi.sogou.com">医疗</a></div> """ - Network accessline 33
<div class="footer"><a href="https://www.sogou.com/web?m2web=mingyi.sogou.com">医疗</a></div> - Network accessline 39
assert [i["title"] for i in items] == ["你的AI编程助手,可能正在偷你的代码", "第二篇文章"] first = items[0] assert first["url"] == "https://weixin.sogou.com/link?url=dn9a_abc&type=2&query=AI" - Network accessline 40
first = items[0] assert first["url"] == "https://weixin.sogou.com/link?url=dn9a_abc&type=2&query=AI" assert first["source_name"] == "自落果" - Network accessline 41
assert first["url"] == "https://weixin.sogou.com/link?url=dn9a_abc&type=2&query=AI" - Network accessline 49
def test_sogou_antispider_raises_clear_error(): with patch.object(http, "fetch", return_value=(200, "https://weixin.sogou.com/antispider/?from=x", "")): - Network accessline 50
with patch.object(http, "fetch", return_value=(200, "https://weixin.sogou.com/antispider/?from=x", "")): - Network accessline 62
TOUTIAO_HTML = "<html><body>" + _card({ "title": "开拓者<em>AI编程助手</em> 重磅发布!", "group_id": "7682701133227344384", "info": {"url": "https://www.toutiao.com/group/7682701133227344384/"}, - Network accessline 63
"title": "开拓者<em>AI编程助手</em> 重磅发布!", "group_id": "7682701133227344384", "info": {"url": "https://www.toutiao.com/group/7682701133227344384/"}, "article_url": "http://finance.sina.com.cn/wm/2026-09-07/doc.shtml", - Network accessline 64
"info": {"url": "https://www.toutiao.com/group/7682701133227344384/"}, - Network accessline 65
"article_url": "http://finance.sina.com.cn/wm/2026-09-07/doc.shtml", - Network accessline 75
item = items[0] assert item["title"] == "开拓者AI编程助手 重磅发布!" assert item["url"] == "https://www.toutiao.com/group/7682701133227344384/" - Network accessline 76
assert item["title"] == "开拓者AI编程助手 重磅发布!" assert item["url"] == "https://www.toutiao.com/group/7682701133227344384/" assert item["original_url"].startswith("http://finance.sina.com.cn") - Network accessline 77
assert item["url"] == "https://www.toutiao.com/group/7682701133227344384/" - Network accessline 78
assert item["original_url"].startswith("http://finance.sina.com.cn") - Network accessline 85
def test_toutiao_retries_empty_shell_pages(): shell = (200, "https://so.toutiao.com/search?keyword=x", "<html><script>var druid={}</script></html>") - Network accessline 86
shell = (200, "https://so.toutiao.com/search?keyword=x", "<html><script>var druid={}</script></html>") full = (200, "https://so.toutiao.com/search?keyword=x", TOUTIAO_HTML) with patch.object(http, "fetch", side_effect=[shell, full]) - Network accessline 87
full = (200, "https://so.toutiao.com/search?keyword=x", TOUTIAO_HTML) with patch.object(http, "fetch", side_effect=[shell, full]), patch("lib.toutiao.time.sleep"): items = toutiao._search_via_so("AI编程助手") - Network accessline 93
def test_toutiao_hot_board_strips_tracking_query(): payload = {"data": [{"Title": "热点", "Url": "https://www.toutiao.com/trending/769/?log_pb=%7B%7D&rank=1", "HotValue": "123"}]} - Network accessline 94
payload = {"data": [{"Title": "热点", "Url": "https://www.toutiao.com/trending/769/?log_pb=%7B%7D&rank=1", "HotValue": "123"}]} - Network accessline 95
with patch.object(http, "get", return_value=payload): hot = toutiao.fetch_hot(5) assert hot[0]["url"] == "https://www.toutiao.com/trending/769/" - Network accessline 96
hot = toutiao.fetch_hot(5) assert hot[0]["url"] == "https://www.toutiao.com/trending/769/" assert hot[0]["hot_value"] == 123 - Network accessline 97
assert hot[0]["url"] == "https://www.toutiao.com/trending/769/" - Network accessline 107
def get_json(self, url, **kwargs): return {"ok": -100, "url": "https://passport.weibo.com/sso/signin?entry=wapsso"} - Network accessline 108
return {"ok": -100, "url": "https://passport.weibo.com/sso/signin?entry=wapsso"} - Network accessline 145
items = weibo.parse_mobile_cards(payload) assert len(items) == 2 assert items[0]["url"] == "https://weibo.com/7/Abc123" - Network accessline 146
assert len(items) == 2 assert items[0]["url"] == "https://weibo.com/7/Abc123" assert items[0]["date"] == "2026-09-22" - Network accessline 147
assert items[0]["url"] == "https://weibo.com/7/Abc123" - Network accessline 175
def test_xhs_mcp_feed_parsing_with_xsec_token(): parsed = xiaohongshu.parse_mcp_feed(MCP_FEED) assert parsed["url"] == ("https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b" - Network accessline 176
[Credential-related source omitted] - Network accessline 177
assert parsed["url"] == ("https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b" - Network accessline 195
with patch.object(http, "get", side_effect=fake_get), patch.object(http, "post", side_effect=fake_post): items = xiaohongshu._search_via_mcp("AI 编程助手", "default", 20, "http://127.0.0.1:18060/") - Network accessline 196
items = xiaohongshu._search_via_mcp("AI 编程助手", "default", 20, "http://127.0.0.1:18060/") - Network accessline 197
assert calls["url"] == "http://127.0.0.1:18060/api/v1/feeds/search" - Network accessline 223
"text_extra": [{"hashtag_name": "效率"}], "video": {"duration": 15230}} parsed = douyin.parse_aweme(aweme) assert parsed["url"] == "https://www.douyin.com/video/7234" - Network accessline 224
parsed = douyin.parse_aweme(aweme) assert parsed["url"] == "https://www.douyin.com/video/7234" assert parsed["date"] == "2026-09-21" - Network accessline 225
assert parsed["url"] == "https://www.douyin.com/video/7234" - Network accessline 233
with patch.object(http, "get", return_value=payload): hot = douyin.fetch_hot(10) assert hot == [{"rank": 1, "title": "中国男足获亚运铜牌", "url": "https://www.douyin.com/hot/2679413", - Network accessline 234
hot = douyin.fetch_hot(10) assert hot == [{"rank": 1, "title": "中国男足获亚运铜牌", "url": "https://www.douyin.com/hot/2679413", "hot_value": 11596271, "label": "", "event_time": None}] - Network accessline 235
assert hot == [{"rank": 1, "title": "中国男足获亚运铜牌", "url": "https://www.douyin.com/hot/2679413", - Access to secretsline 245
[Credential-related source omitted] - Network accessline 250
BAIDU_HTML = """ <div class="result-op c-container new-pmd" tpl="sg_kg_entity_san" mu="https://baike.baidu.com/item/x"> - Network accessline 251
<div class="result-op c-container new-pmd" tpl="sg_kg_entity_san" mu="https://baike.baidu.com/item/x"> - Network accessline 252
<h3><a href="https://baike.baidu.com/item/x">百科卡片</a></h3></div> - Network accessline 253
<div class="result-op c-container new-pmd" tpl="ai_ecology" mu="http://nourl.ubs.baidu.com/aiapp-1"><h3><a href="#">AI 应用</a></h3></div> - Network accessline 254
<div class="result c-container xpath-log new-pmd" tpl="www_index" mu="https://blog.csdn.net/a/article/details/1?x=1&y=2"> - Network accessline 255
<h3 class="t"><a href="http://www.baidu.com/link?url=abc">2026年<em>AI编程</em>工具实战</a></h3> - Network accessline 258
<span class="cosc-source-text cos-line-clamp-1">CSDN博客</span> </div> <div class="result c-container new-pmd" data-tuiguang="1" mu="https://ad.test/"><h3><a href="https://ad.test/">广告</a></h3></div> - Network accessline 259
</div> <div class="result c-container new-pmd" data-tuiguang="1" mu="https://ad.test/"><h3><a href="https://ad.test/">广告</a></h3></div> """ - Network accessline 260
<div class="result c-container new-pmd" data-tuiguang="1" mu="https://ad.test/"><h3><a href="https://ad.test/">广告</a></h3></div> - Network accessline 266
assert len(items) == 1 item = items[0] assert item["url"] == "https://blog.csdn.net/a/article/details/1?x=1&y=2" - Network accessline 267
item = items[0] assert item["url"] == "https://blog.csdn.net/a/article/details/1?x=1&y=2" assert item["title"] == "2026年AI编程工具实战" - Network accessline 268
assert item["url"] == "https://blog.csdn.net/a/article/details/1?x=1&y=2" - Network accessline 276
def test_baidu_qianfan_references_are_parsed(): payload = {"references": [ {"id": 1, "title": "<b>标题</b>", "url": "https://news.test/a", "content": "内容", "date": "2026-09-30 10:00:00", "website": "新闻网"}, - Network accessline 277
payload = {"references": [ {"id": 1, "title": "<b>标题</b>", "url": "https://news.test/a", "content": "内容", "date": "2026-09-30 10:00:00", "website": "新闻网"}, {"id": 2, "title": "", "url": "https://skip.test"}, - Network accessline 278
{"id": 1, "title": "<b>标题</b>", "url": "https://news.test/a", "content": "内容", "date": "2026-09-30 10:00:00", "website": "新闻网"}, - Network accessline 279
{"id": 2, "title": "", "url": "https://skip.test"}, - Network accessline 293
def test_baidu_hot_board_from_s_data(): data = {"data": {"cards": [{"content": [ {"word": "置顶话题", "hotScore": "7904077", "isTop": True, "rawUrl": "https://www.baidu.com/s?wd=a"}, - Network accessline 294
data = {"data": {"cards": [{"content": [ {"word": "置顶话题", "hotScore": "7904077", "isTop": True, "rawUrl": "https://www.baidu.com/s?wd=a"}, {"word": "巴勒斯坦球员向国足道歉", "hotScore": "7807888", "hotTag": "3", "rawUrl": "https://www. - Network accessline 295
{"word": "置顶话题", "hotScore": "7904077", "isTop": True, "rawUrl": "https://www.baidu.com/s?wd=a"}, - Network accessline 296
{"word": "巴勒斯坦球员向国足道歉", "hotScore": "7807888", "hotTag": "3", "rawUrl": "https://www.baidu.com/s?wd=b", "desc": "描述"},
tests/test_query.py
- Executable scriptline 1
Executable file
tests/test_query_type.py
- Executable scriptline 1
Executable file
tests/test_relevance.py
- Executable scriptline 1
Executable file
tests/test_render_v4.py
- Executable scriptline 1
Executable file - Network accessline 37
def test_compact_shows_wechat_account_and_toutiao_source(): report = _report() report.wechat = [schema.WechatItem(id="WX1", title="文章", snippet="摘要", url="https://w.test", - Network accessline 38
report = _report() report.wechat = [schema.WechatItem(id="WX1", title="文章", snippet="摘要", url="https://w.test", source_name="自落果", score=80, date="2026-09-21")] - Network accessline 39
report.wechat = [schema.WechatItem(id="WX1", title="文章", snippet="摘要", url="https://w.test", - Network accessline 40
source_name="自落果", score=80, date="2026-09-21")] report.toutiao = [schema.ToutiaoItem(id="TT1", title="头条文章", abstract="摘要文字", url="https://t.test", source_name="新浪财经", score=70, date="2026-09-07 - Network accessline 41
report.toutiao = [schema.ToutiaoItem(id="TT1", title="头条文章", abstract="摘要文字", url="https://t.test", - Network accessline 49
def test_multiline_bodies_are_collapsed(): report = _report() report.bilibili = [schema.BilibiliItem(id="BL1", title="标题", url="https://b.test", bvid="BV1", - Network accessline 50
report = _report() report.bilibili = [schema.BilibiliItem(id="BL1", title="标题", url="https://b.test", bvid="BV1", channel_name="up", description="第一行\n第二行\n\n第三行", score=60)] - Network accessline 51
report.bilibili = [schema.BilibiliItem(id="BL1", title="标题", url="https://b.test", bvid="BV1", - Network accessline 58
report = _report() report.hackernews = [schema.GlobalItem(id="HN1", platform="hackernews", title="Claude Code tips", url="https://news.ycombinator.com/item?id=1", author="pg", - Network accessline 59
report.hackernews = [schema.GlobalItem(id="HN1", platform="hackernews", title="Claude Code tips", url="https://news.ycombinator.com/item?id=1", author="pg", - Network accessline 60
url="https://news.ycombinator.com/item?id=1", author="pg", - Network accessline 78
def test_fallback_only_sources_get_a_warning(): report = _report() report.zhihu = [schema.ZhihuItem(id="ZH1", title="问题", excerpt="", url="https://www.zhihu.com/question/1", - Network accessline 79
report = _report() report.zhihu = [schema.ZhihuItem(id="ZH1", title="问题", excerpt="", url="https://www.zhihu.com/question/1", author="", score=50)] - Network accessline 80
report.zhihu = [schema.ZhihuItem(id="ZH1", title="问题", excerpt="", url="https://www.zhihu.com/question/1", - Network accessline 96
def test_full_report_includes_status_footer(): report = _report() report.baidu = [schema.BaiduItem(id="BD1", title="百度结果", snippet="摘要", url="https://b.test", - Network accessline 97
report = _report() report.baidu = [schema.BaiduItem(id="BD1", title="百度结果", snippet="摘要", url="https://b.test", source_domain="CSDN博客", score=40, date="2026-09-21")] - Network accessline 98
report.baidu = [schema.BaiduItem(id="BD1", title="百度结果", snippet="摘要", url="https://b.test", - Network accessline 105
def test_context_snippet_lists_sources_with_links(): report = _report() report.bilibili = [schema.BilibiliItem(id="BL1", title="视频", url="https://b.test/v", bvid="BV1", - Network accessline 106
report = _report() report.bilibili = [schema.BilibiliItem(id="BL1", title="视频", url="https://b.test/v", bvid="BV1", channel_name="up", score=90)] - Network accessline 107
report.bilibili = [schema.BilibiliItem(id="BL1", title="视频", url="https://b.test/v", bvid="BV1", - Network accessline 108
channel_name="up", score=90)] snippet = render.render_context_snippet(report) assert "[B站] 视频 — https://b.test/v" in snippet - Network accessline 110
assert "[B站] 视频 — https://b.test/v" in snippet
tests/test_render_wechat.py
- Executable scriptline 1
Executable file - Network accessline 11
item = schema.WechatItem( id="WX1", title="测试文章", snippet="摘要", url="https://example.com", source_name="测试号", - Network accessline 12
id="WX1", title="测试文章", snippet="摘要", url="https://example.com", source_name="测试号", score=50, why_relevant="测试", - Network accessline 13
url="https://example.com", source_name="测试号",
tests/test_render_xss.py
- Executable scriptline 1
Executable file - Network accessline 19
def test_safe_href_allows_http_https(): assert render._safe_href("http://example.com/a") == "http://example.com/a" - Network accessline 20
assert render._safe_href("http://example.com/a") == "http://example.com/a" - Network accessline 21
assert render._safe_href("https://example.com/a") == "https://example.com/a" - Network accessline 23
assert render._safe_href(" https://example.com ") == "https://example.com"
tests/test_score.py
tests/test_search_fallbacks.py
- Executable scriptline 1
Executable file - Network accessline 36
fake = _engines({ "bing_cn": [ SearchResult("小红书 AI 工具测评", "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b", "AI 工具测评摘要", "bing_cn"), - Network accessline 37
"bing_cn": [ SearchResult("小红书 AI 工具测评", "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b", "AI 工具测评摘要", "bing_cn"), SearchResult("AI 工具 招聘", "https://job.xiaohongshu.com/campus/position/1", "AI 工具 岗位", - Network accessline 38
SearchResult("小红书 AI 工具测评", "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b", "AI 工具测评摘要", "bing_cn"), - Network accessline 39
SearchResult("AI 工具 招聘", "https://job.xiaohongshu.com/campus/position/1", "AI 工具 岗位", "bing_cn"), - Network accessline 52
fake = _engines({ "bing_cn": websearch.EngineBlocked("homepage"), "ddg": [SearchResult("知乎 AI 工具讨论 - 知乎", "https://www.zhihu.com/question/123456", "AI 工具 讨论", "ddg")], - Network accessline 53
"bing_cn": websearch.EngineBlocked("homepage"), "ddg": [SearchResult("知乎 AI 工具讨论 - 知乎", "https://www.zhihu.com/question/123456", "AI 工具 讨论", "ddg")], }) - Network accessline 54
"ddg": [SearchResult("知乎 AI 工具讨论 - 知乎", "https://www.zhihu.com/question/123456", "AI 工具 讨论", "ddg")], - Network accessline 67
fake = _engines({ "bing_cn": [SearchResult("体育赛事地图", "https://www.douyin.com/video/7234567890", "活动地图", "bing_cn")], - Network accessline 68
"bing_cn": [SearchResult("体育赛事地图", "https://www.douyin.com/video/7234567890", "活动地图", "bing_cn")], - Network accessline 69
"ddg": [SearchResult("抖音 AI 编程助手实测", "https://www.douyin.com/video/7234567891", "AI 编程助手", "ddg")], - Network accessline 80
def test_toutiao_site_search_parses_dates_from_snippets(): fake = _engines({ "bing_cn": [SearchResult("头条 AI 编程助手评测", "https://www.toutiao.com/article/7234567890/", "AI 编程助手", "bing_cn", "2026-05-30")], - Network accessline 81
fake = _engines({ "bing_cn": [SearchResult("头条 AI 编程助手评测", "https://www.toutiao.com/article/7234567890/", "AI 编程助手", "bing_cn", "2026-05-30")], }) - Network accessline 82
"bing_cn": [SearchResult("头条 AI 编程助手评测", "https://www.toutiao.com/article/7234567890/", "AI 编程助手", "bing_cn", "2026-05-30")],
tests/test_skill_payload.py
- Executable scriptline 1
Executable file
tests/test_sources_pipeline.py
- Executable scriptline 1
Executable file - Network accessline 95
def test_run_sources_isolates_errors_and_enforces_deadlines(): def good(ctx): return [{"title": "AI编程助手 评测", "url": "https://x.test/1", "source": "api"}] - Network accessline 97
return [{"title": "AI编程助手 评测", "url": "https://x.test/1", "source": "api"}] - Network accessline 125
"bilibili": { "items": [ {"id": "BL1", "title": "AI编程助手 新功能", "url": "https://b.test/1", "bvid": "BV1", - Network accessline 126
"items": [ {"id": "BL1", "title": "AI编程助手 新功能", "url": "https://b.test/1", "bvid": "BV1", "channel_name": "up", "date": "2026-09-20", "relevance": 0.9, - Network accessline 127
{"id": "BL1", "title": "AI编程助手 新功能", "url": "https://b.test/1", "bvid": "BV1", - Network accessline 128
"channel_name": "up", "date": "2026-09-20", "relevance": 0.9, "engagement": {"views": 100}, "source": "wbi-search"}, {"id": "BL2", "title": "AI编程助手 旧视频", "url": "https://b.test/2", "bvid": "BV2", - Network accessline 129
"engagement": {"views": 100}, "source": "wbi-search"}, {"id": "BL2", "title": "AI编程助手 旧视频", "url": "https://b.test/2", "bvid": "BV2", "channel_name": "up2", "date": "2025-01-01", "relevance": 0.9, "source": - Network accessline 130
{"id": "BL2", "title": "AI编程助手 旧视频", "url": "https://b.test/2", "bvid": "BV2", - Network accessline 149
def test_query_terms_alone_do_not_make_a_cross_platform_cluster(): raw = { "bilibili": {"items": [{"id": "BL1", "title": "AI编程助手", "url": "https://b.test/1", "bvid": "BV1", - Network accessline 150
raw = { "bilibili": {"items": [{"id": "BL1", "title": "AI编程助手", "url": "https://b.test/1", "bvid": "BV1", "channel_name": "a", "date": "2026-09-20", "relevance": 1.0}], - Network accessline 151
"bilibili": {"items": [{"id": "BL1", "title": "AI编程助手", "url": "https://b.test/1", "bvid": "BV1", - Network accessline 152
"channel_name": "a", "date": "2026-09-20", "relevance": 1.0}], "error": None, "state": "ok", "via": {}}, "toutiao": {"items": [{"id": "TT1", "title": "开拓者AI编程助手 重磅发布!", "url": "https://t.test/1", - Network accessline 153
"error": None, "state": "ok", "via": {}}, "toutiao": {"items": [{"id": "TT1", "title": "开拓者AI编程助手 重磅发布!", "url": "https://t.test/1", "source_name": "新浪财经", "date": "2026-09-20", "relevance": 1.0}], - Network accessline 154
"toutiao": {"items": [{"id": "TT1", "title": "开拓者AI编程助手 重磅发布!", "url": "https://t.test/1",
tests/test_trending.py
- Executable scriptline 1
Executable file - Network accessline 20
"code": label, "kind": kind, "items": [{"rank": i + 1, "title": t, "url": f"https://x.test/{label}/{i}"} for i, t in enumerate(titles)], - Network accessline 21
"kind": kind, "items": [{"rank": i + 1, "title": t, "url": f"https://x.test/{label}/{i}"} for i, t in enumerate(titles)], } - Network accessline 22
"items": [{"rank": i + 1, "title": t, "url": f"https://x.test/{label}/{i}"} for i, t in enumerate(titles)], - Network accessline 92
def test_custom_feeds_from_env(monkeypatch): monkeypatch.setenv("LAST30DAYS_HOT_FEEDS", "36氪快讯|https://rsshub.test/36kr/newsflashes,https://plain.test/rss") - Network accessline 93
monkeypatch.setenv("LAST30DAYS_HOT_FEEDS", "36氪快讯|https://rsshub.test/36kr/newsflashes,https://plain.test/rss") - Network accessline 94
feeds = trending.custom_feeds() assert list(feeds.values()) == [("36氪快讯", "https://rsshub.test/36kr/newsflashes"), ("RSS2", "https://plain.test/rss")] assert "feed1" in trending.parse_sources(None) - Network accessline 95
assert list(feeds.values()) == [("36氪快讯", "https://rsshub.test/36kr/newsflashes"), ("RSS2", "https://plain.test/rss")] - Network accessline 99
RSS = """<?xml version="1.0" encoding="utf-8"?> <rss version="2.0"><channel> <item><title><![CDATA[旧文章]]></title><link>https://a.test/1</link><pubDate>Fri, 02 Oct 2026 08:00:00 +0800</pubDate></item> - Network accessline 100
<rss version="2.0"><channel> <item><title><![CDATA[旧文章]]></title><link>https://a.test/1</link><pubDate>Fri, 02 Oct 2026 08:00:00 +0800</pubDate></item> <item><title>新文章</title><link>https://a.test/2</link><pubDate>Sat, 03 Oct 2026 11:21:48 - Network accessline 101
<item><title><![CDATA[旧文章]]></title><link>https://a.test/1</link><pubDate>Fri, 02 Oct 2026 08:00:00 +0800</pubDate></item> - Network accessline 102
<item><title>新文章</title><link>https://a.test/2</link><pubDate>Sat, 03 Oct 2026 11:21:48 GMT</pubDate></item> - Network accessline 105
ATOM = """<feed xmlns="http://www.w3.org/2005/Atom"><entry><title>Atom 条目</title> - Network accessline 106
<link href="https://b.test/1"/><updated>2026-10-03T09:00:00+08:00</updated></entry></feed>""" - Network accessline 112
assert rows[0]["published"] == "2026-10-03 19:21" atom = trending.parse_feed(ATOM) assert atom[0]["url"] == "https://b.test/1" and atom[0]["published"] == "2026-10-03 09:00" - Network accessline 113
atom = trending.parse_feed(ATOM) assert atom[0]["url"] == "https://b.test/1" and atom[0]["published"] == "2026-10-03 09:00" assert trending.parse_feed("not xml") == [] - Network accessline 114
assert atom[0]["url"] == "https://b.test/1" and atom[0]["published"] == "2026-10-03 09:00" - Network accessline 140
def test_fetch_all_isolates_failures(): def ok(limit): return [{"rank": 1, "title": "热点", "url": "https://x.test"}] - Network accessline 142
return [{"rank": 1, "title": "热点", "url": "https://x.test"}] - Network accessline 177
("unavailable", {"label": "来源状态", "items": [], "error": "upstream timeout"}), ]) topics = [{"title": "跨平台{}".format(i), "url": "https://x.test/topic", "platform_count": 2, - Network accessline 178
]) topics = [{"title": "跨平台{}".format(i), "url": "https://x.test/topic", "platform_count": 2, "mentions": [{"platform": "weibo", "label": "微博", "rank": 2, "url": "https://x.test/2"}]} - Network accessline 179
topics = [{"title": "跨平台{}".format(i), "url": "https://x.test/topic", "platform_count": 2, - Network accessline 180
"mentions": [{"platform": "weibo", "label": "微博", "rank": 2, "url": "https://x.test/2"}]}
tests/test_version.py
- Executable scriptline 1
Executable file
tests/test_websearch.py
- Executable scriptline 1
Executable file - Network accessline 25
def _bing_href(target: str) -> str: encoded = base64.urlsafe_b64encode(target.encode()).decode().rstrip("=") return f"https://www.bing.com/ck/a?!&&p=abc&u=a1{encoded}&ntb=1" - Network accessline 27
return f"https://www.bing.com/ck/a?!&&p=abc&u=a1{encoded}&ntb=1" - Network accessline 31
<ol id="b_results"> <li class="b_algo" data-id="1"> <div class="b_tpcn"><a class="tilk" href="{_bing_href('https://www.zhihu.com/question/123')}">zhihu.com</a></div> - Network accessline 32
<li class="b_algo" data-id="1"> <div class="b_tpcn"><a class="tilk" href="{_bing_href('https://www.zhihu.com/question/123')}">zhihu.com</a></div> <h2 class=""><a target="_blank" href="{_bing_href('https://www.zhihu.com/question/123')}"> - Network accessline 33
<div class="b_tpcn"><a class="tilk" href="{_bing_href('https://www.zhihu.com/question/123')}">zhihu.com</a></div> - Network accessline 34
<h2 class=""><a target="_blank" href="{_bing_href('https://www.zhihu.com/question/123')}"><strong>AI</strong> 编程助手怎么选?</a></h2> - Network accessline 36
</li> <li class="b_algo"> <h2><a href="https://example.com/plain">Plain result</a></h2> - Network accessline 37
<li class="b_algo"> <h2><a href="https://example.com/plain">Plain result</a></h2> <p>no caption wrapper</p> - Network accessline 38
<h2><a href="https://example.com/plain">Plain result</a></h2> - Network accessline 52
def test_unwrap_bing_redirect_links(): assert websearch.unwrap_bing_url(_bing_href("https://a.test/x?y=1")) == "https://a.test/x?y=1" - Network accessline 53
assert websearch.unwrap_bing_url(_bing_href("https://a.test/x?y=1")) == "https://a.test/x?y=1" - Network accessline 54
assert websearch.unwrap_bing_url("https://plain.test/") == "https://plain.test/" - Network accessline 59
assert len(results) == 2 first = results[0] assert first.url == "https://www.zhihu.com/question/123" - Network accessline 60
first = results[0] assert first.url == "https://www.zhihu.com/question/123" assert first.title == "AI 编程助手怎么选?" - Network accessline 61
assert first.url == "https://www.zhihu.com/question/123" - Network accessline 63
assert first.date == "2026-09-21" assert "横评" in first.snippet assert results[1].url == "https://example.com/plain" - Network accessline 65
assert results[1].url == "https://example.com/plain" - Network accessline 69
results = websearch.parse_ddg_html(DDG_HTML) assert len(results) == 1 assert results[0].url == "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b" - Network accessline 70
assert len(results) == 1 assert results[0].url == "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b" assert results[0].date == "2026-09-03" - Network accessline 71
assert results[0].url == "https://www.xiaohongshu.com/explore/65a1b2c3d4e5f60718293a4b" - Network accessline 93
table = { "bing_cn": [ SearchResult("活动地图", "https://www.zhihu.com/question/1", "体育赛事", "bing_cn"), # decoy - Network accessline 94
"bing_cn": [ SearchResult("活动地图", "https://www.zhihu.com/question/1", "体育赛事", "bing_cn"), # decoy SearchResult("AI 编程助手推荐", "https://www.zhihu.com/question/2", "", "bing_cn"), - Network accessline 95
SearchResult("活动地图", "https://www.zhihu.com/question/1", "体育赛事", "bing_cn"), # decoy - Network accessline 96
SearchResult("AI 编程助手推荐", "https://www.zhihu.com/question/2", "", "bing_cn"), - Network accessline 97
SearchResult("AI 编程助手推荐", "https://other.test/2", "", "bing_cn"), # wrong site - Network accessline 101
results = websearch.search("site:zhihu.com AI 编程助手", topic="AI 编程助手", url_pattern=r"zhihu\.com/question/\d+") assert [r.url for r in results] == ["https://www.zhihu.com/question/2"] - Network accessline 103
assert [r.url for r in results] == ["https://www.zhihu.com/question/2"] - Network accessline 113
engines = _fake_engines({"ddg": [SearchResult("AI 编程助手", "https://x.test/1", "", "ddg")]}) - Network accessline 123
def test_stops_after_first_engine_with_validated_hits(): hit = SearchResult("AI 编程助手", "https://x.test/1", "", "bing_cn") - Network accessline 124
hit = SearchResult("AI 编程助手", "https://x.test/1", "", "bing_cn") - Network accessline 143
def test_bing_homepage_redirect_is_detected(): assert websearch._is_bing_homepage("https://www.bing.com/?q=x", "<div class=\"hp_body\"></div>") - Network accessline 144
assert websearch._is_bing_homepage("https://www.bing.com/?q=x", "<div class=\"hp_body\"></div>") - Network accessline 145
assert not websearch._is_bing_homepage("https://www.bing.com/search?q=x", '<li class="b_algo">')
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: 37 facts
- Contacts qianfan.baidubce.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/baidu.py:22High confidence
- Contacts www.baidu.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/baidu.py:175High confidence
- Contacts top.baidu.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/baidu.py:295High confidence
- Contacts search.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/bilibili.py:26High confidence
- Contacts api.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/bilibili.py:27High confidence
- Contacts s.search.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/bilibili.py:31High confidence
- Contacts www.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/bilibili.py:307High confidence
- Contacts www.xiaohongshu.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:78High confidence
- Contacts passport.weibo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:85High confidence
- Contacts www.zhihu.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:93High confidence
- Contacts www.douyin.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:99High confidence
- Contacts passport.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:105High confidence
- Contacts m.weibo.cn, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:512High confidence
- Contacts weibo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:631High confidence
- Contacts search.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:993High confidence
- Contacts www.bilibili.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/crawler_bridge.py:1014High confidence
- Contacts www.douyin.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/douyin.py:24High confidence
- Contacts api.tikhub.io, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/douyin.py:112High confidence
- Contacts www.zhihu.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/env.py:320High confidence
- Contacts hn.algolia.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/hackernews.py:15High confidence
- Contacts news.ycombinator.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/hackernews.py:63High confidence
- Contacts www.reddit.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/reddit.py:15High confidence
- Contacts old.reddit.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/reddit.py:15High confidence
- Contacts so.toutiao.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/toutiao.py:23High confidence
- Contacts www.toutiao.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/toutiao.py:24High confidence
- Contacts www.ithome.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/trending.py:40High confidence
- Contacts rss.huxiu.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/trending.py:41High confidence
- Contacts sspai.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/trending.py:42High confidence
- Contacts www.ifanr.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/trending.py:43High confidence
- Contacts www.solidot.org, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/trending.py:44High confidence
- Contacts html.duckduckgo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/websearch.py:208High confidence
- Contacts weixin.sogou.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/wechat.py:21High confidence
- Contacts api.jisuapi.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/wechat.py:112High confidence
- Contacts m.weibo.cn, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/weibo.py:26High confidence
- Contacts weibo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/weibo.py:27High confidence
- Contacts passport.weibo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/weibo.py:28High confidence
- Contacts api.weibo.com, which SKILL.md, the README and the plugin manifest do not mentionscripts/lib/weibo.py:139High confidence
Signal confidence: 463 facts
- Network access in prose of documentationAGENTS.md:18Low confidence
- Network access in prose of documentationAGENTS.md:19Low confidence
- Network access in prose of documentationAGENTS.md:20Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueAGENTS.md:42Low confidence
- Network access in prose of documentationREADME.en.md:13Low confidence
- Network access in prose of documentationREADME.en.md:14Low confidence
- Network access in code of documentationREADME.en.md:30Low confidence
- Network access in prose of documentationREADME.en.md:41Low confidence
- Network access in prose of documentationREADME.en.md:47Low confidence
- Network access in prose of documentationREADME.en.md:78Low confidence
- Network access in prose of documentationREADME.en.md:79Low confidence
- Network access in prose of documentationREADME.en.md:82Low confidence
- Network access in prose of documentationREADME.en.md:83Low confidence
- Network access in prose of documentationREADME.en.md:84Low confidence
- Network access in prose of documentationREADME.en.md:85Low confidence
- Network access in prose of documentationREADME.en.md:86Low confidence
- Network access in prose of documentationREADME.en.md:99Low confidence
- Network access in prose of documentationREADME.en.md:105Low confidence
- Network access in prose of documentationREADME.en.md:106Low confidence
- Network access in prose of documentationREADME.md:20Low confidence
- Network access in prose of documentationREADME.md:21Low confidence
- Network access in code of documentationREADME.md:43Low confidence
- Network access in prose of documentationREADME.md:54Low confidence
- Network access in prose of documentationREADME.md:60Low confidence
- Network access in prose of documentationREADME.md:91Low confidence
- Network access in prose of documentationREADME.md:92Low confidence
- Network access in prose of documentationREADME.md:95Low confidence
- Network access in prose of documentationREADME.md:96Low confidence
- Network access in prose of documentationREADME.md:97Low confidence
- Network access in prose of documentationREADME.md:98Low confidence
- Network access in prose of documentationREADME.md:99Low confidence
- Network access in prose of documentationREADME.md:112Low confidence
- Network access in prose of documentationREADME.md:118Low confidence
- Network access in prose of documentationREADME.md:119Low confidence
- Network access in prose of documentationSECURITY.md:13Low confidence
- Network access in prose of documentationSECURITY.md:14Low confidence
- Network access in prose of documentationSECURITY.md:15Low confidence
- Network access in prose of documentationSECURITY.md:16Low confidence
- Broad permissions in the frontmatter of the SKILL.mdSKILL.md:1High confidence
- Access to secrets in the frontmatter of the SKILL.mdSKILL.md:18Low confidence
- Access to secrets in the frontmatter of the SKILL.mdSKILL.md:19Low confidence
- Access to secrets in the frontmatter of the SKILL.mdSKILL.md:20Low confidence
- Access to secrets in the frontmatter of the SKILL.mdSKILL.md:21Low confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueSKILL.md:132Low confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueSKILL.md:135Low confidence
- Access to secrets in code of the SKILL.mdSKILL.md:160High confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueSKILL.md:161Low confidence
- Access to secrets in code of the SKILL.md: a variable, placeholder or call, not a stored valueSKILL.md:162Low confidence
- Network access in prose of documentationSPEC.md:3Low confidence
- Network access in prose of documentationSPEC.md:71Low confidence
and 413 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest .claude-plugin/marketplace.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Native | Manifest gemini-extension.json | .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.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/jesseovo-last30days-skill-cn/)