
Wechat Write
- 242 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use wechat-write for development tasks
About
wechat-write: A skill for development. This provides functionality for development workflows.
- wechat-write
Wechat Write by the numbers
- 242 all-time installs (skills.sh)
- +22 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,557 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/redfox-data/redfox-community --skill wechat-writeAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 242 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use wechat-write for development tasks
Files
公众号文案创作
📋 概述
基于红狐数据公众号爆款雷达,按关键词检索当下热门爆款文章,提炼流量密码与创作要点,生成可直接发布的完整文章。
数据范围:全网公众号,每日持续收录爆款文章 | 核心流程:查询爆款 → 分析规律 → 生成文案
🔑 鉴权
获取 API Key
请前往 红狐hub 获取API KEY
配置 API Key
方案1: 以OpenClaw为例,将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中,部分内容如下:
{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }方案2: 终端配置
export REDFOX_API_KEY="ak_xxxx..."🔄 工作流程
Step 0: 意图识别与关键词提炼
先理解用户真实需求,再提炼搜索关键词:
一、理解用户意图
- 核心诉求:想写什么类型的内容,是否有明确主题和论点
- 目标受众:写给谁看
- 创作目的:分享经验、教别人、还是观点输出
二、判断写作对象类型
| 类型 | 判断依据 | 关键词策略 |
|---|---|---|
| 具体实体 | 用户描述中包含明确可指认的对象名称(产品、工具、书籍等) | 意图关键词 + 主体关键词 |
| 通用话题 | 泛领域话题(职场、情感、健康、理财等) | 核心关键词 + 场景关键词 + 扩展关键词 |
三、提炼关键词
通用话题:核心关键词 + 场景关键词 + 扩展关键词
具体实体(必须额外提取主体关键词):
| 维度 | 说明 | 示例(gzh-copywriter) |
|---|---|---|
| 品类词 | 属于什么品类 | AI技能、效率工具 |
| 定位词 | 核心卖点关键词 | 爆款生成、数据驱动 |
| 用户叫法 | 目标用户搜索时用的词 | 公众号神器、自媒体神器 |
规则:主体关键词不得少于 2 个,优先级不低于意图关键词。最终搜索词 = 意图关键词 + 主体关键词(合并去重)。必须提炼至少 2 个不同关键词。
四、示例
通用话题:用户说"帮我写一篇关于职场跳槽的文章" → 搜索词:职场、跳槽、辞职、加薪、职场发展
具体实体:用户说"帮我写一篇推荐gzh-copywriter的公众号文章" → 搜索词:公众号、爆款文章、AI技能、效率工具、爆款生成、数据驱动、公众号神器
Step 0.5: 差异化优势拆解【仅推荐具体实体时执行】
纯话题类写作跳过本步骤。
一、信息收集(按优先级尝试,够用即停)
| 优先级 | 来源 | 操作方式 |
|---|---|---|
| 第一 | 用户描述中已包含的信息 | 提取功能、特点、优势 |
| 第二 | 可读取的结构化文档 | 读取产品文档、技能说明等 |
| 第三 | 联网搜索 | 搜索官方介绍、用户评价、竞品对比 |
二、拆解模型(四维度)
| 维度 | 拆解问题 |
|---|---|
| 输入差异 | 它依赖什么独特的输入源? |
| 流程差异 | 它的工作方式跟同类有什么不同? |
| 输出差异 | 它产出的结果跟同类有什么不同? |
| 定位差异 | 它锁定什么人群/场景,竞品没覆盖? |
三、输出格式
输出 3-5 条核心差异化优势,每条包含:
优势描述:[一句话]
与竞品对比差异:[说明不同之处]四、下游引用
这 3-5 条差异化优势必须在后续步骤中强制引用:
- Step 2:将差异化优势与爆款规律对照,找到契合点
- Step 4:文章必须围绕差异化优势展开,作为"锚点"
Step 1: 查询爆款文章
python3 scripts/fetch_gzh_trends.py \
--keyword "<提炼出的关键词>" \
--max-items 10参数说明:
--keyword:搜索关键词(多个用英文逗号分隔,最多 5 个,总长度 ≤ 200 字符);若执行了 Step 0.5,需包含主体关键词--max-items:展示文章数量,默认 10 条--start-date:可选,开始日期,格式 yyyy-MM-dd(最长为最近 30 天)。不指定时默认近 7 天,数据不足自动拓展至近 30 天
执行要求:执行脚本后直接基于输出数据分析,禁止将原始爆款数据展示给用户,禁止仅发送文件路径或"已保存"等简短提示。
Step 2: 分析爆款规律
基于脚本输出提炼以下规律:
标题规律:高互动标题的共同特征(数字使用、情绪词、人群标签)、标题长度与结构模式
内容规律:热门文章的主题方向与切入角度、内容结构与段落分布特点、互动引导方式
差异化优势对照(若执行了 Step 0.5):将差异化优势与爆款规律对照,找到契合点
数据分析维度:
| 指标 | 分析要点 |
|---|---|
| 阅读数 | 内容传播范围与吸引力 |
| 在看数 | 内容深度与收藏价值 |
| 点赞数 | 情绪共鸣程度 |
| 评论数 | 话题性与互动引导效果 |
Step 3: 引导用户上传个人风格参考
在生成文案前,必须主动询问用户是否提供个人风格参考:
想让我更懂你的风格?发几段平时的笔记、日记或随笔给我就行
- 若用户提供:分析其写作风格(用词习惯、语气特点、表达方式),融合到文案中
- 若用户不提供:直接基于爆款规律生成文案
Step 4: 生成文案
必须严格按照爆款规律分析结果进行创作。
创作准备
1. 确定核心观点(必须):从用户意图、爆款数据和最新资讯中提炼一个核心观点,整篇文章围绕此观点展开。观点要新颖、有争议性或颠覆常识。若执行了 Step 0.5,核心观点应围绕差异化优势展开 2. 回顾爆款规律(必须):提取的高频关键词(必须融入正文)、热门标题模式(必须遵循)、爆款结构特征(必须参考)、热门内容风格(必须保持) 3. 整合差异化优势(若执行了 Step 0.5):将 3-5 条差异化优势作为文章"锚点",每个优势对应一个核心论点或段落 4. 搜索最新资讯(可选):如需补充时效性素材,可使用 web_search。注意:最新资讯仅作素材补充,爆款规律必须来自脚本数据
✍️ 公众号写作规范
行文原则:切入点独到、标题简单粗暴直击痛点、观点颠覆常识、情感共鸣、结合真实经历、与读者相关、实用有价值、文风有趣、制造不看就有损失的紧迫感、有辨识度
字数要求:正文 1500 字左右(开头 200-300 字、核心 800-1000 字、结尾 200-300 字)
风格特点:态度鲜明、金句频出、对比强烈、直击痛点、节奏紧凑、引发思考
标题创作:
- 必须参考爆款数据中出现最多的标题结构
- 优先数字型标题,可使用疑问句/感叹句
- 标题不超过 20 字(含标点)
正文创作:
- 必须融入爆款数据中的高频关键词
- 必须参考爆款内容的开头"钩子"手法
- 必须保持爆款内容的写作风格
- 结尾添加引导互动话术(如:"你们觉得呢?")
- 排版:良好分段,点缀少量 Emoji(每段 1-2 个),短句为主
- 结尾添加 5-10 个相关标签
Step 5: 输出前自检【必须执行】
逐项检查输出是否完整:
- [ ] 推荐标题:3-6 个
- [ ] 正文内容:完整可发布
- [ ] 核心观点:明确陈述
- [ ] 推荐标签:5-10 个
- [ ] 爆款公式来源 - 爆款规律:标题/开头/结构/语言/互动/高频词 6 个维度
- [ ] 爆款公式来源 - 参考文章:2-3 篇,含标题、链接、作者、互动数据
- [ ] 差异化优势(若 Step 0.5):3-5 条,含优势描述与竞品对比差异
- [ ] 询问用户上传个人风格参考
📊 输出格式
输出纯文案内容,包含:
### 推荐标题
1. [标题1]
2. [标题2]
3. [标题3]
### 正文内容
[完整可发布的正文]
**核心观点**:[一句话概括]
### 推荐标签
#标签1 #标签2 #标签3 #标签4 #标签5
### 差异化优势(仅推荐具体实体时输出)
**优势1**:
- 优势描述:[一句话]
- 与竞品对比差异:[说明]
**优势2**:
- 优势描述:[一句话]
- 与竞品对比差异:[说明]
### 爆款公式来源
**数据来源说明**:以下爆款规律和参考文章均来自脚本获取的真实爆款数据,非网络搜索结果。
**参考的爆款规律**:
1. **标题规律**:[具体描述]
2. **开头规律**:[具体描述]
3. **结构规律**:[具体描述]
4. **语言风格**:[具体描述]
5. **互动引导**:[具体描述]
6. **高频关键词**:[3-5个高频词及频次]
**参考的爆款文章**:
1. [文章标题](链接) - 作者:公众号名称 - 阅读数:X / 在看:X / 点赞:X / 评论:X
2. [文章标题](链接) - 作者:公众号名称 - 阅读数:X / 在看:X / 点赞:X / 评论:X禁止输出:卡片设计或图片、脚本执行命令、文件路径或下载链接、仅展示数据而不生成文案
⚠️ 注意事项
- 严格基于查询到的真实爆款数据进行分析
- 生成的文案必须遵循提炼出的爆款规律
- 禁止在文案中添加外部联系方式或违规信息
- 生成的文案必须符合公众号社区规范
📎 其他资源
- 公众号趋势数据格式说明
WeChat Official Account Copywriting / wechat-write
---
Overview
Powered by the RedFox data Official Account viral radar, search for trending viral articles by keyword, extract traffic insights and key writing principles, and generate a complete, publish-ready article.
Core Value
- Data-driven creation: Viral articles from WeChat Official Accounts are continuously collected daily, so copywriting patterns are grounded in real data—not invented examples.
- Analyze first, then write: Complete viral pattern analysis before generating the full article, with clear patterns that are easy to understand and apply.
- Style adaptation: Upload personal writing samples for style analysis—vocabulary habits, tone, and expression—so the generated copy matches your voice.
Intended Users
- ✍️ Official account owners — Use viral data patterns to guide creation; say goodbye to creative blocks and inefficient trial-and-error.
- 📊 Content operators — Quickly search for viral articles by keyword, analyze traffic patterns, and produce high-engagement articles.
- 🏢 MCN / brand planners — Batch-collect viral samples in the same niche and build reusable writing formulas.
---
Features
Core Capabilities
- Keyword-based viral search: Enter product or topic keywords to search for related viral articles; supports multi-keyword combinations (up to 5).
- Viral pattern analysis: Breaks down viral patterns across dimensions including title structure, opening hooks, content style, engagement prompts, and high-frequency keywords.
- Differentiation analysis: When recommending a specific entity, automatically analyzes input, process, output, and positioning differences to anchor the copy.
- Complete article generation: Produces a ~1500-word, publish-ready article based on viral patterns, including recommended titles, core viewpoint, and tags.
- Personal style integration: Upload your everyday writing samples; the tool analyzes your style and blends it into the generated copy.
Highlights
- Dual-mode coverage: Direct creation for general topics; automatic differentiation analysis for specific entity recommendations, ensuring content has clear anchors.
- Smart time strategy: Queries the last 7 days by default; automatically expands to 30 days when samples are insufficient, without changing your keywords.
---
API Key Acquisition & Security
- This skill requires the environment variable:
REDFOX_API_KEY. REDFOX_API_KEYis issued by RedFoxHub (https://redfox.hk)- Register at RedFoxHub to obtain
REDFOX_API_KEY. - Configure
REDFOX_API_KEYon your device before using this skill. - Before providing your key, confirm its source, scope, validity period, and whether it can be reset or revoked.
- Do not hard-code or expose keys in plain text in code, prompts, logs, or output files.
---
Usage Guide
Simply describe your creative need in natural language—no fixed commands to memorize.
Quick Reference
| Intent | Example phrase | Result |
|---|---|---|
| Write an article | "Help me write a WeChat article about career changes" | Search virals by keyword, analyze patterns, then generate a complete article |
| Recommend a product | "Help me write a WeChat article recommending an AI tool" | Automatically break down differentiation advantages and generate copy around product highlights |
| Find viral articles | "What articles are trending on WeChat? Career direction" | Return a list of trending viral articles in the niche with pattern analysis |
| Blend personal style | "Here are some of my daily writings, write in this style" | Analyze your writing style and integrate it into the generated copy |
Output Example
After analysis, you receive a complete, publish-ready article, roughly like this (illustrative):
Recommended Titles
1. 5 truths about career changes—no one tells you the third one 2. You don't want to change jobs—you just want to be seen
Article Content [Complete publish-ready article, ~1500 words]
Core viewpoint: Changing jobs isn't running away—it's repricing your professional value
Recommended Tags #Career #JobChange #CareerDevelopment #SalaryIncrease #Resignation
Viral Formula Sources
- Title patterns: Number-based titles are most common; questions spark curiosity
- Opening patterns: Personal experience openings build resonance
- High-frequency keywords: Job change (8), Career (6), Salary increase (4)
---
Use Cases
| Scenario | Role | Example question | Benefit |
|---|---|---|---|
| Daily creation | Official account owner | "Help me write a WeChat article about personal finance" | Viral patterns guide creation, boosting article engagement |
| Product recommendation | Brand / self-media | "Help me write a WeChat article recommending Tool X" | Automatic differentiation analysis; copy anchored on product highlights |
| Viral pattern research | Content operator | "Analyze recent viral article patterns in the emotional niche" | Multi-dimensional pattern breakdown across titles, openings, structure |
| Styled writing | Individual account owner | "Write a career advice piece in my usual style" | Personal style blended in for more distinctive content |
---
Important Data Notes
- Viral article data is continuously collected and updated daily.
- Queries default to the last 7 days; automatically expands to 30 days when samples are insufficient.
- Maximum query range is the last 30 days.
公众号文案创作 / wechat-write
---
简介
基于红狐数据公众号爆款雷达,按关键词检索当下热门爆款文章,提炼流量密码与创作要点,生成可直接发布的完整文章。
核心价值
- 数据驱动创作:每日持续收录全网公众号爆款文章,文案规律有据可依,避免凭空臆造。
- 先析后写:先完成爆款规律分析,再生成完整文案,规律清晰、便于理解与选用。
- 风格自适应:支持上传个人风格参考,分析用词习惯与语气特点,让生成的文案更贴近你的表达方式。
适用对象
- ✍️ 公众号号主 — 用爆款数据规律指导创作,告别灵感枯竭与低效试错。
- 📊 内容运营 — 按关键词快速检索爆款、分析流量规律,产出高互动文章。
- 🏢 MCN / 品牌策划 — 批量获取同赛道爆款样本,沉淀可复用的创作套路。
---
功能特性
核心功能
- 关键词检索爆款:输入产品词、话题词即可检索相关爆款文章,支持多关键词组合(最多 5 个)。
- 爆款规律分析:从标题结构、开头钩子、内容风格、互动引导、高频关键词等维度拆解爆款规律。
- 差异化优势拆解:推荐具体实体时,自动分析输入差异、流程差异、输出差异与定位差异,作为文案锚点。
- 完整文章生成:基于爆款规律生成 1500 字左右、可直接发布的完整文章,含推荐标题、核心观点与标签。
- 个人风格融合:支持上传日常写作样本,自动分析风格特征并融入文案。
特色亮点
- 双模式覆盖:通用话题直接创作,具体实体推荐自动执行差异化拆解,确保内容有锚点。
- 智能时间策略:默认查询近 7 天数据,样本不足时自动拓展至近 30 天,不擅自更换关键词。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言说出你的创作需求即可,无需记忆固定命令。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 写公众号文章 | 「帮我写一篇关于职场跳槽的公众号文章」 | 按关键词检索爆款,先分析规律再生成完整文章 |
| 推荐具体产品 | 「帮我写一篇推荐某 AI 工具的公众号文章」 | 自动拆解差异化优势,围绕产品亮点生成文案 |
| 查找爆款文章 | 「最近公众号什么文章火?职场方向的」 | 返回同赛道热门爆款文章列表与规律分析 |
| 融入个人风格 | 「这是我的几段日常随笔,帮我按这个风格写」 | 分析你的写作风格并融入生成的文案中 |
输出示例
完成分析后,你将收到一篇完整可发布的文章,大致如下(示意):
推荐标题
1. 职场跳槽的 5 个真相,第 3 个没人告诉你 2. 你不是想跳槽,你只是想被看见
正文内容 [完整可发布的正文,约 1500 字]
核心观点:跳槽不是逃避,而是对自己职业价值的重新定价
推荐标签 #职场 #跳槽 #职业发展 #加薪 #辞职
爆款公式来源
- 标题规律:数字型标题占比最高,疑问句引发好奇
- 开头规律:个人经历开场建立共鸣
- 高频关键词:跳槽(8)、职场(6)、加薪(4)
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 日常创作 | 公众号号主 | 「帮我写一篇关于理财的公众号文章」 | 用爆款规律指导创作,提升文章互动数据 |
| 产品推荐 | 品牌 / 自媒体 | 「帮我写一篇推荐 XX 工具的公众号文章」 | 自动拆解差异化优势,文案围绕产品亮点展开 |
| 爆款规律研究 | 内容运营 | 「分析一下最近情感赛道的爆款文章规律」 | 获取标题、开头、结构等多维度规律拆解 |
| 风格化写作 | 个人号主 | 「按我平时写的风格,写一篇职场干货」 | 融入个人风格,产出更有辨识度的内容 |
---
重要数据说明
- 爆款文章数据每日持续更新收录。
- 默认查询近 7 天数据;数据不足时自动拓展至近 30 天。
- 最长可回溯查询范围为最近 30 天。
公众号爆款数据格式说明
数据来源
接口: 红狐数据 - 公众号爆款文章搜索 URL: https://redfox.hk/story/api/gzh/search/hotArticle API Key: ak_c4fc9018ffb14ce4ae35dafd92f466c3
---
API 请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| keyword | string | 是 | 搜索关键词(多个关键词用英文逗号分隔,最多5个,总长度不超过200字符) |
| startDate | string | 是 | 开始日期,格式 yyyy-MM-dd(最长为最近30天) |
| endDate | string | 是 | 结束日期,格式 yyyy-MM-dd |
| source | string | 是 | 固定值:<见脚本> |
---
API 返回字段说明
成功响应结构
{
"code": 2000,
"msg": "成功",
"data": {
"articles": [
{
"id": "1623044070",
"title": "职场没必要过度纠结的8件事,想开瞬间轻松",
"author": "智联招聘",
"url": "https://mp.weixin.qq.com/s?...",
"imageUrl": "https://mmbiz.qpic.cn/...",
"summary": "混迹职场越久越发明白...",
"clicksCount": 19530,
"watchCount": 40,
"likeCount": 134,
"commentsCount": 6,
"publicTime": "2026-05-25 12:00:00",
"popularityScore": 2.0,
"recencyScore": 2.0,
"relevanceScore": 7.21,
"totalScore": 11.21,
"sourceUsernickname": null,
"publicTagInfo": null
}
]
}
}文章字段详解
| 字段 | 类型 | 说明 |
|---|---|---|
| id | string | 文章唯一标识 |
| title | string | 文章标题 |
| author | string | 公众号名称 |
| url | string | 文章链接(可跳转阅读原文) |
| imageUrl | string/null | 封面图片链接 |
| summary | string | 文章摘要/描述 |
| clicksCount | integer | 阅读数 |
| watchCount | integer | 在看数 |
| likeCount | integer | 点赞数 |
| commentsCount | integer | 评论数 |
| publicTime | string | 发布时间,格式 yyyy-MM-dd HH:mm:ss |
| popularityScore | float | 热度评分 |
| recencyScore | float | 时效评分 |
| relevanceScore | float | 相关度评分 |
| totalScore | float | 总评分 |
| sourceUsernickname | string/null | 来源用户昵称 |
| publicTagInfo | string/null | 标签信息(JSON字符串) |
---
时间范围自动拓展逻辑
当用户未指定时间范围时,脚本会自动处理:
1. 默认查询近7天 2. 数据不足时自动拓展:如果近7天数据少于10条,自动拓展至近30天 3. 用户指定时间则不拓展:如果用户指定了 --start-date,按指定时间查询,不会自动拓展
---
关键词使用规范
多关键词规则
- 多个关键词用英文逗号分隔
- 最多支持 5个 关键词
- 总长度不超过 200字符
示例
# 单关键词
python scripts/fetch_gzh_trends.py --keyword "职场"
# 多关键词
python scripts/fetch_gzh_trends.py --keyword "职场,跳槽,辞职"
# 推荐实体类关键词组合(Step 0 提炼)
python scripts/fetch_gzh_trends.py --keyword "公众号,AI技能,爆款,效率工具"---
输出格式
Markdown 表格格式
| 序号 | 标题 | 作者 | 阅读数 | 在看 | 点赞 | 评论 |
|---|---|---|---|---|---|---|
| 1 | 职场没必要过度纠结的8件事 | 智联招聘 | 19530 | 40 | 134 | 6 |
字段说明
- 标题:可点击跳转原文(Markdown链接格式)
- 作者:公众号名称
- 阅读数:加粗显示,强调传播范围
- 在看数:反映内容深度与收藏价值
- 点赞数:反映情绪共鸣程度
- 评论数:反映话题性与互动效果
---
数据分析维度
1. 阅读数(clicksCount)
- 含义:内容传播范围与吸引力
- 高阅读:标题吸引、内容有价值、推送时间佳
- 分析要点:观察阅读数与标题风格的关联
2. 在看数(watchCount)
- 含义:内容深度与收藏价值
- 高在看:干货密度高、实用性强、值得反复阅读
- 分析要点:观察在看数与内容类型的关联
3. 点赞数(likeCount)
- 含义:情绪共鸣程度
- 高点赞:观点犀利、表达精准、引发认同
- 分析要点:观察点赞数与观点表达的关联
4. 评论数(commentsCount)
- 含义:话题性与互动引导效果
- 高评论:观点有争议、结尾抛出问题、引发讨论
- 分析要点:观察评论数与互动话术的关联
---
注意事项
1. 数据去重:API可能返回重复数据,脚本会按 id 字段去重 2. 空标题处理:如果标题为空,使用 summary 字段前30字符替代 3. 时间限制:最长查询范围为最近30天 4. 自动拓展提示:当自动拓展至30天时,会在输出中提示用户
---
更新记录
- 2026-06-01: 接口替换为红狐数据API,适配新的返回字段结构
#!/usr/bin/env python3
"""
公众号热门数据查询脚本
接口:红狐数据 - 公众号爆款文章搜索
"""
import os
import sys
import argparse
import json
import requests
from datetime import datetime, timedelta
from typing import Dict, List, Optional
def _do_fetch(keyword: str, start_date: str, end_date: str, headers: dict, base_url: str, debug: bool = False) -> dict:
"""
执行单次API请求
Args:
keyword: 搜索关键词(多个关键词用英文逗号分隔)
start_date: 开始日期,格式 yyyy-MM-dd
end_date: 结束日期,格式 yyyy-MM-dd
headers: 请求头
base_url: API基础URL
debug: 是否打印调试信息
Returns:
dict: 包含articles列表和其他元数据
"""
params = {
"keyword": keyword,
"startDate": start_date,
"endDate": end_date,
"source": "公众号文案创作-GitHub"
}
if debug:
print(f"\n=== DEBUG: API请求参数 ===", file=sys.stderr)
print(f"URL: {base_url}", file=sys.stderr)
print(f"Params: {json.dumps(params, ensure_ascii=False)}", file=sys.stderr)
try:
response = requests.post(base_url, headers=headers, json=params, timeout=60)
if debug:
print(f"状态码: {response.status_code}", file=sys.stderr)
print(f"响应长度: {len(response.text)} 字节", file=sys.stderr)
if response.status_code >= 400:
raise Exception(f"HTTP请求失败: 状态码 {response.status_code}")
data = response.json()
# 检查返回码(2000表示成功)
code = data.get("code", 0)
if code != 2000:
error_msg = data.get("msg", "未知错误")
raise Exception(f"API错误(code={code}): {error_msg}")
articles = data.get("data", {}).get("articles", [])
if debug:
print(f"返回文章数: {len(articles)}", file=sys.stderr)
if articles:
print(f"首篇文章字段: {list(articles[0].keys())}", file=sys.stderr)
return {
"articles": articles,
"keyword": keyword,
"startDate": start_date,
"endDate": end_date
}
except requests.exceptions.Timeout:
raise Exception("请求超时,请稍后重试")
except requests.exceptions.ConnectionError:
raise Exception("网络连接失败,请检查网络")
except json.JSONDecodeError:
raise Exception("响应数据解析失败")
except Exception as e:
raise Exception(str(e))
def fetch_gzh_trends(keyword: str, start_date: str = None, debug: bool = False, auto_expand: bool = True) -> dict:
"""
调用接口获取公众号趋势数据
Args:
keyword: 搜索关键词(多个关键词用英文逗号分隔)
start_date: 开始日期,格式 yyyy-MM-dd,最长为最近30天
debug: 是否打印调试信息
auto_expand: 当数据不足时,自动拓展时间范围
- 用户指定了时间:按用户指定时间查询,不自动拓展
- 用户未指定时间:默认近7天;数据不足时拓展至近30天
Returns:
dict: 包含articles列表、expandedDays、expandedHint等字段
关键词规则:
- 多关键词以英文逗号分隔
- 最多5个关键词
- 总长度不超过200字符
"""
base_url = "https://redfox.hk/story/api/gzh/search/hotArticle"
api_key = os.environ.get("REDFOX_API_KEY", "")
if not api_key:
raise Exception("缺少API Key:请设置环境变量 REDFOX_API_KEY。获取方式:https://redfox.hk/settings/api-keys?source=github")
headers = {
"Content-Type": "application/json",
"X-API-Key": api_key
}
end_date = datetime.now().strftime("%Y-%m-%d")
# 用户指定了时间范围,直接按指定时间查询,不自动拓展
if start_date:
result = _do_fetch(keyword, start_date, end_date, headers=headers, base_url=base_url, debug=debug)
# 计算用户指定的时间范围天数
days_diff = (datetime.now() - datetime.strptime(start_date, "%Y-%m-%d")).days
result["expandedDays"] = days_diff
return result
# 用户未指定时间,默认近7天
start_7 = (datetime.now() - timedelta(days=7)).strftime("%Y-%m-%d")
result = _do_fetch(keyword, start_7, end_date, headers=headers, base_url=base_url, debug=debug)
articles = result.get("articles", [])
# 近7天数据不足10条且允许自动拓展,拓展至近30天
if len(articles) < 10 and auto_expand:
start_30 = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
result = _do_fetch(keyword, start_30, end_date, headers=headers, base_url=base_url, debug=debug)
result["expandedDays"] = 30
result["expandedHint"] = "近7天数据不足,已自动拓展至近30天"
else:
result["expandedDays"] = 7
return result
def format_output(data: dict, max_items: int = 10) -> str:
"""
格式化输出热门数据(表格形式)
Args:
data: 原始数据,包含articles列表
max_items: 最多展示文章数量
Returns:
str: Markdown格式的输出内容
"""
def process_title(item: dict) -> str:
"""处理标题:转义特殊字符,空标题使用summary替代,并添加作品链接"""
title = item.get('title', '')
# 如果标题为空,尝试使用 summary 字段
if not title or title.strip() == '':
summary = item.get('summary', '')
if summary:
# 移除 summary 中的换行符并截取前30个字符
title = summary.replace('\n', ' ').replace('\r', ' ').strip()[:30]
if len(summary) > 30:
title = title + '...'
if not title or title.strip() == '':
title = '无标题'
# 转义 Markdown 表格特殊字符(|)
title = title.replace('|', '\\|')
# 移除换行符
title = title.replace('\n', ' ').replace('\r', ' ')
# 移除多余空格
title = ' '.join(title.split())
# 截断过长标题
if len(title) > 30:
title = title[:30] + "..."
# 添加作品链接(公众号使用 url 字段)
article_url = item.get('url', '')
if article_url:
title = f"[{title}]({article_url})"
return title
def process_author(item: dict) -> str:
"""处理作者信息"""
# API返回的字段:author(公众号名称)
author_name = item.get('author', '未知')
# 简化输出,只显示作者名
return author_name
output = []
# 获取文章列表并去重
articles = data.get("articles", [])
# 按 id 去重(API 返回数据可能有重复)
def dedup_items(items: List[dict]) -> List[dict]:
seen = set()
result = []
for item in items:
article_id = item.get('id', '')
if article_id and article_id not in seen:
seen.add(article_id)
result.append(item)
return result
articles = dedup_items(articles)
# 截取指定数量
display_articles = articles[:max_items] if max_items is not None else articles
display_total = len(display_articles)
# 输出标题
keyword = data.get("keyword", "")
expanded_days = data.get("expandedDays", 7)
expanded_hint = data.get("expandedHint", "")
output.append(f"# 公众号爆款数据分析报告\n")
output.append(f"\n**关键词**:{keyword}")
output.append(f"\n**爆款总数**:{display_total} 条")
output.append(f"\n**统计时间**:近 {expanded_days} 天")
if expanded_hint:
output.append(f"\n*{expanded_hint}*")
output.append("\n\n---\n")
# 如果没有数据,输出友好提示
if display_total == 0:
output.append("## 暂无相关爆款数据\n\n")
output.append(f"很抱歉,当前关键词 **「{keyword}」** 尚未有足够的爆款文章数据。\n\n")
output.append("### 可能原因\n\n")
output.append("- 该关键词相对小众或新兴,爆款内容积累较少\n")
output.append("- 近期该赛道热度较低,暂无突出爆款文章\n")
output.append("- 关键词表述方式可以更加具体或热门\n\n")
output.append("### 建议操作\n\n")
output.append("- 更换为更热门的关键词,如:**\"职场干货\"**、**\"个人成长\"**、**\"理财知识\"** 等\n")
output.append("- 尝试更细分的长尾关键词,如:**\"副业赚钱\"**、**\"时间管理技巧\"** 等\n")
output.append("- 输入其他感兴趣的领域或赛道进行追踪\n\n")
output.append("---\n\n")
output.append("*数据来源:红狐数据公众号爆款雷达,每日更新最新热门内容*\n")
return "\n".join(output)
# 输出爆款文章表格
output.append(f"\n## 爆款文章列表(共 {display_total} 条)\n\n")
output.append("| 序号 | 标题 | 作者 | **阅读数** | 在看 | 点赞 | 评论 |")
output.append("|------|------|------|---------|------|------|------|")
for idx, item in enumerate(display_articles, 1):
title = process_title(item)
author_str = process_author(item)
# 互动数据(API实际返回字段)
clicks_count = item.get('clicksCount', '0')
watch_count = item.get('watchCount', '0')
like_count = item.get('likeCount', '0')
comments_count = item.get('commentsCount', '0')
# API没有返回shareCount字段,暂时不显示
output.append(f"| {idx} | {title} | {author_str} | **{clicks_count}** | {watch_count} | {like_count} | {comments_count} |")
output.append("\n\n---\n\n")
output.append("*数据来源:红狐数据公众号爆款雷达,每日更新最新热门内容*\n")
return "\n".join(output)
def main():
"""主函数"""
parser = argparse.ArgumentParser(description='公众号热门数据查询工具(红狐数据)')
parser.add_argument('--keyword', required=True,
help='搜索关键词(多个关键词用英文逗号分隔,最多5个,总长度不超过200字符)')
parser.add_argument('--max-items', type=int, default=10,
help='最多展示文章数量(默认10条)')
parser.add_argument('--start-date', type=str, default=None,
help='开始日期,格式 yyyy-MM-dd(最长为最近30天)')
parser.add_argument('--output-format', choices=['text', 'json', 'markdown'],
default='markdown', help='输出格式(默认markdown)')
parser.add_argument('--debug', action='store_true', help='启用调试模式')
parser.add_argument('--no-auto-expand', action='store_true',
help='禁用自动拓展时间范围(默认开启)')
args = parser.parse_args()
try:
auto_expand = not args.no_auto_expand
data = fetch_gzh_trends(
keyword=args.keyword,
start_date=args.start_date,
debug=args.debug,
auto_expand=auto_expand
)
# 生成输出内容
if args.output_format == 'json':
output_content = json.dumps(data, ensure_ascii=False, indent=2)
else:
output_content = format_output(data, max_items=args.max_items)
# 直接输出到控制台
print(output_content)
except Exception as e:
print(f"❌ 错误: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()