#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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
2.1kGitHub stars
60stars in 7 days
2skills in this repository
23commits in 30 days

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

Aug 2, 2026Nov 7, 20262,072

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

2,638 tokens

When the skill is activated

Reference documents

18,179 tokens

Loaded on request

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

The playbook

  1. Core rule
  2. 1. Pick the mode
  3. 2. Topic research
  4. 3. Hot board (全网热榜)
  5. 4. Overseas sources (opt-in)
  6. 5. 输出契约 (output contract)
  7. 6. Login-gated platforms and diagnostics
  8. 7. Synthesis guidance
  9. Configuration
  10. Compliance

Scripts executed separately

  • hooks/scripts/check-config.sh
  • scripts/build_payload.py
  • scripts/last30days.py
  • scripts/lib/__init__.py
  • scripts/lib/baidu.py
  • scripts/lib/bilibili.py
  • scripts/lib/cache.py
  • scripts/lib/cjk.py
  • scripts/lib/cluster.py
  • scripts/lib/crawler_bridge.py
  • scripts/lib/dates.py
  • scripts/lib/dedupe.py
  • scripts/lib/doctor.py
  • scripts/lib/douyin.py
  • scripts/lib/env.py
  • scripts/lib/github.py
  • scripts/lib/hackernews.py
  • scripts/lib/hot_board.js
  • scripts/lib/hot_board.py
  • scripts/lib/http.py
  • scripts/lib/normalize.py
  • scripts/lib/pipeline.py
  • scripts/lib/query.py
  • scripts/lib/query_type.py
  • scripts/lib/reddit.py
  • scripts/lib/relevance.py
  • scripts/lib/render.py
  • scripts/lib/schema.py
  • scripts/lib/score.py
  • scripts/lib/setup_wizard.py
  • scripts/lib/sources.py
  • scripts/lib/toutiao.py
  • scripts/lib/trending.py
  • scripts/lib/upstream_bridge.py
  • scripts/lib/version.py
  • scripts/lib/websearch.py
  • scripts/lib/wechat.py
  • scripts/lib/weibo.py
  • scripts/lib/xiaohongshu.py
  • scripts/lib/zhihu.py
  • scripts/sync.sh
  • tests/__init__.py
  • tests/test_baidu_antibot.py
  • tests/test_bilibili_v4.py
  • tests/test_cache.py
  • tests/test_cjk.py
  • tests/test_cluster.py
  • tests/test_crawler_bridge.py
  • tests/test_crawler_login.py
  • tests/test_dates.py
  • tests/test_dedupe.py
  • tests/test_doctor.py
  • tests/test_env_cli_v4.py
  • tests/test_env_sources.py
  • tests/test_global_sources.py
  • tests/test_html_render.py
  • tests/test_http.py
  • tests/test_http_v4.py
  • tests/test_normalize.py
  • tests/test_platform_parsers_v4.py
  • tests/test_query.py
  • tests/test_query_type.py
  • tests/test_relevance.py
  • tests/test_render_v4.py
  • tests/test_render_wechat.py
  • tests/test_render_xss.py
  • tests/test_score.py
  • tests/test_search_fallbacks.py
  • tests/test_skill_payload.py
  • tests/test_sources_pipeline.py
  • tests/test_trending.py
  • tests/test_version.py
  • tests/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 bytes
  • AGENTS.mddoc5,762 bytes
  • CLAUDE.mddoc11 bytes
  • LICENSEasset1,363 bytes
  • README.en.mddoc6,277 bytes
  • README.mddoc6,906 bytes
  • SECURITY.mddoc1,586 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SKILL.mdcore10,150 bytes
  • SPEC.mddoc8,153 bytes
  • TASKS.mddoc2,196 bytes
  • agents/openai.yamlasset500 bytes
  • assets/banner.pngasset1,442,056 bytes
  • assets/readme-board-dark.svgasset878 bytes
  • assets/readme-board-light.svgasset878 bytes
  • assets/readme-cover-dark.svgasset6,865 bytes
  • assets/readme-cover-light.svgasset6,865 bytes
  • assets/readme-discovery-dark.svgasset6,786 bytes
  • assets/readme-discovery-light.svgasset6,786 bytes
  • assets/readme-install-dark.svgasset846 bytes
  • assets/readme-install-light.svgasset846 bytes
  • assets/readme-typing-dark.svgasset1,462 bytes
  • assets/readme-typing-light.svgasset1,462 bytes
  • docs/usage.en.mddoc10,765 bytes
  • docs/usage.zh-CN.mddoc13,067 bytes
  • fixtures/bilibili_sample.jsonasset1,109 bytes
  • fixtures/weibo_sample.jsonasset979 bytes
  • fixtures/zhihu_sample.jsonasset1,289 bytes
  • gemini-extension.jsonasset2,294 bytes
  • hooks/hooks.jsonasset280 bytes
  • hooks/scripts/check-config.shruns3,781 bytes
  • release-notes.mddoc9,742 bytes
  • requirements.txtdoc682 bytes
  • scripts/build_payload.pyruns2,979 bytes
  • scripts/last30days.pyruns19,309 bytes
  • scripts/lib/__init__.pyruns29 bytes
  • scripts/lib/baidu.pyruns14,640 bytes
  • scripts/lib/bilibili.pyruns12,740 bytes
  • scripts/lib/cache.pyruns4,967 bytes
  • scripts/lib/cjk.pyruns2,961 bytes
  • scripts/lib/cluster.pyruns3,985 bytes
  • scripts/lib/crawler_bridge.pyruns49,594 bytes
  • scripts/lib/dates.pyruns3,907 bytes
  • scripts/lib/dedupe.pyruns8,943 bytes
  • scripts/lib/doctor.pyruns12,269 bytes
  • scripts/lib/douyin.pyruns8,742 bytes
  • scripts/lib/env.pyruns14,365 bytes
  • scripts/lib/github.pyruns4,900 bytes
  • scripts/lib/hackernews.pyruns3,747 bytes
  • scripts/lib/hot_board.cssasset24,031 bytes
  • scripts/lib/hot_board.jsruns11,869 bytes
  • scripts/lib/hot_board.pyruns17,758 bytes
  • scripts/lib/hot_board_cat.pngasset1,079 bytes
  • scripts/lib/http.pyruns17,581 bytes
  • scripts/lib/normalize.pyruns12,357 bytes
  • scripts/lib/pipeline.pyruns13,277 bytes
  • scripts/lib/query.pyruns7,998 bytes
  • scripts/lib/query_type.pyruns5,821 bytes
  • scripts/lib/reddit.pyruns3,577 bytes
  • scripts/lib/relevance.pyruns6,073 bytes
  • scripts/lib/render.pyruns32,075 bytes
  • scripts/lib/schema.pyruns19,776 bytes
  • scripts/lib/score.pyruns12,425 bytes
  • scripts/lib/setup_wizard.pyruns6,397 bytes
  • scripts/lib/sources.pyruns6,890 bytes
  • scripts/lib/toutiao.pyruns9,874 bytes
  • scripts/lib/trending.pyruns19,597 bytes
  • scripts/lib/upstream_bridge.pyruns10,144 bytes
  • scripts/lib/version.pyruns96 bytes
  • scripts/lib/websearch.pyruns12,153 bytes
  • scripts/lib/wechat.pyruns7,124 bytes
  • scripts/lib/weibo.pyruns14,165 bytes
  • scripts/lib/xiaohongshu.pyruns11,874 bytes
  • scripts/lib/zhihu.pyruns10,872 bytes
  • scripts/sync.shruns893 bytes
  • tests/__init__.pyruns19 bytes
  • tests/test_baidu_antibot.pyruns1,158 bytes
  • tests/test_bilibili_v4.pyruns4,984 bytes
  • tests/test_cache.pyruns4,131 bytes
  • tests/test_cjk.pyruns1,353 bytes
  • tests/test_cluster.pyruns2,019 bytes
  • tests/test_crawler_bridge.pyruns6,969 bytes
  • tests/test_crawler_login.pyruns6,131 bytes
  • tests/test_dates.pyruns6,009 bytes
  • tests/test_dedupe.pyruns4,233 bytes
  • tests/test_doctor.pyruns3,236 bytes
  • tests/test_env_cli_v4.pyruns7,541 bytes
  • tests/test_env_sources.pyruns1,787 bytes
  • tests/test_global_sources.pyruns9,072 bytes
  • tests/test_html_render.pyruns3,261 bytes
  • tests/test_http.pyruns3,514 bytes
  • tests/test_http_v4.pyruns4,121 bytes
  • tests/test_normalize.pyruns5,197 bytes
  • tests/test_platform_parsers_v4.pyruns14,370 bytes
  • tests/test_query.pyruns5,731 bytes
  • tests/test_query_type.pyruns7,070 bytes
  • tests/test_relevance.pyruns5,355 bytes
  • tests/test_render_v4.pyruns5,215 bytes
  • tests/test_render_wechat.pyruns1,325 bytes
  • tests/test_render_xss.pyruns1,399 bytes
  • tests/test_score.pyruns4,371 bytes
  • tests/test_search_fallbacks.pyruns3,716 bytes
  • tests/test_skill_payload.pyruns1,590 bytes
  • tests/test_sources_pipeline.pyruns7,214 bytes
  • tests/test_trending.pyruns10,477 bytes
  • tests/test_version.pyruns1,226 bytes
  • tests/test_websearch.pyruns5,565 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills 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

  1. #515 on Nov 1
  2. #519 on Nov 2
  3. #520 on Nov 3
  4. #521 on Nov 4
  5. #520 from Nov 5 to Nov 6
  6. #523 since Nov 7
82 earlier periods
  1. #457 on Aug 2
  2. #460 on Aug 8
  3. #456 on Aug 9
  4. #471 on Aug 10
  5. #469 on Aug 11
  6. #466 on Aug 12
  7. #476 on Aug 13
  8. #471 on Aug 14
  9. #459 on Aug 15
  10. #465 from Aug 16 to Aug 17
  11. #471 on Aug 18
  12. #469 on Aug 19
  13. #466 on Aug 20
  14. #467 on Aug 21
  15. #448 on Aug 22
  16. #456 on Aug 23
  17. #454 on Aug 24
  18. #455 on Aug 25
  19. #447 on Aug 26
  20. #452 on Aug 27
  21. #449 on Aug 28
  22. #442 on Aug 29
  23. #434 on Aug 30
  24. #445 on Aug 31
  25. #449 on Sep 1
  26. #442 on Sep 2
  27. #447 on Sep 3
  28. #434 on Sep 4
  29. #440 on Sep 5
  30. #439 on Sep 6
  31. #444 on Sep 7
  32. #455 on Sep 8
  33. #452 on Sep 9
  34. #455 on Sep 10
  35. #451 on Sep 11
  36. #449 on Sep 12
  37. #448 on Sep 13
  38. #460 on Sep 14
  39. #456 on Sep 15
  40. #465 on Sep 16
  41. #456 on Sep 17
  42. #466 on Sep 18
  43. #450 on Sep 19
  44. #463 on Sep 20
  45. #462 on Sep 21
  46. #470 on Sep 22
  47. #464 on Sep 23
  48. #453 from Sep 24 to Sep 25
  49. #447 on Sep 26
  50. #460 on Sep 27
  51. #468 on Sep 28
  52. #469 on Sep 29
  53. #468 on Sep 30
  54. #464 on Oct 1
  55. #460 on Oct 2
  56. #448 on Oct 3
  57. #444 on Oct 4
  58. #455 on Oct 5
  59. #463 on Oct 6
  60. #470 on Oct 7
  61. #479 on Oct 8
  62. #483 on Oct 9
  63. #477 on Oct 10
  64. #479 on Oct 11
  65. #490 on Oct 12
  66. #486 on Oct 13
  67. #488 on Oct 14
  68. #492 on Oct 15
  69. #495 on Oct 16
  70. #484 on Oct 17
  71. #486 on Oct 18
  72. #502 on Oct 19
  73. #505 on Oct 20
  74. #507 on Oct 21
  75. #502 on Oct 22
  76. #495 on Oct 23
  77. #484 on Oct 24
  78. #525 on Oct 25
  79. #523 on Oct 28
  80. #522 on Oct 29
  81. #521 on Oct 30
  82. #518 on Oct 31

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Network accessline 5
    "author": {     "name": "Jesse",     "url": "https://github.com/Jesseovo"
  • Network accessline 6
    "name": "Jesse",     "url": "https://github.com/Jesseovo"   },
  • Network accessline 7
    "url": "https://github.com/Jesseovo"

.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

  • Network accessline 6
    This project is a Chinese-localized fork of https://github.com/mvanhorn/last30days-skill
  • Network accessline 8
    Fork author: Jesse (https://github.com/Jesseovo)

README.en.md

  • Network accessline 13
    <p align="center">   <a href="https://jesseovo.github.io/last30days-skill-cn/">Open the daily hot board ↗</a> &ensp;·&ensp; <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> &ensp;·&ensp; <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&amp;label=Stars&amp;labelColor=eee8dc&amp;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&amp;label=Stars&amp;labelColor=eee8dc&amp;color=9a7651" alt="GitHub Stars" /></a>&ens
  • Network accessline 82
    <p align="center">   <a href="https://star-history.com/#Jesseovo/last30days-skill-cn&amp;Date">
  • Network accessline 83
    <a href="https://star-history.com/#Jesseovo/last30days-skill-cn&amp;Date">
  • Network accessline 84
    <picture>       <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&amp;type=Date&amp;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&amp;type=Date&amp;theme=dark" />
  • Network accessline 86
    <img src="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&amp;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&amp;label=Stars&amp;labelColor=eee8dc&amp;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&amp;label=Stars&amp;labelColor=eee8dc&amp;color=9a7651" alt="GitHub Stars" /></a>&ens
  • Network accessline 95
    <p align="center">   <a href="https://star-history.com/#Jesseovo/last30days-skill-cn&amp;Date">
  • Network accessline 96
    <a href="https://star-history.com/#Jesseovo/last30days-skill-cn&amp;Date">
  • Network accessline 97
    <picture>       <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&amp;type=Date&amp;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&amp;type=Date&amp;theme=dark" />
  • Network accessline 99
    <img src="https://api.star-history.com/svg?repos=Jesseovo/last30days-skill-cn&amp;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

  • Access to secretsline 24
    [Credential-related source omitted]
  • Access to secretsline 47
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)
  • Access to secretsline 23
    [Credential-related source omitted]

scripts/lib/cjk.py

  • Executable scriptline 1
    Executable file

scripts/lib/cluster.py

  • Executable scriptline 1
    Executable file
  • Network accessline 7
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

scripts/lib/dedupe.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)
  • Network accessline 16
    API = "https://api.github.com"

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    Author: Jesse (https://github.com/Jesseovo)

scripts/lib/query_type.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

scripts/lib/render.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)
  • Access to secretsline 90
    [Credential-related source omitted]

scripts/lib/schema.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

scripts/lib/score.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 2
    # sync.sh - 部署 last30days-cn 技能到各 Agent 平台 # Author: Jesse (https://github.com/Jesseovo)
  • Network accessline 3
    # Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)
  • Access to secretsline 23
    [Credential-related source omitted]

skills/last30days/scripts/lib/cjk.py

  • Executable scriptline 1
    Executable file

skills/last30days/scripts/lib/cluster.py

  • Executable scriptline 1
    Executable file
  • Network accessline 7
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

skills/last30days/scripts/lib/dedupe.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)
  • Network accessline 16
    API = "https://api.github.com"

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 4
    Author: Jesse (https://github.com/Jesseovo)

skills/last30days/scripts/lib/query_type.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

skills/last30days/scripts/lib/render.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)
  • Access to secretsline 90
    [Credential-related source omitted]

skills/last30days/scripts/lib/schema.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

skills/last30days/scripts/lib/score.py

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    #!/usr/bin/env bash
  • Network accessline 2
    # sync.sh - 部署 last30days-cn 技能到各 Agent 平台 # Author: Jesse (https://github.com/Jesseovo)
  • Network accessline 3
    # Author: Jesse (https://github.com/Jesseovo)

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 86
    [Credential-related source omitted]
  • Access to secretsline 87
    [Credential-related source omitted]
  • Access to secretsline 96
    [Credential-related source omitted]
  • Access to secretsline 98
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 150
    [Credential-related source omitted]

tests/test_crawler_login.py

  • Executable scriptline 1
    [Credential-related source omitted]
  • Access to secretsline 1
    [Credential-related source omitted]
  • Access to secretsline 84
    [Credential-related source omitted]

tests/test_dates.py

  • Executable scriptline 1
    Executable file

tests/test_dedupe.py

  • Executable scriptline 1
    Executable file

tests/test_doctor.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 57
    [Credential-related source omitted]

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&amp;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

  • Executable scriptline 1
    Executable file
  • Network accessline 3
    Author: Jesse (https://github.com/Jesseovo)

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?!&amp;&amp;p=abc&amp;u=a1{encoded}&amp;ntb=1"
  • Network accessline 27
    return f"https://www.bing.com/ck/a?!&amp;&amp;p=abc&amp;u=a1{encoded}&amp;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
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 compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest .claude-plugin/marketplace.json.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLINativeManifest gemini-extension.json.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard SKILL.md SKILL.md.opencode/skills/<skill-name>/
  • Native The repository ships a manifest, folder or frontmatter field for this agent.
  • Compatible A standard SKILL.md that this agent can read.
  • Unknown No evidence either way.

Derived automatically from paths, manifests and frontmatter. Not tested on each agent.

Explore alternatives and comparisons

Add this badge to your README

It updates every night and links to this page.

Jesseovo/last30days-skill-cn: #523 on hotskills, 2.1k stars

[![Jesseovo/last30days-skill-cn on hotskills](https://hotskills.dev/badge/jesseovo-last30days-skill-cn.svg)](https://hotskills.dev/skill/jesseovo-last30days-skill-cn/)