{
  "markdown": "<p align=\"center\">\n  <img src=\"assets/banner.png\" alt=\"last30days-cn — 中国平台深度研究引擎\" width=\"900\">\n</p>\n\n<p align=\"center\">\n  <b>简体中文</b> ·\n  <a href=\"README.en.md\">English</a>\n</p>\n\n# 📰 last30days-cn — 中国平台深度研究引擎\n\n> 🚀 30 天的研究，30 秒的结果。8 大平台。零过时信息。\n\n**last30days-cn** 是一个 AI Agent 技能（Skill），能够自动搜索中国互联网 8 大主流平台最近 30 天的内容，综合分析后生成有据可查的研究报告。\n\n🔗 本项目基于 [mvanhorn/last30days-skill](https://github.com/mvanhorn/last30days-skill) 进行深度本土化改造，完全面向中国用户和中文互联网平台。\n\n🕷️ v2.0 集成 [MediaCrawler](https://github.com/NanmiCoder/MediaCrawler) 爬虫引擎思路，大幅减少 API Key 依赖。v2.1 修复百度/小红书反爬问题，XHR 拦截替代 DOM 解析，Bing 兜底搜索，已移除无效的 ScrapeCreators 小红书集成。\n\n当前版本：`v3.2.0`\n\n👤 **作者 / Author:** Jesse ([@Jesseovo](https://github.com/Jesseovo))\n\n---\n\n## ✨ v3.2.0 优化内容\n\n- 修复小红书新版搜索页只触发 `search/recommend` 联想词的问题：不再把 `sug_items` 当成笔记，而是按响应中的笔记卡片识别结果，并在必要时主动提交搜索框。\n- Playwright 爬虫不再依赖固定的小红书 endpoint；平台改版时只要返回结构仍包含笔记卡片，仍可正常解析。\n- 增加旧电脑兼容模式：可通过 `LAST30DAYS_BROWSER_PATH` 使用本机仍受系统支持的 Chromium/Chrome，也可用 `LAST30DAYS_DISABLE_BROWSER=1` 完全关闭浏览器并使用公开 API/搜索兜底。\n- `--diagnose` 现在会显示浏览器模式、外部浏览器路径和路径是否存在，便于排查旧 macOS 的浏览器二进制兼容性。\n- 版本升级至 `v3.2.0`，根目录脚本与 Agent Skills 安装载荷继续由 payload 检查保持同步。\n\n## ✨ v3.1.0 优化内容\n\n- 修复中文平台日期统一按北京时间（CST）归档，避免非北京时间机器上的窗口边界偏移。\n- 新增 CJK bigram 回退分词，`jieba` 变为可选增强，skill 可零硬依赖运行。\n- 统一 HTTP 重试退避、Retry-After 解析和 debug URL 脱敏。\n- 新增 payload 生成/漂移检查、版本单源、缓存接线和 GitHub Actions CI。\n\n## ✨ v3.0.0 升级内容\n\n- 追平原版 v3 的 Agent Skills 包结构：`skills/last30days` 现在是可独立安装的运行载荷。\n- 中文 CLI 统一使用单入口 `last30days.py`，根目录和 Skill 载荷保持同名结构。\n- 新增 `--emit html` 和 `--emit html-path`，可生成离线可打开的 `report.html`。\n- HTML 报告融入 [op7418/guizang-ppt-skill](https://github.com/op7418/guizang-ppt-skill) 的 Swiss/IKB 视觉语言，适合浏览、归档、打印。\n- 小红书和知乎搜索增加空结果兜底说明，失败时会标注已尝试路径与可能原因。\n- 抖音、头条在原生接口被风控时新增公开搜索引擎兜底，不再静默返回 0 条（见 issue #8）。\n- 修复 macOS/Linux 下 `skills/last30days/SKILL.md` 损坏 symlink 导致的 `npx` 安装失败（见 issue #10）。\n- 对照上游 [mvanhorn/last30days-skill](https://github.com/mvanhorn/last30days-skill) 同步若干平台无关能力：`--as-of` 历史回溯、跨平台聚合热点、`LAST30DAYS_DEFAULT_SEARCH`/`EXCLUDE_SOURCES` 配置开关、诚实 `--diagnose`（实时探测）、HTML 报告 XSS 加固。\n- 根目录 `scripts/` 继续保留，方便本地开发和旧路径调用；Agent Skills 安装使用 `skills/last30days/scripts` 下的自包含载荷。\n\n### ✅ 发布验证\n\n本次发布前已完成以下质检：\n\n- 远端发布 tag 统一为 `v3.2.0`，没有额外 v3 派生 tag。\n- 根目录与 Skill 载荷均统一使用 `last30days.py` 单入口，没有额外入口文件。\n- 全量测试通过：`python -m pytest tests -q`，共 `214 passed`。\n- 根目录入口和 Skill 载荷入口均已验证：`py scripts/last30days.py --diagnose` 与 `py skills/last30days/scripts/last30days.py --diagnose` 均可正常输出平台可用性诊断。\n\n---\n\n## ⚠️ 免责声明 / Disclaimer\n\n> **请务必仔细阅读以下内容。使用本项目即表示您同意以下所有条款。**\n\n### 法律合规声明\n\n1. **本项目仅供学习和研究目的**。所有爬虫功能仅用于技术学习与研究交流，**严禁用于商业用途**。\n2. 使用者必须严格遵守中华人民共和国相关法律法规，包括但不限于：\n   - 《中华人民共和国网络安全法》\n   - 《中华人民共和国数据安全法》\n   - 《中华人民共和国个人信息保护法》\n   - 《中华人民共和国反不正当竞争法》\n3. 使用者必须遵守各平台的**服务条款（ToS）**和 **robots.txt** 规定。\n4. **禁止**将本项目用于以下行为：\n   - 大规模、高频率地抓取平台数据\n   - 收集、存储或传播他人个人隐私信息\n   - 破坏或干扰平台正常运营\n   - 任何形式的非法数据倒卖或商业牟利\n   - 对外提供自动化数据采集服务\n5. 本项目开发者**不承担**因使用本项目而产生的任何法律责任。用户应**自行承担**使用本项目的全部法律风险。\n6. 如有侵权，请联系作者，将在第一时间处理。\n\n### 技术免责\n\n- 爬虫功能依赖 Playwright 浏览器自动化，模拟正常用户浏览行为，**不涉及**逆向加密算法或破解安全机制。\n- 各平台接口随时可能变更，本项目不保证所有功能始终可用。\n- 建议将请求频率控制在合理范围内（如每次搜索间隔 ≥ 5 秒），避免被平台封禁。\n\n> 💡 **爬虫违法违规的案例频发，请务必合法合规使用。**\n> 参考：[中国爬虫相关法律案例汇总](https://github.com/HiddenStrawberry/Crawler_Illegal_Cases_In_China)\n\n---\n\n## ✨ v2.0 新特性\n\n### 🆕 v2.0 vs v1.0 对比\n\n| 特性 | v1.0 | v2.0 |\n|:---:|:---:|:---:|\n| 免费可用平台数 | 4 个 | **7 个**（安装 Playwright 后） |\n| 需要 API Key 的平台 | 微博、小红书、抖音、微信 | **仅微信**（其余可用爬虫替代） |\n| 数据获取方式 | 仅 API + 公开接口 | API + **爬虫引擎** + 公开接口 |\n| 安装难度 | 需配置多个 API Key | `pip install playwright` 即可 |\n| marketplace.json | 缺少 owner 字段（Bug） | ✅ 已修复 |\n\n### 核心升级\n\n1. **集成 MediaCrawler 爬虫引擎** — 基于 Playwright 浏览器自动化，无需逆向加密算法，大幅降低使用门槛\n2. **7/8 平台零配置可用** — 除微信外，所有平台均可无需 API Key 使用\n3. **智能降级策略** — API 优先 → 爬虫模式 → 公开接口，三级自动降级\n4. **修复 Issue #1** — 修复 marketplace.json 缺少 owner 字段导致 Claude Code 安装失败的 bug\n5. **登录态缓存** — 爬虫模式支持 Cookie 持久化，减少重复登录\n\n---\n\n## 📋 平台支持\n\n| 平台 | 模块 | 数据获取方式 | 需要配置 |\n|:---:|:---:|:---:|:---:|\n| 🔴 微博 | `weibo.py` | API / 🕷️爬虫 / 公开接口 | ✅ 爬虫模式无需配置 |\n| 📕 小红书 | `xiaohongshu.py` | API / 🕷️爬虫 / 公开接口 / Bing 兜底 | ✅ 爬虫模式无需配置 |\n| 📺 B站 | `bilibili.py` | 公开 API / 🕷️爬虫备用 | ✅ 无需配置 |\n| 💬 知乎 | `zhihu.py` | 公开搜索 / 🕷️爬虫备用 | ✅ 无需配置 |\n| 🎵 抖音 | `douyin.py` | API / 🕷️爬虫 / 公开接口 / 搜索兜底 | ✅ 爬虫模式无需配置 |\n| 💚 微信 | `wechat.py` | API / 搜狗搜索 | `WECHAT_API_KEY`（可选） |\n| 🔵 百度 | `baidu.py` | 公开搜索 / API | ✅ 基础搜索无需配置 |\n| 📰 头条 | `toutiao.py` | 公开接口 / 搜索兜底 | ✅ 无需配置 |\n\n> 🕷️ = 可选的 Playwright 浏览器模式（`pip install playwright && playwright install chromium`）；旧系统可使用 `LAST30DAYS_BROWSER_PATH` 或直接走公开搜索兜底。\n\n---\n\n## 🤖 Agent 平台安装\n\n### Agent Skills（推荐）\n\n```bash\nnpx skills add Jesseovo/last30days-skill-cn -g\n```\n\n### Cursor（推荐）\n\n将项目克隆到 Cursor 技能目录：\n\n```bash\ngit clone https://github.com/Jesseovo/last30days-skill-cn.git\n```\n\n然后在 Cursor 中将 `SKILL.md` 添加为项目技能。\n\n### Claude Code\n\n```bash\n# 方式一：通过 Agent Skills 安装（推荐）\nnpx skills add Jesseovo/last30days-skill-cn -g\n\n# 方式二：手动安装\ngit clone https://github.com/Jesseovo/last30days-skill-cn.git ~/.claude/skills/last30days-cn\n```\n\n### OpenClaw / ClawHub\n\n```bash\ngit clone https://github.com/Jesseovo/last30days-skill-cn.git ~/.agents/skills/last30days-cn\n```\n\n### Gemini CLI\n\n```bash\ngit clone https://github.com/Jesseovo/last30days-skill-cn.git\n# 在 Gemini CLI 中作为扩展加载\n```\n\n### 通用 Agent\n\n任何支持 **Bash / Read / Write** 工具的 AI Agent 都可以使用本技能。\n\n---\n\n## ⚙️ 配置指南\n\n### 📍 第一步：可选增强\n\n```bash\npython -m pip install jieba\n```\n\n> `jieba` 不是硬依赖；未安装时会自动使用 CJK bigram 回退分词，仍可运行。\n\n### 📍 第二步：安装爬虫引擎（可选，推荐，可获取 7/8 平台数据）\n\n```bash\npython -m pip install playwright\npython -m playwright install chromium\n```\n\n> 安装 Playwright 后，微博、小红书、抖音、B站（备用）、知乎（备用）均可无需 API Key 使用。\n\n### 旧 macOS / 旧电脑兼容模式\n\nPlaywright 管理的 Chromium 会随版本提高系统要求。macOS Catalina 等旧系统无法启动新版浏览器时，不需要放弃整个 skill：\n\n1. 继续使用公开 API 和 Bing 站内搜索兜底（不安装 Playwright），或安装一份仍支持当前系统的 Chromium/Chrome。\n2. 将 Playwright 指向本机浏览器可执行文件：\n\n```bash\nexport LAST30DAYS_BROWSER_PATH=\"/Applications/Chromium.app/Contents/MacOS/Chromium\"\npython scripts/last30days.py --diagnose\n```\n\n也可以使用已安装的 Chrome channel：\n\n```bash\nexport LAST30DAYS_BROWSER_CHANNEL=chrome\n```\n\n若希望强制跳过所有浏览器调用：\n\n```bash\nexport LAST30DAYS_DISABLE_BROWSER=1\npython scripts/last30days.py \"AI 工具\" --search weibo,xiaohongshu,bilibili,zhihu,douyin,baidu,toutiao\n```\n\n`LAST30DAYS_BROWSER_PATH` 必须指向旧系统实际能够启动的浏览器；skill 不会下载或升级系统浏览器。浏览器爬虫仍受平台登录态、验证码和接口改版影响，小红书的 `search/recommend` 联想词不会被计入搜索结果。\n\n### 📍 第三步：创建配置文件（可选）\n\n如果您希望使用 API 模式获取更稳定的数据，或需要使用微信公众号搜索：\n\n```bash\nmkdir -p ~/.config/last30days-cn\ntouch ~/.config/last30days-cn/.env\nchmod 600 ~/.config/last30days-cn/.env\n```\n\n**Windows（PowerShell）等价：** 创建目录与空配置文件可用 `New-Item -ItemType Directory -Force -Path \"$env:USERPROFILE\\.config\\last30days-cn\"` 与 `New-Item -ItemType File -Path \"$env:USERPROFILE\\.config\\last30days-cn\\.env\" -Force`。限制 `.env` 仅当前用户可读写可近似使用 `icacls \"$env:USERPROFILE\\.config\\last30days-cn\\.env\" /inheritance:r /grant:r \"$($env:USERNAME):(R,W)\"`（与 Unix `chmod 600` 意图相近，权限模型不同）。\n\n编辑 `~/.config/last30days-cn/.env`，按需填入 API Key：\n\n```ini\n# ============================================\n# last30days-cn v2.0 配置文件\n# ============================================\n# 📌 说明：所有 API Key 均为可选\n# 安装 Playwright 后，大部分平台已可通过爬虫模式使用\n# API Key 提供更稳定的数据获取方式\n# ============================================\n\n# 🔴 微博开放平台（可选，已有爬虫模式替代）\n# 获取方式: https://open.weibo.com → 创建应用 → 获取 Access Token\nWEIBO_ACCESS_TOKEN=\n\n# 📕 小红书（可选，已有爬虫模式替代）\n# 获取方式: https://scrapecreators.com → 注册 → 获取 API Key\nSCRAPECREATORS_API_KEY=\n\n# 💬 知乎 Cookie（可选，增强搜索质量）\n# 获取方式: 浏览器登录知乎 → F12 → Network → 复制 Cookie 值\nZHIHU_COOKIE=\n\n# 🎵 抖音（可选，已有爬虫模式替代）\n# 获取方式: https://tikhub.io → 注册 → 获取 API Key\nTIKHUB_API_KEY=\n\n# 💚 微信公众号搜索（目前无爬虫替代，需 API Key 才能使用）\n# 获取方式: 使用第三方微信搜索 API 服务商\nWECHAT_API_KEY=\n\n# 🔵 百度搜索 API（可选，公开搜索已可用）\n# 获取方式: https://cloud.baidu.com → 搜索服务 → 创建应用\nBAIDU_API_KEY=\nBAIDU_SECRET_KEY=\n```\n\n### 📍 第四步：验证配置\n\n```bash\npython scripts/last30days.py --diagnose\n```\n\n将输出各平台的可用状态和爬虫引擎状态：\n\n```json\n{\n  \"weibo\": true,\n  \"xiaohongshu\": false,\n  \"bilibili\": true,\n  \"zhihu\": true,\n  \"douyin\": true,\n  \"wechat\": false,\n  \"baidu_api\": false,\n  \"toutiao\": true,\n  \"crawler_engine\": {\n    \"playwright_available\": true,\n    \"cached_logins\": [],\n    \"note\": \"安装 Playwright 后，微博/小红书/抖音/B站/知乎可无需 API Key 使用爬虫模式\"\n  },\n  \"note_douyin_toutiao\": \"抖音/头条原生接口需签名参数，常被风控；接口失败时改用公开搜索引擎兜底，仅能拿到公开链接，无真实互动数据与精确日期。\"\n}\n```\n\n---\n\n## 🚀 使用方式\n\n### 基本用法\n\n```bash\npython scripts/last30days.py \"AI编程助手\" --emit compact\npython scripts/last30days.py \"AI编程助手\" --emit html-path\n```\n\n### 命令行参数\n\n| 参数 | 说明 | 示例 |\n|:---:|:---:|:---:|\n| `--emit` | 输出模式 | `compact` / `json` / `md` / `context` / `path` / `html` / `html-path` |\n| `--quick` | 快速搜索 | 更少数据源，更快速度 |\n| `--deep` | 深度搜索 | 更多数据源，更全面 |\n| `--days N` | 回溯天数 | `--days 7`（最近一周） |\n| `--as-of` | 历史回溯终点日期 | `--as-of 2026-05-01`（以该日为终点回溯 N 天） |\n| `--search` | 指定搜索源 | `--search weibo,bilibili,zhihu` |\n| `--diagnose` | 诊断配置 | 显示各平台可用状态 |\n| `--timeout SECS` | 全局超时秒数 | 覆盖默认全局超时 |\n| `--save-dir DIR` | 自动保存原始输出目录 | 将原始输出写入指定目录 |\n| `--debug` | 调试模式 | 输出详细日志 |\n\n> 🔧 **环境变量**：未指定 `--search` 时，回退到 `LAST30DAYS_DEFAULT_SEARCH`（逗号分隔的默认源集）；`EXCLUDE_SOURCES` 可从启用集合中排除指定源。\n\n### 使用示例\n\n```bash\n# 🔍 搜索 AI 相关话题\npython scripts/last30days.py \"最新AI工具\" --emit compact\n\n# ⚡ 快速搜索，仅 B站和知乎\npython scripts/last30days.py \"Python教程\" --quick --search bilibili,zhihu\n\n# 📊 深度搜索并保存结果\npython scripts/last30days.py \"新能源汽车\" --deep --save-dir ~/Documents/research\n\n# 📋 输出 JSON 格式（适合程序处理）\npython scripts/last30days.py \"ChatGPT替代品\" --emit json\n\n# 🗓️ 仅搜索最近 7 天\npython scripts/last30days.py \"热门话题\" --days 7\n\n# 🧾 生成可离线打开的 HTML 报告\npython scripts/last30days.py \"具身智能\" --deep --emit html-path\n```\n\n---\n\n## 🔧 数据获取策略（三级降级）\n\nv2.0 采用三级自动降级策略，确保最大可用性：\n\n```\n优先级 1: API 模式（如配置了 API Key）\n    ↓ 失败或未配置\n优先级 2: 爬虫模式（MediaCrawler，需要 Playwright）\n    ↓ 失败或未安装\n优先级 3: 公开接口（HTTP 直接请求，无需任何配置）\n    ↓ 仍无结果（抖音/头条/小红书/知乎）\n兜底: 公开搜索引擎（Bing site: 搜索，获取公开链接）\n```\n\n### 各平台数据获取方式对比\n\n| 平台 | API 模式 | 爬虫模式 | 公开接口 | 搜索兜底 |\n|:---:|:---:|:---:|:---:|:---:|\n| 微博 | `WEIBO_ACCESS_TOKEN` | ✅ Playwright | ✅ m.weibo.cn | - |\n| 小红书 | MCP HTTP API(可选) | ✅ Playwright (笔记 payload 识别) | ⚠️ 命中率低 | ✅ Bing |\n| B站 | - | ✅ Playwright(备用) | ✅ 公开 API | - |\n| 知乎 | `ZHIHU_COOKIE`(增强) | ✅ Playwright(备用) | ✅ 公开搜索 | ✅ Bing |\n| 抖音 | `TIKHUB_API_KEY` | ✅ Playwright | ⚠️ 需签名 | ✅ Bing |\n| 微信 | `WECHAT_API_KEY` | - | ✅ 搜狗搜索 | - |\n| 百度 | `BAIDU_API_KEY` | - | ⚠️ 公开搜索可能被拦截 | ✅ Bing |\n| 头条 | - | - | ⚠️ 需签名 | ✅ Bing |\n\n> ⚠️ 抖音/头条原生 web 接口现在强制要求签名参数（`a_bogus` / `_signature`），常被风控。接口失败时改用公开搜索引擎兜底，**只能拿到公开链接，无真实互动数据与精确日期**。\n\n---\n\n## 🏗️ 项目架构\n\n```\nlast30days-skill-cn/\n├── 📄 SKILL.md              # Agent 技能定义文件\n├── 📄 README.md             # 项目说明（中文，本文件）\n├── 📄 README.en.md          # 项目说明（English）\n├── 📄 LICENSE               # MIT 许可证\n├── 📄 requirements.txt      # Python 依赖\n├── 📁 assets/               # README 配图\n├── 📁 scripts/\n│   ├── 🐍 last30days.py     # 中文主入口 CLI\n│   └── 📁 lib/\n│       ├── crawler_bridge.py  # 🆕 MediaCrawler 爬虫桥接模块\n│       ├── weibo.py          # 微博搜索模块\n│       ├── xiaohongshu.py    # 小红书搜索模块\n│       ├── bilibili.py       # B站搜索模块\n│       ├── zhihu.py          # 知乎搜索模块\n│       ├── douyin.py         # 抖音搜索模块\n│       ├── wechat.py         # 微信公众号模块\n│       ├── baidu.py          # 百度搜索模块\n│       ├── toutiao.py        # 今日头条模块\n│       ├── schema.py         # 数据结构定义\n│       ├── score.py          # 评分系统\n│       ├── normalize.py      # 数据标准化\n│       ├── dedupe.py         # 去重\n│       ├── render.py         # 输出渲染\n│       ├── relevance.py      # 相关性计算\n│       ├── query.py          # 查询预处理\n│       ├── query_type.py     # 查询类型检测\n│       ├── entity_extract.py # 实体抽取\n│       ├── env.py            # 环境配置管理\n│       ├── cache.py          # 缓存管理\n│       ├── dates.py          # 日期工具\n│       ├── http.py           # HTTP 客户端\n│       ├── ui.py             # 终端 UI\n│       └── setup_wizard.py   # 配置向导\n├── 📁 skills/\n│   └── 📁 last30days/        # Agent Skills 自包含运行载荷\n│       ├── 📄 SKILL.md       # 安装后供 Agent 读取的技能说明\n│       └── 📁 scripts/\n│           ├── 🐍 last30days.py\n│           └── 📁 lib/       # 与根目录脚本同步的运行依赖\n├── 📁 fixtures/              # 示例数据\n├── 📁 tests/                 # 测试用例\n└── 📁 hooks/                 # Agent 钩子\n```\n\n---\n\n## 📊 评分系统\n\n每条搜索结果的综合评分（0-100）基于：\n\n| 维度 | 权重 | 说明 |\n|:---:|:---:|:---|\n| 🎯 相关性 | 45% | 与查询主题的文本匹配度 |\n| 🕐 时效性 | 25% | 内容发布时间的新鲜程度 |\n| 🔥 互动度 | 30% | 各平台互动指标（见下表） |\n\n### 各平台互动指标\n\n| 平台 | 互动指标 |\n|:---:|:---|\n| 微博 | 转发 + 评论 + 点赞 |\n| 小红书 | 点赞 + 收藏 + 评论 + 分享 |\n| B站 | 播放 + 弹幕 + 评论 + 投币 + 收藏 |\n| 知乎 | 赞同 + 评论 + 收藏 |\n| 抖音 | 点赞 + 评论 + 分享 + 播放 |\n| 头条 | 评论 + 阅读 + 点赞 |\n\n---\n\n## 🙏 致谢\n\n- [mvanhorn/last30days-skill](https://github.com/mvanhorn/last30days-skill) — 原始英文版项目\n- [NanmiCoder/MediaCrawler](https://github.com/NanmiCoder/MediaCrawler) — 爬虫引擎技术灵感来源\n\n---\n\n## 📜 许可证\n\n本项目基于 [MIT License](LICENSE) 发布。\n\n- 🔗 原始项目: [mvanhorn/last30days-skill](https://github.com/mvanhorn/last30days-skill) by Matt Van Horn\n- 🇨🇳 中文本土化: Jesse ([@Jesseovo](https://github.com/Jesseovo))\n",
  "bytes": 12776,
  "sha": "a9385fb23b416fdb70de1832a8b6cfbb43d039416efe0d4e2219f738f6f06625",
  "repo_slug": "jesseovo/last30days-skill-cn",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_jesseovo_last30days_skill_cn_b292ed61/readme"
}