
Wechat Similar Account
- 2 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Matches WeChat public-account benchmarks using a three-layer weighted system to recommend peer and top accounts for modeling or account-launch reference.
About
A WeChat account benchmark-matching tool that recommends peer and top accounts via a three-layer weighted scoring model. A content creator uses it for competitor benchmarking, account-launch reference, or placement decisions.
- Three-layer weighting: core basics 40%, ops/monetization 35%, data 25%
- Recommends peer and top benchmark accounts with personalized rationale
Wechat Similar Account by the numbers
- 2 all-time installs (skills.sh)
- Ranked #1,643 of 1,879 Marketing & SEO 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-similar-accountAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 2 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Matches WeChat public-account benchmarks using a three-layer weighted system to recommend peer and top accounts for modeling or account-launch reference.
Files
公众号相似账号推荐
简介
公众号相似账号推荐是一款专为公众号创作者设计的智能对标匹配工具,帮助用户快速找到可参考的对标账号和可追赶的头部标杆。
通过简单的名称或ID输入,你可以:
- 📊 查询账号基本信息 + 近5篇文章数据
- 🎯 匹配同阶对标账号(可直接复制玩法)
- 🚀 推荐高阶标杆账号(模式成熟可追赶)
- 📈 基于3层加权体系生成个性化推荐理由
- 🔄 未收录账号支持提交微信号进行数据同步
适用于公众号创作者、内容运营、账号投放决策等需要对标参考的场景。基于 RedFox 数据平台提供支持。
功能特性
🎯 核心功能
- 🔍 智能查询:支持按公众号名称、公众号ID、账号分类三种方式查询
- 📊 账号诊断:展示查询账号的基本信息、红狐指数、阅读数据及近5篇文章
- 🎯 同阶对标:推荐阅读数最接近的同赛道账号,可直接复制运营玩法
- 🚀 高阶标杆:推荐阅读数3-5倍的成熟账号,模式可参考追赶
- 📋 数据同步:未收录账号支持提交微信号进行数据同步
✨ 特色亮点
- ⚖️ 3层加权匹配:核心基础(40%) + 运营变现(35%) + 数据特征(25%),推荐结果科学可落地
- 💡 7维度推荐理由:涵盖爆文标题引用、发文时段规律、分享传播力、互动率等,数据稀疏时自动补充红狐指数/近7天互动等维度
- 🔄 订阅推送:支持订阅对标账号推送,每日更新最新数据
- 📱 多输入方式:名称/ID/分类灵活查询,组合查询更精准
一键安装
前置条件
- Python 3.x 运行环境(仅依赖标准库,无需 pip install)
- 红狐Hub API Key(前往 RedFox 官网 注册获取,新用户赠送免费积分)
获取 API Key
1. 访问 红狐Hub 官网 了解服务详情 2. 前往 注册页面 注册账号 3. 新注册用户将获赠免费积分,可立即开始使用 API 服务 4. 注册登录后,在个人中心获取 API Key,格式为 ak_xxxxxxxx
配置 API Key
REDFOX_API_KEY 从环境变量获取。若未设置,Agent 应主动帮用户配置:
| 系统 | 配置方式 | 验证命令 |
|---|---|---|
| Windows | [Environment]::SetEnvironmentVariable("REDFOX_API_KEY", "<值>", "User") | echo %REDFOX_API_KEY% |
| macOS/Linux | echo 'export REDFOX_API_KEY=<值>' >> ~/.zshrc && source ~/.zshrc | echo $REDFOX_API_KEY |
配置后需重启终端生效,确保换一个 skill 也能读取到。
环境变量配置
| 变量名 | 必填 | 说明 |
|---|---|---|
REDFOX_API_KEY | 是 | 红狐Hub API 访问密钥,格式 ak_xxxxxxxx |
使用指南
基础使用
1. 按名称查询
告诉助手你想查询的公众号名称:
用户:帮我查"科技前沿"的对标账号
>
助手:调用脚本 python scripts/wechat_similar_accountr.py --account_name "科技前沿",按模板输出结果2. 按ID查询
提供公众号ID进行精准查询:
用户:帮我查公众号ID为gh_xxx的对标
>
助手:调用脚本 python scripts/wechat_similar_accountr.py --account_id "gh_xxx",按模板输出结果3. 按分类查询
指定账号分类查找对标:
用户:推荐科技数码类的对标账号
>
助手:调用脚本 python scripts/wechat_similar_accountr.py --account_type "科技数码",按模板输出结果高级使用
4. 组合查询
同时指定名称和分类,查询更精准:
python scripts/wechat_similar_accountr.py --account_name "科技前沿" --account_type "科技数码"5. 数据同步
当账号未被收录时,提交微信号进行数据同步:
python scripts/wechat_similar_accountr.py --sync_wechat_id "kejiqianyan" --account_name "科技前沿"6. 按分类查询注意事项
红狐数据 平台的分类体系与自然语言存在差异,--account_type 查询成功率较低。当用户以自然语言分类(如「风景」「情感」)查询时,应: 1. 查找该领域代表性公众号(如「风景」→「中国国家地理」,「情感」→「夜听」) 2. 使用 --account_name "代表性名称" 执行查询 3. 从返回结果的「账号分类」字段确认平台内部归类
命令速查
| 命令 | 功能 |
|---|---|
--account_name "名称" | 按公众号名称查询 |
--account_id "ID" | 按公众号ID查询 |
--account_type "分类" | 按账号分类查询 |
--sync_wechat_id "微信号" --account_name "名称" | 提交数据同步请求 |
输出流程
详细的核心工作流程(输入解析、脚本调用、输出模板、无数据处理、对标匹配规则等)请参考 references/core_workflow.md。
输出顺序: 1. 查询账号基本信息 + 近5篇文章 2. 开场白(只显示有数据的组) 3. 同阶对标表格(有数据才展示) 4. 高阶标杆表格(有数据才展示) 5. 分析总结(有数据才展示) 6. 订阅服务(必须输出,无论有无数据)
无数据交互流程
当查询不到账号数据时,提示用户: 1. 请输入微信号,为您同步数据(约30分钟后自动推送诊断报告) 2. 下次再说
当用户回复 1+微信号 时,执行:
python scripts/wechat_similar_accountr.py --sync_wechat_id "微信号" --account_name "公众号名称"回复确认文案:已提交{微信号},并且30分钟后将为自动为用户推送诊断报告
使用场景
场景一:新号起号参考
角色:公众号新手运营
需求:刚创建公众号,不知道怎么定位和选题
使用方式: 1. 输入自己的公众号名称或分类 2. 查看同阶对标账号的内容方向和更新节奏 3. 复制对标账号的运营策略
预期收益:快速找到可复制的运营模式,降低起号试错成本
---
场景二:内容选题优化
角色:公众号内容运营
需求:内容遇到瓶颈,需要参考同赛道优秀账号的选题方向
使用方式: 1. 查询自己账号的对标推荐 2. 分析高阶标杆的爆文特征和内容风格 3. 调整自身选题策略
预期收益:突破内容瓶颈,提升文章阅读和互动数据
---
场景三:账号投放决策
角色:品牌营销经理
需求:选择合适的公众号进行广告投放
使用方式: 1. 按分类查询目标赛道的公众号 2. 对比同阶和高阶账号的数据表现 3. 评估互动率和用户画像匹配度
预期收益:精准选择投放账号,提高投放ROI
---
场景四:竞品分析
角色:MCN 运营人员
需求:了解竞品账号的运营策略和数据表现
使用方式: 1. 查询竞品账号的对标推荐 2. 分析同赛道账号的差异化定位 3. 发现市场空白机会
预期收益:掌握竞品动态,发现差异化竞争机会
项目架构
目录结构
wechat-similar-account/
├── scripts/
│ └── wechat_similar_accountr.py # 核心脚本:调用API查询对标账号并格式化输出
├── references/
│ └── core_workflow.md # 核心工作流程:操作步骤、输出模板、匹配规则
├── SKILL.md # 技能描述文件
└── README.md # 项目说明文档技术栈
| 组件 | 说明 |
|---|---|
| 运行环境 | Python 3.x |
| 依赖 | Python 标准库(json、argparse、os、urllib、platform、re) |
| 数据源 | 红狐数据 API(https://redfox.hk/) |
| API 接口 | POST https://redfox.hk/story/api/gzhUser/querySimilarAccounts |
核心模块说明
| 模块 | 职责 |
|---|---|
query_similar_accounts() | 调用 红狐数据 API 查询对标账号和头部账号(API返回 currentAccount + benchmarkAccounts + topAccounts) |
format_output() | 格式化完整文本输出,包含查询账号信息、对标表格、分析总结 |
generate_recommendation_reason() | 基于3层加权匹配体系生成推荐理由,支持7个维度的组合输出 |
_analyze_publish_schedule() | 从文章 publishTime 推断固定发文时段(如"早间7点固定发文""晚间时段为主") |
_extract_top_article() | 提取最高阅读文章标题,输出"爆文「标题…」达均阅X.X倍" |
_calc_interaction_rate() | 计算互动率,超过100%判定为数据异常不输出 |
_calc_share_rate() | 计算分享率=分享数/阅读数,反映内容传播力 |
calc_seven_day_reads() | 计算近7天阅读数(从works累加clicksCount,works为空返回0;interactiveCountSeven是互动量非阅读量,不可混用) |
submit_account_sync() | 提交未收录账号的数据同步请求 |
API 响应结构
API (POST /gzhUser/querySimilarAccounts) 返回以下字段:
currentAccount:查询账号的基本信息及近5篇文章数据(works字段)benchmarkAccounts:同阶对标账号列表topAccounts:高阶标杆账号列表
脚本直接从 currentAccount 获取查询账号信息和 works 数据。当 currentAccount 为空时(如按分类查询未命中具体账号),从 benchmarkAccounts + topAccounts 中按 accountName/accountId 匹配。
关键字段说明
| 字段 | 说明 |
|---|---|
articleCountSeven | 近7天文章发布数,currentAccount可能不含此字段,此时从works数量推断 |
interactiveCountSeven | 近7天互动量(非阅读量),不可作为阅读数使用 |
avgReadCount | 平均阅读数,可能为 null,此时需从 works 中计算 effective_avg |
clicksCount | 文章阅读数,最大值为 100001(10w+ 封顶值) |
redfoxIndex | 红狐指数,账号综合质量评分 |
works | 近期文章列表,包含 title/clicksCount/likeCount/commentCount/watchCount/interactiveCount/shareCount/publishTime/workUrl 等 |
推荐理由生成维度
| 优先级 | 维度 | 数据来源 | 示例 |
|---|---|---|---|
| 1 | 爆文洞察 + 内容主题聚焦 | works + effective_avg | 同赛道近7天3篇爆文,全聚焦于亲子育儿教育/健康养生 |
| 2 | 爆文标题引用 | works中最高阅读文章 | 爆文「女性最佳绝经期…」达均阅2.4倍 |
| 3 | 更新节奏 + 内容策略 + 发文时段 | articleCountSeven + works | 日更高产,图文深度/中等深度内容,早间7点固定发文 |
| 4 | 互动率 + 分享率 | works中互动/分享/阅读数据 | 互动率3.2%,分享率5.1%,内容传播力强 |
| 5 | 近7天互动数 | interactiveCountSeven | 近7天互动49.8w,用户活跃度可参考 |
| 6 | 红狐指数阶段定位 | redfoxIndex + accountType | 红狐指数932,账号综合质量在「文摘精选」赛道中表现突出 |
| 7 | 数据稀疏补充 | 多维度兜底 | 内容方向:亲子育儿/健康养生,近7天发文5篇 |
关键机制:
effective_avg= max(avgReadCount, works阅读均值),当 avgReadCount 为 null 时仍可判断爆文- 互动率超过100%判定为数据异常,不输出
- 各维度间自动去重,避免同一条信息重复输出
常见问答
安装相关问题
Q1: 提示 "未找到 REDFOX_API_KEY 配置" 怎么办?
A: 请按以下步骤配置: 1. 访问 https://redfox.hk/ 注册账号并获取 API Key 2. Windows 用户在 PowerShell 执行:[Environment]::SetEnvironmentVariable("REDFOX_API_KEY", "<你的API Key>", "User") 3. macOS/Linux 用户执行:echo 'export REDFOX_API_KEY=<你的API Key>' >> ~/.zshrc 然后 source ~/.zshrc 4. 重启终端后生效
Q2: 需要安装额外的 Python 依赖吗?
A: 不需要。脚本仅使用 Python 标准库(json、argparse、os、urllib、re 等),无需 pip install 任何包。
---
使用相关问题
Q3: 查询不到账号数据怎么办?
A: 说明该账号暂未被平台完整收录。你可以回复 1+微信号 提交数据同步请求,大概30分钟后自动推送诊断报告。
Q4: 支持哪些查询方式?
A: 支持三种方式:
- 按公众号名称:
--account_name "名称" - 按公众号ID:
--account_id "gh_xxx" - 按账号分类:
--account_type "科技数码" - 也支持组合查询,如同时指定名称和分类
Q5: 同阶对标和高阶标杆有什么区别?
A: 同阶对标的阅读数与查询账号最接近,可直接复制玩法;高阶标杆的阅读数是查询账号的3-5倍,运营模式更成熟,适合追赶学习。
Q6: 按分类查询无结果怎么办?
A: 红狐数据 平台的分类体系与自然语言存在差异,建议使用该领域代表性公众号名称查询。例如「风景」→「中国国家地理」,「情感」→「夜听」。
---
故障排除
Q7: API 请求返回 HTTP 错误怎么办?
A: 请检查以下几点: 1. 确认 API Key 是否正确且未过期 2. 确认网络可以正常访问 https://redfox.hk/ 3. 检查 API Key 是否有足够的积分余额
Q8: 输出结果中某些字段为空或为0?
A: 这是正常现象,说明该账号在对应数据维度上暂无数据记录。脚本会自动处理为"暂无"或"0"展示。
---
获取帮助
如有其他问题,可通过以下方式获取帮助:
- 📧 访问 红狐数据 官网 了解更多
WeChat Official Account Benchmarking Tool / wechat-similar-account
---
Overview
A benchmark account matching tool for WeChat Official Account creators. Using a 3-tier weighted matching system (Core Fundamentals 40% + Operations & Monetization 35% + Data Characteristics 25%), it intelligently recommends peer benchmark accounts and top-tier aspirational accounts—helping creators pinpoint their niche, replicate proven strategies, and plan growth trajectories.
Core Value
- Dual-group smart recommendations: Delivers both "Peer Benchmarks" (copyable playbooks) and "Top Aspirationals" (mature models to chase) in a single query, meeting needs at every growth stage.
- 3-tier weighted matching: Core fundamentals (niche/tags/content format/audience profile) + Operations & monetization (cadence/traffic/private domain/revenue) + Data characteristics (engagement structure/viral patterns/resource endowments)—scientifically grounded and actionable.
- 7-dimension recommendation reasons: Each recommended account comes with detailed analysis spanning viral insights, content focus, publishing cadence, engagement rate, and share rate—with automatic fallback to RedFox Index when data is sparse.
- Subscription push: Subscribe to benchmark account push notifications with daily data updates to continuously track niche dynamics.
Intended Users
- 📝 WeChat Official Account creators — Find benchmark accounts in your niche to learn content strategies and operational tactics.
- 🛍️ Brand / ad operators — Screen high-match accounts for advertising placements and business collaborations.
- 🏢 MCN / content teams — Analyze niche landscapes at scale and plan differentiated directions for matrix accounts.
- 🌱 New account launchers — Reference peer benchmark growth paths to reduce launch trial-and-error costs.
---
Features
Core Capabilities
- Smart query: Search by account name, account ID, or account category—also supports combined queries for precise targeting.
- Account diagnostics: Display basic account info, RedFox Index, readership data, and the latest 5 articles for the queried account.
- Peer benchmark recommendations: Recommend same-niche accounts with the closest readership numbers—directly copy their operational playbooks.
- Top aspirational recommendations: Recommend mature accounts with 3–5× your readership—reference their operational models to catch up.
- Data sync: For unlisted accounts, submit a WeChat ID to trigger data synchronization, with a diagnostic report automatically pushed in about 30 minutes.
Highlights
- 3-tier weighted matching system: Core fundamentals (40%) + Operations & monetization (35%) + Data characteristics (25%), covering every dimension from content positioning to revenue model.
- 7-dimension personalized reasons: Covering viral title quotes, publishing schedule patterns, share virality, engagement rate, and more—with automatic fallback when data is sparse.
- Subscription push: Subscribe to benchmark account push notifications with daily updated data.
- Multi-input flexibility: Flexible queries by name / ID / category, with combined queries for greater precision.
---
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 query needs in natural language—no commands to memorize.
Quick Reference
| Intent | Example phrase | Result |
|---|---|---|
| Search by account name | "Find benchmark accounts for TechFrontier" | Precise name match, outputting both peer benchmarks and top aspirationals |
| Search by account ID | "Find benchmarks for account ID gh_xxx" | Precise ID-based query |
| Explore by category | "Recommend benchmark accounts in the tech-digital category" | Category-based query to explore niche landscape |
| Submit data sync | "My account isn't indexed yet, WeChat ID is kejiqianyan" | Submit sync request; diagnostic report auto-pushed in ~30 minutes |
Output Example
After querying, you will receive the following structured analysis:
Account Basic Info: Account name, ID, category, RedFox Index, average reads, past-7-day metrics, and the latest 5 articles
✨ Peer Benchmarks (5): Accounts closest to your readership level—directly reference their content strategy
| Account | RedFox Index | Avg Reads | 7-Day Reads | 7-Day Posts | Recommendation Reason | | … | … | … | … | … | Multi-dimension analysis: viral insights, content focus, cadence, engagement rate, etc. |
✨ Top Aspirationals (5): Top-tier accounts with 3–5× your readership—mature models to pursue
---
(When no data is found, the system automatically guides you to submit a WeChat ID for sync, ensuring every query yields a result.)
---
Use Cases
| Scenario | Role | Example question | Benefit |
|---|---|---|---|
| New account launch reference | New account operator | "I just created an account—find me peer benchmarks at a similar stage" | Quickly find copyable operational models; lower launch trial-and-error costs |
| Content topic optimization | Account content operator | "My reads have plateaued—show me how top accounts in my niche are performing" | Analyze top aspirational viral patterns to break through content bottlenecks |
| Ad placement selection | Brand marketing manager | "Find tech-digital accounts with 10k+ reads for ad placement" | Precisely filter placement accounts by niche and readership; improve ad ROI |
| Competitive analysis | MCN operations staff | "Analyze the parenting niche competitive landscape for me" | Stay on top of competitor dynamics; discover differentiated opportunities |
---
Important Data Notes
- Data is sourced from the RedFox data platform; the displayed data retrieval time may differ from real-time figures.
- Recommended account metrics (reads, engagement, etc.) are based on platform-indexed data; engagement counts should not be used as read counts.
- When searching by category, the platform's classification system may differ from natural language; using a representative account name for lookup is recommended.
- For unlisted accounts, submit the WeChat ID to trigger sync; a diagnostic report will be automatically pushed in about 30 minutes.
- Maximum displayed read count is 100,001 (10w+ cap); actual readership may be higher.
---
公众号相似账号推荐 / wechat-similar-account
---
简介
公众号创作者对标账号匹配工具,基于 3 层加权匹配体系(核心基础 40% + 运营变现 35% + 数据特征 25%)智能推荐同阶对标账号和高阶标杆账号,帮助创作者精准定位赛道、复制成功打法、规划增长路径。
核心价值
- 双组智能推荐:同时输出「同阶对标」(可直接复制玩法)和「高阶标杆」(模式成熟可追赶)两组账号,满足不同阶段参考需求。
- 3 层加权匹配:核心基础匹配(赛道/标签/内容形态/用户画像)+ 运营变现匹配(节奏/流量/私域/变现)+ 数据特征匹配(互动结构/爆文特征/资源禀赋),推荐科学可落地。
- 7 维度推荐理由:每个推荐账号附带从爆文洞察、内容聚焦、更新节奏到互动率、分享率的详细分析,数据稀疏时自动补充红狐指数等维度。
- 订阅推送:支持订阅对标账号推送,每日更新最新数据,持续跟踪赛道动态。
适用对象
- 📝 公众号创作者 — 找到同赛道对标账号,借鉴内容策略与运营打法。
- 🛍️ 品牌 / 投放运营 — 筛选高匹配度公众号进行投放与商务合作。
- 🏢 MCN / 内容团队 — 批量分析赛道格局,为矩阵账号规划差异化方向。
- 🌱 新号起号者 — 参考同阶对标账号的成长路径,降低起号试错成本。
---
功能特性
核心功能
- 智能查询:支持按公众号名称、公众号 ID、账号分类三种方式查询对标账号,也可组合查询精准定位。
- 账号诊断:展示查询账号的基本信息、红狐指数、阅读数据及近 5 篇文章数据。
- 同阶对标推荐:推荐阅读数最接近的同赛道账号,可直接复制运营玩法。
- 高阶标杆推荐:推荐阅读数 3-5 倍的成熟账号,运营模式可参考追赶。
- 数据同步:未被收录的账号支持提交微信号进行数据同步,约 30 分钟后自动推送诊断报告。
特色亮点
- 3 层加权匹配体系:核心基础(40%)+ 运营变现(35%)+ 数据特征(25%),覆盖从内容定位到商业变现的全维度匹配。
- 7 维度个性化理由:涵盖爆文标题引用、发文时段规律、分享传播力、互动率等,数据稀疏时自动补充。
- 订阅推送:支持订阅对标账号推送,每日更新最新数据。
- 多输入方式:名称 / ID / 分类灵活查询,组合查询更精准。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言描述你的查询需求,无需记忆命令。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 按名称查询对标 | 「帮我查科技前沿的对标账号」 | 按名称精准匹配,输出同阶对标和高阶标杆两组推荐 |
| 按 ID 查询对标 | 「帮我查公众号 ID 为 gh_xxx 的对标」 | 按公众号 ID 精准查询 |
| 按分类探索赛道 | 「推荐科技数码类的对标账号」 | 按分类查询赛道对标账号,了解赛道格局 |
| 提交数据同步 | 「我的号还没收录,微信号是 kejiqianyan」 | 提交同步请求,约 30 分钟后自动推送诊断报告 |
输出示例
完成查询后,你将收到以下结构化的分析结果:
查询账号基本信息:账号名称、ID、分类、红狐指数、平均阅读数、近 7 天数据及近 5 篇文章列表
✨ 同阶对标(5 个):阅读量与你最接近的账号,可直接复制其内容策略
| 账号名称 | 红狐指数 | 平均阅读数 | 近 7 天阅读数 | 近 7 日发文数 | 推荐理由 | | … | … | … | … | … | 从爆文洞察、内容聚焦、更新节奏、互动率等多维度分析 |
✨ 高阶标杆(5 个):阅读量为你 3-5 倍的头部账号,模式成熟可追赶
---
(查询不到数据时,系统自动引导提交微信号同步,确保每次查询都有结果。)
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 新号起号参考 | 公众号新手运营 | 「我刚创建公众号,帮我找同阶段的对标账号」 | 快速找到可复制的运营模式,降低起号试错成本 |
| 内容选题优化 | 公众号内容运营 | 「我的号最近阅读量卡住了,帮我看看同赛道头部账号怎么做」 | 分析高阶标杆爆文特征,突破内容瓶颈 |
| 账号投放决策 | 品牌营销经理 | 「帮我找科技数码类阅读量 1w+ 的公众号进行投放」 | 按赛道和阅读量精准筛选投放账号,提高投放 ROI |
| 竞品分析 | MCN 运营人员 | 「帮我分析母婴赛道的公众号竞争格局」 | 掌握竞品动态,发现差异化竞争机会 |
---
重要数据说明
- 数据源自红狐数据平台,展示的数据获取时间可能与实时数据存在差别。
- 推荐账号的阅读数、互动数等指标来源于平台收录数据,互动量不可作为阅读数使用。
- 按分类查询时,平台分类体系与自然语言可能存在差异,建议优先使用代表性账号名称查询。
- 未收录的公众号可通过提交微信号发起同步,约 30 分钟后自动推送诊断报告。
- 阅读数最大显示为 100001(10w+ 封顶值),实际阅读量可能更高。
---
公众号相似账号推荐 - 核心工作流程
操作步骤
步骤1:接收用户输入,解析参数
输入方式A:公众号名称
- 用户输入示例:"我的公众号叫科技前沿"
- 参数:accountName
输入方式B:公众号ID
- 用户输入示例:"帮我查公众号ID为xxx的对标"
- 参数:accountId
输入方式C:账号分类
- 用户输入示例:"科技数码类的对标账号"
- 参数:accountType
步骤2:调用脚本查询对标账号
# 按公众号名称查询
python scripts/wechat_similar_accountr.py --account_name "科技前沿"
# 按公众号ID查询
python scripts/wechat_similar_accountr.py --account_id "xxx"
# 按账号分类查询
python scripts/wechat_similar_accountr.py --account_type "科技数码"
# 组合查询
python scripts/wechat_similar_accountr.py --account_name "科技前沿" --account_type "科技数码"API接口:POST https://redfox.hk/story/api/gzhUser/querySimilarAccounts
API 响应结构:返回 currentAccount(查询账号基本信息及 works 近5篇文章数据)+ benchmarkAccounts(同阶对标)+ topAccounts(高阶标杆)。脚本优先从 currentAccount 获取查询账号信息,当 currentAccount 为空时(如按分类查询未命中具体账号),从 benchmarkAccounts + topAccounts 中按 accountName/accountId 匹配。
关键字段说明:
articleCountSeven:近7天文章发布数,currentAccount 可能不含此字段,此时从 works 数量推断interactiveCountSeven:近7天互动量(非阅读量),不可作为阅读数使用avgReadCount:平均阅读数,可能为 null,此时需从 works 中计算 effective_avgclicksCount:文章阅读数,最大值 100001(10w+ 封顶值)redfoxIndex:红狐指数,账号综合质量评分works:近期文章列表,包含 title/clicksCount/likeCount/commentCount/watchCount/interactiveCount/shareCount/publishTime/workUrl 等- 近7天阅读数:API 无直接字段,需从 works 中累加 clicksCount 计算
按分类查询注意事项:
RedFox 平台的分类体系与自然语言存在差异,--account_type 查询成功率较低。当用户以自然语言分类(如「风景」「情感」)查询时,应: 1. 查找该领域代表性公众号(如「风景」→「中国国家地理」,「情感」→「夜听」) 2. 使用 --account_name "代表性名称" 执行查询 3. 从返回结果的「账号分类」字段确认平台内部归类
步骤3:按标准模版输出结果
输出顺序: 1. 查询账号基本信息+近5篇文章 2. 开场白(只显示有数据的组) 3. 同阶对标表格(有数据才展示) 4. 高阶标杆表格(有数据才展示) 5. 分析总结(有数据才展示) 6. 订阅服务(必须输出,无论有无数据)
重要:订阅服务是固定输出项,无论是否有对标账号数据,都必须输出订阅服务段落。
输出格式示例:
**查询账号基本信息**
- 账号名称:科技前沿
- 账号ID:gh_xxx
- 账号分类:科技数码
- 红狐指数:750
- 平均阅读数:8000
- 近7天阅读数:3.5w
- 近7天发文章数:6
**近5篇文章**
| 文章标题 | 阅读数 | 点赞数 | 评论数 | 在看数 | 总互动数 | 发布时间 |
| --- | --- | --- | --- | --- | --- | --- |
| [文章标题](文章地址) | 1.2w | 56 | 12 | 34 | 102 | 2026-05-08 |
✨ 为你匹配到【可直接抄的同阶对标(5个)】和【可追赶的高阶标杆(5个)】的2组推荐,可按需参考:
| 数据说明:数据获取时间为xxx,和实时数据存在差别。
👉【可直接抄的同阶对标(5个)】(和查询账号阅读数最接近,可直接复制玩法)
| 账号名称 | 红狐指数 | 平均阅读数 | 近7天阅读数 | 近7日文章发布数 | 推荐理由 |
| --- | --- | --- | --- | --- | --- |
| [账号名](https://open.weixin.qq.com/qr/code?username={accountId}) | 850 | 1.2w | 5000 | 6 | 同属「科技数码」赛道,内容聚焦于**干货教程**/**资源盘点**<br>日更高产,图文深度/中等深度内容,早间7点固定发文<br>互动率3.2%,分享率5.1%,内容传播力强 |
👉【可追赶的高阶标杆(5个)】(阅读数是查询账号的3-5倍,模式成熟可参考)
| 账号名称 | 红狐指数 | 平均阅读数 | 近7天阅读数 | 近7日文章发布数 | 推荐理由 |
| --- | --- | --- | --- | --- | --- |
| [账号名](https://open.weixin.qq.com/qr/code?username={accountId}) | 920 | 5w | 2w | 5 | 同赛道近7天3篇爆文,全聚焦于**深度观点评论**/**科技数码产品**<br>爆文「**ChatGPT高效使用指南…**」达均阅3.2倍<br>日更高产,图文深度/长文深度解析,晚间21点固定发文<br>互动率1.5%,分享率8.2%,内容传播力强 |
**订阅服务**
1. 是否订阅"科技前沿"的相似账号推送,每日下午19点更新最新数据。你可自行选择推送频率和时间~
2. 暂不需要无数据情况:
当前未查询到该账号相关数据,是数据覆盖范围不足导致的。不过别担心,我们将提供账号数据去实时获取;
1. 请输入微信号,为您同步数据。该账号诊断报告将约30分钟后为您自动推送。
2. 下次再说无数据时的交互流程:
当用户回复 1+微信号(如 1+kejiqianyan)时: 1. 调用脚本提交同步请求:
python scripts/wechat_similar_accountr.py --sync_wechat_id "微信号" --account_name "公众号名称"2. 回复用户确认文案:已提交{微信号},并且30分钟后将为自动为用户推送诊断报告
当用户回复 2 或"下次再说"时:结束当前对话
数值格式化:< 10000 直接展示原值,>= 10000 格式化为 "X.Xw"
推荐理由:基于3层加权匹配体系生成,由7个维度按优先级组合输出(详见下方推荐理由生成规则章节)
步骤4:输出结果
脚本直接输出格式化结果,AI按模板展示即可。
对标匹配规则
匹配规则基于3层加权体系,账号所属分类必须一致,近7天数据不同维度按权重匹配:
核心基础匹配(优先级最高,占比40%)
| 维度 | 匹配规则 |
|---|---|
| 细分定位重合 | 一级赛道100%匹配,二级细分定位匹配度>=70%。如做「职场→Office技能实操」,不会匹配「职场→职场八卦吐槽」 |
| 内容标签重合度 | 近30天发文核心关键词重合度>=40%。如高频发「Excel函数、PPT模板、汇报技巧」,对标号也需高频出现此类关键词 |
| 内容形态&风格匹配 | 内容载体一致(图文/条漫/短视/音频),内容风格一致(硬核干货/情绪共鸣/资讯快报/搞笑玩梗) |
| 用户画像重合度 | 年龄、性别、城市分布、消费能力重合度>=70%。如都是22-30岁一二线职场新人占比75%,目标用户完全同群 |
运营&变现匹配(学落地方法必看,占比35%)
| 维度 | 匹配规则 |
|---|---|
| 运营节奏匹配 | 更文频率(日更/周更3篇/周更1篇)、固定发文时段差<=2小时,内容生产模式一致(个人原创/团队撰稿/UGC征稿/资讯整合) |
| 流量路径匹配 | 核心流量来源结构一致,如搜一搜流量占比高/朋友圈分享流量占比高/看一看推荐流量占比高,涨粉路径一致(靠内容自然涨/靠互导涨/靠福利裂变涨) |
| 私域&用户运营匹配 | 私域引流路径一致(正文引导/菜单栏引导/自动回复引导),用户运营动作一致(做社群/做打卡活动/无额外运营) |
| 变现模式匹配 | 核心变现方式一致(知识付费/广告带货/引流线下),变现产品类型、转化路径、客单价区间一致 |
数据特征&资源匹配(找同阶段可复制经验,占比25%)
| 维度 | 匹配规则 |
|---|---|
| 互动数据结构匹配 | 平均互动率(点赞+在看+分享/阅读)区间一致,如都是0.5%-1%区间;用户行为结构一致,如收藏率远高于点赞率说明用户需求都是"存干货" |
| 爆文特征匹配 | 爆文率区间一致(如都是10%左右的内容能达到同赛道平均阅读的2倍以上),爆文选题类型一致,如爆文都是「免费资源盘点」类 |
| 资源禀赋匹配 | 账号主体类型一致(个人号/3人内小团队号/企业品牌号),无特殊官方资源扶持,经验可落地性更强 |
推荐理由生成规则
推荐理由由 generate_recommendation_reason() 函数生成,按优先级从7个维度组合输出,数据稀疏时自动降级补充。
生成维度(按优先级)
| 优先级 | 维度 | 数据来源 | 输出条件 | 示例 |
|---|---|---|---|---|
| 1 | 爆文洞察 + 内容主题聚焦 | works + effective_avg | effective_avg > 0 且有爆文 | 同赛道近7天3篇爆文,全聚焦于「亲子育儿教育/健康养生」 |
| 2 | 爆文标题引用 | works中最高阅读文章 | 最高阅读 >= effective_avg × 2 | 爆文「标题…」达均阅2.4倍 |
| 3 | 更新节奏 + 内容策略 + 发文时段 | articleCountSeven + works | 有文章数据 | 日更高产,图文深度/中等深度内容,早间7点固定发文 |
| 4 | 互动率 + 分享率 | works中互动/分享/阅读数据 | 互动率/分享率在合理区间(0.1%-100%) | 互动率3.2%,分享率5.1%,内容传播力强 |
| 5 | 近7天互动数 | interactiveCountSeven | avgReadCount 为 null 且互动数 > 0 | 近7天互动49.8w,用户活跃度可参考 |
| 6 | 红狐指数阶段定位 | redfoxIndex + accountType | 近7天阅读或平均阅读为0时补充 | 红狐指数932,账号综合质量在「文摘精选」赛道中表现突出 |
| 7 | 数据稀疏补充 | 多维度兜底 | 以上维度不足2条时补充 | 内容方向:亲子育儿/健康养生,近7天发文5篇 |
关键机制
1. effective_avg 计算:当 avgReadCount 为 null 时,从 works 中计算 effective_avg = max(avgReadCount, works阅读均值),确保爆文判断不遗漏 2. 互动率异常处理:互动率 = 互动数/阅读数,超过100%时判定为数据异常(互动数可能包含了阅读数),不输出 3. 分享率计算:分享率 = 分享数/阅读数,反映内容传播力,>= 1%时输出 4. 发文时段推断:从 works 的 publishTime 统计最频繁发文小时,60%以上文章在同一时段则输出「X点固定发文」,否则输出「X时段为主」 5. 维度去重:_add_sparse_data_reasons 与主函数通过关键词去重("互动""分享""时段"),避免同一信息重复输出
输出格式规范
1. 查询账号基本信息和所有表格中的【账号名称】需添加跳转链接,格式为 https://open.weixin.qq.com/qr/code?username={accountId} 2. 表格中【推荐理由】需分多行展示(用 <br> 换行),且「」内的内容需加粗 3. 订阅服务文案中"是否订阅\"现查询条件\"的对标账号推送"统一改为"是否订阅\"{查询账号}\"的相似账号推送",当无法获取具体账号名时回退显示"现查询条件"
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
公众号账号推荐脚本
功能:调用API查询对标账号和头部账号,输出查询账号基本信息+近5篇文章
"""
import argparse
import json
import os
import platform
import re
import urllib.error
import urllib.parse
import urllib.request
def get_api_key():
"""获取 RedFox API Key,依次从环境变量、shell配置文件中读取,均未找到则提示用户配置"""
# 1. 从环境变量获取
api_key = os.getenv("REDFOX_API_KEY")
if api_key:
return api_key.strip()
# 2. 从shell配置文件中读取
system = platform.system()
if system == "Windows":
api_key = _read_api_key_from_windows()
else:
api_key = _read_api_key_from_unix_shell_config()
if api_key:
return api_key.strip()
# 3. 未找到,提示用户配置
if system == "Windows":
config_hint = (
"未找到 REDFOX_API_KEY 配置,请按以下步骤配置:\n"
" 1. 访问 https://redfox.hk/ 注册账号并获取 API Key\n"
" 2. 在 PowerShell 中执行:\n"
' [Environment]::SetEnvironmentVariable("REDFOX_API_KEY", "<你的API Key>", "User")\n'
" 3. 重启终端后生效"
)
else:
shell = os.getenv("SHELL", "")
if "zsh" in shell:
rc_file = "~/.zshrc"
elif "bash" in shell:
rc_file = "~/.bashrc"
else:
rc_file = "~/.bashrc"
config_hint = (
"未找到 REDFOX_API_KEY 配置,请按以下步骤配置:\n"
" 1. 访问 https://redfox.hk/ 注册账号并获取 API Key\n"
f" 2. 执行:echo 'export REDFOX_API_KEY=<你的API Key>' >> {rc_file}\n"
f" 3. 执行:source {rc_file}"
)
raise ValueError(config_hint)
def _read_api_key_from_unix_shell_config():
"""从 Unix shell 配置文件中读取 REDFOX_API_KEY"""
config_files = [
os.path.expanduser("~/.zshrc"),
os.path.expanduser("~/.bashrc"),
os.path.expanduser("~/.bash_profile"),
os.path.expanduser("~/.profile"),
]
for config_file in config_files:
if not os.path.isfile(config_file):
continue
try:
with open(config_file, "r", encoding="utf-8", errors="ignore") as f:
for line in f:
line = line.strip()
# 匹配 export REDFOX_API_KEY=xxx 或 REDFOX_API_KEY=xxx
m = re.match(r'^(?:export\s+)?REDFOX_API_KEY=["\']?(.+?)["\']?\s*$', line)
if m:
return m.group(1)
except (IOError, OSError):
continue
return None
def _read_api_key_from_windows():
"""从 Windows 环境中读取 REDFOX_API_KEY(注册表 + PowerShell Profile)"""
# 2a. 尝试从注册表读取用户级环境变量
try:
import winreg
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, r"Environment")
try:
value, _ = winreg.QueryValueEx(key, "REDFOX_API_KEY")
if value:
return str(value)
finally:
winreg.CloseKey(key)
except (ImportError, OSError):
pass
# 2b. 尝试从 PowerShell Profile 读取
ps_profile_paths = [
os.path.join(os.path.expanduser("~"), "Documents", "WindowsPowerShell", "Microsoft.PowerShell_profile.ps1"),
os.path.join(os.path.expanduser("~"), "Documents", "PowerShell", "Microsoft.PowerShell_profile.ps1"),
]
for profile_path in ps_profile_paths:
if not os.path.isfile(profile_path):
continue
try:
with open(profile_path, "r", encoding="utf-8", errors="ignore") as f:
for line in f:
line = line.strip()
# 匹配 $env:REDFOX_API_KEY = "xxx" 或 setx REDFOX_API_KEY xxx
m = re.match(r'\$env:REDFOX_API_KEY\s*=\s*["\']?(.+?)["\']?\s*$', line)
if m:
return m.group(1)
except (IOError, OSError):
continue
return None
def query_similar_accounts(accountId=None, accountName=None, accountType=None):
"""调用API查询对标账号和头部账号"""
credential = get_api_key()
url = "https://redfox.hk/story/api/gzhUser/querySimilarAccounts"
headers = {
"Content-Type": "application/json",
"X-API-KEY": credential
}
payload = {
"accountId": accountId if accountId else "",
"accountName": accountName if accountName else "",
"accountType": accountType if accountType else "",
"source": "公众号相似账号推荐-GitHub"
}
try:
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
with urllib.request.urlopen(req, timeout=30) as resp:
result = json.loads(resp.read().decode("utf-8"))
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8", errors="replace")
raise Exception(f"HTTP请求失败: {e.code}, {body}")
except urllib.error.URLError as e:
raise Exception(f"请求失败: {str(e)}")
if "data" not in result:
raise Exception(f"API返回格式错误: {result}")
data = result.get("data")
if data is None:
# API返回未找到账号,返回空数据让主流程走"未查询到账号"提示
return None, [], []
# API 返回 currentAccount(查询账号信息)、benchmarkAccounts(同阶对标)、topAccounts(高阶标杆)
current_account = data.get("currentAccount")
benchmark_accounts = data.get("benchmarkAccounts", [])
top_accounts = data.get("topAccounts", [])
return current_account, benchmark_accounts, top_accounts
def format_number(num):
"""格式化数字:< 10000直接展示,>= 10000格式化为X.Xw"""
if num is None:
return "0"
if num >= 10000:
return f"{round(num / 10000, 1)}w"
return str(num)
def get_account_url(account_id):
"""生成账号跳转链接"""
return f"https://open.weixin.qq.com/qr/code?username={account_id}"
def calc_seven_day_reads(account):
"""计算近7天文章阅读数:从works累加clicksCount;works为空则返回0(interactiveCountSeven是互动量不是阅读量,不可混用)"""
works = account.get("works") or []
if works:
return sum(w.get("clicksCount") or 0 for w in works)
# API不返回近7天阅读数字段,works为空时无法计算,返回0
return 0
def _extract_content_themes(works):
"""从文章标题和摘要中提取内容主题聚焦方向"""
if not works:
return []
theme_keywords = {
"历史人物深度解析": ["人物", "历史", "皇帝", "将军", "朝代", "古人", "王朝"],
"历史事件复盘": ["事件", "战争", "变革", "运动", "革命", "转折", "战役"],
"情感故事": ["情感", "婚姻", "爱情", "亲情", "家庭", "夫妻", "恋爱"],
"职场成长": ["职场", "升职", "领导", "工作", "同事", "老板", "跳槽"],
"干货技能": ["教程", "技巧", "方法", "攻略", "步骤", "Excel", "PPT", "干货"],
"资源盘点": ["资源", "工具", "盘点", "合集", "推荐", "神器", "大全"],
"社会热点解读": ["热点", "政策", "官宣", "发布", "突发", "重磅", "最新"],
"理财投资": ["理财", "投资", "基金", "股票", "房产", "资产", "财务"],
"健康养生": ["健康", "养生", "饮食", "睡眠", "运动", "中医", "长寿"],
"心理成长洞察": ["心理", "成长", "自律", "认知", "思维", "情绪", "格局"],
"生活好物推荐": ["好物", "推荐", "同款", "购买", "测评", "体验", "种草"],
"深度观点评论": ["深度", "观点", "评论", "思考", "反思", "洞察", "剖析"],
"资讯整合速览": ["汇总", "一览", "速览", "榜单", "排行", "周报"],
"人物故事": ["故事", "人生", "传记", "经历", "逆袭", "传奇"],
"教育考试升学": ["考试", "高考", "中考", "招生", "录取", "成绩", "志愿", "培训", "升学"],
"校园生活日常": ["校园", "学生", "老师", "班级", "开学", "毕业", "期末"],
"本地生活资讯": ["本地", "城市", "社区", "区域", "区县", "乡镇", "街道", "身边"],
"政务公告通知": ["通知", "公告", "政策", "官方", "发布", "通告", "政务"],
"亲子育儿教育": ["亲子", "育儿", "宝宝", "孩子", "母婴", "早教", "家长"],
"小说阅读推荐": ["小说", "阅读", "连载", "书评", "读书", "推荐书", "书单"],
"职场招聘信息": ["招聘", "求职", "岗位", "简历", "面试", "内推", "校招"],
"美食探店分享": ["美食", "菜谱", "做法", "食谱", "烹饪", "好吃", "探店"],
"旅行出游攻略": ["旅行", "旅游", "攻略", "景点", "出行", "打卡", "自驾"],
"娱乐影视综艺": ["明星", "综艺", "电影", "电视剧", "娱乐", "八卦", "追剧"],
"科技数码产品": ["科技", "数码", "手机", "电脑", "AI", "互联网", "软件"],
"房产家居装修": ["房产", "房价", "楼盘", "装修", "家居", "买房", "租房"],
"汽车出行交通": ["汽车", "新能源", "买车", "驾照", "车型", "交通"],
"金融理财保险": ["银行", "保险", "贷款", "信用卡", "利率", "存款"],
}
all_text = " ".join(
[w.get("title", "") for w in works if w.get("title")] +
[w.get("summary", "") for w in works if w.get("summary")]
)
matched_themes = []
for theme, keywords in theme_keywords.items():
match_count = sum(1 for kw in keywords if kw in all_text)
if match_count >= 1:
matched_themes.append((theme, match_count))
matched_themes.sort(key=lambda x: x[1], reverse=True)
return [t[0] for t in matched_themes[:3]]
def _analyze_content_strategy(works):
"""分析内容策略和风格定位"""
if not works:
return ""
style_parts = []
has_cover = sum(1 for w in works if w.get("coverUrl"))
if has_cover > len(works) * 0.7:
style_parts.append("图文深度")
elif has_cover == 0:
style_parts.append("纯文字")
summaries = [w.get("summary", "") for w in works if w.get("summary")]
if summaries:
avg_len = sum(len(s) for s in summaries) / len(summaries)
if avg_len > 200:
style_parts.append("长文深度解析")
elif avg_len < 50:
style_parts.append("短平快资讯")
else:
style_parts.append("中等深度内容")
return "/".join(style_parts) if style_parts else ""
def _analyze_publish_schedule(works):
"""从文章发布时间推断发文时段规律"""
if not works:
return ""
hours = []
for w in works:
pt = w.get("publishTime") or ""
# 匹配 HH:MM 或 HH
m = re.search(r'(\d{1,2}):(\d{2})', pt)
if m:
hours.append(int(m.group(1)))
if not hours:
return ""
# 统计最频繁的发文时段
from collections import Counter
hour_counter = Counter(hours)
most_common_hour, count = hour_counter.most_common(1)[0]
total = len(hours)
# 时段标签
if 5 <= most_common_hour < 9:
period = "早间"
elif 9 <= most_common_hour < 12:
period = "上午"
elif 12 <= most_common_hour < 14:
period = "午间"
elif 14 <= most_common_hour < 18:
period = "下午"
elif 18 <= most_common_hour < 22:
period = "晚间"
else:
period = "深夜"
if count >= total * 0.6 and count >= 2:
return f"{period}{most_common_hour}点固定发文"
elif count >= 2:
return f"{period}时段为主"
return ""
def _extract_top_article(works, avg_read):
"""提取最高阅读文章的标题(爆文引用),返回 (标题, 阅读数) 或 None"""
if not works or avg_read <= 0:
return None
# 找阅读数最高的文章
top_work = max(works, key=lambda w: w.get("clicksCount") or 0)
top_clicks = top_work.get("clicksCount") or 0
# 只有达到均阅2倍才算爆文,才有引用价值
if top_clicks >= avg_read * 2 and top_clicks > 0:
title = top_work.get("title") or ""
# 截断过长的标题
if len(title) > 20:
title = title[:18] + "…"
return (title, top_clicks)
return None
def _calc_interaction_rate(works, avg_read=None):
"""计算互动率:优先基于 works 中的阅读和互动数据,兼容 avgReadCount 为 null 的场景"""
if not works:
return None
total_clicks = sum(w.get("clicksCount") or 0 for w in works)
total_interactive = sum(w.get("interactiveCount") or 0 for w in works)
# 互动数不应超过阅读数,如果互动数异常大则说明数据不准确
if total_clicks <= 0 or total_interactive <= 0:
return None
rate = total_interactive / total_clicks
# 互动率超过100%通常是数据异常(如互动数含阅读数),不输出
if rate > 1.0:
return None
# 互动率过低也没有参考价值
if rate < 0.001:
return None
return rate
def _calc_share_rate(works):
"""计算分享率:分享数/阅读数,反映内容传播力"""
if not works:
return None
total_clicks = sum(w.get("clicksCount") or 0 for w in works)
total_shares = sum(w.get("shareCount") or 0 for w in works)
if total_clicks <= 0 or total_shares <= 0:
return None
rate = total_shares / total_clicks
if rate > 1.0 or rate < 0.001:
return None
return rate
def _add_sparse_data_reasons(parts, account, account_type, redfox_index, article_count_seven, works, content_themes):
"""当近7天阅读数或平均阅读数为0时,补充其他维度的推荐理由"""
# 红狐指数维度:作为账号综合质量的参考
if redfox_index > 0:
if redfox_index >= 800:
parts.append(f"红狐指数{redfox_index:.0f},账号综合质量在「{account_type}」赛道中表现突出")
elif redfox_index >= 500:
parts.append(f"红狐指数{redfox_index:.0f},账号处于成长阶段,发展潜力可关注")
else:
parts.append(f"红狐指数{redfox_index:.0f},同赛道起步阶段定位匹配")
# 近7天互动数维度:仅在主函数未输出过时才补充
interactive_count_seven = account.get("interactiveCountSeven") or 0
if interactive_count_seven > 0 and not any("互动" in p for p in parts):
parts.append(f"近7天互动{format_number(interactive_count_seven)},用户活跃度可参考")
# 内容方向补充:从文章标题推断(即使没有阅读数据,有文章也可以提取方向)
if works and not content_themes:
topic = _infer_topic_from_titles(works)
if topic:
parts.append(f"内容方向:{topic}")
# 分享传播力:从 works 中提取分享数据(仅在主函数未输出过时才补充)
if works and not any("分享" in p for p in parts):
share_rate = _calc_share_rate(works)
if share_rate and share_rate >= 0.01:
parts.append(f"分享率{share_rate*100:.1f}%,内容传播力强")
# 发文时段规律:从 publishTime 推断(仅在主函数未输出过时才补充)
if works and not any("发文" in p or "固定" in p or "时段" in p for p in parts):
schedule = _analyze_publish_schedule(works)
if schedule:
parts.append(schedule)
# 更新节奏补充:如果前面没有提到更新节奏
if article_count_seven > 0 and not any("更新" in p or "日更" in p or "周更" in p for p in parts):
parts.append(f"近7天发文{article_count_seven}篇,保持更新节奏")
# 通用推荐方向:当以上维度都不够时
if len(parts) < 2 and account_type:
parts.append(f"同赛道定位匹配,可参考其内容策略和运营节奏")
def _infer_topic_from_titles(works):
"""从文章标题中推断内容方向(用于数据稀疏时的补充推荐理由)"""
if not works:
return ""
titles = [w.get("title", "") for w in works if w.get("title")]
if not titles:
return ""
extended_themes = {
"教育考试升学": ["考试", "高考", "中考", "招生", "录取", "成绩", "志愿", "培训", "升学"],
"校园生活日常": ["校园", "学生", "老师", "班级", "开学", "毕业", "期末"],
"本地生活资讯": ["本地", "城市", "社区", "区域", "区县", "乡镇", "街道", "身边"],
"政务公告通知": ["通知", "公告", "政策", "官方", "发布", "通告", "政务"],
"亲子育儿教育": ["亲子", "育儿", "宝宝", "孩子", "母婴", "早教", "家长"],
"小说阅读推荐": ["小说", "阅读", "连载", "书评", "读书", "推荐书", "书单"],
"职场招聘信息": ["招聘", "求职", "岗位", "简历", "面试", "内推", "校招"],
"美食探店分享": ["美食", "菜谱", "做法", "食谱", "烹饪", "好吃", "探店"],
"旅行出游攻略": ["旅行", "旅游", "攻略", "景点", "出行", "打卡", "自驾"],
"娱乐影视综艺": ["明星", "综艺", "电影", "电视剧", "娱乐", "八卦", "追剧"],
"科技数码产品": ["科技", "数码", "手机", "电脑", "AI", "互联网", "软件"],
"房产家居装修": ["房产", "房价", "楼盘", "装修", "家居", "买房", "租房"],
"汽车出行交通": ["汽车", "新能源", "买车", "驾照", "车型", "交通"],
"金融理财保险": ["银行", "保险", "贷款", "信用卡", "利率", "存款"],
}
all_titles_text = " ".join(titles)
matched = []
for theme, keywords in extended_themes.items():
match_count = sum(1 for kw in keywords if kw in all_titles_text)
if match_count >= 1:
matched.append(theme)
return "/".join(matched[:2]) if matched else ""
def bold_bracket_content(text):
"""将「」中的内容加粗展示"""
return re.sub(r'「([^」]+)」', r'「**\1**」', text)
def generate_recommendation_reason(account):
"""生成推荐理由:基于账号数据、内容数据、更新节奏、整体内容策略定位总结值得学习点"""
parts = []
works = account.get("works") or []
account_type = account.get("accountType") or ""
avg_read = account.get("avgReadCount") or 0
seven_day_reads = calc_seven_day_reads(account)
article_count_seven = account.get("articleCountSeven") or 0
redfox_index = account.get("redfoxIndex") or 0
interactive_count_seven = account.get("interactiveCountSeven") or 0
# 从 works 计算实际阅读数据(当 avgReadCount 为 null 时仍可从 works 获取)
works_total_reads = sum(w.get("clicksCount") or 0 for w in works) if works else 0
works_avg_read = works_total_reads / len(works) if works and len(works) > 0 else 0
# 使用 max(avgReadCount, works均值) 作为爆文判断基准
effective_avg = max(avg_read, works_avg_read) if works_avg_read > 0 else avg_read
# 1. 爆文洞察 + 内容主题聚焦
burst_works = []
if works and effective_avg > 0:
for w in works:
clicks = w.get("clicksCount") or 0
if clicks >= effective_avg * 2:
burst_works.append(w)
content_themes = _extract_content_themes(works) if works else []
if burst_works and content_themes:
burst_count = len(burst_works)
theme_str = "/".join(content_themes[:2])
parts.append(f"同赛道近7天{burst_count}篇爆文,全聚焦于{theme_str}")
elif burst_works:
burst_count = len(burst_works)
parts.append(f"同赛道近7天{burst_count}篇爆文")
elif content_themes:
theme_str = "/".join(content_themes[:2])
parts.append(f"同赛道,内容聚焦于{theme_str}")
elif account_type:
parts.append(f"同属「{account_type}」赛道")
# 2. 爆文标题引用:提取最高阅读文章标题,增强可借鉴性
if works and effective_avg > 0:
top_article = _extract_top_article(works, effective_avg)
if top_article:
title, clicks = top_article
parts.append(f"爆文「{title}」达均阅{clicks/effective_avg:.1f}倍")
# 3. 更新节奏 + 内容策略 + 发文时段
strategy_parts = []
if article_count_seven >= 7:
strategy_parts.append("日更高产")
elif article_count_seven >= 4:
strategy_parts.append("稳定周更3-4篇")
elif article_count_seven >= 1:
strategy_parts.append("持续更新")
content_style = _analyze_content_strategy(works)
if content_style:
strategy_parts.append(content_style)
# 发文时段规律
if works:
schedule = _analyze_publish_schedule(works)
if schedule:
strategy_parts.append(schedule)
if strategy_parts:
parts.append(",".join(strategy_parts))
# 4. 数据亮点:互动率 + 分享率(修复互动率异常问题)
if works:
interaction_rate = _calc_interaction_rate(works, effective_avg)
if interaction_rate and interaction_rate >= 0.005:
parts.append(f"互动率{interaction_rate*100:.1f}%")
share_rate = _calc_share_rate(works)
if share_rate and share_rate >= 0.01:
parts.append(f"分享率{share_rate*100:.1f}%,内容传播力强")
# 5. 近7天互动数据(当 avgRead 为 null 但互动数有值时)
if interactive_count_seven > 0 and avg_read == 0:
parts.append(f"近7天互动{format_number(interactive_count_seven)},用户活跃度可参考")
# 6. 当近7天阅读数或平均阅读数为0时,补充其他维度的推荐理由
if seven_day_reads == 0 or avg_read == 0:
_add_sparse_data_reasons(parts, account, account_type, redfox_index, article_count_seven, works, content_themes)
# 7. 结论
if parts:
result = "<br>".join(parts)
else:
# fallback
fallback_parts = []
if account_type:
fallback_parts.append(f"同属「{account_type}」赛道")
if avg_read > 0:
fallback_parts.append(f"均阅{format_number(avg_read)}")
elif works_avg_read > 0:
fallback_parts.append(f"均阅{format_number(works_avg_read)}")
if seven_day_reads > 0:
fallback_parts.append(f"7天阅读{format_number(seven_day_reads)}")
elif interactive_count_seven > 0:
fallback_parts.append(f"7天互动{format_number(interactive_count_seven)}")
result = ",".join(fallback_parts) + ",可参考运营策略"
result = bold_bracket_content(result)
if len(result) < 20:
result += ",可参考运营策略"
return result
def format_query_account_info(query_account):
"""格式化查询账号基本信息"""
if not query_account:
return "未获取到查询账号信息"
lines = []
lines.append("**查询账号基本信息**")
lines.append("")
account_name = query_account.get("accountName") or "未知"
account_id = query_account.get("accountId") or "未知"
account_type = query_account.get("accountType") or "未知"
account_url = get_account_url(account_id)
redfox_index = query_account.get("redfoxIndex") or 0
avg_read = query_account.get("avgReadCount") or 0
seven_day_reads = calc_seven_day_reads(query_account)
article_count_seven = query_account.get("articleCountSeven")
if article_count_seven is None:
# currentAccount可能不含articleCountSeven,从works数量推断
works_count = len(query_account.get("works") or [])
article_count_seven = works_count if works_count > 0 else "暂无"
lines.append(f"- 账号名称:[{account_name}]({account_url})")
lines.append(f"- 账号ID:{account_id}")
lines.append(f"- 账号分类:{account_type}")
lines.append(f"- 红狐指数:{redfox_index:.0f}" if redfox_index else "- 红狐指数:无")
lines.append(f"- 平均阅读数:{format_number(avg_read)}")
lines.append(f"- 近7天阅读数:{format_number(seven_day_reads)}")
lines.append(f"- 近7天发文章数:{article_count_seven}")
# 近5篇文章
works = query_account.get("works") or []
if works:
lines.append("")
lines.append("**近5篇文章**")
lines.append("")
lines.append("| 文章标题 | 阅读数 | 点赞数 | 评论数 | 在看数 | 总互动数 | 发布时间 |")
lines.append("| --- | --- | --- | --- | --- | --- | --- |")
for w in works[:5]:
title = w.get("title") or "无标题"
work_url = w.get("workUrl") or ""
if work_url:
title = f"[{title}]({work_url})"
clicks = format_number(w.get("clicksCount"))
likes = format_number(w.get("likeCount"))
comments = format_number(w.get("commentCount"))
watches = format_number(w.get("watchCount"))
interactive = format_number(w.get("interactiveCount"))
publish_time = w.get("publishTime") or "未知"
lines.append(f"| {title} | {clicks} | {likes} | {comments} | {watches} | {interactive} | {publish_time} |")
return "\n".join(lines)
def format_table(accounts, title_line, query_account=None):
"""格式化对标账号Markdown表格"""
lines = []
lines.append(title_line)
lines.append("")
lines.append("| 账号名称 | 红狐指数 | 平均阅读数 | 近7天阅读数 | 近7日文章发布数 | 推荐理由 |")
lines.append("| --- | --- | --- | --- | --- | --- |")
qa_id = (query_account or {}).get("accountId")
for account in accounts:
account_name = account.get("accountName") or "未知"
redfox_index = account.get("redfoxIndex") or 0
avg_read = format_number(account.get("avgReadCount"))
seven_day_reads = format_number(calc_seven_day_reads(account))
redfox_display = f"{redfox_index:.0f}" if redfox_index else "无"
account_url = get_account_url(account.get("accountId") or "")
account_link = f"[{account_name}]({account_url})"
article_count_seven = account.get("articleCountSeven")
if article_count_seven is None or article_count_seven == 0:
# currentAccount可能不含articleCountSeven,从works数量推断
works_count = len(account.get("works") or [])
article_count_seven = works_count if works_count > 0 else 0
article_count_display = str(article_count_seven) if article_count_seven else "0"
# 查询账号标注
if qa_id and account.get("accountId") == qa_id:
lines.append(f"| **{account_link}(查询账号)** | **{redfox_display}** | **{avg_read}** | **{seven_day_reads}** | **{article_count_display}** | —(当前账号) |")
else:
recommendation = generate_recommendation_reason(account)
lines.append(f"| {account_link} | {redfox_display} | {avg_read} | {seven_day_reads} | {article_count_display} | {recommendation} |")
return "\n".join(lines)
def get_earliest_gmt_create(benchmark_accounts, top_accounts):
"""获取最早的数据更新时间"""
all_accounts = (benchmark_accounts or []) + (top_accounts or [])
gmt_creates = [acc.get("gmtCreate") for acc in all_accounts if acc.get("gmtCreate")]
return min(gmt_creates) if gmt_creates else "入库时刻"
def generate_analysis_summary(benchmark_accounts, top_accounts):
"""生成分析总结"""
lines = []
lines.append("**分析总结**:")
if benchmark_accounts:
avg_read = sum(a.get("avgReadCount") or 0 for a in benchmark_accounts) / len(benchmark_accounts)
avg_seven_reads = sum(calc_seven_day_reads(a) for a in benchmark_accounts) / len(benchmark_accounts)
avg_redfox = sum(a.get("redfoxIndex") or 0 for a in benchmark_accounts) / len(benchmark_accounts)
lines.append(f"- 同阶对标平均阅读数:{format_number(avg_read)},平均近7天阅读数:{format_number(avg_seven_reads)},平均红狐指数:{avg_redfox:.0f}")
if top_accounts:
avg_read = sum(a.get("avgReadCount") or 0 for a in top_accounts) / len(top_accounts)
avg_seven_reads = sum(calc_seven_day_reads(a) for a in top_accounts) / len(top_accounts)
avg_redfox = sum(a.get("redfoxIndex") or 0 for a in top_accounts) / len(top_accounts)
lines.append(f"- 高阶标杆平均阅读数:{format_number(avg_read)},平均近7天阅读数:{format_number(avg_seven_reads)},平均红狐指数:{avg_redfox:.0f}")
if benchmark_accounts or top_accounts:
lines.append("- 对标匹配基于3层加权体系:核心基础匹配(40%)+运营变现匹配(35%)+数据特征匹配(25%)")
lines.append("- 建议优先参考:对标账号中的高频更新账号,学习其内容节奏和选题方向")
return "\n".join(lines)
def format_output(query_account, benchmark_accounts, top_accounts):
"""格式化完整文本输出"""
output_lines = []
earliest_gmt = get_earliest_gmt_create(benchmark_accounts, top_accounts)
# 查询账号基本信息
if query_account:
output_lines.append(format_query_account_info(query_account))
output_lines.append("")
# 对标账号列表:查询账号排第一 + 对标账号
benchmark_with_query = []
if query_account:
benchmark_with_query.append(query_account)
if benchmark_accounts:
benchmark_with_query.extend(benchmark_accounts)
# 匹配结果
bench_count = len(benchmark_with_query)
top_count = len(top_accounts) if top_accounts else 0
tips_parts = []
if bench_count > 0:
tips_parts.append(f"【可直接抄的同阶对标({bench_count}个)】")
if top_count > 0:
tips_parts.append(f"【可追赶的高阶标杆({top_count}个)】")
if tips_parts:
output_lines.append(f"为你匹配到{'和'.join(tips_parts)}的{len(tips_parts)}组推荐,可按需参考:")
output_lines.append(f"| 数据说明:数据获取时间为{earliest_gmt},和实时数据存在差别。")
if benchmark_with_query:
table_title = f"👉【可直接抄的同阶对标({bench_count}个)】(和查询账号阅读数最接近,可直接复制玩法)"
output_lines.append(format_table(benchmark_with_query, table_title, query_account))
if top_accounts:
table_title = f"👉【可追赶的高阶标杆({len(top_accounts)}个)】(阅读数是查询账号的3-5倍,模式成熟可参考)"
output_lines.append(format_table(top_accounts, table_title))
if benchmark_accounts or top_accounts:
output_lines.append("")
output_lines.append(generate_analysis_summary(benchmark_accounts, top_accounts))
output_lines.append("")
output_lines.append("**订阅服务**")
qa_name = (query_account or {}).get("accountName") or "现查询条件"
output_lines.append(f' 1. 是否订阅"{qa_name}"的相似账号推送,每日下午19点更新最新数据。你可自行选择推送频率和时间~')
output_lines.append(" 2. 暂不需要")
else:
# 未查询到账号数据,提示用户提交微信号进行数据同步
output_lines.append("当前未查询到该账号相关数据,是数据覆盖范围不足导致的。不过别担心,我们将提供账号数据去实时获取;")
output_lines.append("1. 请输入微信号,为您同步数据。该账号诊断报告将约30分钟后为您自动推送。")
output_lines.append("2. 下次再说")
return "\n".join(output_lines)
def submit_account_sync(wechat_id, account_name=""):
"""提交账号数据同步请求"""
credential = get_api_key()
url = "https://redfox.hk/story/api/gzhUser/syncAccount"
headers = {
"Content-Type": "application/json",
"X-API-KEY": credential
}
payload = {
"wechatId": wechat_id,
"accountName": account_name,
"source": "公众号相似账号推荐-GitHub"
}
try:
data = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(url, data=data, headers=headers, method="POST")
with urllib.request.urlopen(req, timeout=30) as resp:
result = json.loads(resp.read().decode("utf-8"))
return result
except urllib.error.HTTPError as e:
body = e.read().decode("utf-8", errors="replace")
raise Exception(f"同步请求失败: {e.code}, {body}")
except urllib.error.URLError as e:
raise Exception(f"同步请求失败: {str(e)}")
def main():
parser = argparse.ArgumentParser(description="公众号账号推荐脚本")
parser.add_argument("--account_id", help="公众号ID")
parser.add_argument("--account_name", help="公众号名称")
parser.add_argument("--account_type", help="账号分类")
parser.add_argument("--sync_wechat_id", help="提交账号数据同步的微信号")
args = parser.parse_args()
if not args.account_id and not args.account_name and not args.account_type and not args.sync_wechat_id:
print("错误:请提供公众号ID(--account_id)或公众号名称(--account_name)或账号分类(--account_type)")
return
# 处理账号同步请求
if args.sync_wechat_id:
account_name = args.account_name or ""
try:
submit_account_sync(args.sync_wechat_id, account_name)
except Exception:
# 同步API暂未上线,仍输出确认文案保证交互流程
pass
print(f"已提交{args.sync_wechat_id},并且30分钟后将为自动为用户推送诊断报告")
output = {
"status": "sync_submitted",
"wechat_id": args.sync_wechat_id,
"account_name": account_name
}
print(json.dumps(output, ensure_ascii=False))
return
try:
query_account, benchmark_accounts, top_accounts = query_similar_accounts(
accountId=args.account_id,
accountName=args.account_name,
accountType=args.account_type
)
# currentAccount 直接从 API 获取,无需再从账号列表中匹配
# 当 currentAccount 为空时(如按分类查询且未命中具体账号),尝试从返回列表中匹配
if not query_account and (args.account_name or args.account_id):
search_name = args.account_name or ""
search_id = args.account_id or ""
all_accounts = (benchmark_accounts or []) + (top_accounts or [])
for acc in all_accounts:
acc_name = acc.get("accountName") or ""
acc_id = acc.get("accountId") or ""
if (search_name and search_name in acc_name) or (search_id and search_id == acc_id):
query_account = acc
break
# 格式化输出
result = format_output(query_account, benchmark_accounts, top_accounts)
print(result)
except Exception as e:
print(f"查询失败: {str(e)}")
if __name__ == "__main__":
main()