@clawhub-if530770-65feeed114
抖音热榜神器 — 可以实时追踪抖音热点、挖掘爆款规律,并支持历史热榜数据回溯。使用时只需输入“查抖音热榜”“抖音热搜”“今日热榜”“近7天热榜”“历史热榜”等触发词,或订阅热榜推送,即可快速获取当前及过往的热门话题,帮助内容创作者和运营者高效蹭热点、找选题。
---
name: douyin-hot-trend
description: >
抖音热榜神器 — 可以实时追踪抖音热点、挖掘爆款规律,并支持历史热榜数据回溯。使用时只需输入“查抖音热榜”“抖音热搜”“今日热榜”“近7天热榜”“历史热榜”等触发词,或订阅热榜推送,即可快速获取当前及过往的热门话题,帮助内容创作者和运营者高效蹭热点、找选题。
---
# 🔥 抖音热榜
## 这是什么
一个帮你搞定抖音热点全流程的小助手。
**能做什么:**
- 📡 实时获取抖音热榜数据,每小时自动更新
- 📅 查询近7天、近30天历史热榜,回溯热点轨迹
- 🧠 从创作者视角拆解爆款规律,给出可落地的选题和标题公式
- 📊 生成紫色极简风 HTML 可视化页面,支持导出 PDF
- 🔔 可订阅每日/每小时热榜推送,不错过任何一个流量密码
## 什么时候用它
| 场景 | 举例 |
| ---------------------- | ------------------------------ |
| 想知道今天抖音在火什么 | "帮我看看抖音热榜" |
| 追踪某个话题的历史热度 | "查一下这周的热榜变化" |
| 写内容前找选题灵感 | "最近什么话题最热?" |
| 研究爆款标题的套路 | "分析下最近热榜标题有什么规律" |
| 定期追踪热点做运营 | "每天早上给我推送热榜" |
## 怎么用
```
查今日抖音热榜
查近7天热榜
看看4月1日的热榜
分析热榜标题规律
帮我订阅每天早上9点的热榜推送
```
## 快速开始
> **⚠️ 触发本技能时,必须先读取以下文件获取完整执行流程:**
>
> 📄 **[assets/core-workflow.md](assets/core-workflow.md)**
读取方式:用 `read_file` 工具读取 `assets/core-workflow.md`(相对于本技能根目录),然后严格按照其中定义的步骤依次执行。
## 注意事项
- 🌐 需要网络连接,请确保网络通畅
- ⏰ 历史热榜最长查询30天,超出范围会报错
- 📌 分析结论全部基于真实数据,不编造,给出的建议都是可执行的
- 💾 订阅偏好需要你明确回复确认才会记录
- 📄 HTML 和 PDF 生成是自动执行的,不需要你额外操作
## 资源一览
| 资源 | 路径 |
| -------------------- | --------------------------------------- |
| 核心执行流程(必读) | `assets/core-workflow.md` |
| 数据获取脚本 | `scripts/hotspot_fetcher.py` |
| HTML 生成脚本 | `scripts/gen_douyin_hot_html.py` |
| HTML 模板 | `assets/douyin_hot_trend_template.html` |
FILE:_skillhub_meta.json
{
"name": "douyin-hot-trend",
"installedAt": 1777261886760,
"source": "import"
}
FILE:scripts/gen_douyin_hot_html.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
抖音热榜HTML生成器
从API获取实时热榜数据,生成可独立打开的HTML页面。
用法:python gen_douyin_hot_html.py [--start-date YYYY-MM-DD] [--end-date YYYY-MM-DD] [--days N]
输出:douyin_hot_trend.html(与脚本同目录)
样式特性:
- 紫色系极简风格(#6c5ce7 / #a29bfe)
- 卡片式表格(border-collapse: separate,每行独立圆角白卡)
- TOP3 奖牌徽章 + 对应色竖线边框
- 4+ 序号深灰小字
- 热度值纯紫色 #6c5ce7
- 整行点击跳转(location.href,兼容 file:// 协议)
- 导出 PDF 功能(仅截取内容区,不含按钮栏,单页 A4 自适应缩放)
- 页面最大宽度 750px
"""
import json
import sys
import os
import socket
import ssl
from datetime import datetime, timedelta
def fetch_douyin_hotspot(start_date=None, end_date=None, days=None):
"""获取抖音热榜数据"""
host = "onetotenvip.com"
ip = "8.154.41.7"
path = "/story/hotSpot/getListByPlatform"
base_params = "platform=2&source=%E6%8A%96%E9%9F%B3%E7%83%AD%E6%A6%9C"
date_range = ""
query_type = "实时"
if days:
today = datetime.now().date()
end_date_obj = today
start_date_obj = today - timedelta(days=days)
start_date = start_date_obj.strftime("%Y-%m-%d")
end_date = end_date_obj.strftime("%Y-%m-%d")
query_type = f"近{days}天"
if start_date and end_date:
date_range = f"&startDate={start_date}&endDate={end_date}"
query_type = f"{start_date} 至 {end_date}"
params = base_params + date_range
http_request = (
"GET {}?{} HTTP/1.1\r\n"
"Host: {}\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36\r\n"
"Accept: application/json, text/plain, */*\r\n"
"Connection: close\r\n"
"\r\n"
).format(path, params, host)
raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
raw_socket.settimeout(30)
raw_socket.connect((ip, 443))
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
ssl_socket = context.wrap_socket(raw_socket, server_hostname=None)
ssl_socket.send(http_request.encode('utf-8'))
response = b""
while True:
try:
chunk = ssl_socket.recv(8192)
if not chunk:
break
response += chunk
except socket.timeout:
break
ssl_socket.close()
raw_socket.close()
response_text = response.decode('utf-8', errors='ignore')
if "\r\n\r\n" in response_text:
_, body = response_text.split("\r\n\r\n", 1)
elif "\n\n" in response_text:
_, body = response_text.split("\n\n", 1)
else:
body = response_text
api_response = json.loads(body)
if isinstance(api_response, dict):
data = api_response.get("data", api_response.get("list", []))
elif isinstance(api_response, list):
data = api_response
else:
data = []
# 处理数据:去除标题中的所有空格(半角空格、全角空格、制表符、换行符等)
for item in data:
if 'title' in item and item['title']:
# 去除半角空格、全角空格、制表符、换行符等所有空白字符
item['title'] = ''.join(item['title'].split())
if 'word' in item and item['word']:
item['word'] = ''.join(item['word'].split())
return {
"fetch_time": datetime.now().strftime("%Y-%m-%d %H:%M:%S"),
"query_type": query_type,
"hot_list": data
}
def generate_desc(title, hot_count):
"""根据标题和热度值生成核心内容摘要(30-80字)"""
import re
desc = title
hot_str = f"热度{hot_count}"
# 核心内容生成规则 - 基于标题关键词匹配
if any(k in title for k in ['春天', '春日', '花开', '樱花', '踏青']):
return f"春季相关话题持续升温,用户分享春日生活美好瞬间与旅行记录,展现春日美景与生活方式,引发大量互动讨论,当前{hot_str}"
elif any(k in title for k in ['裙摆', '穿搭', '时尚', '美妆', '妆容', '造型']):
return f"时尚穿搭类话题火爆,博主分享穿搭技巧与造型灵感,年轻用户积极参与模仿创作,带动相关话题持续走高,当前{hot_str}"
elif any(k in title for k in ['海洋', '科技', '技术', '突破', '创新', '研发']):
return f"硬核科技/工业成就引发全民关注,展现中国技术实力与发展成果,网友纷纷点赞转发表达民族自豪感,当前{hot_str}"
elif any(k in title for k in ['骑马', '公主', '古装', '汉服', 'cosplay']):
return f"古风/角色扮演类内容走红,创作者通过特色造型吸引关注,用户参与度高,评论区互动热烈,当前{hot_str}"
elif any(k in title for k in ['对镜', '自拍', '拍照', '镜头', '摄影']):
return f"摄影/自拍技巧类内容广受欢迎,创作者分享实用拍摄方法,帮助普通用户提升出片质量,传播度极高,当前{hot_str}"
elif any(k in title for k in ['出游', '旅行', '旅游', '景点', '打卡']):
return f"旅游出行话题热度攀升,各地景点迎来游客高峰,用户分享旅行攻略与见闻,激发更多人规划行程,当前{hot_str}"
elif any(k in title for k in ['赖清德', '弹劾', '政治', '政策', '政府', '官员']):
return f"时政类重大事件引发全网热议,各平台讨论量激增,用户密切关注事态发展,相关分析解读视频获得高播放,当前{hot_str}"
elif any(k in title for k in ['房价', '楼市', '房贷', '购房', '经济', 'GDP', '股市', 'A股']):
return f"财经/民生话题牵动大众神经,专业机构与个人投资者高度关注市场动态,各类解读分析内容刷屏,当前{hot_str}"
elif any(k in title for k in ['电影', '剧集', '开播', '定档', '综艺', '选秀', '歌手']):
return f"影视娱乐类话题霸榜,新作品/节目上线引发追剧热潮,明星动态与剧情讨论占据热搜前列,当前{hot_str}"
elif any(k in title for k in ['游戏', '电竞', '比赛', '战队', '选手']):
return f"游戏/电竞赛事话题火热,职业赛事精彩操作被广泛传播,玩家社区讨论氛围活跃,相关二创内容爆发式增长,当前{hot_str}"
elif any(k in title for k in ['美食', '做饭', '食谱', '奶茶', '探店', '餐厅']):
return f"美食类内容持续吸睛,创作者推荐美食做法与探店体验,激发用户尝试欲望与打卡热情,评论区求教程留言众多,当前{hot_str}"
elif any(k in title for k in ['萌宠', '猫咪', '狗狗', '动物', '可爱']):
return f"宠物/动物类治愈系内容广受喜爱,萌宠日常视频轻松获取百万播放,用户在评论区晒出自家毛孩子照片,互动率极高,当前{hot_str}"
elif any(k in title for k in ['健身', '减肥', '运动', '瑜伽', '瘦身']):
return f"健康运动话题受关注度提升,健身达人分享训练计划与饮食建议,激励大批用户开启锻炼模式,跟练打卡成风潮,当前{hot_str}"
elif any(k in title for k in ['教育', '高考', '考研', '学校', '老师', '家长']):
return f"教育相关话题引发家长群体强烈共鸣,升学政策与学习方法的讨论热度居高不下,干货分享型内容获大量收藏,当前{hot_str}"
elif any(k in title for k in ['恋爱', '感情', '婚姻', '分手', '相亲']):
return f"情感婚恋话题触动年轻人共鸣,真实故事分享与情感分析视频引发深度讨论,用户在评论区倾诉经历寻求建议,当前{hot_str}"
elif any(k in title for k in ['职场', '工资', '面试', '辞职', '老板', '打工']):
return f"职场话题直击打工人痛点,薪资待遇、工作体验等议题引发广泛共鸣,职场经验分享内容获高收藏转发,当前{hot_str}"
else:
# 兜底:基于标题长度智能扩展
return f"该话题在抖音平台引发广泛关注与讨论,大量创作者围绕此主题产出优质内容,用户互动活跃,相关视频播放量持续增长,当前{hot_str}"
def generate_html(result, top_n=20):
"""生成HTML页面 - 紫色极简风格
Args:
result: 热榜数据结果
top_n: 显示条数,默认20,可设为50
重要:只传递实际需要展示的数据到HTML,确保统计数据与展示数据一致
"""
hot_list = result["hot_list"]
fetch_time = result["fetch_time"]
query_type = result["query_type"]
# 限制显示条数 - 必须先截取,确保统计数据准确
top_n = min(top_n, 50) # 最大支持TOP50
# ⚠️ 关键:只保留实际需要展示的数据,确保HTML中统计数据与展示数据一致
hot_list = hot_list[:top_n]
def fmt_hot_value(n):
"""格式化热度值 - 保持与表格显示一致"""
n = int(n or 0)
if n >= 100000000:
return f"{n / 100000000:.1f}亿"
if n >= 10000:
# 保留一位小数,如 1109.6w
return f"{n / 10000:.1f}w"
return str(n)
# 为每条数据生成核心内容摘要(如果API没有返回desc字段)
for item in hot_list:
if not item.get('desc') and not item.get('excerpt'):
title = item.get('title', '') or item.get('word', '')
hot_count = item.get('hotCount', '') or item.get('hotValue', '0')
item['_genDesc'] = generate_desc(title, fmt_hot_value(hot_count))
js_data = json.dumps(hot_list, ensure_ascii=False, indent=2)
if query_type == "实时":
page_title = "抖音实时热榜"
else:
page_title = f"抖音热榜({query_type})"
html = f'''<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{page_title}</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/2.5.1/jspdf.umd.min.js"></script>
<style>
* {{ margin: 0; padding: 0; box-sizing: border-box; }}
body {{
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'PingFang SC', sans-serif;
background: #f0f0f5;
color: #333;
line-height: 1.6;
}}
/* ===== 页面容器 - 最大宽度750px ===== */
.page-wrap {{
max-width: 750px;
margin: 0 auto;
padding: 16px 16px 32px;
}}
/* ===== 导出按钮栏 - 不参与PDF导出 ===== */
.export-bar {{
position: sticky;
top: 0;
z-index: 100;
display: flex;
justify-content: flex-end;
padding: 10px 0 12px;
margin-bottom: 4px;
}}
.btn-export-pdf {{
background: #fff;
color: #6c5ce7;
border: 1.5px solid #6c5ce7;
border-radius: 20px;
padding: 7px 22px;
font-size: 13px;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
}}
.btn-export-pdf:hover {{ background: #f8f6ff; transform: translateY(-1px); }}
.btn-export-pdf:active {{ transform: translateY(0); }}
/* ===== PDF内容区域 ===== */
.pdf-content {{ background: transparent; }}
/* ===== 头部卡片 - 紫色渐变 ===== */
.hot-title-wrap {{
background: linear-gradient(135deg, #6c5ce7, #a29bfe);
border-radius: 14px;
padding: 24px 24px 20px;
margin-bottom: 18px;
color: #fff;
text-align: center;
}}
.hot-title-wrap h1 {{
font-size: 22px; font-weight: 800;
letter-spacing: 0.5px;
}}
.hot-update-time {{
margin-top: 4px;
font-size: 12.5px;
opacity: 0.85;
}}
/* 统计卡片区 */
.stats-row {{
display: flex;
justify-content: center;
gap: 16px;
margin-top: 16px;
}}
.stat-card {{
background: rgba(255,255,255,0.18);
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
border-radius: 11px;
padding: 11px 20px;
min-width: 95px;
text-align: center;
}}
.stat-num {{ font-size: 21px; font-weight: 800; }}
.stat-label {{ font-size: 11.5px; opacity: 0.85; margin-top: 2px; }}
/* ===== 表格区域 ===== */
.table-area {{ background: transparent; }}
/* 卡片式表格 */
.hot-table {{
width: 100%;
border-collapse: separate;
border-spacing: 0 6px;
}}
.hot-table thead {{ display: none; }}
.hot-table tbody tr {{
background: #fff;
border-radius: 10px;
transition: all 0.2s ease;
cursor: pointer;
}}
.hot-table tbody tr:hover {{
transform: translateY(-1.5px);
box-shadow: 0 6px 20px rgba(108,92,231,0.15);
}}
.hot-table td {{
padding: 13px 14px;
vertical-align: middle;
border: none;
}}
.hot-table tr td:first-child {{ border-radius: 10px 0 0 10px; }}
.hot-table tr td:last-child {{ border-radius: 0 10px 10px 0; }}
/* 排名序号 */
.rank-cell {{ width: 58px; text-align: center; }}
/* TOP3 奖牌徽章 */
.rank-badge {{
display: inline-flex;
align-items: center;
justify-content: center;
width: 31px; height: 31px;
border-radius: 50%;
font-size: 14px;
font-weight: 800;
position: relative;
}}
/* TOP1 紫红 */
.rank-badge.top1 {{
background: linear-gradient(135deg, #e056a0, #a855f7);
color: #fff;
box-shadow: 0 2px 8px rgba(168,85,247,0.35);
}}
/* TOP2 蓝紫 */
.rank-badge.top2 {{
background: linear-gradient(135deg, #6c5ce7, #74b9ff);
color: #fff;
box-shadow: 0 2px 8px rgba(108,92,231,0.30);
}}
/* TOP3 浅紫 */
.rank-badge.top3 {{
background: linear-gradient(135deg, #a29bfe, #dfe6e9);
color: #6c5ce7;
box-shadow: 0 2px 8px rgba(162,155,254,0.35);
}}
/* 4+ 序号 */
.rank-normal {{
font-size: 13px;
font-weight: 700;
color: #555;
}}
/* TOP1-3 行左侧色条 + 背景色 */
.hot-table tbody tr.row-top1 {{ background: linear-gradient(90deg, rgba(168,85,247,0.07), #fff 6%); }}
.hot-table tbody tr.row-top2 {{ background: linear-gradient(90deg, rgba(108,92,231,0.07), #fff 6%); }}
.hot-table tbody tr.row-top3 {{ background: linear-gradient(90deg, rgba(162,155,254,0.09), #fff 6%); }}
.hot-table tbody tr.row-top1 > td:first-child {{ border-left: 3.5px solid #a855f7; }}
.hot-table tbody tr.row-top2 > td:first-child {{ border-left: 3.5px solid #6c5ce7; }}
.hot-table tbody tr.row-top3 > td:first-child {{ border-left: 3.5px solid #a29bfe; }}
/* 标题描述 */
.info-cell {{}}
.topic-title-link {{
text-decoration: none;
display: block;
}}
.topic-title-link:hover .topic-title {{
color: #6c5ce7;
}}
.topic-title {{
font-size: 14.5px;
font-weight: 650;
color: #222;
line-height: 1.45;
word-break: break-all;
transition: color 0.2s ease;
}}
.topic-desc {{
font-size: 12.5px;
color: #888;
margin-top: 3px;
line-height: 1.4;
word-break: break-all;
}}
/* 热度值 - 纯紫色 */
.heat-cell {{ text-align: right; white-space: nowrap; width: 110px; }}
.heat-value {{
font-size: 14px;
font-weight: 800;
color: #6c5ce7;
}}
/* 标签 */
.tag {{
display: inline-block;
font-size: 11px;
font-weight: 600;
padding: 2px 9px;
border-radius: 10px;
margin-right: 4px;
vertical-align: middle;
}}
.tag-hot {{ background: rgba(231,76,60,0.08); color: #e74c3c; }}
.tag-new {{ background: rgba(52,152,219,0.08); color: #3498db; }}
.tag-hot-rising {{ background: rgba(230,126,34,0.1); color: #e67e22; }}
.tag-descend {{ background: rgba(149,165,166,0.1); color: #7f8c8d; }}
.tag-steady {{ background: rgba(39,174,96,0.1); color: #27ae60; }}
/* 时间标签 */
.time-tag {{
font-size: 11.5px;
color: #999;
white-space: nowrap;
}}
/* 底部说明 */
.footer-note {{
text-align: center;
font-size: 11.5px;
color: #bbb;
margin-top: 20px;
padding: 10px 0;
}}
@media (max-width: 480px) {{
.page-wrap {{ padding: 10px 8px 24px; }}
.hot-title-wrap {{ padding: 18px 16px 16px; }}
.stats-row {{ gap: 8px; }}
.stat-card {{ padding: 8px 14px; min-width: 75px; }}
.stat-num {{ font-size: 18px; }}
.hot-table td {{ padding: 10px 10px; }}
.topic-title {{ font-size: 13.5px; }}
.heat-value {{ font-size: 15px; }}
}}
</style>
</head>
<body>
<div class="page-wrap">
<!-- 导出按钮(不包含在PDF内) -->
<div class="export-bar">
<button class="btn-export-pdf" onclick="exportPdf()">导出 PDF</button>
</div>
<!-- PDF内容区域 -->
<div class="pdf-content" id="pdfContent">
<!-- 头部 -->
<div class="hot-title-wrap">
<h1>🔥 {page_title}</h1>
<div class="hot-update-time">更新时间:{fetch_time}</div>
<div class="stats-row">
<div class="stat-card">
<div class="stat-num" id="totalCount">--</div>
<div class="stat-label">话题总数</div>
</div>
<div class="stat-card">
<div class="stat-num" id="maxHeat">--</div>
<div class="stat-label">最高热度</div>
</div>
<div class="stat-card">
<div class="stat-num" id="avgHeat">--</div>
<div class="stat-label">平均热度</div>
</div>
</div>
</div>
<!-- 表格 -->
<div class="table-area">
<table class="hot-table">
<thead>
<tr><th>排名</th><th>话题信息</th><th>热度值</th></tr>
</thead>
<tbody id="hotTableBody"></tbody>
</table>
</div>
<div class="footer-note">数据来源:抖音 · 仅供参考</div>
</div><!-- /pdf-content -->
</div><!-- /page-wrap -->
<script>
// 行点击跳转 - 使用 location.href 避免 file:// 下 window.open 被拦截
(function() {{
function bindRowClick() {{
var rows = document.querySelectorAll('.hot-table tbody tr[data-href]');
rows.forEach(function(row) {{
row.style.cursor = 'pointer';
row.addEventListener('click', function(e) {{
if (e.target.closest('button, a, .btn-export-pdf')) return;
var url = this.getAttribute('data-href');
if (url) window.location.href = url;
}});
}});
}}
if (document.readyState === 'loading') {{
document.addEventListener('DOMContentLoaded', bindRowClick);
}} else {{
bindRowClick();
}}
}})();
// 渲染热榜数据
(function() {{
var RAW = {js_data};
// 统计
var totalCount = RAW.length;
var maxH = 0, sumH = 0;
for (var i = 0; i < RAW.length; i++) {{
var h = parseInt(RAW[i].hotCount || RAW[i].hotValue || 0);
if (h > maxH) maxH = h;
sumH += h;
}}
var avgH = totalCount > 0 ? sumH / totalCount : 0;
function fmtHot(n) {{
n = parseInt(n || 0);
if (n >= 100000000) return (n / 100000000).toFixed(1) + '亿';
if (n >= 10000) return (n / 10000).toFixed(1) + 'w'; // 保留一位小数,如 1109.6w
return n.toString();
}}
// 更新统计
document.getElementById('totalCount').textContent = totalCount;
document.getElementById('maxHeat').textContent = fmtHot(maxH);
document.getElementById('avgHeat').textContent = fmtHot(Math.round(avgH));
// 保持API返回的原始排名顺序(不重新排序)
// ⚠️ 数据一致性要求:必须使用API返回的原始数据,禁止修改排名、热度、链接
// RAW.sort(function(a, b) {{ return (a.index || 999) - (b.index || 999); }});
// 渲染表格 - 显示TOP{top_n}
// ⚠️ 每条数据的URL必须是API返回的真实链接,禁止伪造或替换
var html = '';
for (var i = 0; i < RAW.length && i < {top_n}; i++) {{
var d = RAW[i];
var rank = i + 1;
var title = d.title || d.word || '--';
var heatVal = d.hotCount || d.hotValue || 0;
var desc = d.desc || d.excerpt || d._genDesc || '';
// 链接必须使用API返回的真实URL
var url = d.url || d.schemeUrl || '#';
// TOP3 样式类
var rowCls = '', badgeHtml = '', tagHtml = '';
if (rank === 1) {{
rowCls = 'row-top1';
badgeHtml = '<span class="rank-badge top1">🥇</span>';
tagHtml = '<span class="tag tag-new">新</span>';
}} else if (rank === 2) {{
rowCls = 'row-top2';
badgeHtml = '<span class="rank-badge top2">🥈</span>';
tagHtml = '<span class="tag tag-hot">热</span>';
}} else if (rank === 3) {{
rowCls = 'row-top3';
badgeHtml = '<span class="rank-badge top3">🥉</span>';
tagHtml = '<span class="tag tag-hot-rising">升</span>';
}} else {{
badgeHtml = '<span class="rank-normal">' + rank + '</span>';
}}
html += '<tr class="' + rowCls + '" data-href="' + url + '">'
+ '<td class="rank-cell">' + badgeHtml + '</td>'
+ '<td class="info-cell">'
+ '<a class="topic-title-link" href="' + url + '" target="_blank" onclick="event.stopPropagation()"><div class="topic-title">' + title + '</div></a>'
+ '<div class="topic-desc">' + desc + '</div>'
+ '</td><td class="heat-cell">'
+ '<div class="heat-value">' + fmtHot(heatVal) + '</div>';
if (tagHtml) {{
html += '<div style="margin-top:3px">' + tagHtml + '</div>';
}}
html += '</td></tr>';
}}
document.getElementById('hotTableBody').innerHTML = html;
// 重新绑定行点击事件(动态插入后)
var rows = document.querySelectorAll('.hot-table tbody tr[data-href]');
rows.forEach(function(row) {{
row.addEventListener('click', function(e) {{
if (e.target.closest('button, a, .btn-export-pdf')) return;
var u = this.getAttribute('data-href');
if (u && u !== '#') window.location.href = u;
}});
}});
}})();
// 导出PDF - 只截取 pdfContent 区域,单页自适应A4,支持链接跳转
function exportPdf() {{
var btn = document.querySelector('.btn-export-pdf');
btn.textContent = '生成中...';
btn.style.pointerEvents = 'none';
var target = document.getElementById('pdfContent');
// 收集所有链接信息 - 链接必须是API返回的真实URL
var links = [];
var rows = document.querySelectorAll('.hot-table tbody tr[data-href]');
rows.forEach(function(row, idx) {{
var url = row.getAttribute('data-href');
if (url && url !== '#') {{
links.push({{
url: url,
top: row.offsetTop,
height: row.offsetHeight,
idx: idx
}});
}}
}});
html2canvas(target, {{
scale: 2,
useCORS: true,
backgroundColor: '#f0f0f5',
logging: false,
windowWidth: target.scrollWidth,
windowHeight: target.scrollHeight
}}).then(function(canvas) {{
var imgData = canvas.toDataURL('image/png');
var pdf = new jspdf.jsPDF('p', 'mm', 'a4');
var pdfW = pdf.internal.pageSize.getWidth();
var pdfH = pdf.internal.pageSize.getHeight();
var margin = 10;
var contentW = pdfW - margin * 2;
var contentH = pdfH - margin * 2;
var imgW = contentW;
var imgH = (canvas.height * imgW) / canvas.width;
// 计算缩放比例
var scaleX = imgW / target.scrollWidth;
var scaleY = imgH / target.scrollHeight;
// 计算内容在PDF中的位置
var imgX, imgY;
if (imgH > contentH) {{
imgH = contentH;
imgW = (canvas.width * imgH) / canvas.height;
scaleX = imgW / target.scrollWidth;
scaleY = imgH / target.scrollHeight;
imgX = (contentW - imgW) / 2 + margin;
imgY = margin;
}} else {{
imgX = margin;
imgY = margin;
}}
// 添加图片
pdf.addImage(imgData, 'PNG', imgX, imgY, imgW, imgH);
// 添加可点击链接注解(覆盖整行)
// 注意:PDF阅读器对链接注解的支持不一,但这是PDF规范的标准方式
links.forEach(function(link) {{
// 转换坐标:HTML像素 -> PDF毫米
var pdfY = imgY + (link.top * scaleY);
var pdfH = Math.max(link.height * scaleY, 3); // 最小高度3mm确保可点击
var pdfX = imgX;
var pdfW = imgW;
// 使用 link 方法添加链接注解
// 这是PDF规范的标准方式,大多数现代PDF阅读器支持
pdf.link(pdfX, pdfY, pdfW, pdfH, {{ url: link.url }});
}});
var now = new Date();
var dateStr = now.getFullYear() +
String(now.getMonth()+1).padStart(2,'0') +
String(now.getDate()).padStart(2,'0') +
'_' +
String(now.getHours()).padStart(2,'0') +
String(now.getMinutes()).padStart(2,'0');
pdf.save('{page_title}_' + dateStr + '.pdf');
btn.textContent = '导出 PDF';
btn.style.pointerEvents = '';
// 提示用户PDF链接功能
console.log('PDF已生成,包含' + links.length + '个可点击链接');
}}).catch(function(err) {{
alert('PDF 生成失败:' + err.message);
btn.textContent = '导出 PDF';
btn.style.pointerEvents = '';
}});
}}
</script>
</body>
</html>'''
return html
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='生成抖音热榜HTML页面')
parser.add_argument('--start-date', type=str, help='开始日期,格式 YYYY-MM-DD')
parser.add_argument('--end-date', type=str, help='结束日期,格式 YYYY-MM-DD')
parser.add_argument('--days', type=int, help='查询天数')
parser.add_argument('--output', type=str, help='输出文件路径')
parser.add_argument('--top', type=int, default=20, help='显示条数,默认20,可设为50')
args = parser.parse_args()
print("正在获取抖音热榜数据...", file=sys.stderr)
result = fetch_douyin_hotspot(
start_date=args.start_date,
end_date=args.end_date,
days=args.days
)
html = generate_html(result, top_n=args.top)
if args.output:
output_path = args.output
else:
output_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), "douyin_hot_trend.html")
with open(output_path, 'w', encoding='utf-8') as f:
f.write(html)
print(f"✅ 已生成:{output_path}", file=sys.stderr)
print(f"📊 共 {len(result['hot_list'])} 条热榜数据,展示TOP{args.top}", file=sys.stderr)
FILE:scripts/hotspot_fetcher.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
抖音热榜数据获取脚本
功能:调用热榜API获取抖音实时热点数据
接口:https://onetotenvip.com/story/hotSpot/getListByPlatform
参数:platform=2, source=抖音热榜神器-ClawHub, startDate, endDate(可选)
方法:GET
特殊处理:未启用SNI(Server Name Indication)以适配特定SSL握手场景
"""
import json
import sys
import socket
import ssl
from datetime import datetime, timedelta
from urllib.parse import quote
def fetch_douyin_hotspot(start_date=None, end_date=None, days=None):
"""
获取抖音热榜数据
使用原生socket+ssl实现,未发送SNI以适配特定网络环境
Args:
start_date: 开始日期,格式 YYYY-MM-DD
end_date: 结束日期,格式 YYYY-MM-DD
days: 查询天数,如7表示近7天,30表示近30天
Returns:
None (结果直接打印到标准输出)
"""
host = "onetotenvip.com"
ip = "8.154.41.7"
path = "/story/hotSpot/getListByPlatform"
# 构建基础参数(source 固定为“抖音热榜神器 -SkillHub”)
source = quote("抖音热榜神器-ClawHub")
base_params = f"platform=2&source={source}"
# 处理日期参数
date_range = ""
query_type = "实时"
if days:
# 根据天数计算日期范围
# 日期范围是 [start_date, end_date),end_date 为今天
today = datetime.now().date()
end_date_obj = today
start_date_obj = today - timedelta(days=days)
start_date = start_date_obj.strftime("%Y-%m-%d")
end_date = end_date_obj.strftime("%Y-%m-%d")
query_type = f"近{days}天"
if start_date and end_date:
date_range = f"&startDate={start_date}&endDate={end_date}"
query_type = f"{start_date} 至 {end_date}"
params = base_params + date_range
http_request = (
"GET {}?{} HTTP/1.1\r\n"
"Host: {}\r\n"
"User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0\r\n"
"Accept: application/json, text/plain, */*\r\n"
"Accept-Language: zh-CN,zh;q=0.9,en;q=0.8\r\n"
"Connection: close\r\n"
"\r\n"
).format(path, params, host)
try:
raw_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
raw_socket.settimeout(30)
raw_socket.connect((ip, 443))
context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
ssl_socket = context.wrap_socket(raw_socket, server_hostname=None)
ssl_socket.send(http_request.encode('utf-8'))
response = b""
while True:
try:
chunk = ssl_socket.recv(8192)
if not chunk:
break
response += chunk
except socket.timeout:
break
ssl_socket.close()
raw_socket.close()
response_text = response.decode('utf-8', errors='ignore')
# 分离响应头和响应体
if "\r\n\r\n" in response_text:
_, body = response_text.split("\r\n\r\n", 1)
elif "\n\n" in response_text:
_, body = response_text.split("\n\n", 1)
else:
body = response_text
# 解析JSON
api_response = json.loads(body)
# 处理不同的响应格式
if isinstance(api_response, dict):
# 格式1: {"code":2000, "data":[...]}
if "data" in api_response:
data = api_response["data"]
elif "list" in api_response:
data = api_response["list"]
else:
data = []
elif isinstance(api_response, list):
# 格式2: 直接是数组 [...]
data = api_response
else:
data = []
# 提取并格式化热榜数据
if isinstance(data, list):
# 获取当前时间
now = datetime.now()
fetch_time = now.strftime("%Y-%m-%d %H:00")
result = {
"fetch_time": fetch_time,
"query_type": query_type,
"start_date": start_date,
"end_date": end_date,
"hot_list": []
}
for item in data:
# 处理标题:去除所有空格(半角空格、全角空格、制表符、换行符等)
title = item.get("title", "")
if title:
title = ''.join(title.split())
result["hot_list"].append({
"index": item.get("index"),
"title": title,
"hotCount": item.get("hotCount", ""),
"url": item.get("url", "")
})
print(json.dumps(result, ensure_ascii=False, indent=2))
else:
print(json.dumps([], ensure_ascii=False))
except json.JSONDecodeError as e:
error_msg = {"error": f"JSON解析失败: {str(e)}"}
print(json.dumps(error_msg, ensure_ascii=False))
sys.exit(1)
except ssl.SSLError as e:
error_msg = {"error": f"SSL错误: {str(e)}"}
print(json.dumps(error_msg, ensure_ascii=False))
sys.exit(1)
except Exception as e:
error_msg = {"error": f"错误: {str(e)}"}
print(json.dumps(error_msg, ensure_ascii=False))
sys.exit(1)
if __name__ == "__main__":
import argparse
parser = argparse.ArgumentParser(description='获取抖音热榜数据')
parser.add_argument('--start-date', type=str, help='开始日期,格式 YYYY-MM-DD')
parser.add_argument('--end-date', type=str, help='结束日期,格式 YYYY-MM-DD')
parser.add_argument('--days', type=int, help='查询天数,如7表示近7天,30表示近30天')
args = parser.parse_args()
fetch_douyin_hotspot(
start_date=args.start_date,
end_date=args.end_date,
days=args.days
)
FILE:assets/core-workflow.md
# 抖音热榜 — 核心执行流程
## 操作步骤
### 1. 获取热榜数据
#### 1.1 实时热榜(默认)
```bash
python scripts/hotspot_fetcher.py
```
#### 1.2 历史热榜查询
支持查询近7天、近30天的历史热榜数据:
```bash
# 查询昨日热榜(假设今天是2026-04-16)
python scripts/hotspot_fetcher.py --start-date 2026-04-15 --end-date 2026-04-16
# 查询近7天热榜(假设今天是2026-04-16)
python scripts/hotspot_fetcher.py --start-date 2026-04-09 --end-date 2026-04-16
# 查询近30天热榜(假设今天是2026-04-16)
python scripts/hotspot_fetcher.py --start-date 2026-03-17 --end-date 2026-04-16
# 查询4月1日热榜
python scripts/hotspot_fetcher.py --start-date 2026-04-01 --end-date 2026-04-02
```
**日期范围规则**:
- 日期范围是 **[start_date, end_date)** 左闭右开区间
- 例如:`start-date 2026-04-01 --end-date 2026-04-02` 查询的是4月1日当天的数据
- 例如:`start-date 2026-04-09 --end-date 2026-04-16` 查询的是4月9日至4月15日共7天的数据
**参数说明**:
- `--start-date`:开始日期(包含),格式 YYYY-MM-DD
- `--end-date`:结束日期(不包含),格式 YYYY-MM-DD
- `--days`:查询天数,自动计算日期范围(end_date为今天)
- **最长查询范围:30天**
#### 1.3 智能体判断逻辑
根据用户意图自动选择查询方式(假设今天日期为T):
- "今日热榜" / "最新热榜" / "热榜" → 实时热榜(不传日期参数)
- "昨日热榜" / "昨天热榜" → `--start-date T-1 --end-date T`
- "近7天热榜" / "一周热榜" → `--start-date T-7 --end-date T`
- "近30天热榜" / "本月热榜" → `--start-date T-30 --end-date T`
- "X月X日热榜" → `--start-date X月X日 --end-date X月X日的下一天`
**示例**(假设今天是2026-04-16):
| 用户表达 | start_date | end_date | 查询范围 |
| ------------ | ---------- | ---------- | -------------------- |
| "昨日热榜" | 2026-04-15 | 2026-04-16 | 4月15日当天 |
| "近7天热榜" | 2026-04-09 | 2026-04-16 | 4月9日至4月15日共7天 |
| "4月1日热榜" | 2026-04-01 | 2026-04-02 | 4月1日当天 |
### 2. 展示热榜数据表格
智能体将脚本返回的JSON数据转换为表格形式展示:
**标题格式**:
```
抖音实时热榜(2026-04-14 16:00 每小时更新)
```
或历史热榜:
```
抖音历史热榜(2026-04-14 至 2026-04-15)
```
**表格格式**(默认展示TOP20数据,每条数据必须严格按规则输出):
| 排名 | 热度值 | 话题 | 核心内容 |
| ----- | ------ | --------------------------------- | ---------------------------------------------------------------------------------- |
| TOP01 | 902.4w | [用万能旅行拍照姿势美美出片](URL) | 旅行博主分享多种万能拍照姿势,帮助女生在旅行中拍出好看的照片,解决拍照不自然的问题 |
| TOP02 | 892.6w | [耗时三年拍下古诗词里的中国](URL) | 摄影师历时三年走遍中国,用镜头还原古诗词中的意境美景,展现传统文化之美 |
| TOP03 | 875.8w | [我拍到了海鸥雨](URL) | 摄影爱好者在海边偶遇海鸥群飞,拍下壮观的海鸥雨画面,记录大自然的神奇瞬间 |
| TOP04 | 853.2w | [超日常美食教程速来get](URL) | 美食博主分享简单易学的日常美食制作教程,教大家快速上手做出美味家常菜 |
| TOP05 | 843.7w | [定格这一刻的日照金山](URL) | 旅行者在日照金山时刻拍下震撼美景,记录下日照金山的壮丽景色和难忘瞬间 |
| TOP06 | 832.1w | [你可以永远相信赛里木湖](URL) | 旅游达人推荐新疆赛里木湖景点,展示湖泊的绝美风光,被称为大西洋最后一滴眼泪 |
| TOP07 | 818.7w | [拼豆上也可以作画了](URL) | 手工达人用拼豆创作精美画作,将像素艺术与手工结合,展示创意手工制作过程 |
| TOP08 | 796.4w | [我的家庭旅行更像是打副本](URL) | 博主分享带家人旅行的有趣经历,将家庭旅行比作游戏打副本,记录旅途中的欢乐时光 |
| TOP09 | 785.4w | [原来古诗词里的河南真的存在](URL) | 文化旅行博主探访河南古诗词中的景点,发现诗中描绘的美景真实存在,感受文化魅力 |
| TOP10 | 771.0w | [蒸出了奶香爆米花馒头](URL) | 美食创作者创新制作奶香爆米花馒头,分享独特的面食做法,展示创意美食成果 |
| TOP11 | 758.6w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP12 | 745.2w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP13 | 732.8w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP14 | 718.5w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP15 | 705.3w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP16 | 692.7w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP17 | 680.1w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP18 | 668.9w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP19 | 655.4w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP20 | 642.8w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
**加载更多**:
表格下方显示可点击文案:
```
抖音实时热榜为你提供TOP50的数据,是否继续加载剩余30条?
```
- 用户点击确认后,**仅输出TOP21至TOP50的表格**(从TOP21开始,不重复输出TOP1-20)
- 用户拒绝则仅展示TOP20数据
- **用户确认加载更多后,必须生成新的HTML文件,HTML中展示完整的TOP50数据**
**加载更多表格示例**(用户确认后输出):
| 排名 | 热度值 | 话题 | 核心内容 |
| ----- | ------ | --------------- | -------------------------------------------------------------- |
| TOP21 | 632.5w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP22 | 628.1w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| ... | ... | ... | ... |
| TOP49 | 505.3w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
| TOP50 | 498.7w | [话题标题](URL) | 话题核心内容摘要,主要讲述什么人做了什么事,内容丰富且信息完整 |
**表格绘制规则(严格执行)**:
1. **排名**:
- 默认查询:`TOP01` 到 `TOP20` 格式(双数字符)
- 加载更多:`TOP21` 到 `TOP50` 格式(从TOP21开始,不重复输出TOP1-20)
2. **热度值**:
- 格式:保留一位小数,单位统一为 `w`(小写)
- 示例:`1109.6w`、`923.4w`、`85.2w`
- HTML页面与表格显示必须完全一致
3. **话题**:使用Markdown链接格式 `[标题](URL)`,用户点击可直接跳转
4. **核心内容**:总结话题里的主要内容信息,主要讲的是什么人/事件/事情,控制字数不低于30字,不超过80字
### 3. 🔍 创作者洞察报告(核心功能)
展示完条形图后,**必须自动输出创作者视角的深度洞察**:
#### 3.1 📌 爆款选题机会
分析当前热榜内容,回答:
- **爆款公式拆解**:这些热点背后有什么共同规律?
- 标题结构是什么?
- 内容形式是什么?
- 用户痛点是什么?
- **🔄 可迁移选题**:其他赛道创作者如何蹭这个热点?
输出格式:
```
📌 爆款选题机会
发现:[核心发现]
- 数据支撑:[具体数据]
- 核心公式:[拆解出的公式]
🔄 可迁移选题:
· 美妆赛道:[具体选题建议]
· 穿搭赛道:[具体选题建议]
· 其他赛道:[具体选题建议]
```
#### 3.2 ✏️ 标题套路破解
分析热榜标题,提炼:
- **爆款标题模式**:统计出现频率最高的标题类型
- **立即可用的标题公式**:给出填空式的标题模板
- **情绪触发词清单**:提取能触发用户行动冲动的高频词汇
输出格式:
```
✏️ 标题套路破解
爆款标题模式TOP3:
1. [类型名称]:[示例]
2. [类型名称]:[示例]
3. [类型名称]:[示例]
立即可用的标题公式:
· "用[方法],[效果]" → 例:用万能旅行拍照姿势美美出片
· "耗时[时间],拍下[成果]" → 例:耗时三年拍下古诗词里的中国
· "原来[认知],真的存在" → 例:原来古诗词里的河南真的存在
情绪触发词:
[高频词列表]
```
#### 3.3 📈 趋势预判与行动建议
基于当前热榜数据,逐点给出前瞻性判断:
输出格式:
```
📈 趋势预判
一、[预判点1]
[具体分析内容和依据]
行动建议:[具体建议]
二、[预判点2]
[具体分析内容和依据]
行动建议:[具体建议]
三、[预判点3]
[具体分析内容和依据]
行动建议:[具体建议]
```
#### 3.4 分析原则
- 基于实际数据,不编造
- 给出可执行的行动建议,不泛泛而谈
- 从创作者视角出发,每条洞察都要回答"怎么用"
- 保持专业但易懂,避免术语堆砌
### 4. 🔔 询问订阅(关键步骤)
分析完成后,**必须主动询问用户**是否需要订阅:
```
🔔 订阅服务
是否需要订阅每日/每小时热榜推送?
1. 每小时推送 - 实时追踪热点变化(默认推送TOP50完整数据)
2. 每日推送 - 每天早/晚获取一次热榜汇总(默认推送TOP50完整数据)
3. 暂不需要 - 仅本次查询
请回复数字或"取消",如有其他推送时间偏好请说明。
```
#### 订阅处理流程
- **用户选择1(每小时推送)**:记录偏好,后续每小时自动推送TOP50数据
- **用户选择2(每日推送)**:询问具体推送时间(早/晚),记录偏好,推送TOP50数据
- **用户选择3或"取消"**:结束本次交互,不记录
- **用户有其他偏好**:灵活记录并确认
**订阅数据输出规则**:
- 默认推送TOP50完整数据(无需用户确认加载更多)
- 如用户特别要求TOP20,则按用户要求执行
### 5. 📄 生成热榜HTML页面(必须立即执行)
**⚠️ 强制规则:HTML文件生成是必须执行的强制步骤,不等待用户回复,立即执行**
**⚠️ 禁止行为**:
- ❌ 禁止跳过HTML生成步骤
- ❌ 禁止等待用户回复后再生成HTML
- ❌ 禁止询问用户是否生成HTML
- ❌ 禁止在HTML生成前结束对话
- ❌ 禁止在表格、洞察、订阅询问之前生成HTML
**执行顺序(严格按序执行,HTML必须是最后一步,立即执行)**:
1️⃣ 获取数据 → 2️⃣ 展示表格 → 3️⃣ 创作者洞察 → 4️⃣ 询问订阅 → **5️⃣ 立即执行HTML生成(不等待用户回复)**
**触发场景**:
| 场景 | 是否生成HTML | 数据范围 | 文件命名 |
|-----|-------------|---------|---------|
| 查询实时热榜 | ✅ 必须立即生成 | TOP20(严格20条) | `douyin_hot_YYYYMMDD_HHMM.html` |
| 查询历史热榜 | ✅ 必须立即生成 | TOP20(严格20条) | `douyin_hot_YYYYMMDD_YYYYMMDD.html` |
| 用户加载更多 | ✅ 必须立即生成 | TOP50(严格50条) | `douyin_hot_top50_YYYYMMDD_HHMM.html` |
**⚠️ HTML数据展示规则(最高优先级)**:
- **默认展示TOP20**:查询实时/历史热榜时,HTML只展示TOP20数据
- **加载更多展示TOP50**:只有用户明确要求加载更多时,HTML才展示TOP50数据
- **数据条数严格控制**:HTML中的数据条数必须与展示条数完全一致
- TOP20模式:HTML中只能有20条数据,话题总数显示20
- TOP50模式:HTML中只能有50条数据,话题总数显示50
- **禁止自动扩展**:禁止在用户未要求时自动展示更多数据
**智能体必须立即执行(不等待用户回复)**:
```bash
# 实时热榜(默认只生成TOP20)
python scripts/gen_douyin_hot_html.py --output scripts/douyin_hot_20260417_1000.html
# 历史热榜(默认只生成TOP20)
python scripts/gen_douyin_hot_html.py --start-date 2026-04-15 --end-date 2026-04-16 --output scripts/douyin_hot_20260415_20260416.html
# 用户加载更多时才生成TOP50(使用--top 50参数)
python scripts/gen_douyin_hot_html.py --top 50 --output scripts/douyin_hot_top50_20260417_1000.html
```
**⚠️ 文件命名规则**:
- 实时热榜:`douyin_hot_YYYYMMDD_HHMM.html`(如 `douyin_hot_20260417_1000.html`)
- 历史热榜:`douyin_hot_起始日期_结束日期.html`(如 `douyin_hot_20260415_20260416.html`)
- 加载更多:`douyin_hot_top50_YYYYMMDD_HHMM.html`
**⚠️ 加载更多场景特殊处理**:
当用户确认加载更多(TOP21-TOP50)时:
1. **仅输出TOP21-TOP50的表格**(不重复输出TOP01-TOP20)
2. **立即生成新的HTML文件**,使用 `--top 50` 参数
3. HTML中必须包含完整的TOP50数据(TOP01-TOP50)
**⚠️ HTML文件输出要求(强制执行)**:
- **必须直接输出HTML文件内容**:生成HTML后,智能体必须在回复中直接输出完整的HTML文件内容
- **输出方式**:使用代码块直接展示HTML源码
```html
<!DOCTYPE html>
<html lang="zh-CN">
...(完整HTML内容)
</html>
```
- **同时告知文件路径**:在HTML内容前后说明文件保存路径
````
📄 已生成热榜HTML页面:
文件路径:./scripts/douyin_hot_20260417_1000.html
HTML内容:
```html
[完整HTML代码]
````
可直接用浏览器打开查看,或导出PDF保存。
```
```
- **禁止遗漏**:无论实时查询还是历史查询,都必须输出完整HTML内容
- **禁止截断**:必须输出完整的HTML文件,不得省略或截断
**⚠️ PDF文件输出要求(强制执行)**:
- **必须输出PDF文件**:智能体必须在回复中输出PDF文件
- **PDF生成方式**:
1. 先生成HTML文件
2. 使用浏览器工具或其他方式将HTML转换为PDF
3. 输出PDF文件路径
- **PDF输出格式**:
```
📄 已生成热榜PDF文件:
文件路径:./scripts/douyin_hot_20260417_1000.pdf
PDF内容支持点击跳转到对应话题页面。
```
- **禁止遗漏**:无论实时查询还是历史查询,都必须输出PDF文件
**⚠️ 数据一致性要求(严格执行,禁止数据对齐/修改)**:
- **数据来源唯一**:HTML中的数据必须完全来自脚本执行返回的API数据,禁止使用其他来源
- **禁止数据对齐**:API返回什么数据就输出什么数据,禁止为了"对齐"而修改任何字段
- **原始数据输出**:
- 排名:按API返回的原始顺序,禁止重新排序
- 热度值:按API返回的原始数值,禁止修改格式或数值
- 话题标题:按API返回的原始标题,禁止修改或美化
- 跳转链接:按API返回的原始URL,禁止替换或伪造
- **禁止任何修改**:智能体不得在生成HTML时修改、添加、删除、重排、美化任何数据
- **禁止编造内容**:核心内容摘要必须严格基于话题标题生成,禁止编造不存在的内容
- **一一对应**:HTML中的每一条数据必须与智能体输出的榜单表格完全一致
**HTML页面统计数据要求**:
- **话题总数**:必须是HTML页面中实际展示的榜单数据条数(TOP20或TOP50)
- **最高热度**:必须是HTML页面中展示的所有热度值的最大值
- **平均热度**:必须是HTML页面中展示的所有热度值的平均值
- **禁止伪造统计**:统计数据必须根据实际展示的榜单数据计算,禁止编造或使用其他数据
**HTML页面特性**(紫色极简卡片风格):
- **数据一致性**:展示数据与API返回数据完全一致,不做任何修改
- **统计数据准确**:话题总数、最高热度、平均热度必须根据实际榜单数据计算
- **支持TOP20或TOP50数据**:默认TOP20,可通过 `--top 50` 显示完整TOP50
- **保持原生排名顺序**(禁止重新排序)
- **核心内容完整展示**(不使用省略号截断)
- **整行点击跳转**:链接为API返回的真实URL,点击直接跳转到对应话题页面
- **PDF链接跳转**:导出的PDF中每一行都支持点击跳转
- 使用PDF规范的标准链接注解(Link Annotation)
- 支持大多数现代PDF阅读器(Adobe Reader、Chrome PDF Viewer、Edge PDF等)
- 点击任意榜单行即可跳转到对应的抖音话题页面
- 链接URL与榜单数据完全一致,使用API返回的真实链接
### 6. 可选操作
- 用户可以点击标题直接跳转到对应热点页面
- 可根据热度值排序或筛选特定话题
- 可随时发送"取消订阅"停止推送
## 资源索引
- 数据获取脚本:见 [scripts/hotspot_fetcher.py](../scripts/hotspot_fetcher.py)(获取抖音热榜JSON数据)
- HTML生成脚本:见 [scripts/gen_douyin_hot_html.py](../scripts/gen_douyin_hot_html.py)(生成热榜可视化HTML页面)
- HTML模板文件:见 [assets/douyin_hot_trend_template.html](douyin_hot_trend_template.html)(HTML页面模板,支持快速生成)
## 模板使用说明
`douyin_hot_trend_template.html` 是一个独立的HTML模板文件,支持以下占位符快速生成:
| 占位符 | 说明 | 示例值 |
| ------------------- | ------------ | ------------------- |
| `{{PAGE_TITLE}}` | 页面标题 | 抖音实时热榜 |
| `{{FETCH_TIME}}` | 获取时间 | 2026-04-17 10:00:00 |
| `{{HOT_LIST_DATA}}` | 热榜数据JSON | `[{...}, {...}]` |
**快速生成方式**:将占位符替换为实际数据即可生成完整HTML页面。
## 注意事项
- API调用需要网络连接,请确保网络通畅
- 热榜数据实时更新,每次调用获取最新数据
- 历史热榜最长查询范围为30天
- 如遇API调用失败,提示用户稍后重试
- 订阅偏好需要用户明确确认后记录
- 分析必须基于实际数据,给出可执行的行动建议
Generates trending Xiaohongshu notes by extracting hot keywords, popular structures, and engagement tips for ready-to-post, high-potential content.
---
name: xhs-copywriter
description: 📖写笔记写到头秃?快让这个“小红书笔记生成器”来帮你摸鱼……啊不,帮你起飞~🚀 它每天偷偷刷2000+篇爆款笔记,比你刷剧还勤快📱💨 你只要随便丢几个关键词进去,它就能精准捞出当下最火的热门笔记,连爆款的结构、开头套路、干货密度、互动小妙招……统统拆得明明白白!🧠🔍 然后AI小脑瓜一运转,提炼出“流量密码本密码”✨,再按照小红书的脾气和审美,给你写出一篇通顺、合规、直接能发的完整笔记文案~ 从此告别抓耳挠腮,告别反复删改,轻轻松松产出爆款潜力股内容!💥 让创作变简单,让流量变日常~🥳💖
version:1.0.0
---
# 小红书爆款文案创作
触发本技能并需要执行完整流程时,**必须先读取**与本技能同目录下的 `references/core_workflow.md`,并**完整遵循**其中的触发规则、术语规范、数据来源约束、所有操作步骤、自检清单与注意事项。生成 HTML 报告时另需按该文档要求读取 `references/report_template.md`;数据格式说明见 `references/xhs_trend_data_format.md`。脚本路径相对于技能目录:`scripts/fetch_xhs_trends.py`。
FILE:scripts/fetch_xhs_trends.py
#!/usr/bin/env python3
"""
小红书热门数据查询脚本(最终版 - 禁用 SNI + 支持 chunked + gzip)
"""
import sys
import argparse
import json
import socket
import ssl
import gzip
def decode_chunked(data):
"""解码 chunked 传输编码"""
chunks = []
idx = 0
while idx < len(data):
# 读取 chunk 大小
line_end = data.find(b'\r\n', idx)
if line_end == -1:
break
chunk_size_line = data[idx:line_end]
try:
chunk_size = int(chunk_size_line, 16)
except:
break
if chunk_size == 0:
break
# 读取 chunk 数据
chunk_start = line_end + 2
chunk_end = chunk_start + chunk_size
if chunk_end > len(data):
break
chunk = data[chunk_start:chunk_end]
chunks.append(chunk)
# 移动到下一个 chunk
idx = chunk_end + 2 # 跳过 \r\n
return b''.join(chunks)
def fetch_via_no_sni(base_url: str, params: dict, headers: dict, timeout: int = 60):
"""
使用原生 socket 实现 HTTPS 请求(不发送 SNI)
关键:服务器在 SNI 扩展中检测到域名后主动断开连接
解决:不发送 SNI 扩展
"""
# 解析 URL
if "://" in base_url:
base_url = base_url.split("://", 1)[1]
host, path = base_url.split("/", 1)
# 构建 query string
if params:
from urllib.parse import quote
query = "&".join(f"{quote(str(k))}={quote(str(v))}" for k, v in params.items())
path = f"{path}?{query}"
# 创建 TCP 连接
sock = socket.create_connection((host, 443), timeout=timeout)
# 创建 SSL 上下文(不使用 SNI)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
# 包装 socket(不传递 server_hostname,避免发送 SNI)
ssl_sock = context.wrap_socket(sock)
# 构建 HTTP 请求
request_lines = [
f"GET /{path} HTTP/1.1",
f"Host: {host}",
]
for k, v in headers.items():
request_lines.append(f"{k}: {v}")
request_lines.append("")
request_lines.append("")
request = "\r\n".join(request_lines)
# 发送请求
ssl_sock.send(request.encode())
# 接收响应
response_data = b""
while True:
try:
chunk = ssl_sock.recv(8192)
if not chunk:
break
response_data += chunk
except:
break
ssl_sock.close()
# 解析响应头
response_str = response_data.decode('utf-8', errors='ignore')
lines = response_str.split('\r\n')
# 提取状态码
status_code = int(lines[0].split()[1])
# 提取响应头
headers_dict = {}
for i, line in enumerate(lines[1:]):
if line == '':
break
if ':' in line:
key, value = line.split(':', 1)
headers_dict[key.strip().lower()] = value.strip()
# 分离头部和正文
header_end = response_data.find(b'\r\n\r\n')
if header_end != -1:
body_bytes = response_data[header_end + 4:]
else:
body_bytes = b""
# 处理 chunked 编码
if headers_dict.get('transfer-encoding', '').lower() == 'chunked':
body_bytes = decode_chunked(body_bytes)
# 处理 gzip 压缩
if headers_dict.get('content-encoding', '').lower() == 'gzip':
try:
body_bytes = gzip.decompress(body_bytes)
except:
pass
response_body = body_bytes.decode('utf-8', errors='ignore')
return status_code, response_body
def fetch_xhs_trends(keyword: str, debug: bool = False, max_retries: int = 3, start_date: str = None):
"""
调用新接口获取小红书热门数据
Args:
keyword: 搜索关键词(多个关键词用逗号分隔,最多5个,总长度不超过200)
debug: 是否打印调试信息
max_retries: 最大重试次数
start_date: 开始日期,格式 yyyy-MM-dd,最长为最近30天
Returns:
dict: 包含4类爆款数据
Raises:
Exception: 当API调用失败时抛出异常
"""
base_url = "https://onetotenvip.com/skill/cozeSkill/getXhsCozeSkillData"
params = {
"keyword": keyword,
"source": "小红书笔记创作-ClawHub"
}
# 添加开始日期参数
if start_date:
params["startDate"] = start_date
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "close",
}
last_error = None
for attempt in range(max_retries):
try:
if debug:
print(f"\n=== DEBUG: 第 {attempt + 1} 次尝试 ===", file=sys.stderr)
status_code, body = fetch_via_no_sni(base_url, params, headers)
if debug:
print(f"状态码: {status_code}", file=sys.stderr)
print(f"响应长度: {len(body)} 字节", file=sys.stderr)
if status_code >= 400:
raise Exception(f"HTTP请求失败: 状态码 {status_code}")
data = json.loads(body)
if "data" not in data:
error_msg = data.get("msg", "未知错误")
raise Exception(f"API 错误: {error_msg}")
result_data = data.get("data", {})
if debug:
print("=== DEBUG: API 返回的 data 字段键 ===", file=sys.stderr)
print(json.dumps(list(result_data.keys()), ensure_ascii=False, indent=2), file=sys.stderr)
return {
"keyword": keyword,
"low_fan_explosive": result_data.get("lowPowderExplosiveArticle", []),
"daily_like_top500": result_data.get("likeTheTop500", []),
"daily_increment": result_data.get("singleDayIncrements", []),
"weekly_increment": result_data.get("sevenDaysOfIncrements", [])
}
except Exception as e:
last_error = str(e)
if debug:
print(f" 错误: {type(e).__name__}: {str(e)[:100]}", file=sys.stderr)
import time
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
raise Exception(f"{last_error}(已尝试 {max_retries} 次)")
def format_output(data: dict, max_items: int = None):
"""
格式化输出热门数据(表格形式)
Args:
data: 原始数据
max_items: 每类爆款数据最多展示数量,None 表示展示所有数据
"""
def process_title(item):
"""处理标题:转义特殊字符,空标题使用desc替代,并添加作品链接"""
title = item.get('title', '')
# 如果标题为空,尝试使用 desc 字段
if not title or title.strip() == '':
desc = item.get('desc', '')
if desc:
# 移除 desc 中的换行符并截取前30个字符
title = desc.replace('\n', ' ').replace('\r', ' ').strip()[:30]
if len(desc) > 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] + "..."
# 添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
work_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title = f"[{title}]({work_link})"
return title
output = []
# 按 photoId 去重(API 返回数据可能有重复)
def dedup_items(items):
seen = set()
result = []
for item in items:
photo_id = item.get('photoId', '')
if photo_id and photo_id not in seen:
seen.add(photo_id)
result.append(item)
return result
# 检查是否有任何数据
low_fan_items = dedup_items(data.get("low_fan_explosive", []))
daily_like_items = dedup_items(data.get("daily_like_top500", []))
daily_increment_items = dedup_items(data.get("daily_increment", []))
weekly_increment_items = dedup_items(data.get("weekly_increment", []))
total_count = len(low_fan_items) + len(daily_like_items) + len(daily_increment_items) + len(weekly_increment_items)
# 如果所有类型都没有数据,输出友好提示
if total_count == 0:
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n**爆款总数**:{total_count} 条\n\n")
output.append("---\n\n")
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)
# 1. 新手友好爆款
items = low_fan_items
if max_items is not None:
items = items[:max_items]
# 计算实际展示的总数
display_low_fan = items
display_daily_like = daily_like_items[:max_items] if max_items is not None else daily_like_items
display_daily_increment = daily_increment_items[:max_items] if max_items is not None else daily_increment_items
display_weekly_increment = weekly_increment_items[:max_items] if max_items is not None else weekly_increment_items
display_total = len(display_low_fan) + len(display_daily_like) + len(display_daily_increment) + len(display_weekly_increment)
# 输出标题和总数量
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n**爆款总数**:{display_total} 条\n\n---\n")
output.append(f"\n## 爆款笔记(共 {len(items)} 条)")
output.append(f"### - **新手友好爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | **互动总数** | 收藏 | 分享 | 评论 | 点赞 |")
output.append("|------|------|------|------------|------|------|------|------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
output.append(f"| {idx} | {title} | {author_str} | **{item.get('interactiveCount', 0)}** | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} | {item.get('useLikeCount', 0)} |")
# 2. 当日点赞爆款
items = data.get("daily_like_top500", [])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **当日点赞爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | **点赞** | 收藏 | 分享 | 评论 |")
output.append("|------|------|------|-------|------|------|------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
output.append(f"| {idx} | {title} | {author_str} | **{item.get('useLikeCount', 0)}** | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} |")
# 3. 当日增长爆款
items = data.get("daily_increment", [])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **当日增长爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **新增互动总量** |")
output.append("|------|------|------|------|------|------|------|---------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
# 从 anaAdd 对象获取新增互动数据
ana_add = item.get('anaAdd', {})
if ana_add:
total = ana_add.get('addInteractiveount', 0)
collected = ana_add.get('addCollectedCunt', 0)
share = ana_add.get('addShareCount', 0)
comment = ana_add.get('addCommentCount', 0)
like = ana_add.get('addLikeCount', 0)
else:
total = 0
collected = 0
share = 0
comment = 0
like = 0
output.append(f"| {idx} | {title} | {author_str} | {collected} | {share} | {comment} | {like} | **{total}** |")
# 4. 持续增长爆款
items = data.get("weekly_increment", [])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **持续增长爆款**(共 {len(items)} 条)")
output.append(f"统计时间:近30天\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **新增互动总量** |")
output.append("|------|------|------|------|------|------|------|---------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
if user_id:
author_link = f"https://www.xiaohongshu.com/user/profile/{user_id}"
author_str = f"[{user_name}]({author_link})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
# 从 anaAdd 对象获取新增互动数据
ana_add = item.get('anaAdd', {})
if ana_add:
total = ana_add.get('addInteractiveount', 0)
collected = ana_add.get('addCollectedCunt', 0)
share = ana_add.get('addShareCount', 0)
comment = ana_add.get('addCommentCount', 0)
like = ana_add.get('addLikeCount', 0)
else:
total = 0
collected = 0
share = 0
comment = 0
like = 0
output.append(f"| {idx} | {title} | {author_str} | {collected} | {share} | {comment} | {like} | **{total}** |")
return "\n".join(output)
def main():
"""主函数"""
parser = argparse.ArgumentParser(description='小红书热门数据查询工具')
parser.add_argument('--keyword', required=True, help='搜索关键词')
parser.add_argument('--max-items', type=int, default=10,
help='每类爆款内容最多展示数量(默认10条)')
parser.add_argument('--output-format', choices=['text', 'json', 'markdown'],
default='markdown', help='输出格式:text(文本表格)、json(JSON格式)或 markdown(Markdown格式,默认)')
parser.add_argument('--start-date', type=str, default=None,
help='开始日期,格式 yyyy-MM-dd(默认最近30天)')
parser.add_argument('--debug', action='store_true', help='启用调试模式')
parser.add_argument('--max-retries', type=int, default=3,
help='最大重试次数(默认3次)')
args = parser.parse_args()
try:
data = fetch_xhs_trends(args.keyword, debug=args.debug, max_retries=args.max_retries, start_date=args.start_date)
# 生成输出内容
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()
FILE:references/core_workflow.md
# 小红书爆款内容分析与文案生成
## 自我介绍
当用户询问"你的技能是什么"、"你能做什么"、"你的触发条件是什么"等问题时,请回答:
**我的技能**:专为小红书内容创作打造的一站式笔记生成工具,基于全网每日持续收录的2000+条爆款笔记数据,根据用户输入关键词,精准检索查询平台当下热门爆款笔记,通过AI深度复盘爆款内容的结构、开头逻辑、干货密度与互动话术,提炼核心流量密码与创作要点,严格贴合小红书内容生态与传播逻辑,生成通顺、合规、可直接发布的完整笔记文案,降低创作门槛,高效产出流量内容。
**触发条件**:当用户说"帮我写一篇关于XX的小红书笔记"、"生成XX相关的文案内容"等文案生成类需求时使用。
## 任务目标
1. **查询爆款**:根据用户关键词查询小红书热门笔记
2. **分析规律**:从爆款数据中提炼流量密码与创作要点
3. **生成文案**:基于爆款规律生成可发布的文案内容
## 触发条件
当用户询问以下场景时使用本 Skill:
- "帮我找 XXX 的爆款笔记"
- "分析 XXX 的爆款规律"
- "帮我写一篇 XXX 的文案"
- "生成 XXX 相关的笔记内容"
## 操作流程
### Step 1: 查询爆款笔记
调用脚本获取热门数据:
```bash
python scripts/fetch_xhs_trends.py \
--keyword "<用户关键词>" \
--max-items 10 \
--output-format markdown
```
**参数说明**:
- `--keyword`:用户输入的搜索关键词
- `--max-items`:每类爆款数据展示数量,默认 10 条
- `--output-format`:固定使用 `markdown` 格式
**脚本输出**:
- 四类爆款数据:低粉高赞爆款、点赞靠前、爆发增长、持续增长
- 每条数据包含:标题、作者、互动数据(收藏/分享/评论/点赞)
**执行要求**:
- 执行脚本后,直接基于输出数据进行分析
- 禁止将原始爆款数据展示给用户
- 禁止仅发送文件路径或"已保存"等简短提示
### Step 2: 分析爆款规律
基于脚本输出的数据,提炼以下规律:
**标题规律**:
- 高互动标题的共同特征(数字使用、情绪词、人群标签)
- 标题长度与结构模式
**内容规律**:
- 热门笔记的主题方向与切入角度
- 内容结构与段落分布特点
- 互动引导方式
**标签策略**:
- 高频出现的标签类型
- 热门话题标签
**数据分析维度**:
| 指标 | 分析要点 |
|------|---------|
| 互动总量 | 高互动内容的核心特征 |
| 收藏率 | 内容实用价值高低 |
| 评论量 | 话题性与互动引导效果 |
| 点赞比 | 情绪共鸣程度 |
### Step 3: 引导用户上传个人风格参考
在生成文案前,**必须**主动询问用户是否提供个人风格参考:
> 想让我更懂你的风格?发几段平时的笔记、日记或随笔给我就行
**处理方式**:
- 若用户提供:分析其写作风格(用词习惯、语气特点、表达方式),融合到生成的文案中
- 若用户不提供:直接基于爆款规律生成文案
### Step 4: 生成文案
**必须严格按照爆款规律分析结果进行创作**,生成符合爆款规律的小红书笔记
**创作前的准备**
1. **回顾爆款规律分析结果**(必须执行):
- 提取的高频关键词和热词(必须融入正文)
- 热门标题模式(必须严格遵循)
- 爆款内容的结构特征(必须参考)
- 热门内容风格(必须保持一致)
2. **搜索最新资讯/热点**(必须执行):
- 使用 `web_search` 工具搜索该领域的最新动态、热点事件、深度分析或行业趋势
- 搜索关键词格式:`小红书 + <选题关键词> + 最新`
- **必须获取至少1-2个最新热点或资讯作为创作素材**
**撰写小红书笔记内容**(必须遵循爆款规律)
1. **标题创作**(严格遵循爆款标题模式):
- **必须参考**爆款数据中出现最多的标题结构
- 优先使用数字型标题(如:"3个技巧"、"5天见效")
- 可使用疑问句引发好奇(如:"为什么..."、"居然...")
- 可使用感叹句增强情绪(如:"太绝了!"、"绝了!")
- 标题最多不超过 20 字(包含标点符号,超出必须精简)
2. **正文创作**(严格遵循爆款内容结构):
- **必须融入**爆款数据中出现的高频关键词
- **必须参考**爆款内容的开头"钩子"手法(如:痛点共鸣、惊人数据、反差对比)
- **必须保持**爆款内容的写作风格(如:口语化、亲切感、代入感)
- **必须融入**最新搜索到的热点/资讯,增加时效性和话题度
- **结构参考**:分点说明、步骤教程、对比展示等
- **结尾引导**:添加引导互动的话术(如:"你们觉得呢?"、"评论区告诉我")
- **排版**:良好分段,点缀少量 Emoji(每段 1-2 个),使用简短句子
- **Tags**:结尾添加 5-10 个相关标签(**注意:Tags 仅用于笔记正文,不渲染到图片中**)
### Step 5: 输出前自检【必须执行】
在输出前,逐项检查输出格式的每一个字段是否完整:
- []**推荐标题**:是否包含3-6个推荐标题?
- []**正文内容**:是否包含完整可发布的正文?
- []**推荐标签**:是否包含5-10个相关标签?
- []**爆款公式来源-参考的爆款规律**:是否简述提炼的爆款公式?
- []**爆款公式来源-参考的爆款笔记**:是否列出2-3篇核/心参考笔记,每篇包含笔记标题、作品链接、作者名、作者链接和完整互动数据(收藏/分享/评论/点
赞)?
如有任何字段遗漏或不完整,必须补齐后再输出。
## 输出格式
最终输出**纯文案内容**,包含:
```
### 推荐标题
1. [标题1]
2. [标题2]
3. [标题3]
### 正文内容
[完整可发布的正文]
### 推荐标签
#标签1 #标签2 #标签3 #标签4 #标签5
### 爆款公式来源
**参考的爆款规律**:[简述提炼的爆款公式,如"数字型标题 + 痛点开场 + 分点干货 + 互动收尾"]
**参考的爆款笔记**(列出 2-3 篇核心参考笔记):
1. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
2. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
3. [笔记标题](作品链接) - [@作者名](作者链接) - 互动数据:收藏 X / 分享 X / 评论 X / 点赞 X
```
**输出格式要求(强制)**:
- 如果是在子 Agent 中执行,主 Agent 也必须保持此输出格式不变,禁止调整、精简或重新组织
- 必须严格按照上述结构输出,不得遗漏任何部分(推荐标题、正文内容、推荐标签、爆款公式来源)
- 爆款公式来源必须包含"参考的爆款规律"和"参考的爆款笔记"两部分
**禁止输出**:
- 卡片设计或图片
- 脚本执行命令
- 文件路径或下载链接
- 仅展示数据而不生成文案
## 注意事项
- 严格基于查询到的真实爆款数据进行分析
- 生成的文案必须遵循提炼出的爆款规律
- 禁止在文案中添加外部联系方式或违规信息
- 生成的文案必须符合小红书社区规范
FILE:references/xhs_trend_data_format.md
# 小红书热门数据格式说明
## 概览
本文档定义了小红书热门数据查询脚本 `fetch_xhs_trends.py` 的输入输出格式规范。
## 输入格式
### 脚本参数
```bash
python scripts/fetch_xhs_trends.py --keyword <关键词> [选项]
```
| 参数 | 必填 | 说明 | 默认值 |
|------|------|------|--------|
| `--keyword` | 是 | 搜索关键词(支持多个关键词,逗号分隔,最多5个,总长度不超过200字符) | - |
| `--start-date` | 否 | 开始日期,格式 yyyy-MM-dd | 最近30天 |
| `--max-items` | 否 | 每类内容最多展示数量 | 50 |
| `--output-format` | 否 | 输出格式:text、json 或 markdown | markdown |
| `--output-file` | 否 | 输出文件路径 | 关键词_爆款数据.md |
| `--debug` | 否 | 调试模式,打印原始API响应 | False |
## 输出格式
### 四类爆款内容
脚本返回**近30天**的小红书热门数据,包含以下四类爆款内容:
| 内容类型 |适用场景 |
|---------|---------|
| **新手友好爆款** | 适合模仿学习,发现低成本爆款 |
| **当日点赞爆款** | 了解当前最热门内容 |
| **爆发增长内容** | 发现快速增长的内容 |
| **持续增长内容** | 发现持续增长的内容 |
### 作品数据字段(完整)
每个作品包含以下字段:
#### 作品基本信息
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `photoId` | string | 作品ID(唯一标识) |
| `title` | string | 作品标题 |
| `desc` | string | 作品描述/正文 |
| `publicTime` | string | 发布时间(格式:YYYY-MM-DD HH:MM:SS) |
#### 作者信息
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `userId` | string | 作者ID |
| `userName` | string | 作者名称 |
| `userHeadUrl` | string | 作者头像URL |
| `fans` | int | 粉丝数 |
**作者主页链接拼接规则**:
```
https://www.xiaohongshu.com/user/profile/{userId}
```
#### 互动数据(非增量类)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `useLikeCount` | int | 点赞数 |
| `collectedCount` | int | 收藏数 |
| `useCommentCount` | int | 评论数 |
| `useShareCount` | int | 分享数 |
| `interactiveCount` | int | 互动总数 |
#### 互动数据(增量类)
增量类(单日增量、七日增量)的数据在 `anaAdd` 对象中:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `anaAdd.addLikeCount` | int | 新增点赞数 |
| `anaAdd.addCollectedCunt` | int | 新增收藏数(注意:API字段名有拼写错误) |
| `anaAdd.addCommentCount` | int | 新增评论数 |
| `anaAdd.addShareCount` | int | 新增分享数 |
| `anaAdd.addInteractiveount` | int | 新增互动总数(注意:API字段名有拼写错误) |
| `anaAdd.useLikeCount` | int | 总点赞数 |
| `anaAdd.collectedCount` | int | 总收藏数 |
| `anaAdd.useCommentCount` | int | 总评论数 |
| `anaAdd.useShareCount` | int | 总分享数 |
| `anaAdd.interactiveCount` | int | 总互动数 |
| `anaAdd.pred_readnum` | int | 预测阅读数 |
#### 图片链接
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `coverUrl` | string | 封面图URL |
| `thumbnail` | string | 缩略图URL |
### JSON 输出示例
```json
{
"keyword": "高考",
"low_fan_explosive": [
{
"photoId": "69aa603c0000000015021b18",
"title": "对于26高考女宝们的选大学建议",
"desc": "一定要选人文关怀好以及男女平等的大学...",
"publicTime": "2026-03-06 13:03:56",
"userId": "68ebaae60000000037006191",
"userName": "Alley",
"userHeadUrl": "https://sns-avatar-qc.xhscdn.com/...",
"fans": 2,
"useLikeCount": 23439,
"collectedCount": 15610,
"useCommentCount": 846,
"useShareCount": 697,
"interactiveCount": 39895,
"coverUrl": "http://sns-img-hw.xhscdn.com/...",
"thumbnail": "http://sns-img-hw.xhscdn.com/..."
}
],
"daily_like_top": [...],
"daily_increment": [
{
"photoId": "...",
"title": "...",
"anaAdd": {
"addLikeCount": 12345,
"addCollectedCunt": 2345,
"addCommentCount": 567,
"addShareCount": 89,
"addInteractiveount": 15346,
"useLikeCount": 50000,
"collectedCount": 10000,
"useCommentCount": 2000,
"useShareCount": 500,
"interactiveCount": 62500,
"pred_readnum": 800000
}
}
],
"weekly_increment": [...]
}
```
### 文本输出格式(表格形式)
文本输出采用 Markdown 表格格式,结构清晰,便于阅读:
```markdown
## 1、新手友好爆款
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |
|------|------|------|----------|------|------|------|------|----------|
| 1 | 对于26高考女宝们的选大学建议 | [Alley](https://www.xiaohongshu.com/user/profile/68ebaae60000000037006191)(粉丝:2) | 教育 / 大学教育 | 15610 | 697 | 846 | 23439 | 39895 |
| 2 | 查出来个高考状元 | [泽陈泽陈](https://www.xiaohongshu.com/user/profile/684c0a9d000000001d00b1a1)(粉丝:4279) | 教育 / 中学教育 | 2860 | 221 | 44 | 23617 | 26521 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... | ... |
## 2、当日点赞爆款
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 收藏 | 分享 | 评论 | 点赞 |
|------|------|------|----------|------|------|------|------|
| 1 | 被1w人看过的地理书x厦门日光岩 | [深海里遇见你](https://www.xiaohongshu.com/user/profile/634a71b8000000001802d092)(粉丝:7404) | 教育 / 中学教育 | 57637 | 14733 | 2818 | 460237 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... |
## 3、爆发增长内容
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 新增收藏 | 新增分享 | 新增评论 | 新增点赞 | 互动增量 |
|------|------|------|----------|----------|----------|----------|----------|----------|
| 1 | 今年春晚预测的中高考考点❗ | [北大旺仔](https://www.xiaohongshu.com/user/profile/5de3e57c00000000010055f8)(粉丝:179984) | 教育 / 中学教育 | 14639 | 1485 | 102 | 19257 | 33998 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... | ... |
## 4、持续增长内容
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 新增收藏 | 新增分享 | 新增评论 | 新增点赞 | 互动增量 |
|------|------|------|----------|----------|----------|----------|----------|----------|
| 1 | 高考文言文词类活用-活用作状语 友好版! | [我是摆子](https://www.xiaohongshu.com/user/profile/5d99de820000000001000015)(粉丝:52197) | 教育 / 中学教育 | 29937 | 1162 | 150 | 75196 | 105283 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... | ... |
```
### 表格字段说明
#### 新手友好爆款
| 列名 | 说明 |
|------|------|
| 序号 | 排名|
| 标题 | 作品标题|
| 作者 | 作者名称(可点击跳转)+ 粉丝数 |
| 收藏 | 收藏数 |
| 分享 | 分享数 |
| 评论 | 评论数 |
| 点赞 | 点赞数 |
| 互动总数 | 互动总数 |
#### 当日点赞爆款
| 列名 | 说明 |
|------|------|
| 序号 | 排名|
| 标题 | 作品标题|
| 作者 | 作者名称(可点击跳转)+ 粉丝数 |
| 收藏 | 收藏数 |
| 分享 | 分享数 |
| 评论 | 评论数 |
| 点赞 | 点赞数 |
#### 增长内容
| 列名 | 说明 |
|------|------|
| 序号 | 排名 |
| 标题 | 作品标题 |
| 作者 | 作者名称(可点击跳转)+ 粉丝数 |
| 新增收藏 | 新增收藏数 |
| 新增分享 | 新增分享数 |
| 新增评论 | 新增评论数 |
| 新增点赞 | 新增点赞数 |
| 互动增量 | 互动增量总数 |
## 使用注意事项
### 数据获取原则
1. **必须调用脚本查询**:不能使用其他方式查询或直接搜索网络资讯
2. **必须等待脚本执行完成**:获取返回结果后才能进行后续步骤
3. **必须展示完整数据列表**:不能跳过或询问用户
### 数据展示原则
1. **展示所有字段**:每个作品展示完整信息,包括封面图、作者链接、分类、互动数据等
2. **四类爆款内容全部展示**:
### 字段说明
1. **增量内容的 anaAdd 字段**:仅爆发增长和持续增长内容包含此字段
2. **API字段拼写错误**:`addCollectedCunt` 和 `addInteractiveount` 是 API 的原始拼写,保持不变
3. **封面图和缩略图**:通常相同,但有时缩略图分辨率更低
AI-powered cover design tool for Xiaohongshu creators that analyzes viral post data to generate high-conversion, platform-optimized cover designs.
---
name: explosive-cover-generator
description: 专为小红书内容创作打造的AI封面设计工具,基于全网每日持续收录的2000+条爆款笔记数据,深度抓取同赛道爆款封面的视觉元素,通过AI智能分析总结高转化视觉规律,生成贴合笔记内容、符合平台流量审美的可落地封面设计方案,省去繁琐设计流程,提升笔记封面点击率。仅在主Agent中执行,不派发给子Agent。
Agent
python:
- requests>=2.28.0
system:
---
# 爆款封面生成
## 核心功能
专为小红书内容创作打造的AI封面设计工具,基于全网每日持续收录的2000+条爆款笔记数据,深度抓取同赛道爆款封面的视觉元素,通过AI智能分析总结高转化视觉规律,生成贴合笔记内容、符合平台流量审美的可落地封面设计方案,省去繁琐设计流程,提升笔记封面点击率。
触发本技能并需要执行完整流程时,**必须先读取**与本技能同目录下的 `references/core_workflow.md`,并**完整遵循**其中的触发规则、术语规范、数据来源约束、完整操作步骤、自检清单与注意事项。生成 HTML 报告时另需按该文档要求读取 `references/xhs_trend_data_format.md`。脚本路径相对于技能目录:`scripts/fetch_explosive_covers.py`。
FILE:scripts/fetch_explosive_covers.py
#!/usr/bin/env python3
"""
小红书热门数据查询脚本(最终版 - 禁用 SNI + 支持 chunked + gzip)
"""
import sys
import argparse
import json
import socket
import ssl
import gzip
def decode_chunked(data):
"""解码 chunked 传输编码"""
chunks = []
idx = 0
while idx < len(data):
# 读取 chunk 大小
line_end = data.find(b'\r\n', idx)
if line_end == -1:
break
chunk_size_line = data[idx:line_end]
try:
chunk_size = int(chunk_size_line, 16)
except:
break
if chunk_size == 0:
break
# 读取 chunk 数据
chunk_start = line_end + 2
chunk_end = chunk_start + chunk_size
if chunk_end > len(data):
break
chunk = data[chunk_start:chunk_end]
chunks.append(chunk)
# 移动到下一个 chunk
idx = chunk_end + 2 # 跳过 \r\n
return b''.join(chunks)
def fetch_via_no_sni(base_url: str, params: dict, headers: dict, timeout: int = 60):
"""
使用原生 socket 实现 HTTPS 请求(不发送 SNI)
关键:服务器在 SNI 扩展中检测到域名后主动断开连接
解决:不发送 SNI 扩展
"""
# 解析 URL
if "://" in base_url:
base_url = base_url.split("://", 1)[1]
host, path = base_url.split("/", 1)
# 构建 query string
if params:
from urllib.parse import quote
query = "&".join(f"{quote(str(k))}={quote(str(v))}" for k, v in params.items())
path = f"{path}?{query}"
# 创建 TCP 连接
sock = socket.create_connection((host, 443), timeout=timeout)
# 创建 SSL 上下文(不使用 SNI)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
# 包装 socket(不传递 server_hostname,避免发送 SNI)
ssl_sock = context.wrap_socket(sock)
# 构建 HTTP 请求
request_lines = [
f"GET /{path} HTTP/1.1",
f"Host: {host}",
]
for k, v in headers.items():
request_lines.append(f"{k}: {v}")
request_lines.append("")
request_lines.append("")
request = "\r\n".join(request_lines)
# 发送请求
ssl_sock.send(request.encode())
# 接收响应
response_data = b""
while True:
try:
chunk = ssl_sock.recv(8192)
if not chunk:
break
response_data += chunk
except:
break
ssl_sock.close()
# 解析响应头
response_str = response_data.decode('utf-8', errors='ignore')
lines = response_str.split('\r\n')
# 提取状态码
status_code = int(lines[0].split()[1])
# 提取响应头
headers_dict = {}
for i, line in enumerate(lines[1:]):
if line == '':
break
if ':' in line:
key, value = line.split(':', 1)
headers_dict[key.strip().lower()] = value.strip()
# 分离头部和正文
header_end = response_data.find(b'\r\n\r\n')
if header_end != -1:
body_bytes = response_data[header_end + 4:]
else:
body_bytes = b""
# 处理 chunked 编码
if headers_dict.get('transfer-encoding', '').lower() == 'chunked':
body_bytes = decode_chunked(body_bytes)
# 处理 gzip 压缩
if headers_dict.get('content-encoding', '').lower() == 'gzip':
try:
body_bytes = gzip.decompress(body_bytes)
except:
pass
response_body = body_bytes.decode('utf-8', errors='ignore')
return status_code, response_body
def fetch_xhs_trends(keyword: str, debug: bool = False, max_retries: int = 3, start_date: str = None):
"""
调用新接口获取小红书热门数据
Args:
keyword: 搜索关键词(多个关键词用逗号分隔,最多5个,总长度不超过200)
debug: 是否打印调试信息
max_retries: 最大重试次数
start_date: 开始日期,格式 yyyy-MM-dd,最长为最近30天
Returns:
dict: 包含4类爆款数据
Raises:
Exception: 当API调用失败时抛出异常
"""
base_url = "https://onetotenvip.com/skill/cozeSkill/getXhsCozeSkillData"
params = {
"keyword": keyword,
"source": "小红书爆款封面生成-ClawHub"
}
# 添加开始日期参数
if start_date:
params["startDate"] = start_date
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "close",
}
last_error = None
for attempt in range(max_retries):
try:
if debug:
print(f"\n=== DEBUG: 第 {attempt + 1} 次尝试 ===", file=sys.stderr)
status_code, body = fetch_via_no_sni(base_url, params, headers)
if debug:
print(f"状态码: {status_code}", file=sys.stderr)
print(f"响应长度: {len(body)} 字节", file=sys.stderr)
if status_code >= 400:
raise Exception(f"HTTP请求失败: 状态码 {status_code}")
data = json.loads(body)
if "data" not in data:
error_msg = data.get("msg", "未知错误")
raise Exception(f"API 错误: {error_msg}")
result_data = data.get("data", {})
if debug:
print("=== DEBUG: API 返回的 data 字段键 ===", file=sys.stderr)
print(json.dumps(list(result_data.keys()), ensure_ascii=False, indent=2), file=sys.stderr)
return {
"keyword": keyword,
"low_fan_explosive": result_data.get("lowPowderExplosiveArticle", []),
"daily_like_top500": result_data.get("likeTheTop500", []),
"daily_increment": result_data.get("singleDayIncrements", []),
"weekly_increment": result_data.get("sevenDaysOfIncrements", [])
}
except Exception as e:
last_error = str(e)
if debug:
print(f" 错误: {type(e).__name__}: {str(e)[:100]}", file=sys.stderr)
import time
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
raise Exception(f"{last_error}(已尝试 {max_retries} 次)")
def get_cover_urls(data, max_per_category=5):
"""提取所有封面图URL"""
urls = []
categories = [
('low_fan_explosive', '低粉高赞'),
('daily_like_top500', '点赞最多'),
('daily_increment', '单日互动爆发'),
('weekly_increment', '7日持续增长')
]
for key, name in categories:
items = data.get(key, [])[:max_per_category]
for item in items:
cover_url = item.get('coverUrl', '')
photo_id = item.get('photoId', '')
title = item.get('title', '')[:20]
if cover_url and photo_id:
urls.append({
'category': name,
'title': title,
'photo_id': photo_id,
'cover_url': cover_url,
'link': f"https://www.xiaohongshu.com/explore/{photo_id}"
})
return urls
def format_output(data: dict, max_items: int = None, start_date: str = None):
"""
格式化输出热门数据(表格形式)
Args:
data: 原始数据
max_items: 每类爆款数据最多展示数量,None 表示展示所有数据
start_date: 开始日期,格式 yyyy-MM-dd,用于计算统计时间范围
"""
from datetime import datetime, timedelta
# 计算统计时间范围
def get_time_range(start_date):
if start_date:
try:
start = datetime.strptime(start_date, '%Y-%m-%d')
end = datetime.now()
days = (end - start).days
if days <= 1:
return "近1天"
elif days <= 7:
return f"近{days}天"
else:
return f"近{days}天"
except:
return "近30天"
return "近30天"
time_range = get_time_range(start_date)
def process_title(item):
"""处理标题:转义特殊字符,空标题使用desc替代"""
title = item.get('title', '')
# 如果标题为空,尝试使用 desc 字段
if not title or title.strip() == '':
desc = item.get('desc', '')
if desc:
# 移除 desc 中的换行符并截取前30个字符
title = desc.replace('\n', ' ').replace('\r', ' ').strip()[:30]
if len(desc) > 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] + "..."
return title
def format_time(item):
"""格式化发布时间为 X月X日"""
pub_time = item.get('publicTime', '')
if pub_time:
# publicTime 格式: "2026-03-06 13:03:56"
try:
month = int(pub_time[5:7])
day = int(pub_time[8:10])
return f"{month}月{day}日"
except:
pass
return '--'
def format_note_link(item):
"""生成作品链接"""
photo_id = item.get('photoId', '')
if photo_id:
return f"[查看详情](https://www.xiaohongshu.com/explore/{photo_id})"
return '--'
def get_latest_date(data):
"""获取数据中最新的发布日期"""
all_items = []
for key in ['low_fan_explosive', 'daily_like_top500', 'daily_increment', 'weekly_increment']:
all_items.extend(data.get(key, []))
latest_date = None
for item in all_items:
pub_time = item.get('publicTime', '')
if pub_time:
try:
date_str = pub_time[:10] # 取 "YYYY-MM-DD" 部分
if latest_date is None or date_str > latest_date:
latest_date = date_str
except:
pass
return latest_date
output = []
# 检查数据日期
latest_date = get_latest_date(data)
# 按 photoId 去重(API 返回数据可能有重复)
def dedup_items(items):
seen = set()
result = []
for item in items:
photo_id = item.get('photoId', '')
if photo_id and photo_id not in seen:
seen.add(photo_id)
result.append(item)
return result
# 检查是否有任何数据
low_fan_items = dedup_items(data.get("low_fan_explosive", []))
daily_like_items = dedup_items(data.get("daily_like_top500", []))
daily_increment_items = dedup_items(data.get("daily_increment", []))
weekly_increment_items = dedup_items(data.get("weekly_increment", []))
total_count = len(low_fan_items) + len(daily_like_items) + len(daily_increment_items) + len(weekly_increment_items)
# 如果所有类型都没有数据,输出友好提示
if total_count == 0:
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n")
output.append("---\n\n")
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)
# 1. 低粉高赞
items = low_fan_items
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **低粉高赞**(粉丝<5000的博主中点赞最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 封面 | 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **互动总数** |")
output.append("|------|------|----------|------|------|------|------|------|------|-------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 封面缩略图
cover_url = item.get('coverUrl', '')
if cover_url:
cover_str = f""
else:
cover_str = "--"
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
output.append(f"| {cover_str} | {idx} | {pub_time} | {title_with_link} | {author_str} | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} | {item.get('useLikeCount', 0)} | **{item.get('interactiveCount', 0)}** |")
# 2. 点赞最多
items = data.get("daily_like_top500", [])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **点赞最多**(统计时间内点赞数最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 封面 | 序号 | 发布时间 | 标题 | 作者 | **点赞** | 收藏 | 分享 | 评论 | 互动总数 |")
output.append("|------|------|----------|------|------|--------|------|------|------|------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 封面缩略图
cover_url = item.get('coverUrl', '')
if cover_url:
cover_str = f""
else:
cover_str = "--"
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
output.append(f"| {cover_str} | {idx} | {pub_time} | {title_with_link} | {author_str} | **{item.get('useLikeCount', 0)}** | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} | {item.get('interactiveCount', 0)} |")
# 3. 单日互动爆发
items = data.get("daily_increment", [])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **单日互动爆发**(当天互动量增长最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 封面 | 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |")
output.append("|------|------|----------|------|------|------|------|------|------|------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 封面缩略图
cover_url = item.get('coverUrl', '')
if cover_url:
cover_str = f""
else:
cover_str = "--"
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
# 从 anaAdd 对象获取新增互动数据
ana_add = item.get('anaAdd', {})
if ana_add:
total = ana_add.get('addInteractiveount', 0)
collected = ana_add.get('addCollectedCunt', 0)
share = ana_add.get('addShareCount', 0)
comment = ana_add.get('addCommentCount', 0)
like = ana_add.get('addLikeCount', 0)
else:
total = 0
collected = 0
share = 0
comment = 0
like = 0
output.append(f"| {cover_str} | {idx} | {pub_time} | {title_with_link} | {author_str} | {collected} | {share} | {comment} | {like} | **{total}** |")
# 4. 7日持续增长
items = data.get("weekly_increment", [])
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **7日持续增长**(近7天互动量持续增长最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 封面 | 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |")
output.append("|------|------|----------|------|------|------|------|------|------|------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 封面缩略图
cover_url = item.get('coverUrl', '')
if cover_url:
cover_str = f""
else:
cover_str = "--"
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
# 从 anaAdd 对象获取新增互动数据
ana_add = item.get('anaAdd', {})
if ana_add:
total = ana_add.get('addInteractiveount', 0)
collected = ana_add.get('addCollectedCunt', 0)
share = ana_add.get('addShareCount', 0)
comment = ana_add.get('addCommentCount', 0)
like = ana_add.get('addLikeCount', 0)
else:
total = 0
collected = 0
share = 0
comment = 0
like = 0
output.append(f"| {cover_str} | {idx} | {pub_time} | {title_with_link} | {author_str} | {collected} | {share} | {comment} | {like} | **{total}** |")
return "\n".join(output)
def main():
"""主函数"""
parser = argparse.ArgumentParser(description='小红书热门数据查询工具')
parser.add_argument('--keyword', required=True, help='搜索关键词')
parser.add_argument('--max-items', type=int, default=10,
help='每类爆款内容最多展示数量(默认10条)')
parser.add_argument('--output-format', choices=['text', 'json', 'markdown'],
default='json', help='输出格式:text(文本表格)、json(JSON格式,默认)或 markdown(Markdown格式)')
parser.add_argument('--output-file', type=str, default=None,
help='输出文件路径(默认:关键词_爆款数据.md)')
parser.add_argument('--start-date', type=str, default=None,
help='开始日期,格式 yyyy-MM-dd(默认最近30天)')
parser.add_argument('--debug', action='store_true', help='启用调试模式')
parser.add_argument('--max-retries', type=int, default=3,
help='最大重试次数(默认3次)')
args = parser.parse_args()
try:
data = fetch_xhs_trends(args.keyword, debug=args.debug, max_retries=args.max_retries, start_date=args.start_date)
# 生成输出内容
if args.output_format == 'json':
output_content = json.dumps(data, ensure_ascii=False, indent=2)
elif args.output_format == 'markdown':
# Markdown 格式添加标题
markdown_header = f"# 小红书爆款数据分析报告\n\n**关键词**:{args.keyword}\n\n"
output_content = markdown_header + format_output(data, max_items=args.max_items, start_date=args.start_date)
else:
output_content = format_output(data, max_items=args.max_items, start_date=args.start_date)
# 确定输出文件路径(默认不输出文件,只输出到控制台)
output_file = args.output_file
# 输出到文件或控制台
if output_file:
with open(output_file, 'w', encoding='utf-8') as f:
f.write(output_content)
print(f"✓ 结果已保存到: {output_file}", file=sys.stderr)
print(f"✓ 关键词: {args.keyword}", file=sys.stderr)
# 统计数据
total_items = (
len(data.get('low_fan_explosive', [])) +
len(data.get('daily_like_top500', [])) +
len(data.get('daily_increment', [])) +
len(data.get('weekly_increment', []))
)
print(f"✓ 总计: {total_items} 条数据", file=sys.stderr)
# 显示每类数据量
print(f" - 低粉高赞: {len(data.get('low_fan_explosive', []))} 条", file=sys.stderr)
print(f" - 点赞最多: {len(data.get('daily_like_top500', []))} 条", file=sys.stderr)
print(f" - 单日互动爆发: {len(data.get('daily_increment', []))} 条", file=sys.stderr)
print(f" - 7日持续增长: {len(data.get('weekly_increment', []))} 条", file=sys.stderr)
# 输出封面图URL供后续分析
cover_urls = get_cover_urls(data, max_per_category=3)
if cover_urls:
print(f"\n=== 封面图URL(用于风格分析)===", file=sys.stderr)
for i, item in enumerate(cover_urls, 1):
print(f"{i}. [{item['category']}] {item['title']}: {item['cover_url']}", file=sys.stderr)
else:
print(output_content)
# 统计数据输出到 stderr
print(f"\n✓ 关键词: {args.keyword}", file=sys.stderr)
except Exception as e:
print(f"❌ 错误: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
FILE:references/core_workflow.md
**核心优势**:
- 自动解析用户文案意图,提取关键信息
- 获取目标领域真实爆款封面图,通过AI分析总结风格特征
- 结合用户需求与爆款数据,生成可落地的设计方案(含案例+生图提示词)
## ⚠️ 触发规则
**以下情况才执行任务流程**:
- 用户提供了具体的内容主题或赛道(如"帮我设计美妆教程封面"、"职场穿搭封面怎么设计")
- 用户明确要求生成封面方案
- 用户上传了文案或图片要求分析
**以下情况只介绍技能,不执行任务**:
- 用户询问"这个技能能做什么"、"怎么用"
- 用户只是了解功能,未提出具体需求
- 用户未提供明确的创作主题或方向
## ⚠️ 术语规范(强制执行)
**本技能统一使用"爆款封面"这一术语,禁止使用以下词汇**:
| ❌ 禁止使用 | ✅ 正确表述 |
|------------|------------|
| 爆炸封面 | 爆款封面 |
| 爆炸数据 | 爆款数据 |
| 抓取数据 | 获取/查询数据 |
| 抓取封面 | 获取封面 |
**⚠️ 强制要求**:在执行过程中,所有对外输出的文字必须使用"爆款封面"相关表述,包括但不限于:
- 标题、段落、步骤说明
- 对话回复
- 生成的分析报告
- 生成的提示词
## 前置准备
- 依赖:`requests>=2.28.0`
## 重要数据说明
- 数据库仅包含昨天至30天前的数据
- 默认时间范围为最近30天
## 操作流程
### 步骤1:用户意图解析(必须执行)
**核心任务**:结构化解析用户需求,提取关键信息
**解析维度**:
| 维度 | 说明 | 示例 |
|------|------|------|
| 内容主题 | 优先领域词 | 护肤、穿搭、美食、职场 |
| 内容类型 | 内容形式 | 干货、测评、种草、教程 |
| 风格偏好 | 视觉/调性 | 专业、吸引点击、情绪、极简 |
| 核心关键词 | 搜索关键词 | 秋冬、美白、护肤、干皮 |
**解析示例**:
用户输入:`秋冬美白护肤心得,干货满满、看起来很专业`
解析结果:
```
内容主题:美白护肤、护肤
内容类型:干货
风格偏好:专业、干货
核心关键词:秋冬、美白、护肤
```
**关键词提取规则**:
- 提取2-5个核心关键词,用逗号分隔
- 优先提取细分领域词(如"美白护肤"而非"护肤")
- 结合风格偏好补充场景词(如"专业"、"干货")
---
### 步骤2:爆款数据查询
**执行命令**:
- 有赛道关键词:`python scripts/fetch_explosive_covers.py --keyword <关键词1,关键词2,关键词3>`
- 无赛道关键词:`python scripts/fetch_explosive_covers.py --keyword ""`
**重要说明**:
- 接口支持多个关键词,用逗号分隔(如:`职场穿搭,通勤穿搭,面试穿搭`)
- 最多5个关键词,总长度不超过200字符
- **默认查询近30天数据**,无需计算 startDate
**时间范围**:
- 用户未指定时间 → 默认近30天(不传 startDate 参数)
- 用户指定"近N天" → 计算 startDate = 今天 - (N-1)天
---
### 步骤3:智能匹配筛选(必须执行)
**⚠️ 重要:脚本返回数据后,必须进行智能匹配筛选,返回20条最相关数据**
**筛选流程**:
1. **合并候选池**:将四类数据(低粉高赞、点赞最多、单日互动爆发、7日持续增长)合并为一个候选池
2. **综合评分维度**(按优先级排序):
| 评分维度 | 权重 | 评分标准 |
|----------|------|----------|
| 意图匹配度 | 最高 | 是否直接回应用户需求、是否属于目标场景 |
| 内容相关性 | 高 | 标题关键词匹配、正文围绕主题、标签精准 |
| 数据表现 | 中 | 点赞/收藏/评论/分享/互动总数 |
| 内容质量 | 中 | 标题清晰有吸引力、内容具体有信息量 |
3. **评分公式**:
```
综合得分 = 意图匹配度(40%) + 内容相关性(30%) + 数据表现(20%) + 内容质量(10%)
```
4. **筛选规则**:
- 按综合得分从高到低排序
- 选取前20条数据用于封面图分析
- 优先保证强相关内容,高互动内容不能压过相关性
---
### 步骤4:AI批量图像分析与特征提取(强制执行)
**⚠️ 重要:此步骤必须执行,不可跳过!**
**执行流程**:
1. **解析脚本返回的JSON数据**:脚本返回包含以下字段的JSON数据:
```json
{
"keyword": "关键词",
"low_fan_explosive": [...],
"daily_like_top500": [...],
"daily_increment": [...],
"weekly_increment": [...]
}
```
2. **提取封面图URL**:从每条数据中提取 `coverUrl` 字段,合并为封面候选池
- **⚠️ 重要**:直接使用接口返回的原始 `coverUrl`,不要修改或转换URL地址
3. **按互动量排序筛选**:从高到低选取前20条数据(优先选取总互动量高的笔记)
4. **批量图像识别分析**:主动调用原生图片理解能力,直接访问封面URL进行图片分析
- **逐张访问封面图URL**:使用原生图片理解能力,访问每张coverUrl
- 识别封面文字:标题文案、副标题、标签文字等
- 理解场景描述:室内/室外、生活场景、工作场景等
- 识别主要物体:人物、产品、道具、装饰元素等
- 分析色调风格、构图特点、视觉元素
- **每张封面必须单独分析,记录完整的图片内容描述**
3. **分类汇总**:将相似风格的封面归为同一类,统计特征规律
### 步骤5:输出爆款封面风格总结表
**⚠️ 封面示例必须展示真实图片!**
将相似风格的封面归为同一类,输出风格总结表:
## 📊 爆款封面分析报告
**[风格类型1]** 出现频次:X/20
**⚠️重要**: 封面示例必须展示该分类下的所有图片,横向排列,每张图片使用小尺寸缩略图
**封面示例**(横向排列,使用真实coverUrl):
| 封面1 | 封面2 | 封面3 | 封面4 | 封面5 |
|:---:|:---:|:---:|:---:|:---:|
|  |  |  |  |  |
| 封面6 | 封面7 | 封面8 | ... | |
|:---:|:---:|:---:|:---:|:---:|
|  |  |  | ... | |
(每行最多5张,超出则换行继续展示,直到展示完该分类下所有封面图)
**核心视觉**:[一句话风格描述]
**关键特征**:[色调、构图、排版等核心特征]
**分析数量**:只分析20张封面,按互动量从高到低筛选
**格式说明**:
- 封面示例:使用表格横向排列缩略图,每行最多5张,超出换行继续展示
- coverUrl:从JSON数据中提取的原始 `coverUrl` 字段,不要修改URL地址
- 核心视觉:一句话风格描述
- 关键特征:色调、构图、排版等核心特征
- 出现频次:该风格在样本中的出现次数
---
### 步骤6:生成定制化封面方案
**结合用户需求与爆款风格特征,输出三种风格方案**:
## 🎯 封面设计方案
- 格式:竖版封面图,适合手机屏幕浏览
- 所有生图提示词必须包含比例要求
---
### 方案一:[风格名称]
**核心视觉**:[一句话风格描述]
**案例参考**:
| 封面 | 标题 | 作者 | 互动数据 |
|------|------|------|----------|
|  | [真实标题](笔记链接) | [真实作者](主页链接) | 点赞:X | 收藏:X | 评论:X |
**生图提示词**:
```
小红书封面图,3:4竖版比例(1080x1440像素)。参考封面:{coverUrl}。[风格描述]。[色调]。[构图]。[文字排版]。[具体元素描述]。
```
---
### 方案二:[风格名称]
**核心视觉**:[一句话风格描述]
**案例参考**:
| 封面 | 标题 | 作者 | 互动数据 |
|------|------|------|----------|
|  | [真实标题](笔记链接) | [真实作者](主页链接) | 点赞:X | 收藏:X | 评论:X |
**生图提示词**:
```
小红书封面图,3:4竖版比例(1080x1440像素)。参考封面:{coverUrl}。[风格描述]。[色调]。[构图]。[文字排版]。[具体元素描述]。
```
---
### 方案三:[风格名称]
**核心视觉**:[一句话风格描述]
**案例参考**:
| 封面 | 标题 | 作者 | 互动数据 |
|------|------|------|----------|
|  | [真实标题](笔记链接) | [真实作者](主页链接) | 点赞:X | 收藏:X | 评论:X |
**生图提示词**:
```
小红书封面图,3:4竖版比例(1080x1440像素)。参考封面:{coverUrl}。[风格描述]。[色调]。[构图]。[文字排版]。[具体元素描述]。
```
---
## 注意事项
- 不展示原始数据表格,只展示分析后的爆款风格总结
- 封面图使用接口返回的 `coverUrl` 字段,⚠️ 必须填入真实的 coverUrl
- 案例参考表格中的封面列必须展示实际图片
- 每个方案展示该风格下最具代表性的1个案例
- 图像识别使用 `read_image` 工具批量分析
- 方案卡片需包含:标题链接、作者链接、互动数据
---
### 步骤7:输出前自检【必须执行】
**⚠️ 重要:输出前必须逐项检查以下内容是否完整**
**自检清单**:
| 检查项 | 要求 | 状态 |
|--------|------|------|
| 风格类型总结 | 是否输出完整的风格类型总结表(含风格类型、封面示例、核心视觉、关键特征) | ☐ |
| 封面示例 | 是否展示该分类下所有封面图(每行5张,超出换行) | ☐ |
| 三种封面设计方案 | 是否输出三种不同风格的封面方案 | ☐ |
| 案例参考 | 每个方案是否包含真实的coverUrl、标题链接、作者链接、互动数据 | ☐ |
| 生图提示词 | 每个方案是否包含3:4竖版比例要求及参考封面coverUrl | ☐ |
| 用户交互 | 是否询问用户是否上传自己的图片并结合方案生成 | ☐ |
**输出结尾必须包含**:
```
---
💡 **下一步建议**:您可以上传自己的图片,我将结合以上爆款封面方案为您生成专属封面设计。
```
FILE:references/xhs_trend_data_format.md
# 小红书热门数据格式说明
## 概览
本文档定义了小红书热门数据查询脚本 `fetch_xhs_trends.py` 的输入输出格式规范。
## 输入格式
### 脚本参数
```bash
python scripts/fetch_xhs_trends.py --keyword <关键词> [选项]
```
| 参数 | 必填 | 说明 | 默认值 |
|------|------|------|--------|
| `--keyword` | 是 | 搜索关键词(支持多个关键词,逗号分隔,最多5个,总长度不超过200字符) | - |
| `--start-date` | 否 | 开始日期,格式 yyyy-MM-dd | 最近30天 |
| `--max-items` | 否 | 每类内容最多展示数量 | 10 |
| `--output-format` | 否 | 输出格式:text、json 或 markdown | markdown |
| `--output-file` | 否 | 输出文件路径 | 关键词_爆款数据.md |
| `--debug` | 否 | 调试模式,打印原始API响应 | False |
## 输出格式
### 四类爆款内容
脚本返回**近30天**的小红书热门数据,包含以下四类爆款内容:
| 内容类型 |适用场景 |
|---------|---------|
| **新手友好爆款** | 适合模仿学习,发现低成本爆款 |
| **当日点赞爆款** | 了解当前最热门内容 |
| **爆发增长内容** | 发现快速增长的内容 |
| **持续增长内容** | 发现持续增长的内容 |
### 作品数据字段(完整)
每个作品包含以下字段:
#### 作品基本信息
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `photoId` | string | 作品ID(唯一标识) |
| `title` | string | 作品标题 |
| `desc` | string | 作品描述/正文 |
| `publicTime` | string | 发布时间(格式:YYYY-MM-DD HH:MM:SS) |
#### 作者信息
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `userId` | string | 作者ID |
| `userName` | string | 作者名称 |
| `userHeadUrl` | string | 作者头像URL |
| `fans` | int | 粉丝数 |
**作者主页链接拼接规则**:
```
https://www.xiaohongshu.com/user/profile/{userId}
```
#### 互动数据(非增量类)
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `useLikeCount` | int | 点赞数 |
| `collectedCount` | int | 收藏数 |
| `useCommentCount` | int | 评论数 |
| `useShareCount` | int | 分享数 |
| `interactiveCount` | int | 互动总数 |
#### 互动数据(增量类)
增量类(单日增量、七日增量)的数据在 `anaAdd` 对象中:
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `anaAdd.addLikeCount` | int | 新增点赞数 |
| `anaAdd.addCollectedCunt` | int | 新增收藏数(注意:API字段名有拼写错误) |
| `anaAdd.addCommentCount` | int | 新增评论数 |
| `anaAdd.addShareCount` | int | 新增分享数 |
| `anaAdd.addInteractiveount` | int | 新增互动总数(注意:API字段名有拼写错误) |
| `anaAdd.useLikeCount` | int | 总点赞数 |
| `anaAdd.collectedCount` | int | 总收藏数 |
| `anaAdd.useCommentCount` | int | 总评论数 |
| `anaAdd.useShareCount` | int | 总分享数 |
| `anaAdd.interactiveCount` | int | 总互动数 |
| `anaAdd.pred_readnum` | int | 预测阅读数 |
#### 图片链接
| 字段名 | 类型 | 说明 |
|--------|------|------|
| `coverUrl` | string | 封面图URL |
| `thumbnail` | string | 缩略图URL |
### JSON 输出示例
```json
{
"keyword": "高考",
"low_fan_explosive": [
{
"photoId": "69aa603c0000000015021b18",
"title": "对于26高考女宝们的选大学建议",
"desc": "一定要选人文关怀好以及男女平等的大学...",
"publicTime": "2026-03-06 13:03:56",
"userId": "68ebaae60000000037006191",
"userName": "Alley",
"userHeadUrl": "https://sns-avatar-qc.xhscdn.com/...",
"fans": 2,
"useLikeCount": 23439,
"collectedCount": 15610,
"useCommentCount": 846,
"useShareCount": 697,
"interactiveCount": 39895,
"coverUrl": "http://sns-img-hw.xhscdn.com/...",
"thumbnail": "http://sns-img-hw.xhscdn.com/..."
}
],
"daily_like_top": [...],
"daily_increment": [
{
"photoId": "...",
"title": "...",
"anaAdd": {
"addLikeCount": 12345,
"addCollectedCunt": 2345,
"addCommentCount": 567,
"addShareCount": 89,
"addInteractiveount": 15346,
"useLikeCount": 50000,
"collectedCount": 10000,
"useCommentCount": 2000,
"useShareCount": 500,
"interactiveCount": 62500,
"pred_readnum": 800000
}
}
],
"weekly_increment": [...]
}
```
### 文本输出格式(表格形式)
文本输出采用 Markdown 表格格式,结构清晰,便于阅读:
```markdown
## 1、新手友好爆款
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |
|------|------|------|----------|------|------|------|------|----------|
| 1 | 对于26高考女宝们的选大学建议 | [Alley](https://www.xiaohongshu.com/user/profile/68ebaae60000000037006191)(粉丝:2) | 教育 / 大学教育 | 15610 | 697 | 846 | 23439 | 39895 |
| 2 | 查出来个高考状元 | [泽陈泽陈](https://www.xiaohongshu.com/user/profile/684c0a9d000000001d00b1a1)(粉丝:4279) | 教育 / 中学教育 | 2860 | 221 | 44 | 23617 | 26521 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... | ... |
## 2、当日点赞爆款
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 收藏 | 分享 | 评论 | 点赞 |
|------|------|------|----------|------|------|------|------|
| 1 | 被1w人看过的地理书x厦门日光岩 | [深海里遇见你](https://www.xiaohongshu.com/user/profile/634a71b8000000001802d092)(粉丝:7404) | 教育 / 中学教育 | 57637 | 14733 | 2818 | 460237 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... |
## 3、爆发增长内容
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 新增收藏 | 新增分享 | 新增评论 | 新增点赞 | 互动增量 |
|------|------|------|----------|----------|----------|----------|----------|----------|
| 1 | 今年春晚预测的中高考考点❗ | [北大旺仔](https://www.xiaohongshu.com/user/profile/5de3e57c00000000010055f8)(粉丝:179984) | 教育 / 中学教育 | 14639 | 1485 | 102 | 19257 | 33998 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... | ... |
## 4、持续增长内容
统计时间:近30天
| 序号 | 标题 | 作者 | 作品分类 | 新增收藏 | 新增分享 | 新增评论 | 新增点赞 | 互动增量 |
|------|------|------|----------|----------|----------|----------|----------|----------|
| 1 | 高考文言文词类活用-活用作状语 友好版! | [我是摆子](https://www.xiaohongshu.com/user/profile/5d99de820000000001000015)(粉丝:52197) | 教育 / 中学教育 | 29937 | 1162 | 150 | 75196 | 105283 |
...
| 10 | ... | ... | ... | ... | ... | ... | ... | ... |
```
### 表格字段说明
#### 新手友好爆款
| 列名 | 说明 |
|------|------|
| 序号 | 排名|
| 标题 | 作品标题|
| 作者 | 作者名称(可点击跳转)+ 粉丝数 |
| 收藏 | 收藏数 |
| 分享 | 分享数 |
| 评论 | 评论数 |
| 点赞 | 点赞数 |
| 互动总数 | 互动总数 |
#### 当日点赞爆款
| 列名 | 说明 |
|------|------|
| 序号 | 排名|
| 标题 | 作品标题|
| 作者 | 作者名称(可点击跳转)+ 粉丝数 |
| 收藏 | 收藏数 |
| 分享 | 分享数 |
| 评论 | 评论数 |
| 点赞 | 点赞数 |
#### 增长内容
| 列名 | 说明 |
|------|------|
| 序号 | 排名 |
| 标题 | 作品标题 |
| 作者 | 作者名称(可点击跳转)+ 粉丝数 |
| 新增收藏 | 新增收藏数 |
| 新增分享 | 新增分享数 |
| 新增评论 | 新增评论数 |
| 新增点赞 | 新增点赞数 |
| 互动增量 | 互动增量总数 |
## 使用注意事项
### 数据获取原则
1. **必须调用脚本查询**:不能使用其他方式查询或直接搜索网络资讯
2. **必须等待脚本执行完成**:获取返回结果后才能进行后续步骤
3. **必须展示完整数据列表**:不能跳过或询问用户
### 数据展示原则
1. **展示所有字段**:每个作品展示完整信息,包括封面图、作者链接、分类、互动数据等
2. **四类爆款内容全部展示**:
### 字段说明
1. **增量内容的 anaAdd 字段**:仅爆发增长和持续增长内容包含此字段
2. **API字段拼写错误**:`addCollectedCunt` 和 `addInteractiveount` 是 API 的原始拼写,保持不变
3. **封面图和缩略图**:通常相同,但有时缩略图分辨率更低
基于用户输入的任何信息生成小红书爆款标题的专业工具。无论用户输入什么,最终目标都是生成小红书爆款标题。任务只在主agent执行,不在子agent执行。
---
name: xhs-explosive-content-suite
description: 基于用户输入的任何信息生成小红书爆款标题的专业工具。无论用户输入什么,最终目标都是生成小红书爆款标题。任务只在主agent执行,不在子agent执行。
dependency:
python:
- requests>=2.28.0
system:
---
# 小红书爆款标题生成器
触发本技能并需要执行完整流程时,**必须先读取**与本技能同目录下的 `references/core_workflow.md`,并**完整遵循**其中的触发规则、术语规范、数据来源约束、完整操作步骤、自检清单与注意事项。脚本路径相对于技能目录:`scripts/fetch_xhs_trends.py`。
FILE:美式咖啡_爆款数据.md
# 小红书爆款数据分析报告
**关键词**:美式咖啡
### - **低粉高赞**(粉丝<5000的博主中点赞最多的内容)
(无数据)
### - **点赞最多**(统计时间内点赞数最多的内容)
(无数据)
### - **单日互动爆发**(当天互动量增长最多的内容)
| 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |
|------|----------|------|------|------|------|------|------|------------|
| 1 | 3月17日 | [咖啡店新品美式相关热点(标题已脱敏)](https://www.xiaohongshu.com/explore/69b8b1aa00000000220036ec) | [闪电新闻](https://www.xiaohongshu.com/user/profile/5eb034a800000000010011d6)(粉丝:27w+) | 52 | 3269 | 405 | 536 | **993** |
### - **7日持续增长**(近7天互动量持续增长最多的内容)
(无数据)
FILE:scripts/fetch_xhs_trends.py
#!/usr/bin/env python3
"""
小红书热门数据查询脚本(HTTPS 传输兼容:支持 chunked、gzip 等常见编码)
"""
import sys
import argparse
import json
import socket
import ssl
import gzip
def decode_chunked(data):
"""解码 chunked 传输编码"""
chunks = []
idx = 0
while idx < len(data):
# 读取 chunk 大小
line_end = data.find(b'\r\n', idx)
if line_end == -1:
break
chunk_size_line = data[idx:line_end]
try:
chunk_size = int(chunk_size_line, 16)
except:
break
if chunk_size == 0:
break
# 读取 chunk 数据
chunk_start = line_end + 2
chunk_end = chunk_start + chunk_size
if chunk_end > len(data):
break
chunk = data[chunk_start:chunk_end]
chunks.append(chunk)
# 移动到下一个 chunk
idx = chunk_end + 2 # 跳过 \r\n
return b''.join(chunks)
def fetch_via_no_sni(base_url: str, params: dict, headers: dict, timeout: int = 60):
"""
使用原生 socket 实现 HTTPS 请求(TLS 握手不携带 SNI 扩展,以适配当前接口服务端的连接策略)。
说明:部分环境下服务端对 SNI 与证书校验组合较敏感;本实现按接口要求调整握手参数,不改变请求语义与数据用途。
"""
# 解析 URL
if "://" in base_url:
base_url = base_url.split("://", 1)[1]
host, path = base_url.split("/", 1)
# 构建 query string
if params:
from urllib.parse import quote
query = "&".join(f"{quote(str(k))}={quote(str(v))}" for k, v in params.items())
path = f"{path}?{query}"
# 创建 TCP 连接
sock = socket.create_connection((host, 443), timeout=timeout)
# 创建 SSL 上下文(wrap_socket 不传 server_hostname,与接口侧 TLS 策略匹配)
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.check_hostname = False
context.verify_mode = ssl.CERT_NONE
# 包装 socket(不传 server_hostname)
ssl_sock = context.wrap_socket(sock)
# 构建 HTTP 请求
request_lines = [
f"GET /{path} HTTP/1.1",
f"Host: {host}",
]
for k, v in headers.items():
request_lines.append(f"{k}: {v}")
request_lines.append("")
request_lines.append("")
request = "\r\n".join(request_lines)
# 发送请求
ssl_sock.send(request.encode())
# 接收响应
response_data = b""
while True:
try:
chunk = ssl_sock.recv(8192)
if not chunk:
break
response_data += chunk
except:
break
ssl_sock.close()
# 解析响应头
response_str = response_data.decode('utf-8', errors='ignore')
lines = response_str.split('\r\n')
# 提取状态码
status_code = int(lines[0].split()[1])
# 提取响应头
headers_dict = {}
for i, line in enumerate(lines[1:]):
if line == '':
break
if ':' in line:
key, value = line.split(':', 1)
headers_dict[key.strip().lower()] = value.strip()
# 分离头部和正文
header_end = response_data.find(b'\r\n\r\n')
if header_end != -1:
body_bytes = response_data[header_end + 4:]
else:
body_bytes = b""
# 处理 chunked 编码
if headers_dict.get('transfer-encoding', '').lower() == 'chunked':
body_bytes = decode_chunked(body_bytes)
# 处理 gzip 压缩
if headers_dict.get('content-encoding', '').lower() == 'gzip':
try:
body_bytes = gzip.decompress(body_bytes)
except:
pass
response_body = body_bytes.decode('utf-8', errors='ignore')
return status_code, response_body
def fetch_xhs_trends(keyword: str, debug: bool = False, max_retries: int = 3, start_date: str = None):
"""
调用新接口获取小红书热门数据
Args:
keyword: 搜索关键词(多个关键词用逗号分隔,最多5个,总长度不超过200)
debug: 是否打印调试信息
max_retries: 最大重试次数
start_date: 开始日期,格式 yyyy-MM-dd,最长为最近30天
Returns:
dict: 包含4类爆款数据
Raises:
Exception: 当API调用失败时抛出异常
"""
base_url = "https://onetotenvip.com/skill/cozeSkill/getXhsCozeSkillData"
params = {
"keyword": keyword,
"source": "小红书爆款标题创作-ClawlHub"
}
# 添加开始日期参数
if start_date:
params["startDate"] = start_date
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Accept": "application/json, text/plain, */*",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip, deflate, br",
"Connection": "close",
}
last_error = None
for attempt in range(max_retries):
try:
if debug:
print(f"\n=== DEBUG: 第 {attempt + 1} 次尝试 ===", file=sys.stderr)
status_code, body = fetch_via_no_sni(base_url, params, headers)
if debug:
print(f"状态码: {status_code}", file=sys.stderr)
print(f"响应长度: {len(body)} 字节", file=sys.stderr)
if status_code >= 400:
raise Exception(f"HTTP请求失败: 状态码 {status_code}")
data = json.loads(body)
if "data" not in data:
error_msg = data.get("msg", "未知错误")
raise Exception(f"API 错误: {error_msg}")
result_data = data.get("data", {})
if debug:
print("=== DEBUG: API 返回的 data 字段键 ===", file=sys.stderr)
print(json.dumps(list(result_data.keys()), ensure_ascii=False, indent=2), file=sys.stderr)
return {
"keyword": keyword,
"low_fan_explosive": result_data.get("lowPowderExplosiveArticle", []),
"daily_like_top500": result_data.get("likeTheTop500", []),
"daily_increment": result_data.get("singleDayIncrements", []),
"weekly_increment": result_data.get("sevenDaysOfIncrements", [])
}
except Exception as e:
last_error = str(e)
if debug:
print(f" 错误: {type(e).__name__}: {str(e)[:100]}", file=sys.stderr)
import time
if attempt < max_retries - 1:
time.sleep(2 ** attempt)
continue
raise Exception(f"{last_error}(已尝试 {max_retries} 次)")
def get_cover_urls(data, max_per_category=5):
"""提取所有封面图URL"""
urls = []
categories = [
('low_fan_explosive', '低粉高赞'),
('daily_like_top500', '点赞最多'),
('daily_increment', '单日互动爆发'),
('weekly_increment', '7日持续增长')
]
for key, name in categories:
items = data.get(key, [])[:max_per_category]
for item in items:
cover_url = item.get('coverUrl', '')
photo_id = item.get('photoId', '')
title = item.get('title', '')[:20]
if cover_url and photo_id:
urls.append({
'category': name,
'title': title,
'photo_id': photo_id,
'cover_url': cover_url,
'link': f"https://www.xiaohongshu.com/explore/{photo_id}"
})
return urls
def format_output(data: dict, max_items: int = None, start_date: str = None):
"""
格式化输出热门数据(表格形式)
Args:
data: 原始数据
max_items: 每类爆款数据最多展示数量,None 表示展示所有数据
start_date: 开始日期,格式 yyyy-MM-dd,用于计算统计时间范围
"""
from datetime import datetime, timedelta
# 计算统计时间范围
def get_time_range(start_date):
if start_date:
try:
start = datetime.strptime(start_date, '%Y-%m-%d')
end = datetime.now()
days = (end - start).days
if days <= 1:
return "近1天"
elif days <= 7:
return f"近{days}天"
else:
return f"近{days}天"
except:
return "近30天"
return "近30天"
time_range = get_time_range(start_date)
def process_title(item):
"""处理标题:转义特殊字符,空标题使用desc替代"""
title = item.get('title', '')
# 如果标题为空,尝试使用 desc 字段
if not title or title.strip() == '':
desc = item.get('desc', '')
if desc:
# 移除 desc 中的换行符并截取前30个字符
title = desc.replace('\n', ' ').replace('\r', ' ').strip()[:30]
if len(desc) > 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] + "..."
return title
def format_time(item):
"""格式化发布时间为 X月X日"""
pub_time = item.get('publicTime', '')
if pub_time:
# publicTime 格式: "2026-03-06 13:03:56"
try:
month = int(pub_time[5:7])
day = int(pub_time[8:10])
return f"{month}月{day}日"
except:
pass
return '--'
def format_note_link(item):
"""生成作品链接"""
photo_id = item.get('photoId', '')
if photo_id:
return f"[查看详情](https://www.xiaohongshu.com/explore/{photo_id})"
return '--'
def get_latest_date(data):
"""获取数据中最新的发布日期"""
all_items = []
for key in ['low_fan_explosive', 'daily_like_top500', 'daily_increment', 'weekly_increment']:
all_items.extend(data.get(key, []))
latest_date = None
for item in all_items:
pub_time = item.get('publicTime', '')
if pub_time:
try:
date_str = pub_time[:10] # 取 "YYYY-MM-DD" 部分
if latest_date is None or date_str > latest_date:
latest_date = date_str
except:
pass
return latest_date
output = []
# 检查数据日期
latest_date = get_latest_date(data)
# 按 photoId 去重(API 返回数据可能有重复)
def dedup_items(items):
seen = set()
result = []
for item in items:
photo_id = item.get('photoId', '')
if photo_id and photo_id not in seen:
seen.add(photo_id)
result.append(item)
return result
# 按时间倒序排序
def sort_by_time_desc(items):
"""按发布时间倒序排列"""
def get_time_key(item):
pub_time = item.get('publicTime', '')
if pub_time:
return pub_time
return '0'
return sorted(items, key=get_time_key, reverse=True)
# 检查是否有任何数据
low_fan_items = dedup_items(data.get("low_fan_explosive", []))
daily_like_items = dedup_items(data.get("daily_like_top500", []))
daily_increment_items = dedup_items(data.get("daily_increment", []))
weekly_increment_items = dedup_items(data.get("weekly_increment", []))
total_count = len(low_fan_items) + len(daily_like_items) + len(daily_increment_items) + len(weekly_increment_items)
# 如果所有类型都没有数据,输出友好提示
if total_count == 0:
keyword = data.get("keyword", "")
output.append(f"# 小红书爆款数据分析报告\n\n**关键词**:{keyword}\n\n")
output.append("---\n\n")
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)
# 1. 低粉高赞
items = sort_by_time_desc(low_fan_items)
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **低粉高赞**(粉丝<5000的博主中点赞最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | **互动总数** |")
output.append("|------|----------|------|------|------|------|------|------|-------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
output.append(f"| {idx} | {pub_time} | {title_with_link} | {author_str} | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} | {item.get('useLikeCount', 0)} | **{item.get('interactiveCount', 0)}** |")
# 2. 点赞最多
items = sort_by_time_desc(data.get("daily_like_top500", []))
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **点赞最多**(统计时间内点赞数最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 发布时间 | 标题 | 作者 | **点赞** | 收藏 | 分享 | 评论 | 互动总数 |")
output.append("|------|----------|------|------|--------|------|------|------|------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 封面图
cover_url = item.get('coverUrl', '')
if cover_url:
cover_str = f"[查看封面]({cover_url})"
else:
cover_str = "--"
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
output.append(f"| {idx} | {pub_time} | {title_with_link} | {author_str} | **{item.get('useLikeCount', 0)}** | {item.get('collectedCount', 0)} | {item.get('useShareCount', 0)} | {item.get('useCommentCount', 0)} | {item.get('interactiveCount', 0)} |")
# 3. 单日互动爆发
items = sort_by_time_desc(data.get("daily_increment", []))
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **单日互动爆发**(当天互动量增长最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |")
output.append("|------|----------|------|------|------|------|------|------|------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
# 从 anaAdd 对象获取新增互动数据
ana_add = item.get('anaAdd', {})
if ana_add:
total = ana_add.get('addInteractiveount', 0)
collected = ana_add.get('addCollectedCunt', 0)
share = ana_add.get('addShareCount', 0)
comment = ana_add.get('addCommentCount', 0)
like = ana_add.get('addLikeCount', 0)
else:
total = 0
collected = 0
share = 0
comment = 0
like = 0
output.append(f"| {idx} | {pub_time} | {title_with_link} | {author_str} | {collected} | {share} | {comment} | {like} | **{total}** |")
# 4. 7日持续增长
items = sort_by_time_desc(data.get("weekly_increment", []))
if max_items is not None:
items = items[:max_items]
output.append(f"\n### - **7日持续增长**(近7天互动量持续增长最多的内容)")
output.append("\n")
if not items:
output.append("(无数据)\n")
else:
output.append("| 序号 | 发布时间 | 标题 | 作者 | 收藏 | 分享 | 评论 | 点赞 | 互动总数 |")
output.append("|------|----------|------|------|------|------|------|------|------------|")
for idx, item in enumerate(items, 1):
user_id = item.get('userId', '')
user_name = item.get('userName', '未知')
fans = item.get('fans', 0)
# 作者信息添加主页链接
if user_id:
author_str = f"[{user_name}](https://www.xiaohongshu.com/user/profile/{user_id})(粉丝:{fans})"
else:
author_str = f"{user_name}(粉丝:{fans})"
title = process_title(item)
pub_time = format_time(item)
# 标题添加作品链接
photo_id = item.get('photoId', '')
if photo_id:
note_link = f"https://www.xiaohongshu.com/explore/{photo_id}"
title_with_link = f"[{title}]({note_link})"
else:
title_with_link = title
# 从 anaAdd 对象获取新增互动数据
ana_add = item.get('anaAdd', {})
if ana_add:
total = ana_add.get('addInteractiveount', 0)
collected = ana_add.get('addCollectedCunt', 0)
share = ana_add.get('addShareCount', 0)
comment = ana_add.get('addCommentCount', 0)
like = ana_add.get('addLikeCount', 0)
else:
total = 0
collected = 0
share = 0
comment = 0
like = 0
output.append(f"| {idx} | {pub_time} | {title_with_link} | {author_str} | {collected} | {share} | {comment} | {like} | **{total}** |")
return "\n".join(output)
def main():
"""主函数"""
parser = argparse.ArgumentParser(description='小红书热门数据查询工具')
parser.add_argument('--keyword', required=True, help='搜索关键词')
parser.add_argument('--max-items', type=int, default=10,
help='每类爆款内容最多展示数量(默认10条)')
parser.add_argument('--output-format', choices=['text', 'json', 'markdown'],
default='markdown', help='输出格式:text(文本表格)、json(JSON格式)或 markdown(Markdown格式,默认)')
parser.add_argument('--output-file', type=str, default=None,
help='输出文件路径(默认:关键词_爆款数据.md)')
parser.add_argument('--start-date', type=str, default=None,
help='开始日期,格式 yyyy-MM-dd(默认最近30天)')
parser.add_argument('--debug', action='store_true', help='启用调试模式')
parser.add_argument('--max-retries', type=int, default=3,
help='最大重试次数(默认3次)')
args = parser.parse_args()
try:
data = fetch_xhs_trends(args.keyword, debug=args.debug, max_retries=args.max_retries, start_date=args.start_date)
# 生成输出内容
if args.output_format == 'json':
output_content = json.dumps(data, ensure_ascii=False, indent=2)
elif args.output_format == 'markdown':
# Markdown 格式添加标题
markdown_header = f"# 小红书爆款数据分析报告\n\n**关键词**:{args.keyword}\n\n"
output_content = markdown_header + format_output(data, max_items=args.max_items, start_date=args.start_date)
else:
output_content = format_output(data, max_items=args.max_items, start_date=args.start_date)
# 确定输出文件路径(markdown 格式默认输出到文件)
output_file = args.output_file
if output_file is None and args.output_format == 'markdown':
# 默认文件名:关键词_爆款数据.md
output_file = f"{args.keyword}_爆款数据.md"
# 输出到文件或控制台
if output_file:
with open(output_file, 'w', encoding='utf-8') as f:
f.write(output_content)
print(f"✓ 结果已保存到: {output_file}", file=sys.stderr)
print(f"✓ 关键词: {args.keyword}", file=sys.stderr)
# 统计数据
total_items = (
len(data.get('low_fan_explosive', [])) +
len(data.get('daily_like_top500', [])) +
len(data.get('daily_increment', [])) +
len(data.get('weekly_increment', []))
)
print(f"✓ 总计: {total_items} 条数据", file=sys.stderr)
# 显示每类数据量
print(f" - 低粉高赞: {len(data.get('low_fan_explosive', []))} 条", file=sys.stderr)
print(f" - 点赞最多: {len(data.get('daily_like_top500', []))} 条", file=sys.stderr)
print(f" - 单日互动爆发: {len(data.get('daily_increment', []))} 条", file=sys.stderr)
print(f" - 7日持续增长: {len(data.get('weekly_increment', []))} 条", file=sys.stderr)
# 输出封面图URL供后续分析
cover_urls = get_cover_urls(data, max_per_category=3)
if cover_urls:
print(f"\n=== 封面图URL(用于风格分析)===", file=sys.stderr)
for i, item in enumerate(cover_urls, 1):
print(f"{i}. [{item['category']}] {item['title']}: {item['cover_url']}", file=sys.stderr)
else:
print(output_content)
except Exception as e:
print(f"❌ 错误: {str(e)}", file=sys.stderr)
sys.exit(1)
if __name__ == "__main__":
main()
FILE:references/core_workflow.md
## 🔴 最高优先级指令(必须100%遵守)
### 用户输入的任何信息都是想基于输入的内容生成"小红书爆款标题"——这是前提且必要逻辑。
**无论用户输入什么,最终目标都是生成小红书爆款标题。**
**示例场景理解**:
- 用户输入:"我想写关于护肤的内容" → 目标:基于"护肤"生成小红书爆款标题
- 用户输入:"上班族早餐" → 目标:基于"上班族早餐"生成小红书爆款标题
- 用户输入:"想分享一些旅行心得" → 目标:基于"旅行心得"生成小红书爆款标题
- 用户输入:"帮我看看最近有什么热门" → 目标:基于全站热门内容生成小红书爆款标题
- 用户输入:任何内容 → 目标:基于用户输入的内容生成小红书爆款标题
---
### 🔴 绝对执行顺序(必须严格遵守)
**在第五步"分析爆款标题并生成新标题"中,必须严格按以下顺序执行:**
1. **先执行"分析爆款标题"**
2. **再执行"生成新爆款标题"**
**顺序绝对不能颠倒!没有分析就不能生成标题!**
---
### 🔴 数据查询规则(必须严格遵守)
**数据不足时的自动调整中,必须优先扩展时间,绝对禁止换词!**
**处理原则(最高优先级)**:
- 数据不足5条时,**只能扩展时间范围,绝对不能更换或拓展关键词**
- **禁止任何形式的换词行为**,包括:
- ❌ 更换关键词
- ❌ 推荐其他词
- ❌ 触发泛化词拓展流程
- **只能做一件事**:自动扩展时间范围
**调整顺序(严格按此顺序)**:
1. 近1天 → 近3天
2. 近3天 → 近7天
3. 近7天 → 近30天
**告知用户**:每次扩展后必须提示用户:"该关键词近X天数据不足5条,已自动扩展时间范围至近Y天"
**最终兜底**:即使扩展到近30天仍不足5条,也只能如实展示现有数据,**绝对不能换词**,但必须提示用户数据不足
---
### 🔴 输出格式规则(必须严格遵守)
**严格按照推荐标题的格式产出内容,格式绝对不能改变!**
**推荐标题的标准格式(必须完全一致)**:
```
**标题X:[标题内容]**
📈匹配指数:[数值]
🔥参考的爆款:[参考标题1](互动数:XXX)、[参考标题2](互动数:YYY)
👍推荐理由:[详细推荐理由]
---
```
**格式要求(必须100%遵守)**:
- 标题行:`**标题X:[标题内容]**`
- 匹配指数行:`📈匹配指数:[数值]`
- 参考的爆款行:`🔥参考的爆款:[参考标题链接](互动数:XXX)`
- 推荐理由行:`👍推荐理由:[详细推荐理由]`
- 分隔线:`---`
- 所有emoji和格式必须完全一致
**🔴 重要:无论在什么情况下(包括在子agent中执行时),主agent也不要改变输出内容的格式!**
---
## 核心功能
本工具专门用于生成小红书爆款标题,完整流程:
1. **理解用户输入**:分析用户输入的任何信息,提取核心主题
2. **查询相关爆款数据**:基于用户输入的内容,查询匹配的小红书爆款内容
3. **分析爆款规律**:总结爆款标题的结构、关键词、表达方式等
4. **生成新爆款标题**:基于分析结果,创作10个符合平台特性的新爆款标题
## 前置准备
- 依赖:`requests>=2.28.0`
## 重要数据说明
- **数据时间差说明**:笔记互动数据截止为入库时间,不是实时数据,展示数据仅为入库快照,互动量可能持续增长。
- 数据库仅包含昨天至30天前的数据
- 默认时间范围为最近7天(today-6天)
- 数据不足自动扩展时间范围,并提示用户
## 🔴 用词规范(必须100%遵守)
- **禁止使用词汇**:在所有面向用户的输出与说明中,**不得使用**常见于「非官方、自动化批量拷贝平台公开展示信息」场景的两类双字动词:**以「爬」开头且以「取」结尾**、**以「抓」开头且以「取」结尾**(与「抓住痛点」「抓住需求」等正常用语无关)。
- **替代词汇**:上述含义统一用 **「获取」** 表述。
- **示例**:
- ❌ 错误:用上述两类动词表述「小红书数据」的来源方式
- ✅ 正确:获取小红书数据
- ❌ 错误:用上述两类动词表述「爆款内容」的来源方式
- ✅ 正确:获取爆款内容
## ⚠️ 核心执行规则(必须遵守)
1. **🔴 最终目标只有一个:生成小红书爆款标题**:无论用户输入什么,无论中间经历什么步骤,最终都要导向"生成小红书爆款标题"
2. **泛化词必须先询问再查询**:当识别到泛化词时,**绝对禁止直接调用脚本**,必须先输出细分词推荐并等待用户选择后再执行查询
3. **正确执行顺序**:理解用户输入 → 提取关键词 → 判断是否泛化词 → 是泛化词则询问用户 → 用户回复后再调用脚本 → 基于数据生成标题
4. **强制等待规则**:输出细分词推荐后,必须停止执行,等待用户下一轮对话回复「拓展」或「不拓展」,**不得在同一次对话中继续执行任何脚本调用**
**常见泛化词**:
泛词:抽象层级高、覆盖范围广的概括性词汇,无具体场景/属性修饰,行业分类等,可包含多个子类。特征:①语义上为上位概念(如"美妆"包含"粉底液/口红";"运动"包含"跑步/瑜伽";如AI);②上下文中常搭配"领域""类型"等概括词(如"美妆领域""运动类型")。
**常见具体词**:
具体词:抽象层级低、指向明确的实例化词汇,含具体场景/属性修饰,属于某泛词的直接子类。特征:①语义上为下位概念(如"粉底液"是"美妆产品"子类;"生酮饮食"是"饮食方式"子类);②词语结构多含修饰成分(如"春日"→"春日穿搭";"生酮"→"生酮饮食")。
## 完整操作流程
### 第一步:理解用户输入并提取关键词
**🔴 时刻谨记:用户输入的任何信息都是为了生成小红书爆款标题**
**⚠️ 精准关键词理解规则(必须100%遵守):**
- 用户输入的是什么产品,就只查询什么产品,**不随意扩展到相关但不同的产品**
- 要理解产品的**具体形态和类型**边界:
- **霜**≠喷雾≠衣≠帽≠伞:用户输入"防晒霜",要的是**有防晒作用的霜**(膏状/乳状产品),**不包含**防晒喷雾、防晒衣、防晒帽、遮阳伞等其他形态的防晒产品
- **膏**≠液≠粉≠笔:用户输入"睫毛膏",要的是**膏状的睫毛产品**,**不包含**假睫毛、睫毛增长液、睫毛纤维等其他睫毛相关产品
- **液**≠霜≠膏≠喷雾:用户输入"粉底液",要的是**液体状的粉底产品**,**不包含**气垫、BB霜、粉底膏、粉底喷雾等其他底妆产品
- **膏/棒**≠釉≠彩≠油:用户输入"口红",要的是**膏状/棒状的唇部产品**,**不包含**唇釉、唇彩、唇油等其他唇部产品
- 精准理解示例:
- 用户输入"防晒霜" → 理解为:有防晒作用的霜(膏状/乳状)→ 只查询防晒霜,**不包含**防晒喷雾、防晒衣、防晒帽等
- 用户输入"睫毛膏" → 理解为:刷睫毛的膏状产品 → 只查询睫毛膏,**不包含**假睫毛、睫毛增长液等
- 用户输入"粉底液" → 理解为:液体状的粉底 → 只查询粉底液,**不包含**气垫、BB霜、粉底膏等
- 用户输入"口红" → 理解为:膏状/棒状的唇部彩妆 → 只查询口红,**不包含**唇釉、唇彩、唇油等
- 用户输入"跑鞋" → 理解为:专门用于跑步的鞋 → 只查询跑鞋,**不包含**运动鞋、休闲鞋等其他鞋类
- **核心原则**:用户输入的具体产品是什么形态/类型,就严格限定在该产品形态/类型范围内
1. **分析用户输入**:
- **无论用户输入什么**(单个词、一段话、一个想法、一个问题等),都理解为用户想要基于这个内容生成小红书爆款标题
- 从用户输入中提取核心主题和关键词
- 示例:
- 用户输入:"我想写关于护肤的内容" → 核心关键词:护肤 → 目标:生成护肤相关的小红书爆款标题
- 用户输入:"上班族早餐" → 核心关键词:上班族早餐 → 目标:生成上班族早餐相关的小红书爆款标题
- 用户输入:"想分享一些旅行心得" → 核心关键词:旅行 → 目标:生成旅行相关的小红书爆款标题
- 用户输入:"防晒霜" → 核心关键词:防晒霜 → 目标:只查询防晒霜,**不包含**防晒衣、防晒喷雾等
- 用户输入:"睫毛膏" → 核心关键词:睫毛膏 → 目标:只查询睫毛膏,**不包含**假睫毛、睫毛增长液等
- 用户输入:"最近有什么热门" → 核心关键词:(空,查询全站热门)→ 目标:基于全站热门生成小红书爆款标题
- 用户输入:任何内容 → 核心关键词:从输入中提取 → 目标:基于用户输入的内容生成小红书爆款标题
2. **判断关键词类型**:
- **细分词/垂直赛道**(含具体场景/属性修饰的词,如"职场穿搭"、"减脂餐"、"小个子穿搭")→ 直接查询数据,无需拓展询问
- **具体产品词**(如"防晒霜"、"睫毛膏"、"粉底液")→ 直接查询该产品数据,**不扩展到其他相关产品**
- **泛化词/大分类**(纯大类词,如"穿搭"、"美食"、"美妆",无任何修饰)→ 执行泛化词拓展策略
---
### 第二步:泛化词拓展策略(仅当关键词为泛化词时执行)
**⚠️ 重要:如果用户输入的是细分词,跳过此步骤,直接执行第三步查询数据!**
**🔴 即使有此步骤,最终目标仍然是生成小红书爆款标题**
1. **泛化词处理流程(⚠️ 必须等待用户明确回复后再调用脚本!)**:
1. **第一步:查询近7天网页资讯中和泛化词相关的小红书热点并生成细分词**(禁止调用脚本搜索数据)
- 拓展词生成原则:
- **词的大小适中**:避免过细,不要加组合
- **参考热门话题**:查询近7天热点后,选择热度较高的方向
- **覆盖不同场景**:趋势词、人群词、场景词、意图词各2-3个
- 输出示例:
```
我识别到「美妆」是较大的分类,已查询近期热门趋势,推荐以下细分方向:
柔焦底妆、养肤妆、亚裔妆、油皮定妆、通勤妆、夏日妆容、新手妆容、平价彩妆、妆容教程、彩妆测评
回复「拓展」将同时搜索这10个词,回复「不拓展」将继续搜索「美妆」
```
```
我识别到「中产」是较大的分类,已查询近期热门趋势,推荐以下细分方向:
老钱、轻奢、品质生活、松弛感、高级感穿搭、体面、法式穿搭、律师、医生、品质家居
回复「拓展」将同时搜索这10个词,回复「不拓展」将继续搜索「中产」
```
2. **第二步:等待用户回复**
- ❌ **禁止**:用户未回复时调用脚本
- ✅ **正确**:只等待用户明确回复「拓展」或「不拓展」后再执行
3. **第三步:根据用户明确回复执行**
- 用户回复「拓展」 → 调用脚本搜索10个细分词
- 用户回复「不拓展」或「继续」 → 调用脚本搜索原关键词
- 用户未回复或回复其他内容 → 识别对应意图
- **🔴 无论用户选择什么,最终都是为了生成小红书爆款标题**
### 第三步:时间范围与数据查询
**🔴 这一步是为了获取数据,最终用于生成小红书爆款标题**
**时间范围**:
- 数据库只包含昨天至30天前的数据
- **"最近"的默认定义**:最近7天(startDate = 今天 - 6天)
- **日期计算**(将用户表达转换为 startDate,格式为 yyyy-MM-dd):
**第一步:先获取当前系统时间**
- 首先获取今天的日期(格式:yyyy-MM-dd)
**第二步:根据用户表达计算 startDate**
- 今天:直接用昨天日期,startDate = 昨天(格式:yyyy-MM-dd)
- 最近/近7天:startDate = 今天 - 7天(格式:yyyy-MM-dd)
- 近N天:startDate = 今天 - N天(格式:yyyy-MM-dd)
**示例(假设当前系统时间为 2026-04-08)**:
- 示例1:用户说"近7天",今天是2026-04-08 → startDate = 2026-04-01
- 示例2:用户说"近15天",今天是2026-04-08 → startDate = 2026-03-24
**数据不足时的自动调整(⚠️ 优先扩展时间,禁止换词!)**:
- **处理原则**:数据不足5条时,只能扩展时间范围,不能更换或拓展关键词
- **调整顺序**:按以下顺序自动扩展时间范围
1. 近1天 → 近3天
2. 近3天 → 近7天
3. 近7天 → 近30天
- **告知用户**:每次扩展后必须提示用户:"该关键词近X天数据不足5条,已自动扩展时间范围至近Y天"
- **禁止行为**:❌ 不可因为数据不足就更换关键词、推荐其他词或触发泛化词拓展流程
- **最终兜底**:即使扩展到近30天仍不足5条,如实展示现有数据,但必须提示用户数据不足
**超出范围或未更新数据的道歉说明**:
- 用户说"今天/今日"时:回答"非常抱歉,今天的数据暂未更新,已为您展示最近可用的数据"
- 用户要求的时间超出30天时:回答"非常抱歉,当前仅支持最近30天的数据,已为您展示最接近的数据"
**执行命令**:
- 有赛道关键词(单个或多个关键词用逗号隔开):`python scripts/fetch_xhs_trends.py --keyword <关键词> --start-date <日期>`
- 日期格式必须为:yyyy-MM-dd(如:2024-01-15)
- 示例(单个关键词):`python scripts/fetch_xhs_trends.py --keyword "防晒霜" --start-date 2024-01-15`
- 示例(多个关键词):`python scripts/fetch_xhs_trends.py --keyword "防晒霜,防晒喷雾,防晒衣" --start-date 2024-01-15`
- 无赛道关键词(查询全站热门):`python scripts/fetch_xhs_trends.py --keyword "" --start-date <日期>`
- 日期格式必须为:yyyy-MM-dd(如:2024-01-15)
### [仅内部执行,页面上不展示]第四步:爆款数据
**🔴 分析数据是为了了解爆款情况,最终还是要生成小红书爆款标题**
1. **前置说明(页面上不展示)**:
- **数据时间差说明**:笔记的互动数据截止为入库时间,不是实时数据。入库后互动数据可能持续增长,展示数据为入库时快照。
2. **读取并处理数据**:
- 执行命令后,读取生成的 Markdown 文件
- 文件位置:`关键词_爆款数据.md`
---
### 第五步:分析爆款标题并生成新标题
**🔴 这是最终目标:基于用户最初输入的内容和查询到的爆款数据,生成小红书爆款标题**
**🔴 绝对执行顺序:必须先"分析爆款标题",再"生成新标题",顺序不能颠倒**
**前提**:必须已完成第四步,获取到真实的爆款数据
**新生成的标题是基于对小红书平台热门数据内容分析总结后的创新创作,不是直接采用参考的爆款标题**
**操作流程(严格按顺序执行)**:
**第一步:分析爆款标题(必须输出分析结果)**:
- 从获取的爆款数据中提取所有标题
- 分析这些爆款标题的共同特征:
- 标题结构(疑问句、陈述句、数字开头等)
- 关键词使用
- 情绪表达
- 目标人群
- 痛点点出
- 利益承诺
- **🔴 必须输出分析结果,格式如下**:
```
## 爆款标题分析
### 标题结构特点
- [分析总结]
### 关键词使用
- [分析总结]
### 目标人群
- [分析总结]
### 爆款规律总结
- [分析总结]
```
- **必须完成这一步分析并输出后,才能进入下一步生成标题**
**第二步:生成新爆款标题**:
- **🔴 重要:只有完成第一步"分析爆款标题"后,才能执行这一步**
- 新生成的标题是基于对小红书平台热门数据内容分析总结后的创新创作,不是直接采用参考的爆款标题
- 基于第一步分析得到的标题规律,创作10个新的爆款标题
- **字数控制要求**:生成的所有爆款标题必须控制在**20个字以内**
- **推荐理由要求(详细)**:每个新标题的推荐理由必须详细说明,包含以下要素:
- 标题采用了什么结构(疑问句/陈述句/数字开头等)
- 使用了什么关键词或热门词汇
- 目标人群是谁
- 抓住了什么痛点或需求
- 提供了什么价值或承诺
- 为什么这个标题在小红书平台会受欢迎
- 基于相关爆款标题的匹配度,给出匹配指数
- **参考的爆款标题要求**:每个参考的爆款标题必须支持点击查看作品链接,格式为 `[标题文字](https://www.xiaohongshu.com/explore/{photoId})`
3. **先输出爆款标题分析结果,再输出推荐标题,最后输出全部10个标题**
---
## 爆款标题分析
### 标题结构特点
- 以陈述句为主,直接表达观点
- 部分使用数字开头,增强吸引力
- 少量使用疑问句,引发好奇心
### 关键词使用
- 精准使用产品关键词(如"防晒霜"、"护肤技巧")
- 结合热门季节词(如"夏天")
- 使用人群定位词(如"新手"、"普通人")
### 目标人群
- 主要针对年轻女性用户
- 关注护肤、美妆、穿搭等领域
- 包括新手和有一定经验的用户
### 爆款规律总结
- 直接表达产品优点或使用感受
- 明确目标人群,精准定位
- 抓住痛点,提供解决方案
- 使用"必看"、"绝了"等词汇增加紧迫感
---
基于本次分析,为您生成以下10个爆款标题:
**标题1:这款防晒霜真的太好用了**
📈匹配指数:9.8
🔥参考的爆款:[爆款标题A](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)、[爆款标题B](https://www.xiaohongshu.com/explore/xxx)(互动数:YYY)
👍推荐理由:采用陈述句结构,直接表达产品使用感受;使用"防晒霜"精准关键词,目标人群为关注防晒的年轻女性;抓住夏天防晒需求痛点,提供产品好用的价值承诺,符合小红书用户喜欢分享真实体验的风格。
---
**标题2:夏天一定要试试这个**
📈匹配指数:9.8
🔥参考的爆款:[爆款标题C](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)
👍推荐理由:采用祈使句结构,带有强烈推荐意味;使用"夏天"热门季节关键词,目标人群为夏季有护肤/穿搭需求的用户;抓住用户夏天想尝试新事物的心理,通过"这个"制造好奇心,引发点击欲。
---
**标题3:新手必看的护肤技巧**
📈匹配指数:9.5
🔥参考的爆款:[爆款标题D](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)、[爆款标题E](https://www.xiaohongshu.com/explore/xxx)(互动数:YYY)
👍推荐理由:采用陈述句结构,明确受众定位;使用"新手"、"护肤技巧"精准关键词,目标人群为护肤新手;抓住新手想学习专业知识的痛点,提供实用技巧的价值承诺,"必看"二字增加紧迫感。
---
**标题4:这才是正确的化妆步骤**
📈匹配指数:9.5
🔥参考的爆款:[爆款标题F](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)
👍推荐理由:采用陈述句结构,带有纠正认知的意味;使用"化妆步骤"精准关键词,目标人群为学习化妆的用户;抓住用户担心化妆方法不对的痛点,提供正确方法的价值承诺,"这才是"引发好奇心。
---
**标题5:分享一个超好用的好物**
📈匹配指数:9.2
🔥参考的爆款:[爆款标题G](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)、[爆款标题H](https://www.xiaohongshu.com/explore/xxx)(互动数:YYY)
👍推荐理由:采用陈述句结构,带有分享属性;使用"好物"热门词汇,目标人群为喜欢种草的用户;抓住用户想发现好东西的心理,通过"超好用"制造期待感,符合小红书分享文化。
---
**标题6:这个方法真的绝了**
📈匹配指数:9.0
🔥参考的爆款:[爆款标题I](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)
👍推荐理由:采用陈述句结构,带有强烈情感;使用"方法"通用关键词,适用人群广泛;抓住用户想找高效方法的痛点,通过"绝了"制造强烈好奇心,口语化表达贴近小红书风格。
---
**标题7:普通人也能学会的穿搭**
📈匹配指数:8.8
🔥参考的爆款:[爆款标题J](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)、[爆款标题K](https://www.xiaohongshu.com/explore/xxx)(互动数:YYY)
👍推荐理由:采用陈述句结构,降低学习门槛;使用"普通人"、"穿搭"精准关键词,目标人群为想学穿搭的普通用户;抓住用户觉得穿搭很难的痛点,提供普通人也能学会的价值承诺,增加亲和力。
---
**标题8:早起化妆只需要5分钟**
📈匹配指数:8.8
🔥参考的爆款:[爆款标题L](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)
👍推荐理由:采用陈述句结构,数字开头吸引眼球;使用"化妆"、"5分钟"精准关键词,目标人群为早上时间紧张的上班族/学生;抓住用户想快速化妆的痛点,提供时间短的价值承诺,数字增加可信度。
---
**标题9:这个夏天一定要拥有**
📈匹配指数:8.5
🔥参考的爆款:[爆款标题M](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)、[爆款标题N](https://www.xiaohongshu.com/explore/xxx)(互动数:YYY)
👍推荐理由:采用祈使句结构,带有强烈推荐意味;使用"夏天"热门季节关键词,目标人群为夏季有购物需求的用户;抓住用户夏天想买应季物品的心理,通过"一定要拥有"制造紧迫感,引发购买欲。
---
**标题10:后悔没有早点发现**
📈匹配指数:8.2
🔥参考的爆款:[爆款标题O](https://www.xiaohongshu.com/explore/xxx)(互动数:XXX)
👍推荐理由:采用陈述句结构,带有情感共鸣;使用无特定关键词,适用人群广泛;抓住用户怕错过好东西的心理,通过"后悔"制造好奇心,想知道到底是什么好东西,引发点击欲。
---
### 第六步:验证输出格式是否正确
**🔴 必须在输出前完成格式验证,确保所有格式要求100%符合**
**验证清单(必须逐项检查)**:
1. **分析爆款标题**:
- 从获取的爆款数据中提取所有标题
- 分析这些爆款标题的共同特征:
- 标题结构(疑问句、陈述句、数字开头等)
- 关键词使用
- 情绪表达
- 目标人群
- 痛点点出
- 利益承诺
2. **标题行格式检查**:
- 格式:`**标题X:[标题内容]**`
- 标题内容必须在20个字以内
- 所有标题必须使用粗体标记 `**`
3. **匹配指数行格式检查**:
- 格式:`📈匹配指数:[数值]`
- 数值范围必须在8-10之间
- 必须保留一位小数
- 同一个匹配指数最多重复出现2次
4. **参考的爆款行格式检查**:
- 格式:`🔥参考的爆款:[标题文字](https://www.xiaohongshu.com/explore/{photoId})(互动数:XXX)`
- 必须包含可点击的链接格式 `[标题文字](URL)`
- URL格式必须正确:`https://www.xiaohongshu.com/explore/{photoId}`
- 多个爆款之间用顿号 `、` 分隔
- 必须包含互动数信息
5. **推荐理由行格式检查**:
- 格式:`👍推荐理由:[详细推荐理由]`
- 推荐理由必须详细,包含以下要素:
- 标题采用了什么结构
- 使用了什么关键词或热门词汇
- 目标人群是谁
- 抓住了什么痛点或需求
- 提供了什么价值或承诺
- 为什么这个标题在小红书平台会受欢迎
6. **分隔线检查**:
- 每个标题块之间必须有分隔线 `---`
- 最后一个标题后也必须有分隔线
7. **Emoji符号检查**:
- 必须正确使用:📈、🔥、👍
- 所有emoji和格式必须完全一致
8. **完整性检查**:
- 必须输出10个标题,不能少于10个
- 每个标题必须包含完整的4行内容(标题、匹配指数、参考爆款、推荐理由)
9. **使用建议**:
- 必可以先测试匹配指数较高的2-3个标题,观察实际数据表现
- 根据测试结果,调整标题的关键词和表达方式
- 结合自己的内容特点,对推荐标题进行个性化修改
**验证通过后才可输出,如有任何格式错误必须立即修正**
---
**使用建议**:
1. 可以先测试匹配指数较高的2-3个标题,观察实际数据表现
2. 根据测试结果,调整标题的关键词和表达方式
3. 结合自己的内容特点,对推荐标题进行个性化修改
---
**⚠️ 重要说明**:
- **匹配指数规则**:
- 数值范围:8-10之间(不得低于8)
- 保留一位小数
- 同一个匹配指数最多可以重复出现2次(不能同时存在3个及以上相同的匹配指数)
- 数值越高表示与爆款规律匹配度越高
## 资源索引
- 数据查询脚本:见 [scripts/fetch_xhs_trends.py](scripts/fetch_xhs_trends.py)
追踪全网热点,分析热门文章风格,模仿并超越生成爆款文章,附爆款理由和封面图,支持质量检查和SEO优化。适用于新媒体运营、内容营销、自媒体创作场景
---
name: hotspot-article-generator
description: 追踪全网热点,分析热门文章风格,模仿并超越生成爆款文章,附爆款理由和封面图,支持质量检查和SEO优化。适用于新媒体运营、内容营销、自媒体创作场景
version: 2.0
author: AI Assistant
---
# 热点爆款文章生成器 v2.0
本技能用于从全网热点中快速产出高质量、可发布的爆款文章,适配公众号、小红书、知乎、百家号、头条号等平台。
## 核心流程概览
技能首先进行**智能起点判断**,根据用户输入自动选择执行模式:
- **快速模式**:用户直接输入话题(如"成都户外打野"),跳过热点采集(S1),直接进入竞品分析与生成。
- **完整模式**:用户请求"追热点"或"生成今日热点文章",执行完整 S1-S4 流程。
- **文章优化模式**:用户提供已有文章,仅执行质量检查与优化(S3-S4)。
### 极速执行流程(S1-S5)
```
┌─────────────────────────────────────────────────────────────┐
│ 智能起点判断 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 直接话题输入 │ → │ 追热点需求 │ → │ 文章优化 │ │
│ │ (跳过S1) │ │ (完整流程) │ │ (仅S4优化) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼───────────────────┼─────────────────┼────────────┘
│ │ │
↓ ↓ ↓
┌─────────────────────────────────────────────────────────────┐
│ S1: 并行采集(热点+竞品分析) │
│ ┌───────────────────┐ ┌───────────────────┐ │
│ │ 🔥 热点搜索采集 │ ∥ │ 📊 竞品文章分析 │ │
│ │ - 全网热搜采集 │ │ - 热门文章搜索 │ │
│ │ - 时效分级 │ │ - 风格提取 │ │
│ │ - 热度评估 │ │ - 成功要素 │ │
│ └───────────────────┘ └───────────────────┘ │
└─────────────────────────────────────────────────────────────┘
∥
↓
┌─────────────────────────────────────────────────────────────┐
│ S2: 智能生成(多篇并发) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 文章一 │ │ 文章二 │ │ 文章三 │ │
│ │ (情感共鸣型) │ │ (实用干货型) │ │ (观点评论型) │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ S3: 质量控制(自动化) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ ✅ 违禁词检查 │ → │ 📝 真实性验证 │ → │ ⭐ 质量评分 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │ │ │
│ └─────────── 不合格 → 修复 ──────────┘ │
└─────────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ S4: 智能输出(按需生成) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 📄 文章输出 │ │ 🖼️ 封面图 │ │ 📋 发布建议 │ │
│ │ (差异化多篇) │ │ (S5 可选) │ │ (含SEO) │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
在执行过程中,技能会自动进行违禁词检查、事实真实性核验、质量评分与 SEO 优化,确保内容不仅"能爆",还"可信、合规、可持续复用"。
详细执行规则、参数与模板见:`references/core_workflow.md`。
FILE:scripts/check_prohibited_words.py
#!/usr/bin/env python3
"""
文章违禁词检测脚本
检测文章内容是否包含敏感词、违禁词
"""
import re
import json
def check_prohibited_words(text):
"""
检测文章中的违禁词
Args:
text: 待检测的文章内容
Returns:
dict: 检测结果,包含是否通过、违禁词列表、风险等级
"""
# 违禁词库(分类)
prohibited_words = {
# 政治敏感
"political": [
"反党", "反政府", "颠覆", "分裂国家", "台独", "藏独", "疆独",
"法轮功", "邪教", "六四", "天安门事件"
],
# 暴力恐怖
"violence": [
"恐怖袭击", "爆炸", "杀人", "砍人", "枪击", "暴恐",
"人体炸弹", "自杀式袭击"
],
# 色情低俗
"pornography": [
"色情", "淫秽", "裸体", "性交", "强奸", "乱伦"
],
# 违法犯罪
"crime": [
"贩毒", "吸毒", "走私", "洗钱", "诈骗", "传销",
"非法集资", "非法经营"
],
# 社会敏感
"social_sensitive": [
"群体性事件", "暴力执法", "黑警", "城管打人",
"强拆", "暴力拆迁"
],
# 平台违禁(知乎等平台特有)
"platform_sensitive": [
"微信号", "加微信", "扫码领红包", "点击领取",
"免费领取", "限时优惠", "回复领取"
]
}
# 广告营销词
marketing_words = [
"加我微信", "私聊我", "扫码添加", "限时特价",
"仅限今日", "错过后悔", "必须转发"
]
# 风险词汇(需要人工审核)
risk_words = [
"封锁", "制裁", "打压", "抵制", "抗议",
"腐败", "贪污", "渎职", "权色交易"
]
results = {
"passed": True,
"prohibited_found": [],
"risk_found": [],
"marketing_found": [],
"risk_level": "low",
"suggestions": []
}
# 检测违禁词
for category, words in prohibited_words.items():
for word in words:
if word in text:
results["prohibited_found"].append({
"word": word,
"category": category,
"level": "high"
})
results["passed"] = False
# 检测风险词
for word in risk_words:
if word in text:
# 获取上下文
pattern = re.compile(r'.{0,20}' + re.escape(word) + r'.{0,20}')
matches = pattern.findall(text)
results["risk_found"].append({
"word": word,
"level": "medium",
"context": matches[:2] if matches else []
})
# 检测营销词
for word in marketing_words:
if word in text:
results["marketing_found"].append({
"word": word,
"level": "low"
})
# 确定风险等级
if results["prohibited_found"]:
results["risk_level"] = "high"
elif results["risk_found"]:
results["risk_level"] = "medium"
elif results["marketing_found"]:
results["risk_level"] = "low"
else:
results["risk_level"] = "safe"
# 生成建议
if results["prohibited_found"]:
results["suggestions"].append("❌ 发现违禁词,必须修改后发布")
if results["risk_found"]:
results["suggestions"].append("⚠️ 发现风险词,建议人工审核上下文")
if results["marketing_found"]:
results["suggestions"].append("💡 发现营销词,可能影响推荐")
if results["risk_level"] == "safe":
results["suggestions"].append("✅ 未发现违禁词,可以发布")
return results
def analyze_text_content(text):
"""分析文本内容的其他指标"""
analysis = {
"word_count": len(text),
"paragraph_count": len([p for p in text.split('\n\n') if p.strip()]),
"has_sensitive_numbers": False,
"has_external_links": False,
"suggestions": []
}
# 检测敏感数字(可能涉及隐私或违规)
phone_pattern = re.compile(r'1[3-9]\d{9}')
id_pattern = re.compile(r'\d{17}[\dXx]')
if phone_pattern.search(text):
analysis["has_sensitive_numbers"] = True
analysis["suggestions"].append("⚠️ 文章包含手机号,建议删除")
if id_pattern.search(text):
analysis["has_sensitive_numbers"] = True
analysis["suggestions"].append("⚠️ 文章包含身份证号,建议删除")
# 检测外链
url_pattern = re.compile(r'https?://[^\s]+')
external_links = url_pattern.findall(text)
if external_links:
analysis["has_external_links"] = True
analysis["external_links"] = external_links
analysis["suggestions"].append("💡 文章包含外链,部分平台可能限制")
return analysis
def print_report(prohibited_result, analysis_result):
"""打印检测报告"""
print("\n" + "="*60)
print("📋 文章违禁词检测报告")
print("="*60)
# 基本信息
print(f"\n📊 基本信息:")
print(f" - 字数统计:{analysis_result['word_count']} 字")
print(f" - 段落数量:{analysis_result['paragraph_count']} 段")
# 违禁词检测结果
print(f"\n🔍 违禁词检测:")
print(f" - 风险等级:{prohibited_result['risk_level'].upper()}")
print(f" - 检测结果:{'✅ 通过' if prohibited_result['passed'] else '❌ 未通过'}")
if prohibited_result["prohibited_found"]:
print(f"\n ❌ 发现违禁词:")
for item in prohibited_result["prohibited_found"]:
print(f" - [{item['category']}] {item['word']}")
if prohibited_result["risk_found"]:
print(f"\n ⚠️ 发现风险词:")
for item in prohibited_result["risk_found"]:
print(f" - {item['word']}")
if item['context']:
print(f" 上下文:...{item['context'][0]}...")
if prohibited_result["marketing_found"]:
print(f"\n 💡 发现营销词:")
for item in prohibited_result["marketing_found"]:
print(f" - {item['word']}")
# 其他分析
if analysis_result["suggestions"]:
print(f"\n📝 其他建议:")
for suggestion in analysis_result["suggestions"]:
print(f" {suggestion}")
# 总体建议
print(f"\n💡 总体建议:")
for suggestion in prohibited_result["suggestions"]:
print(f" {suggestion}")
print("\n" + "="*60)
return prohibited_result["passed"]
if __name__ == "__main__":
# 读取文章内容
article_path = "/workspace/projects/hotspot-article-generator/assets/article2_chip_breakthrough.txt"
# 如果文件不存在,使用内置文章
article_content = """中国芯片突破:这场"突围战",我们打了太久
今天,一则消息刷屏:中国发布芯片研发重大突破成果。
看似简单的一句话,背后却是无数科研人员日以继夜的奋斗,是我们在技术封锁下的艰难突围,是一个民族不屈不挠的抗争。
这不是一条普通的新闻,这是一场没有硝烟的战争中的重要转折。
一、从"卡脖子"到"突围",这条路有多难
过去几年,"芯片"成为中国人心中最痛的字眼。
美国的技术封锁、高端光刻机的禁运、核心技术的缺失……每一个关键词,都像一把刀,刺痛着我们的神经。我们深刻地意识到:在关键核心技术上受制于人,是多么危险的一件事。
于是,无数科研人员开始了艰难的攻关。没有高端设备,就自主研发;没有成熟工艺,就从零探索;没有现成经验,就摸着石头过河。
这就是中国人的韧劲:越是困难,越要迎难而上;越是被封锁,越要突破重围。
今天的突破成果,正是这些努力的结晶。它告诉我们:只要我们想做的事情,没有做不到的。
二、突破的意义,远超技术本身
很多人会问:这次突破到底有多重要?
从技术角度看,它意味着我们在芯片领域又向前迈进了一大步,缩小了与国际先进水平的差距。
从战略角度看,它意味着我们在关键技术上有了更多自主权,不再那么容易被"卡脖子"。
从精神角度看,它意味着我们有信心、有能力突破任何技术封锁,实现科技自立自强。
技术突破只是表象,真正的意义在于:我们证明了自己可以做到。
这种信心,比任何技术成果都更重要。它会激励更多科研人员投身核心技术攻关,会激励更多企业敢于投入研发,会激励整个社会更加重视科技创新。
三、突破是起点,不是终点
当然,我们也要清醒地认识到:一次突破不等于全面领先,我们的芯片产业还有很长的路要走。
在高端光刻机、先进制程、核心设计软件等领域,我们与国际先进水平仍有差距。我们不能因为一次突破就沾沾自喜,更不能因为一点成绩就放松警惕。
突破是起点,不是终点。
我们需要继续加大研发投入,需要培养更多优秀人才,需要建立更完善的产业生态。只有这样,我们才能真正实现芯片产业的自主可控,才能在未来的技术竞争中立于不败之地。
四、给年轻人的话:你们是最好的时代
看到这条新闻,我想对年轻人说几句。
你们是最好的时代。国家正在大力推动科技创新,社会越来越重视技术人才,无数机会正在等待着你们。
如果你对科技感兴趣,如果你有志于投身核心技术攻关,请不要犹豫。这个国家需要你们,这个行业需要你们,未来属于你们。
一个民族的崛起,最终要靠自己的双手。而你们,正是这双手最有力的部分。
结语
中国芯片突破,只是一个开始。
这场"突围战",我们打了太久。但今天的成果告诉我们:只要坚持不懈,就一定能够突破重围。
未来的路还很长,但我们有理由相信:一个科技自立自强的中国,正在崛起。
致敬每一位默默奉献的科研人员,是你们的坚守,撑起了这个国家的科技脊梁。
你的观点是什么?你认为中国芯片产业还需要多久才能全面领先?欢迎在评论区留言。"""
# 执行检测
prohibited_result = check_prohibited_words(article_content)
analysis_result = analyze_text_content(article_content)
# 打印报告
passed = print_report(prohibited_result, analysis_result)
# 返回状态码
import sys
sys.exit(0 if passed else 1)
FILE:references/core_workflow.md
> **核心升级**:性能优化 + 智能化增强 + 质量控制 + SEO优化
---
## 一、核心能力概览
### 1.1 能力矩阵
| 能力模块 | 功能描述 | 优先级 |
| --------------- | ------------------------------------ | -------- |
| 🔥 **热点追踪** | 全网热搜采集、时效分级、智能筛选 | ⭐⭐⭐ |
| 📊 **风格分析** | 热门文章分析、竞品研究、传播要素提取 | ⭐⭐⭐ |
| ✍️ **爆款生成** | 模仿超越、质量检查、去AI化写作 | ⭐⭐⭐⭐ |
| 🎨 **封面生成** | 平台适配、自动生成、多风格选择 | ⭐⭐⭐ |
| ✅ **质量控制** | 违禁词检查、真实性验证、评分反馈 | ⭐⭐⭐⭐ |
| 🔍 **SEO优化** | 关键词布局、搜索优化、平台适配 | ⭐⭐⭐ |
### 1.2 触发场景
**自动执行(跳过热点搜索)**:
- 用户直接输入话题(如"成都户外打野"、"AI绘画技巧")
- 用户已有明确选题,只需生成内容
**完整执行(热点搜索+生成)**:
- 用户请求"生成今日热点文章"、"追热点"
- 用户需要从热点事件切入创作
**智能优化(仅优化)**:
- 用户提供已有文章,要求优化
- 用户要求检查/修复文章质量
---
## 二、极速执行流程(优化版)
> **优化说明**:从6步简化为4步,热点搜索与文章分析并行执行,自动化质量检查
```
┌─────────────────────────────────────────────────────────────┐
│ 智能起点判断 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ 直接话题输入 │ → │ 追热点需求 │ → │ 文章优化 │ │
│ │ (跳过S1) │ │ (完整流程) │ │ (仅S4优化) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼───────────────────┼─────────────────┼────────────┘
│ │ │
↓ ↓ ↓
┌─────────────────────────────────────────────────────────────┐
│ S1: 并行采集(热点+竞品分析) │
│ ┌───────────────────┐ ┌───────────────────┐ │
│ │ 🔥 热点搜索采集 │ ∥ │ 📊 竞品文章分析 │ │
│ │ - 全网热搜采集 │ │ - 热门文章搜索 │ │
│ │ - 时效分级 │ │ - 风格提取 │ │
│ │ - 热度评估 │ │ - 成功要素 │ │
│ └───────────────────┘ └───────────────────┘ │
└─────────────────────────────────────────────────────────────┘
∥
↓
┌─────────────────────────────────────────────────────────────┐
│ S2: 智能生成(多篇并发) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 文章一 │ │ 文章二 │ │ 文章三 │ │
│ │ (情感共鸣型) │ │ (实用干货型) │ │ (观点评论型) │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ S3: 质量控制(自动化) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ ✅ 违禁词检查 │ → │ 📝 真实性验证 │ → │ ⭐ 质量评分 │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
│ │ │ │
│ └─────────── 不合格 → 修复 ──────────┘ │
└─────────────────────────────────────────────────────────────┘
│
↓
┌─────────────────────────────────────────────────────────────┐
│ S4: 智能输出(按需生成) │
│ ┌───────────────┐ ┌───────────────┐ ┌───────────────┐ │
│ │ 📄 文章输出 │ │ 🖼️ 封面图 │ │ 📋 发布建议 │ │
│ │ (差异化多篇) │ │ (可选) │ │ (含SEO) │ │
│ └───────────────┘ └───────────────┘ └───────────────┘ │
└─────────────────────────────────────────────────────────────┘
```
---
## 三、起点智能判断
### 3.1 判断决策树
```
用户输入
│
├── 包含已有文章/文本 ──────────────→ 【文章优化模式】
│ │
│ ↓
│ S4: 质量检查 → 优化建议
│
├── 直接话题输入 ──────────────────→ 【快速模式】
│ (如"成都打野"、"职场技巧") │
│ ↓
│ S2: 搜索竞品 → 生成
│
└── 追热点/生成文章 ────────────────→ 【完整模式】
(如"今日热点"、"生成爆款文章") │
↓
S1: 热点采集 + 竞品分析 → S2 → S3
```
### 3.2 数量模式识别
| 用户表达 | 模式 | 输出 | 适用场景 |
| ------------------------------------- | ------------ | --------------------- | ------------------ |
| "帮我写**一篇**..."、"就**一篇**..." | **精写模式** | 1篇精修 + 2个备选标题 | 深度需求、测试 |
| "**几篇**"、"**多篇**"、"**批量**..." | **批量模式** | 3篇差异化版本 | 矩阵运营、快速产出 |
| 未明确指定 | **默认批量** | 3篇差异化版本 | 标准产出 |
### 3.3 平台智能识别
| 平台关键字 | 风格适配 | 特殊规则 | SEO重点 |
| ---------- | -------- | --------------------------------------- | ----------- |
| **小红书** | 图文笔记 | 标题≤20字、正文≤1000字、emoji、话题标签 | 关键词+标签 |
| **知乎** | 深度文章 | 专业分析、逻辑严谨、长文 | 问答优化 |
| **公众号** | 情感推文 | 故事化、流畅阅读、标题党 | 转发分享 |
| **微博** | 短文话题 | 观点鲜明、情绪感染 | 话题标签 |
| **抖音** | 口播脚本 | 开头抓人、节奏快 | 完播率优化 |
| **B站** | 视频脚本 | 年轻化、创意感 | 弹幕互动 |
| **百家号** | 资讯文章 | 新闻感、信息密度高 | 百度收录 |
| **搜狐号** | 综合内容 | 兼容性好、中长篇 | SEO外链 |
| **头条号** | 算法推荐 | 大众化、冲击力强 | 算法友好 |
---
## 四、步骤一:并行采集(S1)
> **性能优化**:热点搜索与竞品分析并行执行,减少等待时间
### 4.1 热点搜索采集 ⚡ 并行
**执行策略**:使用网络搜索工具,实时采集全网热点
**采集范围**:
- 微博热搜、知乎热榜、抖音热榜、今日头条热榜、百度热搜
- 时间限定:优先24小时内(黄金热点)
- 采集数量:≥10个热点事件
**关键词策略**:
```
主搜索词:
- "今日热点新闻"
- "最新热搜事件"
- "刚刚发生的热点"
时效限定:+ "2026年4月" / + "最新" / + "今天"
```
**三级时效分类**:
| 等级 | 标识 | 时间范围 | 策略 | 内容侧重 |
| ----------- | ------ | --------- | -------- | ---------------------------- |
| 🔥 黄金热点 | `HOT` | 0-6小时 | 抢时效 | 事件报道、快速表态、信息整合 |
| ⭐ 白银热点 | `WARM` | 6-24小时 | 差异化 | 多方观点、深度分析 |
| 📌 青铜热点 | `COOL` | 24-72小时 | 角度创新 | 深层解读、趋势预判 |
| 🌿 常青热点 | `EVER` | 72小时+ | 价值沉淀 | 知识沉淀、方法论 |
**选择原则**:
- ✅ 优先选择黄金热点(时效性最强)
- ⭐ 白银热点需要差异化角度
- 📌 青铜热点需要独特视角
- 🌿 常青热点适合专业垂直领域
### 4.2 竞品文章分析 ⚡ 并行
**执行策略**:与热点搜索同步进行,节省50%时间
**搜索策略**:
```
平台优先级:
1. 知乎(深度观点)
2. 公众号(10w+传播)
3. 小红书(年轻视角)
4. 微博(舆论反应)
5. B站(创意表达)
搜索词:[话题/热点] + "深度分析" / "评论" / "观点"
筛选:点赞>1000 / 阅读>10w / 转发>500
```
**分析维度**(参考 [style-analysis-framework.md](references/style-analysis-framework.md)):
| 分析维度 | 提取要素 |
| ------------ | -------------------------------- |
| **标题风格** | 句式结构、情绪关键词、悬念技巧 |
| **内容结构** | 开头方式、段落节奏、小标题风格 |
| **语言风格** | 口语化程度、长短句比例、情感表达 |
| **观点输出** | 立场倾向、论证方式、深度层次 |
| **传播要素** | 情感触点、价值提供、转发动力 |
**竞品创作者分析**:
- 识别赛道头部创作者(3-5个)
- 分析内容定位差异
- 寻找差异化机会
---
## 五、步骤二:智能生成(S2)
> **性能优化**:多篇文章同时生成,提升产出效率
### 5.1 生成策略
**三篇文章差异化定位**:
| 文章 | 类型 | 核心卖点 | 目标受众 |
| ---------- | ---------- | ------------------ | ------------------ |
| **文章一** | 情感共鸣型 | 击中情绪、制造共鸣 | 感性读者、广泛人群 |
| **文章二** | 实用干货型 | 提供价值、解决问题 | 理性读者、从业者 |
| **文章三** | 观点评论型 | 输出观点、引发讨论 | 思辨读者、行业人士 |
### 5.2 写作核心原则
**超越策略**(参考 [viral-article-guide.md](references/viral-article-guide.md)):
```
✅ 角度超越:多角度综合 > 单角度分析
✅ 深度超越:深层洞察 > 表象描述
✅ 案例超越:新鲜典型 > 陈旧普通
✅ 价值超越:方法+行动 > 仅观点
✅ 表达超越:金句有力 > 平实叙述
```
**去AI化写作技巧**:
- ✅ 使用口语化表达,避免"首先...其次...最后"
- ✅ 适当短句断句,增加节奏感
- ✅ 加入真实感受和个人化表达
- ✅ 避免模板化开头结尾
- ✅ 多用自然对话感强的表达
- ❌ 不编造数据、人物、事件
### 5.3 平台风格适配
| 平台 | 字数范围 | 结构特点 | 特殊元素 |
| ------ | ----------- | ---------- | ----------------------------- |
| 小红书 | ≤1000字 | 分段+emoji | 封面图+配图+话题标签+互动引导 |
| 知乎 | 2000-3000字 | 专业+逻辑 | 引用+数据+分析框架 |
| 公众号 | 2000-3000字 | 故事+情感 | 标题党+金句+转发引导 |
| 微博 | 500-1000字 | 观点+情绪 | 话题标签+@互动 |
| 抖音 | ≤1000字 | 口播脚本 | 开头抓人+节奏+行动号召 |
| B站 | 2000字左右 | 年轻创意 | 开场+干货+互动 |
| 百家号 | 1500-2500字 | 新闻结构 | 信息密度+时效性 |
| 头条号 | 1500-2500字 | 大众化 | 冲击力+算法友好 |
### 5.4 小红书特殊规则
```
⚠️ 强制规则(违反将导致限流):
- 标题:≤20字(中文)
- 正文:≤1000字
- 必须包含:emoji表情(3-5个)
- 必须包含:话题标签 #XX#(3-5个)
- 必须包含:互动引导(结尾提问)
✅ 推荐元素:
- 封面图:1080×1440px,3:4竖版
- 正文配图:3-5张,场景化
- 收藏提醒:"点❤️收藏⭐"
```
---
## 六、步骤三:质量控制(S3)
> **新增能力**:自动化质量检查,确保内容安全合规
### 6.1 违禁词检查 ⚡ 自动执行
**检查维度**(调用 `scripts/check_prohibited_words.py`):
| 风险等级 | 词汇类型 | 处理方式 |
| --------- | -------------------------------------- | -------------------------- |
| 🔴 高风险 | 政治敏感、暴力恐怖、色情低俗、违法犯罪 | **必须修改**,否则无法发布 |
| 🟡 中风险 | 社会敏感、争议话题 | **人工审核上下文** |
| 🟢 低风险 | 营销推广、平台违禁 | **建议修改**,可能影响推荐 |
**违禁词检测流程**:
```
文章内容
│
├── 检测违禁词 ── 发现 → 返回修改建议 → 重新生成
│
├── 检测风险词 ── 发现 → 提示人工审核 → 确认后继续
│
└── 无风险词 ── 通过 → 继续下一步
```
### 6.2 真实性验证 ✅ 强制执行
**真实性要求**(最高优先级):
```
✅ 允许:
- 引用真实数据(标注来源:"根据XX报告显示")
- 使用真实人物(明确身份:"XX大学教授张三")
- 描述真实事件(基于新闻报道)
- 模糊表达("据统计"、"有观点认为")
❌ 禁止:
- 编造数据("调查显示90%的人...")
- 虚构人物("小李是一个普通的上班族...")
- 捏造细节("据内部人士透露...")
```
### 6.3 质量评分系统
**评分维度**:
| 维度 | 权重 | 评分标准 |
| ------------ | ---- | ------------------------------ |
| **内容质量** | 30% | 原创性、深度、逻辑性 |
| **情感共鸣** | 25% | 代入感、情绪触发、金句 |
| **可读性** | 20% | 段落长度、语言流畅、结构清晰 |
| **传播性** | 15% | 标题吸引力、转发动力、社交货币 |
| **SEO优化** | 10% | 关键词布局、标签设置 |
**评分等级**:
| 等级 | 分数 | 状态 | 处理方式 |
| ---------- | ------ | ------ | ---------- |
| ⭐⭐⭐⭐⭐ | 90-100 | 优秀 | 直接输出 |
| ⭐⭐⭐⭐ | 80-89 | 良好 | 轻微优化 |
| ⭐⭐⭐ | 70-79 | 合格 | 建议优化 |
| ⭐⭐ | 60-69 | 需优化 | 返回S2重写 |
| ⭐ | <60 | 不合格 | 重新生成 |
---
## 七、步骤四:智能输出(S4)
### 7.1 输出结构
**标准输出包**:
```
📦 生成成果
│
├── 📊 热点分析报告
│ ├── 热点事件概述(时效等级标注)
│ ├── 热度数据(热度指数、传播范围)
│ └── 切入建议(角度、差异化点)
│
├── 📝 竞品分析报告
│ ├── 分析样本(3-5篇热门文章)
│ ├── 风格特征总结
│ └── 成功要素提取
│
├── 📄 三篇完整文章
│ ├── 文章一:情感共鸣型
│ │ ├── 标题(主标题+备选×2)
│ │ ├── 正文(完整内容)
│ │ ├── 标签(3-5个)
│ │ └── 差异化定位说明
│ │
│ ├── 文章二:实用干货型
│ │ └── (同上结构)
│ │
│ └── 文章三:观点评论型
│ └── (同上结构)
│
├── 📋 发布建议汇总表
│ ├── 爆款理由(每篇一句话)
│ ├── 推荐平台(1-2个最佳)
│ ├── 发布时间(具体时间段)
│ ├── 互动话术(引导评论/收藏)
│ └── SEO关键词(长尾词布局)
│
└── 🖼️ 封面图(可选)
├── 封面图(每篇1张)
└── 配图(按需生成)
```
### 7.2 发布建议模板
**单篇文章建议**:
| 项目 | 内容 |
| ------------- | -------------------------------------------- |
| **爆款理由** | 本文[超越点],击中[核心情绪],预期[传播效果] |
| **推荐平台** | [最佳平台1]、[备选平台2] |
| **发布时间** | [具体时间段](如:晚上8-10点) |
| **互动话术** | [引导评论] / [引导收藏] / [引导转发] |
| **SEO关键词** | 核心词:[X]、长尾词:[X1]、[X2] |
**批量文章汇总表**:
| 文章 | 爆款理由 | 推荐平台 | 发布时间 | 互动话术 | SEO关键词 |
| ------ | -------- | -------- | -------- | -------- | --------- |
| 文章一 | [理由] | [平台] | [时间] | [话术] | [关键词] |
| 文章二 | [理由] | [平台] | [时间] | [话术] | [关键词] |
| 文章三 | [理由] | [平台] | [时间] | [话术] | [关键词] |
### 7.3 SEO优化指南
**关键词布局策略**:
```
标题优化:
- 核心关键词靠前(≤20字位置)
- 包含长尾关键词
- 符合搜索习惯
正文优化:
- 开头100字包含核心关键词
- 段落中自然融入2-3个长尾词
- 关键词密度:2-5%
标签优化:
- 3-5个标签
- 包含:领域词 + 话题词 + 受众词
```
**各平台SEO要点**:
| 平台 | SEO重点 | 技巧 |
| ------ | -------- | ------------------------------ |
| 知乎 | 问答优化 | 标题含问句、正文专业、引用权威 |
| 公众号 | 转发优化 | 情感触发、金句突出、转发动机 |
| 小红书 | 标签优化 | 精准标签、关键词靠前、热门话题 |
| 头条号 | 算法优化 | 时效性强、信息密度、点击率 |
| 百家号 | 收录优化 | 原创度、首发标识、外部链接 |
---
## 八、封面图智能生成(S5)
> **智能触发**:自动判断用户意图,无需确认直接生成
### 8.1 触发判断逻辑
```
文章生成完成
│
├── 用户已明确发布平台 ──→ 直接生成适配封面图
│
├── 批量模式 ──────────→ 自动生成3张封面图
│
├── 精写模式 ──────────→ 自动生成1张封面图
│
└── 用户要求跳过 ───────→ 跳过封面图
```
### 8.2 平台封面图规范
| 平台 | 尺寸(px) | 比例 | 风格 | 文字 |
| ---------- | --------- | ------ | ---------- | -------------- |
| 微信公众号 | 900×383 | 2.35:1 | 简洁专业 | 左上角预留 |
| 知乎 | 1200×675 | 16:9 | 专业学术 | 无(自动叠加) |
| 微博 | 1080×1260 | 4:5 | 活泼多样 | 居中偏下 |
| 小红书 | 1080×1440 | 3:4 | 文艺精致 | 底部/居中 |
| 今日头条 | 1280×720 | 16:9 | 新闻冲击 | 底部1/4 |
| B站 | 1146×717 | 16:10 | 二次元创意 | 左下角 |
| 百家号 | 1200×800 | 3:2 | 新闻感 | 居中 |
| 抖音 | 1080×1920 | 9:16 | 竖版全屏 | 中心/底部 |
### 8.3 封面图生成Prompt模板
**基础模板**:
```
A [风格] cover image for [平台] article about [主题]
- Size: [尺寸]
- Main subject: [主体元素]
- Background: [背景描述]
- Color palette: [色彩方案]
- Mood: [情感基调]
- Style: [风格描述]
- Text: [是否需要文字]
- Additional: [额外要求]
```
**分平台Prompt示例**(参考 [cover-image-spec.md](references/cover-image-spec.md)):
| 平台 | Prompt特点 |
| ------ | -------------------------------- |
| 小红书 | 暖色调、生活感、高颜值、精致文艺 |
| 知乎 | 深色系、专业感、简洁大气、知识感 |
| 公众号 | 情感化、温暖、适合长文 |
| 微博 | 情绪感染力强、信息密度高 |
| B站 | 年轻化、二次元元素、创意感 |
---
## 九、SEO优化系统指南
### 9.1 标题SEO优化
**SEO标题公式**:
```
✅ 优秀SEO标题:
[核心关键词] + [修饰词] + [价值词]
示例:"职场沟通技巧:3个方法让同事更愿意听你说"
❌ 差SEO标题:
纯情绪/纯悬念,无关键词
示例:"你绝对想不到!同事竟然这样说!"
```
**关键词选择策略**:
1. **核心关键词**:用户搜索的核心词(如"职场沟通")
2. **长尾关键词**:用户具体问题的词(如"如何让同事听我的")
3. **时效关键词**:带时间的词(如"2026年")
4. **疑问关键词**:用户问的词(如"怎么做")
### 9.2 正文SEO优化
**关键词密度控制**:
- 核心关键词:出现2-3次
- 长尾关键词:出现3-5次
- 关键词密度:2-5%(不过度堆砌)
**结构化SEO**:
```
标题(H1):包含核心关键词
小标题(H2):包含长尾关键词
段落首句:自然融入关键词
结尾:重复核心关键词
```
### 9.3 标签SEO优化
**标签选择原则**:
- 3-5个标签
- 包含:领域标签 + 话题标签 + 受众标签 + 热点标签
- 优先选择高搜索量标签
**标签示例**:
```
文章:职场沟通技巧
标签:
#职场沟通 ← 领域词(高搜索)
#职场技巧 ← 相关领域
#职场人必看 ← 受众词
#向上管理 ← 话题词
#高效沟通 ← 方法词
```
---
## 十、智能文章优化功能
### 10.1 优化模式
**用户可提供**:
- 已有文章,要求优化润色
- 已有大纲,要求扩写
- 已有观点,要求生成文章
- 已有文章,要求改写风格
### 10.2 优化维度
| 优化类型 | 描述 | 输出 |
| -------------- | -------------------------------- | ---------- |
| **质量优化** | 检查违禁词、优化表达、提升可读性 | 优化后文章 |
| **风格改写** | 转换写作风格(正式↔口语化) | 改写版本 |
| **SEO优化** | 优化关键词布局、标题、标签 | SEO增强版 |
| **扩写/缩写** | 按字数要求调整篇幅 | 调整后版本 |
| **多平台适配** | 转换为不同平台风格 | 多版本 |
### 10.3 优化执行
```
用户提交文章
│
├── 违禁词检查 ──→ 返回修改建议
│
├── 质量评分 ────→ 返回评分报告
│
├── SEO分析 ────→ 返回SEO建议
│
└── 执行优化 ────→ 输出优化后文章
```
---
## 十一、输出规范总结
### 11.1 字数标准
| 平台 | 最少 | 推荐 | 最多 |
| ---------- | ------ | ----------- | ------ |
| 小红书正文 | 300字 | 600-800字 | 1000字 |
| 微博 | 300字 | 500-800字 | 1000字 |
| 抖音脚本 | 500字 | 800-1000字 | 1200字 |
| 知乎 | 1000字 | 2000-3000字 | 5000字 |
| 公众号 | 1500字 | 2000-2500字 | 3000字 |
| 头条号 | 1000字 | 1500-2000字 | 3000字 |
| 百家号 | 1000字 | 1500-2500字 | 3000字 |
### 11.2 格式标准
- **段落长度**:每段2-4行,不超过6行
- **小标题**:每300字设置一个
- **金句**:每篇至少4个,用引用格式「」
- **emoji**:小红书/微博必用,其他平台建议
- **标签**:3-5个,以#开头
### 11.3 真实性核查清单
```
✅ 发布前必查:
- [ ] 无违禁词(政治、暴力、色情等)
- [ ] 数据来源真实可查证
- [ ] 人物身份真实明确
- [ ] 事件基于真实报道
- [ ] 无虚假夸大内容
- [ ] 敏感话题已妥善处理
```
---
## 十二、资源索引
| 资源类型 | 文件路径 | 用途 |
| ------------ | ------------------------------------------------------------------------------------ | -------------- |
| 热点分析框架 | [references/hotspot-analysis-framework.md](references/hotspot-analysis-framework.md) | 热点筛选与分析 |
| 风格分析框架 | [references/style-analysis-framework.md](references/style-analysis-framework.md) | 竞品文章分析 |
| 爆款创作指南 | [references/viral-article-guide.md](references/viral-article-guide.md) | 文章写作指导 |
| 封面图规范 | [references/cover-image-spec.md](references/cover-image-spec.md) | 封面图设计 |
| 文章模板 | [assets/article-template.md](assets/article-template.md) | 输出格式参考 |
| 违禁词检查 | [scripts/check_prohibited_words.py](scripts/check_prohibited_words.py) | 内容安全检查 |
---
## 十三、注意事项
### ⚠️ 真实性要求(最高优先级)
- **人物必须真实**:使用真实姓名或真实身份
- **数据必须真实**:引用可查证来源
- **事件必须真实**:基于新闻报道或官方信息
- **无确切信息时**:使用模糊表达,不编造
### ⚠️ 合规要求
- 避免敏感话题和违规内容
- 保持客观立场,不恶意引导舆论
- 封面图符合平台审核标准
- 不使用侵权素材
### ⚠️ 质量要求
- 注重原创性,模仿风格但不是抄袭
- 必须提供超越热门文章的独特价值
- 关注时效性,热点稍纵即逝
- 保持自然流畅,避免AI写作痕迹
---
## 十四、版本更新日志
### v2.0 更新内容
**性能优化**:
- ✅ 流程简化:从6步优化为4步
- ✅ 并行处理:热点搜索与竞品分析同步执行
- ✅ 自动化检查:违禁词检查自动执行
- ✅ 智能触发:封面图自动判断是否生成
**能力增强**:
- ✅ 质量评分系统:多维度评分反馈
- ✅ SEO优化指南:系统化SEO策略
- ✅ 平台扩展:支持百家号、头条号、搜狐号
- ✅ 文章优化功能:支持二次优化和改写
**智能化提升**:
- ✅ 智能起点判断:自动识别执行模式
- ✅ 智能数量模式:精写/批量自动识别
- ✅ 智能平台识别:自动适配平台风格
- ✅ 智能发布建议:包含SEO关键词
FILE:references/cover-image-spec.md
# 封面图设计规范
## 目录
- [一、主流平台封面图尺寸](#一主流平台封面图尺寸)
- [二、封面图设计原则](#二封面图设计原则)
- [三、不同风格封面图模板](#三不同风格封面图模板)
- [四、平台审核规范](#四平台审核规范)
## 一、主流平台封面图尺寸
### 1.1 微信公众号
**尺寸规格**:
- 推荐尺寸:900 × 383 像素(2.35:1)
- 最小尺寸:600 × 275 像素
- 文件格式:JPG、PNG、GIF
- 文件大小:不超过 5M
**设计要点**:
- 标题区域:左上角或居中,预留文字空间
- 视觉焦点:中间偏左,符合阅读习惯
- 文字叠加:支持,建议对比度高
### 1.2 知乎
**尺寸规格**:
- 推荐尺寸:1200 × 675 像素(16:9)
- 最小尺寸:640 × 360 像素
- 文件格式:JPG、PNG
- 文件大小:不超过 5M
**设计要点**:
- 标题区域:知乎会自动叠加标题,预留上方空间
- 视觉焦点:居中或偏右,避免被标题遮挡
- 文字叠加:不建议,知乎会自动添加
### 1.3 微博
**尺寸规格**:
- 推荐尺寸:1080 × 1260 像素(约4:5)
- 头图尺寸:1080 × 720 像素(3:2)
- 文件格式:JPG、PNG
- 文件大小:不超过 5M
**设计要点**:
- 标题区域:居中偏下,预留文字空间
- 视觉焦点:中上部,下部容易被裁剪
- 文字叠加:支持,建议简洁醒目
### 1.4 今日头条
**尺寸规格**:
- 推荐尺寸:1280 × 720 像素(16:9)
- 三图模式:400 × 300 像素(4:3)
- 文件格式:JPG、PNG
- 文件大小:不超过 5M
**设计要点**:
- 标题区域:底部1/4区域,避免遮挡主图
- 视觉焦点:中上部
- 文字叠加:支持,建议清晰可读
### 1.5 小红书
**尺寸规格**:
- 推荐尺寸:1080 × 1440 像素(3:4)
- 最小尺寸:720 × 960 像素
- 文件格式:JPG、PNG
- 文件大小:不超过 10M
**设计要点**:
- 标题区域:底部或居中,预留文字空间
- 视觉焦点:中上部,符合竖屏浏览习惯
- 文字叠加:支持,小红书风格偏文艺
### 1.6 B站(Bilibili)
**尺寸规格**:
- 推荐尺寸:1146 × 717 像素(约16:10)
- 文件格式:JPG、PNG
- 文件大小:不超过 2M
**设计要点**:
- 标题区域:左下角或底部
- 视觉焦点:居中或偏右
- 文字叠加:支持,建议二次元风格
## 二、封面图设计原则
### 2.1 视觉层级
**三层结构**:
```
┌─────────────────────────────────────┐
│ 背景层:色调、纹理、渐变 │ ← 最底层
├─────────────────────────────────────┤
│ 主体层:核心元素、视觉焦点 │ ← 中间层
├─────────────────────────────────────┤
│ 文字层:标题、副标题、标签 │ ← 最上层
└─────────────────────────────────────┘
```
**设计原则**:
- 背景层:简洁不抢戏,烘托氛围
- 主体层:视觉焦点,传达主题
- 文字层:清晰可读,对比度高
### 2.2 色彩搭配
**常用配色方案**:
| 文章类型 | 主色调 | 辅助色 | 情感传达 |
|---------|--------|--------|---------|
| 科技类 | 科技蓝、深蓝 | 金色、白色 | 专业、前沿 |
| 情感类 | 暖色、粉色 | 柔和灰 | 温暖、治愈 |
| 新闻类 | 深色、红色 | 白色、金色 | 严肃、重要 |
| 轻松类 | 明亮色系 | 白色 | 活泼、有趣 |
| 财经类 | 深蓝、金色 | 灰色 | 专业、稳重 |
**对比度要求**:
- 文字与背景对比度:≥ 4.5:1
- 主体与背景对比度:≥ 3:1
### 2.3 元素构成
**必需元素**:
- 主视觉:1个(人物/物体/场景)
- 背景:简洁,不喧宾夺主
**可选元素**:
- 文字:标题关键词、副标题
- 装饰:图标、线条、光效
- 标签:平台logo、分类标签
### 2.4 构图法则
**三分法构图**:
```
┌───────┬───────┬───────┐
│ │ │ │
├───────┼───────┼───────┤
│ │ ●焦点 │ │ ← 视觉焦点在交叉点
├───────┼───────┼───────┤
│ │ │ │
└───────┴───────┴───────┘
```
**中心构图**:
```
┌─────────────────────────┐
│ │
│ ●焦点 │ ← 视觉焦点居中
│ │
└─────────────────────────┘
```
**对角线构图**:
```
┌─────────────────────────┐
│ ● │
│ ↘ │ ← 视觉引导线
│ ● │
└─────────────────────────┘
```
## 三、不同风格封面图模板
### 3.1 科技/科技突破类
**适用场景**:芯片突破、科技新闻、创新成果
**设计模板**:
```
【背景】深蓝到黑色渐变,底层有淡色网格线条
【主体】发光的芯片/电路板/科技设备
【光效】从中心向外放射光芒(象征突破)
【色调】深蓝(#0A2463) + 科技蓝(#3E92CC) + 金色(#F9A825)
【文字】标题文字在左下角,白色或金色
【尺寸】适配目标平台
```
**视觉关键词**:
- futuristic(未来感)
- glowing(发光)
- circuit pattern(电路纹理)
- tech grid(科技网格)
### 3.2 情感共鸣类
**适用场景**:社会现象、民生话题、感人故事
**设计模板**:
```
【背景】暖色调渐变(橙色/粉色/米色)
【主体】人物剪影、手部特写、温暖场景
【氛围】柔和光线、温暖色调
【色调】暖橙(#E8845F) + 柔粉(#F4B4B4) + 米白(#FFF8E7)
【文字】标题在底部,深色或白色
【尺寸】适配目标平台
```
**视觉关键词**:
- warm(温暖)
- soft light(柔和光线)
- emotional(情感化)
- human connection(人际连接)
### 3.3 观点评论类
**适用场景**:社会事件、争议话题、深度分析
**设计模板**:
```
【背景】深色或中性色调(深灰/深蓝/黑色)
【主体】抽象图形、对比元素、天平/放大镜
【氛围】严肃、思考、对立
【色调】深灰(#2C3E50) + 红色(#C0392B) + 白色(#FFFFFF)
【文字】标题居中或偏下,白色,加粗
【尺寸】适配目标平台
```
**视觉关键词**:
- serious(严肃)
- contrast(对比)
- debate(辩论)
- thought-provoking(发人深省)
### 3.4 实用干货类
**适用场景**:知识分享、技能教程、经验总结
**设计模板**:
```
【背景】明亮干净的纯色或浅色渐变
【主体】书本/工具/图标/清单元素
【氛围】清新、专业、易读
【色调】白色(#FFFFFF) + 浅蓝(#E8F4F8) + 点缀色
【文字】标题清晰,深色,配合图标
【尺寸】适配目标平台
```
**视觉关键词**:
- clean(简洁)
- professional(专业)
- educational(教育性)
- infographic style(信息图风格)
## 四、平台审核规范
### 4.1 通用禁忌
**禁止内容**:
- ❌ 政治敏感内容(国旗、国徽、政治人物不当使用)
- ❌ 色情低俗内容
- ❌ 暴力恐怖内容
- ❌ 违法违规内容
- ❌ 侵权内容(明星肖像、品牌logo未经授权)
- ❌ 虚假宣传内容
### 4.2 平台特殊要求
**微信公众号**:
- 禁止诱导分享的图片
- 禁止过度营销的图片
- 建议避免使用过多文字
**知乎**:
- 禁止过度夸张的图片
- 建议保持学术感
- 避免使用emoji表情
**微博**:
- 禁止虚假热点图片
- 建议符合微博社区氛围
- 允许更活泼的设计
**今日头条**:
- 禁止标题党封面
- 建议图文相关度高
- 避免过度美化失真
**小红书**:
- 建议符合"种草"风格
- 允许精美图文设计
- 避免过度商业感
### 4.3 版权注意事项
**图片来源**:
- ✅ 使用AI生成的原创图片
- ✅ 使用无版权素材网站(Unsplash、Pexels等)
- ❌ 直接使用网络图片(可能侵权)
- ❌ 使用明星肖像(未经授权)
**字体使用**:
- ✅ 使用免费商用字体
- ✅ 使用AI生成文字
- ❌ 使用商用字体(未购买授权)
## 五、封面图生成Prompt模板
### 5.1 基础Prompt结构
```
A professional cover image for article titled "[文章标题]"
- Platform: [平台名称]
- Size: [尺寸]
- Main subject: [主体元素]
- Background: [背景描述]
- Color palette: [色彩方案]
- Mood: [情感基调]
- Style: [风格描述]
- Text: [是否需要文字]
```
### 5.2 具体平台示例
**知乎封面图Prompt**:
```
A professional cover image for Zhihu article about China's chip breakthrough
- Platform: Zhihu (Chinese Q&A platform)
- Size: 1200x675px (16:9 ratio)
- Main subject: glowing golden microchip with circuit patterns
- Background: deep blue gradient with subtle tech grid
- Accent: red light beams radiating from chip center (symbolizing breakthrough)
- Color palette: deep blue #0A2463, tech blue #3E92CC, China red #D64045, golden #F9A825
- Mood: hopeful, powerful, technological achievement
- Style: modern, futuristic, professional
- Text: no text on image (Zhihu will overlay title automatically)
- Resolution: high quality, sharp details
```
**微信公众号封面图Prompt**:
```
A professional cover image for WeChat article about doctor's kindness
- Platform: WeChat Official Account
- Size: 900x383px (2.35:1 ratio)
- Main subject: silhouette of doctor helping patient, warm lighting
- Background: soft gradient from warm orange to light pink
- Accent: gentle light rays, heart symbol subtly integrated
- Color palette: warm orange #E8845F, soft pink #F4B4B4, cream white #FFF8E7
- Mood: heartwarming, touching, inspiring
- Style: warm, emotional, artistic
- Text: clean space on left for title overlay
- Resolution: high quality, suitable for mobile viewing
```
## 六、快速参考表
| 平台 | 尺寸 | 比例 | 文字叠加 | 风格倾向 |
|------|------|------|---------|---------|
| 微信公众号 | 900×383 | 2.35:1 | 支持 | 简洁专业 |
| 知乎 | 1200×675 | 16:9 | 不建议 | 专业学术 |
| 微博 | 1080×1260 | 4:5 | 支持 | 活泼多样 |
| 今日头条 | 1280×720 | 16:9 | 支持 | 新闻感 |
| 小红书 | 1080×1440 | 3:4 | 支持 | 文艺精致 |
| B站 | 1146×717 | 16:10 | 支持 | 二次元 |
| 百家号 | 1200×800 | 3:2 | 支持 | 新闻感 |
| 抖音 | 1080×1920 | 9:16 | 支持 | 竖版冲击 |
| 搜狐号 | 1200×675 | 16:9 | 支持 | 大众化 |
---
## 七、新增平台封面图规范
### 7.1 百家号
**尺寸规格**:
- 推荐尺寸:1200 × 800 像素(3:2)
- 次选尺寸:1200 × 675 像素(16:9)
- 文件格式:JPG、PNG
- 文件大小:不超过 5M
**设计要点**:
- 标题区域:底部或居中,预留文字空间
- 视觉焦点:中上部,避免被标题遮挡
- 文字叠加:支持,建议简洁醒目
- 风格:新闻感强、信息密度高
**内容要求**:
- 与文章主题高度相关
- 避免过度美化或失真
- 避免使用模糊或低质量图片
- 避免使用有版权争议的图片
### 7.2 抖音
**尺寸规格**:
- 推荐尺寸:1080 × 1920 像素(9:16)
- 文件格式:JPG、PNG
- 文件大小:不超过 10M
**设计要点**:
- 标题区域:中心位置或底部
- 视觉焦点:中上部(黄金分割区)
- 文字叠加:支持,建议大字体、高对比度
- 风格:冲击力强、抓人眼球、竖版全屏
**内容要求**:
- 开头3秒要有视觉冲击
- 可添加动态效果或GIF
- 人物面部表情清晰
- 背景简洁不杂乱
### 7.3 搜狐号
**尺寸规格**:
- 推荐尺寸:1200 × 675 像素(16:9)
- 文件格式:JPG、PNG
- 文件大小:不超过 5M
**设计要点**:
- 标题区域:底部或右侧
- 视觉焦点:居中或偏左
- 文字叠加:支持
- 风格:大众化、兼容性好
---
## 八、封面图生成Prompt增强模板
### 8.1 百家号封面图Prompt
```
A professional news-style cover image for Baidu Baijiahao article about [主题]
- Platform: Baidu Baijiahao (Chinese content platform)
- Size: 1200x800px (3:2 ratio)
- Main subject: [主体元素,如新闻场景/数据图表/人物]
- Background: clean gradient or solid color, professional tone
- Accent: subtle news elements (microphone, newspaper, globe icons)
- Color palette: blue #1E3A5F, white #FFFFFF, accent red #C41E3A
- Mood: authoritative, informative, trustworthy
- Style: news journalism, professional, data-driven
- Text: space on bottom for title overlay
- Resolution: high quality, suitable for search engine indexing
```
### 8.2 抖音封面图Prompt
```
A vertical full-screen cover image for Douyin/TikTok video about [主题]
- Platform: Douyin (Chinese TikTok)
- Size: 1080x1920px (9:16 vertical ratio)
- Main subject: [主体元素,如人物/产品/场景特写]
- Background: gradient or bold color, high contrast
- Focal point: upper middle section (golden ratio area)
- Accent: dramatic lighting, bold elements
- Color palette: vibrant #FF4757, gold #FFD700, black #000000, white #FFFFFF
- Mood: energetic, attention-grabbing, exciting
- Style: modern, bold typography, high impact
- Text: large bold text in center or bottom
- Visual hook: must catch attention in 3 seconds
- Resolution: ultra high quality, mobile optimized
```
### 8.3 情感类通用Prompt
```
A warm and emotional cover image for [平台] article about [主题]
- Platform: [平台名称]
- Size: [尺寸]
- Main subject: [人物/手部特写/温暖场景]
- Background: warm gradient (orange/pink/cream tones)
- Lighting: soft, natural, warm tones
- Accent: subtle emotional elements (heart, hands, embrace)
- Color palette: warm orange #E8845F, soft pink #F4B4B4, cream #FFF8E7
- Mood: heartwarming, touching, relatable
- Style: emotional storytelling, human connection
- Text: clean space for title
- Resolution: high quality, mobile friendly
```
### 8.4 科技/数据类通用Prompt
```
A futuristic tech-style cover image for [平台] article about [主题]
- Platform: [平台名称]
- Size: [尺寸]
- Main subject: [芯片/数据/科技设备/代码界面]
- Background: dark blue gradient with subtle grid pattern
- Lighting: glowing neon accents, futuristic
- Accent: circuit patterns, data streams, AI elements
- Color palette: deep blue #0A2463, tech blue #3E92CC, neon cyan #00D4FF
- Mood: innovative, cutting-edge, intelligent
- Style: futuristic, tech-forward, modern
- Text: space on left for title
- Resolution: high quality, sharp details
```
### 8.5 职场/商业类通用Prompt
```
A professional business-style cover image for [平台] article about [主题]
- Platform: [平台名称]
- Size: [尺寸]
- Main subject: [办公场景/人物商务/数据图表/职场元素]
- Background: clean corporate gradient (blue/gray tones)
- Lighting: professional studio lighting, clean
- Accent: subtle business icons, growth charts
- Color palette: navy blue #1E3A5F, silver #A8B2C1, gold #D4AF37
- Mood: professional, trustworthy, success-oriented
- Style: corporate, polished, authoritative
- Text: clean space for title overlay
- Resolution: high quality, print-ready
```
---
## 九、封面图质量自检清单
### 9.1 技术质量检查
```
基础质量:
- [ ] 分辨率达到平台要求
- [ ] 文件大小在限制内
- [ ] 格式正确(JPG/PNG)
- [ ] 无压缩失真或模糊
视觉质量:
- [ ] 焦点清晰锐利
- [ ] 色彩准确自然
- [ ] 光线均匀合适
- [ ] 无噪点或杂色
```
### 9.2 内容合规检查
```
合规要求:
- [ ] 无政治敏感内容
- [ ] 无色情低俗内容
- [ ] 无暴力恐怖元素
- [ ] 无侵权素材(明星/品牌)
- [ ] 无虚假夸大信息
平台适配:
- [ ] 符合平台调性
- [ ] 尺寸比例正确
- [ ] 文字位置合适
- [ ] 无平台违禁元素
```
### 9.3 传播效果检查
```
吸引力检查:
- [ ] 前3秒有视觉冲击
- [ ] 主体清晰可辨
- [ ] 色彩对比度足够
- [ ] 信息密度适中
平台适配检查:
- [ ] 小红书:生活感、高颜值
- [ ] 知乎:专业感、学术气
- [ ] 公众号:情感化、有深度
- [ ] 抖音:冲击力、抓眼球
- [ ] 百家号:新闻感、权威性
```
FILE:references/hotspot-analysis-framework.md
# 热点分析框架
## 目录
- [一、事件要素分析](#一事件要素分析)
- [二、传播路径分析](#二传播路径分析)
- [三、受众画像构建](#三受众画像构建)
- [四、热度评估模型](#四热度评估模型)
- [五、切入角度选择](#五切入角度选择)
- [六、三级时效策略](#六三级时效策略)(新增)
## 一、事件要素分析
### 1.1 5W1H分析模型
对热点事件进行结构化拆解:
| 维度 | 分析要点 | 应用价值 |
|------|---------|---------|
| **Who(谁)** | 事件主体、关键人物、利益相关者 | 确定文章主角和视角 |
| **What(什么)** | 事件内容、核心冲突、关键细节 | 提炼文章核心议题 |
| **When(何时)** | 发生时间、持续时间、关键节点 | 把握时效性和节奏 |
| **Where(何地)** | 发生地点、传播平台、影响范围 | 确定地域相关性和平台策略 |
| **Why(为何)** | 事件原因、深层动机、社会背景 | 挖掘深度和价值观 |
| **How(如何)** | 事件经过、发展路径、解决方式 | 构建叙事逻辑 |
### 1.2 关键争议点识别
**方法**:从网友评论和媒体报道中提取高频争议词
**常见争议类型**:
- 价值观冲突(如:传统vs现代、个人vs集体)
- 利益分配(如:公平性、特权问题)
- 道德判断(如:对错、善恶、美丑)
- 制度缺陷(如:规则漏洞、监管缺失)
### 1.3 情感触点挖掘
**核心情绪类型**:
- **愤怒**:不公、欺骗、侵害
- **感动**:善良、奉献、温暖
- **焦虑**:生存、竞争、未来
- **好奇**:新奇、反差、悬念
- **认同**:共鸣、归属、价值
## 二、传播路径分析
### 2.1 起源追踪
**分析维度**:
- 首发平台:微博/抖音/知乎/B站/公众号
- 首发者:个人/媒体/机构/官方
- 初始传播:转发量、评论量、点赞量
**价值判断**:
- 自发型热点:群众自发传播,可信度高
- 营销型热点:有预谋策划,需警惕商业目的
- 突发型热点:意外事件,时效性强
### 2.2 传播节点识别
**关键节点类型**:
- **引爆点**:让事件从局部走向大众的关键时刻
- **转折点**:舆论风向发生逆转的时间点
- **高潮点**:讨论量达到峰值的时间点
**分析方法**:
1. 搜索"事件名 + 时间线"
2. 查看热搜榜排名变化
3. 分析关键KOL的介入时间
### 2.3 舆论演变追踪
**典型演变模式**:
```
阶段1:事实披露
├─ 主要内容:事件基本信息
├─ 舆论特征:好奇、等待
└─ 文章策略:快速报道、信息整合
阶段2:情绪爆发
├─ 主要内容:各方表态、网友反应
├─ 舆论特征:愤怒、站队
└─ 文章策略:情感共鸣、观点输出
阶段3:深度解读
├─ 主要内容:背景分析、深层原因
├─ 舆论特征:理性、反思
└─ 文章策略:专业分析、价值输出
阶段4:后续发展
├─ 主要内容:处理结果、影响评估
├─ 舆论特征:平息、总结
└─ 文章策略:复盘总结、经验提炼
```
## 三、受众画像构建
### 3.1 核心受众识别
**分析方法**:
1. 评论用户特征:性别、年龄、地域分布
2. 关注话题:该群体还关注什么
3. 活跃平台:他们主要在哪个平台
**典型受众类型**:
| 受众类型 | 特征 | 内容偏好 |
|---------|------|---------|
| **年轻人** | 18-25岁,学生/初入职场 | 新奇、个性、吐槽 |
| **中年人** | 30-45岁,有家庭事业 | 实用、共鸣、深度 |
| **女性群体** | 关注情感、家庭、职场 | 情感、育儿、成长 |
| **行业人士** | 关注专业、趋势、机会 | 干货、分析、前瞻 |
### 3.2 情感倾向分析
**方法**:抽样分析前100条热评
**倾向类型**:
- 支持方:占比、核心论点、代表人物
- 反对方:占比、核心论点、代表人物
- 中立方:占比、关注点、疑问点
**应用价值**:
- 选择立场:站在多数人这边 or 输出反向观点
- 避雷区:不触碰受众的情感底线
- 找共鸣:放大受众认同的观点
### 3.3 需求洞察
**受众想看什么**:
1. **信息需求**
- 事件真相:到底发生了什么?
- 背景信息:为什么会发生?
- 最新进展:现在怎么样了?
2. **情感需求**
- 情绪宣泄:替我说出想说的话
- 价值认同:确认我的观点是对的
- 心理安慰:这件事对我没影响
3. **实用需求**
- 经验借鉴:我能学到什么?
- 解决方案:我遇到类似问题怎么办?
- 预防措施:如何避免这种事?
## 四、热度评估模型
### 4.1 量化指标
**基础指标**:
- 搜索结果数量:>100万条为高热度
- 微博话题阅读量:>1亿为爆款潜力
- 热搜榜排名:前10为高热度
- 讨论持续时间:>3天为持续性热点
**综合评分公式**:
```
热度指数 = (搜索量 × 0.3) + (讨论量 × 0.3) + (传播速度 × 0.2) + (持续性 × 0.2)
```
### 4.2 时效性评估(四级分类)
**时间窗口分级**:
| 等级 | 标识 | 时间范围 | 内容侧重 | 策略要点 |
|------|------|---------|---------|---------|
| 🔥 **黄金热点** | HOT | 0-6小时 | 事件报道、快速表态 | 抢时效,第一时间发布 |
| ⭐ **白银热点** | WARM | 6-24小时 | 信息整合、观点输出 | 差异化,快速深度 |
| 📌 **青铜热点** | COOL | 24-72小时 | 深度分析、多角度解读 | 角度创新,避免同质 |
| 🌿 **常青热点** | EVER | 72小时以上/无时效 | 知识沉淀、经验总结 | 价值驱动,长效流量 |
**时效策略决策树**:
```
热点事件发生
│
├── 0-6小时 ──→ 🔥黄金热点 (HOT)
│ ├── 策略:快!
│ ├── 内容:事件基本信息 + 初步态度
│ ├── 标题:事件型(客观描述)
│ ├── 字数:500-800字
│ └── 风险:信息可能不完整
│
├── 6-24小时 ──→ ⭐白银热点 (WARM)
│ ├── 策略:快速深度
│ ├── 内容:事件全貌 + 深度观点 + 差异化角度
│ ├── 标题:观点型(引发好奇)
│ ├── 字数:1000-1500字
│ └── 风险:竞争激烈
│
├── 24-72小时 ──→ 📌青铜热点 (COOL)
│ ├── 策略:深度分析或另辟蹊径
│ ├── 内容:深层原因 + 多角度解读 + 预测展望
│ ├── 标题:分析型(提供价值)
│ ├── 字数:1500-2000字
│ └── 风险:时效性减弱
│
└── 72小时+ ──→ 🌿常青热点 (EVER)
├── 策略:提炼普适价值
├── 内容:经验总结 + 方法论 + 知识沉淀
├── 标题:价值型(搜索导向)
├── 字数:1800-2000字
└── 风险:需跳出事件本身
```
**各时效等级标题模板**:
| 等级 | 标题模板 | 示例 |
|------|---------|------|
| 🔥 黄金 | 事件型 | "刚刚,[事件]引发关注" |
| ⭐ 白银 | 观点型 | "[事件]背后,是三个你没看到的真相" |
| 📌 青铜 | 分析型 | "[事件]一周后,我们才看清这3个趋势" |
| 🌿 常青 | 价值型 | "从[事件]学到的5个人生道理" |
### 4.3 可讨论性评估
**高讨论性特征**:
- 有争议点:多方观点对立
- 有延展性:可关联更多话题
- 有代入感:读者能对号入座
- 有启发点:能引发思考
**低讨论性特征**:
- 事实清晰:没有争议空间
- 范围狭窄:受众面小
- 时效短暂:明天就没人关心
- 敏感风险:容易触碰红线
## 五、切入角度选择
### 5.1 角度矩阵
| 角度类型 | 适用场景 | 优势 | 风险 |
|---------|---------|------|------|
| **情感共鸣** | 民生话题、社会现象 | 传播力强、易引发转发 | 容易过度煽情 |
| **深度分析** | 行业事件、政策解读 | 专业度高、易获信任 | 门槛高、传播慢 |
| **观点输出** | 争议话题、价值冲突 | 个性鲜明、易吸粉 | 容易招黑 |
| **实用干货** | 知识热点、技能话题 | 价值明确、易收藏 | 热度依赖性强 |
| **反常识** | 常识性误解、刻板印象 | 新鲜感强、易传播 | 需要充分论证 |
### 5.2 差异化策略
**如何避免同质化**:
1. **时间差**:比别人更快 or 更深入
2. **角度差**:选择被忽视的视角
3. **深度差**:比别人挖得更深
4. **形式差**:用不同的表达方式
**案例**:
同一热点"某明星恋情曝光":
- 角度1:情感共鸣 - 从中看到了爱情的美好/无奈
- 角度2:深度分析 - 解析明星公关策略
- 角度3:实用干货 - 从中学习恋爱技巧
- 角度4:反常识 - 明星恋情背后的商业逻辑
### 5.3 切入点检验清单
在确定切入角度前,检验以下问题:
- [ ] 这个角度是否有人写过?
- [ ] 我能提供新的信息或观点吗?
- [ ] 这个角度是否安全合规?
- [ ] 受众会对这个角度感兴趣吗?
- [ ] 这个角度是否有传播价值?
- [ ] 我能驾驭这个角度吗?
## 六、三级时效策略详解
### 6.1 黄金热点策略(0-6小时)
**内容策略**:
```
标题:事件型标题(客观描述)
结构:事件简述 → 初步反应 → 保持关注
字数:500-1000字(不宜过长)
角度:信息整合 + 初步表态
```
**示例标题**:
- "刚刚,[事件名称]引发关注"
- "[事件名称]最新进展..."
- "[事件名称]:我们需要知道什么"
**风险提示**:
- ❌ 不确定信息不传播
- ❌ 不做过度解读
- ❌ 不预设立场
---
### 6.2 白银热点策略(6-24小时)
**内容策略**:
```
标题:观点型标题(引发好奇)
结构:事件回顾 → 多方观点 → 核心洞察
字数:1500-2000字
角度:深度分析 + 鲜明观点
```
**示例标题**:
- "深度 | [事件名称],暴露了什么"
- "[事件名称]背后,是三个你没看到的真相"
- "从[事件名称],看懂[深层趋势]"
**超越策略**:
- ✅ 提供独家数据或信息
- ✅ 采访当事人或专家
- ✅ 提出反常识观点
---
### 6.3 青铜热点策略(24-72小时)
**内容策略**:
```
标题:分析型标题(提供价值)
结构:现象回顾 → 深层原因 → 趋势预判 → 行动建议
字数:2000-3000字
角度:深度分析 + 行动指南
```
**示例标题**:
- "[事件名称]一周后,我们才看清这3个趋势"
- "为什么[事件名称]不是终点,而是开始"
- "复盘[事件名称]:我们能学到什么"
**超越策略**:
- ✅ 跳出事件,看更大格局
- ✅ 提供系统方法论
- ✅ 预测未来走向
---
### 6.4 常青热点策略(72小时以上/无时效)
**内容策略**:
```
标题:价值型标题(搜索导向)
结构:引子 → 方法论 → 案例 → 行动清单
字数:2000-3000字
角度:经验总结 + 可复制方法
```
**示例标题**:
- "从[事件名称]学到的5个人生道理"
- "[领域]人必看:如何避免[事件中的问题]"
- "干货 | [核心方法论]完整指南"
**超越策略**:
- ✅ 提炼普适经验
- ✅ 构建系统方法论
- ✅ 适配搜索SEO
---
## 七、分析报告模板
### 热点分析报告
**事件名称**:[热点事件名称]
**一、事件概述**(100字)
[简述事件经过]
**二、热度评估**
- 热度指数:[XX分]
- **时效等级**:[🔥黄金/⭐白银/📌青铜/🌿常青]
- 可讨论性:[高/中/低]
**三、关键要素**
- 主体:[谁]
- 核心冲突:[什么矛盾]
- 情感触点:[什么情绪]
**四、传播分析**
- 起源:[首发平台/首发者]
- 关键节点:[引爆点/转折点]
- 当前阶段:[事实披露/情绪爆发/深度解读/后续发展]
**五、受众画像**
- 核心受众:[人群特征]
- 情感倾向:[支持/反对/中立比例]
- 核心需求:[信息/情感/实用]
**六、切入建议**
- 推荐角度:[情感共鸣/深度分析/观点输出/实用干货]
- **时效策略**:[🔥快/⭐深/📌独/🌿值]
- 差异化点:[与现有内容的区别]
- 风险提示:[需要避免的内容]
FILE:references/quality-check-guide.md
# 质量检查与文章优化指南
## 一、质量检查集成
### 1.1 质量检查流程
```
文章生成完成
│
├── 步骤1:违禁词检查 (scripts/check_prohibited_words.py)
│ │
│ ├── 高风险违禁词 → 返回修改建议 → 重新生成
│ ├── 中风险词汇 → 人工审核确认 → 继续
│ └── 无违禁词 → 通过
│
├── 步骤2:真实性验证
│ │
│ ├── 数据来源可查证 → 通过
│ ├── 人物身份真实 → 通过
│ └── 无法验证 → 使用模糊表达
│
└── 步骤3:质量评分
│
├── ⭐⭐⭐⭐⭐ (90-100分) → 直接输出
├── ⭐⭐⭐⭐ (80-89分) → 轻微优化
└── ⭐⭐⭐及以下 → 返回S2重写
```
### 1.2 质量评分维度
| 维度 | 权重 | 评分标准 |
|------|------|---------|
| 内容质量 | 30% | 原创性(0-10)、深度(0-10)、逻辑性(0-10) |
| 情感共鸣 | 25% | 代入感(0-10)、情绪触发(0-10)、金句(0-10) |
| 可读性 | 20% | 段落长度(0-10)、语言流畅(0-10)、结构清晰(0-10) |
| 传播性 | 15% | 标题吸引力(0-10)、转发动力(0-10)、社交货币(0-10) |
| SEO优化 | 10% | 关键词布局(0-10)、标签设置(0-10) |
### 1.3 评分等级处理
| 分数 | 等级 | 处理方式 | 预计时间 |
|------|------|---------|---------|
| 90-100 | ⭐⭐⭐⭐⭐ | 直接发布 | 0分钟 |
| 80-89 | ⭐⭐⭐⭐ | 轻微优化 | 5分钟 |
| 70-79 | ⭐⭐⭐ | 建议优化 | 15分钟 |
| 60-69 | ⭐⭐ | 返回重写 | 30分钟 |
| <60 | ⭐ | 重新生成 | 30+分钟 |
---
## 二、违禁词检查
### 2.1 检查脚本集成
**文件路径**:`scripts/check_prohibited_words.py`
**使用方法**:
```python
# 在生成文章后自动调用
from scripts.check_prohibited_words import check_prohibited_words
result = check_prohibited_words(article_text)
if not result["passed"]:
# 发现违禁词,返回修改建议
return {"status": "failed", "issues": result["prohibited_found"]}
```
### 2.2 违禁词分类
| 风险等级 | 词汇类型 | 处理方式 |
|---------|---------|---------|
| 🔴 高风险 | 政治敏感、暴力恐怖、色情低俗、违法犯罪 | 必须修改 |
| 🟡 中风险 | 社会敏感、争议话题 | 人工审核 |
| 🟢 低风险 | 营销推广、平台违禁 | 建议修改 |
---
## 三、SEO优化指南
### 3.1 SEO自检清单
```
□ 标题包含核心关键词
□ 标题符合平台字数要求
□ 正文开头包含关键词
□ 有2-3个长尾关键词分布
□ 关键词密度在2-5%
□ 标签/话题选择合适(3-5个)
□ 配图与内容相关
□ 原创度达标(≥85%)
□ 首发平台正确
```
### 3.2 各平台SEO要点
| 平台 | SEO重点 | 核心技巧 |
|------|---------|---------|
| 微信公众号 | 转发优化 | 情感触发、金句突出 |
| 知乎 | 问答优化 | 标题含问句、正文专业引用 |
| 小红书 | 标签优化 | 精准标签、关键词靠前 |
| 头条号 | 算法优化 | 时效性强、点击率高 |
| 百家号 | 收录优化 | 原创首发、锚文本 |
---
## 四、文章优化类型
| 优化类型 | 描述 | 适用场景 |
|---------|------|---------|
| **质量优化** | 违禁词检查、语言润色 | 发布前必做 |
| **风格改写** | 正式↔口语化转换 | 跨平台适配 |
| **SEO优化** | 关键词布局调整 | 提升搜索曝光 |
| **扩写/缩写** | 按字数要求调整 | 平台字数限制 |
| **多版本** | 一文多平台适配 | 矩阵运营 |
FILE:references/style-analysis-framework.md
# 热门文章风格分析框架
## 目录
- [一、热门文章搜索策略](#一热门文章搜索策略)
- [二、标题风格分析](#二标题风格分析)
- [三、内容结构分析](#三内容结构分析)
- [四、语言风格分析](#四语言风格分析)
- [五、观点输出分析](#五观点输出分析)
- [六、传播成功要素](#六传播成功要素)
- [七、竞品创作者分析](#七竞品创作者分析)(新增)
- [八、模仿与超越策略](#八模仿与超越策略)
---
## 一、热门文章搜索策略
### 1.1 搜索渠道优先级
| 平台 | 搜索方式 | 价值点 |
|------|---------|--------|
| **知乎** | 热门话题下的高赞回答 | 深度观点、逻辑论证 |
| **微信公众号** | 搜索热点+10w+ | 传播性强、情感共鸣 |
| **微博** | 热搜话题下的热门长文 | 时效性强、网友视角 |
| **B站** | 热门视频文案 | 年轻化表达、故事性 |
| **小红书** | 热门笔记 | 生活化、场景化 |
### 1.2 搜索关键词策略
**基础搜索**:
```
"[热点事件名称] + 深度分析"
"[热点事件名称] + 评论/观点"
"[热点事件名称] + 怎么看"
```
**进阶搜索**:
```
"site:zhihu.com [热点事件名称] 赞同"
"site:weixin.qq.com [热点事件名称] 10w+"
"[热点事件名称] 最全分析"
```
### 1.3 筛选标准
**数据指标**:
- 知乎:赞同数 > 1000
- 公众号:阅读量 > 10w
- 微博:转发+评论 > 500
- B站:播放量 > 10w
**质量指标**:
- 内容深度:有分析、有观点、有洞察
- 结构完整:有开头、有论证、有结论
- 原创性:非纯搬运、有独特视角
- 时效性:最好是24-48小时内的内容
---
## 二、标题风格分析
### 2.1 句式结构分析
**疑问句式**:
```
特征:以"为什么"、"怎么"、"如何"开头
示例:
- "为什么年轻人都不愿意结婚了?"
- "怎么看待XX事件?"
效果:引发好奇,提升点击率20-30%
```
**感叹句式**:
```
特征:表达强烈情感,多用"!"或情绪词
示例:
- "太真实了!这就是成年人的世界"
- "终于有人敢说真话了!"
效果:激发情绪,适合情感共鸣型
```
**陈述句式**:
```
特征:直接陈述事实或观点
示例:
- "XX事件的真相"
- "从XX事件看XX问题"
效果:专业感强,适合深度分析
```
**数字句式**:
```
特征:以数字开头或包含数字
示例:
- "3个方法让你..."
- "90后 vs 00后"
效果:具体可感,易于传播
```
### 2.2 关键词使用分析
**情绪关键词**:
| 类型 | 示例 | 效果 |
|------|------|------|
| 正面 | 终于、竟然、原来 | 期待、惊喜 |
| 负面 | 震惊、愤怒、心酸 | 关注、同情 |
| 疑问 | 为什么、怎么、能否 | 好奇、探索 |
**悬念关键词**:
```
"真相是..."、"背后..."、"竟然..."
"万万没想到..."、"没想到..."
```
### 2.3 标题长度分析
| 平台 | 最佳长度 | 特点 |
|------|---------|------|
| 知乎 | 15-25字 | 可较长,需完整表达观点 |
| 微信公众号 | 20-30字 | 中等长度,兼顾搜索 |
| 微博 | 10-20字 | 简洁有力,适合快速浏览 |
| 小红书 | 15-20字 | 加emoji,吸引眼球 |
---
## 三、内容结构分析
### 3.1 开头方式分析
**故事切入型**:
```
特征:以具体故事或场景开头
示例:
"昨天深夜,小张加完班回家,看到妻子还在等他..."
优势:代入感强,情感共鸣
适用:情感类、社会现象类
```
**数据切入型**:
```
特征:以数据或调查结果开头
示例:
"最近一项调查显示:90后平均负债12万..."
优势:可信度高,引发思考
适用:数据类、趋势分析类
```
**冲突切入型**:
```
特征:以争议或矛盾开头
示例:
"有人说X,有人说Y,真相到底是什么?"
优势:引发好奇,制造悬念
适用:争议话题、观点评论类
```
**金句切入型**:
```
特征:以名言或金句开头
示例:
"罗曼·罗兰说:世界上只有一种真正的英雄主义..."
优势:格调高,易传播
适用:励志类、深度思考类
```
### 3.2 段落节奏分析
**节奏类型**:
| 类型 | 段落长度 | 特点 | 适用场景 |
|------|---------|------|---------|
| 快节奏 | 1-2句/段 | 紧凑、有力 | 情感类、励志类 |
| 中等节奏 | 3-4句/段 | 平衡、流畅 | 大多数场景 |
| 慢节奏 | 5句+/段 | 细腻、深沉 | 深度分析类 |
**节奏变化技巧**:
```
开头:短句吸引注意
中间:长短结合,张弛有度
结尾:短句收尾,有力
```
### 3.3 小标题风格分析
**有/无小标题**:
```
无小标题:
- 特点:一气呵成,流畅
- 适用:短文、情感故事
- 风险:长文易疲劳
有小标题:
- 特点:结构清晰,易读
- 适用:长文、干货类
- 技巧:每300-500字一个
```
**小标题风格**:
| 风格 | 示例 | 适用 |
|------|------|------|
| 提问式 | "为什么会这样?" | 引发思考 |
| 总结式 | "一、核心原因" | 干货类 |
| 故事式 | "他选择了离开" | 叙事类 |
| 金句式 | "你的善良,要有锋芒" | 情感类 |
---
## 四、语言风格分析
### 4.1 用词特点分析
**口语化程度**:
| 类型 | 特征 | 适用场景 |
|------|------|---------|
| 高口语化 | 使用网络用语、俚语 | 年轻受众、轻松话题 |
| 中口语化 | 日常表达、易懂 | 大众传播 |
| 低口语化 | 书面语、专业术语 | 专业领域、深度分析 |
**专业术语使用**:
```
适度使用:
- 增加专业感
- 建立权威性
- 需要解释术语
过度使用风险:
- 增加阅读门槛
- 降低传播性
- 显得做作
```
### 4.2 句式偏好分析
**长短句比例**:
```
短句为主(占比>70%):
- 特点:有力、节奏快
- 适用:情感类、励志类
长短均衡(短句占比40-60%):
- 特点:流畅、有变化
- 适用:大多数场景
长句为主(短句占比<40%):
- 特点:细腻、深沉
- 适用:深度分析、专业文章
```
**特殊句式使用**:
| 句式 | 效果 | 示例 |
|------|------|------|
| 排比 | 气势、强调 | "他们有的...有的...有的..." |
| 对仗 | 优美、易记 | "不是因为...而是因为..." |
| 反问 | 强调、共鸣 | "这难道不是...吗?" |
### 4.3 情感表达方式
**克制型**:
```
特征:情感内敛,通过细节表达
示例:
"他没说话,只是轻轻拍了拍她的肩膀。"
优势:高级感、耐人寻味
适用:深度文章、专业内容
```
**外放型**:
```
特征:情感直接表达
示例:
"这一刻,我泪流满面!"
优势:感染力强、易共鸣
适用:情感类、励志类
```
---
## 五、观点输出分析
### 5.1 立场倾向分析
**中立客观型**:
```
特征:
- 多角度呈现
- 不预设立场
- 让读者自己判断
优势:可信度高、争议少
适用:新闻类、争议话题
```
**鲜明激进型**:
```
特征:
- 观点明确
- 态度鲜明
- 立场坚定
优势:易引发讨论、吸粉
风险:可能招黑、争议大
适用:评论类、观点类
```
### 5.2 论证方式分析
**案例支撑型**:
```
结构:观点 + 案例1 + 案例2 + 案例3
优势:
- 具体可感
- 易于理解
- 有说服力
要求:
- 案例真实
- 具有代表性
- 与观点紧密相关
```
**数据支撑型**:
```
结构:观点 + 数据1 + 数据2 + 结论
优势:
- 客观权威
- 难以反驳
- 专业度高
要求:
- 数据来源可靠
- 数据足够新
- 数据解读准确
```
**逻辑推导型**:
```
结构:前提 + 推理过程 + 结论
优势:
- 逻辑严密
- 深度分析
- 训练思维
要求:
- 逻辑无漏洞
- 前提可信
- 推理过程清晰
```
### 5.3 深度层次分析
| 层次 | 特征 | 示例 |
|------|------|------|
| **表象描述** | 描述发生了什么 | "XX事件发生了..." |
| **原因分析** | 分析为什么会这样 | "之所以这样,是因为..." |
| **深层洞察** | 揭示本质和规律 | "这背后反映的是..." |
| **价值升华** | 提升到更高层面 | "这告诉我们一个道理..." |
---
## 六、传播成功要素
### 6.1 情感触点
**核心情绪类型**:
| 情绪 | 触发方式 | 传播效果 |
|------|---------|---------|
| **愤怒** | 不公、欺骗、侵害 | 高转发、高评论 |
| **感动** | 善良、奉献、温暖 | 高点赞、高收藏 |
| **焦虑** | 生存、竞争、未来 | 高阅读、高转发 |
| **认同** | 共鸣、归属、价值 | 高点赞、高转发 |
| **好奇** | 新奇、反差、悬念 | 高点击、高阅读 |
### 6.2 价值提供
**信息价值**:
- 提供独家信息
- 整合分散信息
- 解读复杂信息
**情感价值**:
- 情感宣泄出口
- 价值观认同
- 心理安慰
**实用价值**:
- 解决具体问题
- 提供行动指南
- 节省时间精力
### 6.3 传播动力
**为什么读者愿意转发**:
```
身份认同型:
"这篇文章说出了我的心声"
→ 转发代表我的态度
价值传递型:
"这篇文章对朋友有用"
→ 利他心理
情绪宣泄型:
"太气人了!"
→ 情绪出口
社交货币型:
"分享这个显得我有深度"
→ 提升形象
```
### 6.4 差异化优势
**与同类内容的区别**:
| 维度 | 差异化方式 |
|------|-----------|
| **角度** | 独特视角、反常识 |
| **深度** | 更深入、更系统 |
| **案例** | 更新鲜、更典型 |
| **表达** | 更生动、更有力 |
| **价值** | 更实用、更落地 |
---
## 七、竞品创作者分析
### 7.1 为什么要分析竞品创作者
**目的**:
- 了解赛道头部玩家是谁
- 掌握不同创作者的内容定位差异
- 找到自己的差异化定位空间
- 学习竞品的运营策略
**分析维度**:
```
竞品创作者分析
├─ 基础信息:粉丝量、更新频率、擅长领域
├─ 内容定位:垂直方向、目标受众、核心价值
├─ 风格特征:标题风格、内容结构、语言特点
├─ 运营策略:发布时间、互动策略、变现路径
└─ 差异化机会:空白地带、可切入角度
```
---
### 7.2 竞品搜索方法
**搜索策略**:
1. **直接搜索**
```
关键词:"[话题] + 头部创作者"
关键词:"[话题] + 知名博主"
关键词:"[话题] + 大V推荐"
```
2. **平台榜单**
- 知乎:关注者排行榜
- 公众号:在看榜单、新榜榜单
- 小红书:博主排行榜
- B站:创作榜、百大UP主
3. **评论区挖掘**
- 查看热门文章的评论区
- 找出读者提到或推荐的同类创作者
- 了解读者的信息源
**筛选标准**:
- 粉丝量:头部(100万+)、腰部(10-100万)、潜力(1-10万)
- 活跃度:近3个月有更新
- 相关度:内容与目标话题高度相关
- 质量:内容有深度,非低质洗稿
---
### 7.3 创作者画像分析
**分析模板**:
| 分析维度 | 内容 |
|---------|------|
| **账号名称** | @XXX |
| **粉丝量级** | XX万 |
| **内容定位** | [一句话定位] |
| **目标受众** | [人群特征] |
| **核心价值** | [给读者带来什么] |
| **内容风格** | [标题/结构/语言特点] |
| **更新频率** | [每周X篇] |
| **爆款规律** | [什么类型内容容易爆] |
| **变现方式** | [广告/带货/知识付费等] |
**分析示例**:
| 创作者 | @职场研究所 |
|--------|------------|
| 粉丝量级 | 50万 |
| 内容定位 | 职场晋升与个人成长 |
| 目标受众 | 25-35岁职场人 |
| 核心价值 | 实用的职场技巧 |
| 内容风格 | 干货型、清单式、实用导向 |
| 更新频率 | 每周3篇 |
| 爆款规律 | 带数字的标题+清单型内容 |
| 变现方式 | 知识付费、职场咨询 |
---
### 7.4 差异化定位策略
**定位矩阵**:
```
年龄:年轻人(18-25)
│
┌────────────┼────────────┐
│ │ │
深度:专业 深度:入门 深度:案例
│ │ │
├────────────┼────────────┤
│ │ │
│ [空白区] │ │
│ ⭐我的定位 │
│ │ │
└────────────┼────────────┘
│
年龄:职场人(25-40)
```
**寻找差异化机会**:
| 差异化维度 | 操作方法 | 示例 |
|-----------|---------|------|
| **人群差异** | 专注被忽视的细分人群 | 不是"职场人",而是"30岁+中层管理者" |
| **视角差异** | 用不同角度解读同一话题 | 不是"如何沟通",而是"从老板视角看沟通" |
| **形式差异** | 用不同形式表达 | 不是图文,而是视频;不是教程,而是故事 |
| **深度差异** | 更浅或更深 | 不是"深度分析",而是"3分钟速懂" |
| **价值差异** | 提供不同类型价值 | 不是"情感共鸣",而是"实操工具包" |
**差异化检验问题**:
- [ ] 这个定位是否已有头部玩家?
- [ ] 我能提供他们没有提供的东西吗?
- [ ] 这个定位的受众规模够大吗?
- [ ] 我能持续产出这个定位的内容吗?
- [ ] 这个定位能让我变现吗?
---
### 7.5 竞品分析报告模板
**竞品创作者分析报告**
**话题**:[分析的话题]
**一、赛道概览**
- 总创作者数量:约XX个
- 头部玩家:[列出3-5个头部账号]
- 市场热度:[高/中/低]
- 变现情况:[容易/一般/困难]
**二、竞品画像汇总**
| 创作者 | 粉丝量 | 内容定位 | 核心优势 | 不足之处 |
|--------|-------|---------|---------|---------|
| @XXX | XX万 | [定位] | [优势] | [不足] |
| @XXX | XX万 | [定位] | [优势] | [不足] |
| @XXX | XX万 | [定位] | [优势] | [不足] |
**三、空白地带识别**
- [ ] 细分人群空白:[什么人群被忽视]
- [ ] 内容形式空白:[什么形式没人做]
- [ ] 价值提供空白:[什么价值没人提供]
- [ ] 深度层次空白:[什么深度没人覆盖]
**四、差异化定位建议**
- **推荐定位**:[一句话定位]
- **目标受众**:[人群描述]
- **核心价值**:[给受众带来什么]
- **差异化优势**:[与竞品的区别]
- **内容策略**:[主要做什么类型内容]
**五、执行建议**
- 起步期:[如何从0到1]
- 成长期:[如何快速起号]
- 成熟期:[如何建立壁垒]
---
## 八、模仿与超越策略
### 7.1 模仿什么
**可模仿元素**:
✅ **标题风格**
- 句式结构
- 关键词使用
- 长度范围
✅ **内容结构**
- 开头方式
- 段落节奏
- 小标题风格
✅ **语言风格**
- 用词特点
- 句式偏好
- 情感表达
✅ **观点输出**
- 立场倾向
- 论证方式
- 深度层次
### 7.2 不可模仿什么
❌ **直接抄袭**
- 不能复制原文
- 不能洗稿
- 不能搬运观点
❌ **过度模仿**
- 不能只换案例
- 不能只改表达
- 不能只换角度
### 7.3 超越策略
**策略一:角度超越**
```
热门文章:从A角度分析
超越:从B角度分析,或从多个角度综合分析
示例:
热门文章:《为什么年轻人不结婚》从经济角度分析
超越文章:《年轻人不结婚的背后,是整个时代的变迁》从经济+文化+心理多角度分析
```
**策略二:深度超越**
```
热门文章:表层分析
超越:深层洞察 + 本质揭示 + 规律总结
示例:
热门文章:列举现象
超越文章:分析原因 + 揭示本质 + 提供解决方案
```
**策略三:案例超越**
```
热门文章:1-2个普通案例
超越:3-5个典型且新鲜的案例
要求:
- 案例更典型(代表性更强)
- 案例更新鲜(时效性更强)
- 案例更多样(覆盖面更广)
```
**策略四:价值超越**
```
热门文章:仅提供观点
超越:观点 + 方法 + 行动指南
示例:
热门文章:分析问题的原因
超越文章:分析原因 + 提供解决方法 + 给出行动建议
```
**策略五:表达超越**
```
热门文章:平实表达
超越:更生动的表达 + 更多金句
技巧:
- 增加修辞手法(排比、对仗、比喻)
- 设计更多金句
- 优化段落节奏
```
### 7.4 超越检验清单
生成文章后,检验是否真正超越:
- [ ] **角度是否更多元?** 比热门文章多至少1个角度
- [ ] **深度是否更深?** 至少深入一个层次
- [ ] **案例是否更丰富?** 案例数量或质量提升
- [ ] **价值是否更实用?** 提供具体行动建议
- [ ] **表达是否更有力?** 金句数量增加
- [ ] **是否保持原创性?** 非抄袭、非洗稿
---
## 八、风格分析报告模板
### 热门文章分析报告
**文章基本信息**:
- 标题:[文章标题]
- 平台:[发布平台]
- 数据:阅读量XX万,点赞XX,评论XX
- 发布时间:[时间]
**一、标题风格**
- 句式类型:[疑问句/感叹句/陈述句]
- 关键词:[使用了哪些关键词]
- 长度:[字数]
- 标题技巧:[使用了哪些技巧]
**二、内容结构**
- 开头方式:[故事/数据/冲突/金句]
- 段落节奏:[快/中/慢]
- 小标题:[有/无,风格]
- 整体结构:[总分总/问题解决/故事感悟]
**三、语言风格**
- 口语化程度:[高/中/低]
- 长短句比例:[短句占比XX%]
- 特殊句式:[排比/对仗/反问]
- 情感表达:[克制型/外放型]
**四、观点输出**
- 立场倾向:[中立/鲜明]
- 论证方式:[案例/数据/逻辑]
- 深度层次:[表象/原因/深层/价值]
- 独特观点:[文章的核心观点]
**五、传播成功要素**
- 情感触点:[击中了什么情绪]
- 价值提供:[给了读者什么]
- 传播动力:[为什么愿意转发]
- 差异化优势:[与同类内容的区别]
**六、竞品定位参考**(新增)
- 同赛道头部创作者:[列出3个]
- 他们的核心定位:[各有何差异]
- 我的差异化机会:[在哪里]
**七、可借鉴点**
- [列出可以学习和模仿的点]
**八、可超越点**
- [列出可以改进和超越的点]
FILE:references/viral-article-guide.md
# 爆款文章创作指南
## 目录
- [一、爆款文章的核心要素](#一爆款文章的核心要素)
- [二、标题创作技巧](#二标题创作技巧)
- [三、开头写作技巧](#三开头写作技巧)
- [四、内容结构设计](#四内容结构设计)
- [五、金句与爆点设计](#五金句与爆点设计)
- [六、六种风格文章模板](#六六种风格文章模板)
- [6.1 情感共鸣型文章模板](#61-情感共鸣型文章模板)
- [6.2 观点评论型文章模板](#62-观点评论型文章模板)
- [6.3 实用干货型文章模板](#63-实用干货型文章模板)
- [6.4 故事叙事型文章模板](#64-故事叙事型文章模板)
- [6.5 清单盘点型文章模板](#65-清单盘点型文章模板)
- [6.6 对话访谈型文章模板](#66-对话访谈型文章模板)
- [七、写作自检清单](#七写作自检清单)
## 一、爆款文章的核心要素
### 1.1 爆款公式
```
爆款文章 = 优质选题 × 情感共鸣 × 传播动力 × 精准受众
```
**四大要素**:
- **优质选题**:追热点、击痛点、有争议
- **情感共鸣**:让读者觉得"这就是在说我"
- **传播动力**:让读者愿意转发、点赞、评论
- **精准受众**:明确写给谁看,满足他们的需求
### 1.2 爆款数据特征
**量化指标**:
- 阅读量:10万+ 为爆款门槛
- 点赞率:>3% 为优质内容
- 转发率:>1% 为强传播力
- 完读率:>40% 为内容优质
**传播规律**:
- 前1小时:核心粉丝阅读
- 前6小时:朋友圈传播
- 前24小时:公域流量爆发
- 24小时后:长尾流量
## 二、标题创作技巧
### 2.1 标题公式库
#### 公式1:数字+结果
```
模板:[数字]个[方法/技巧],让你[结果]
示例:3个简单动作,让你每天多睡1小时
```
#### 公式2:对比反差
```
模板:[正面] vs [负面],[结果]
示例:月薪3千和月薪3万的人,区别在哪?
```
#### 公式3:悬念疑问
```
模板:为什么[现象]?答案竟然是[答案]
示例:为什么90后都不愿意结婚了?答案让人心酸
```
#### 公式4:情感共鸣
```
模板:[人群]的[痛点],说出了[数量]人的心声
示例:成年人的崩溃,说出了1000万人的心声
```
#### 公式5:反常识
```
模板:别再[常见做法]了,[正确做法]
示例:别再早起了,这才是高效工作的真相
```
#### 公式6:紧迫感
```
模板:[时间限制],[行动]
示例:最后3天!错过这波红利再等10年
```
### 2.2 标题自检清单
创作标题后,检验以下维度:
- [ ] 是否有吸引力?(让读者想点开)
- [ ] 是否清晰准确?(不标题党、不误导)
- [ ] 是否有情感?(引发好奇、认同或共鸣)
- [ ] 是否符合平台调性?(不同平台有不同风格)
- [ ] 是否在字数限制内?(建议20-30字)
### 2.3 A/B测试方法
为每篇文章准备3个标题候选:
**示例**:
原标题:如何提高工作效率
优化版1:每天只工作4小时,我是如何做到的?
优化版2:别再加班了,这3个方法让你效率翻倍
优化版3:月薪从5千到5万,我只做对了这件事
选择标准:
- 好奇心:哪个最能引发好奇?
- 相关性:哪个最符合内容?
- 情感:哪个最能打动目标受众?
## 三、开头写作技巧
### 3.1 开头类型库
#### 类型1:故事开头
**适用场景**:情感共鸣型文章
**模板**:
```
[时间],[地点],[人物]遇到了[事件]。
那一刻,[情感描述]。
这个场景,[引发共鸣]。
```
**示例**:
```
凌晨两点,小张还在公司加班。
手机突然震动,是妻子的消息:"孩子睡了,你什么时候回来?"
那一刻,他的眼眶湿润了。
这个场景,多少中年人都经历过。
```
#### 类型2:数据开头
**适用场景**:观点评论型、实用干货型
**模板**:
```
最近,一项数据显示:[数据内容]。
这个数字背后,[深层含义]。
它揭示了一个真相:[核心观点]。
```
**示例**:
```
最近,一项数据显示:90后平均负债12万。
这个数字背后,是年轻人无处安放的焦虑。
它揭示了一个真相:我们正在用透支未来,换取当下的体面。
```
#### 类型3:冲突开头
**适用场景**:观点评论型文章
**模板**:
```
[事件描述],引发[争议]。
一方认为:[观点A]。另一方认为:[观点B]。
争论的背后,是[深层矛盾]。
```
**示例**:
```
某公司要求员工签"自愿加班协议",引发热议。
一方认为:这是合法的。另一方认为:这是变相剥削。
争论的背后,是劳资关系的深层矛盾。
```
#### 类型4:悬念开头
**适用场景**:实用干货型文章
**模板**:
```
你有没有遇到过这样的情况:[痛点]。
我花了[时间],终于找到了答案:[核心方法]。
今天,我把这个方法分享给你。
```
**示例**:
```
你有没有遇到过这样的情况:明明很努力,却总是做不出成绩。
我花了3年时间,研究了100个成功案例,终于找到了答案:不是能力问题,是方法问题。
今天,我把这个方法分享给你。
```
### 3.2 开头自检清单
- [ ] 前50字是否抓住读者注意力?
- [ ] 是否有代入感?(读者能对号入座)
- [ ] 是否引出核心主题?
- [ ] 是否简洁有力?(不啰嗦)
## 四、内容结构设计
### 4.1 常见结构模板
#### 结构1:总-分-总
**适用场景**:观点评论型文章
```
开头:提出观点
├─ 分论点1:论据+案例
├─ 分论点2:论据+案例
└─ 分论点3:论据+案例
结尾:升华观点
```
#### 结构2:问题-分析-解决
**适用场景**:实用干货型文章
```
开头:提出问题
├─ 分析原因:为什么会这样?
├─ 分析影响:不解决会怎样?
└─ 解决方案:具体怎么做?
结尾:总结+鼓励
```
#### 结构3:故事-感悟-方法
**适用场景**:情感共鸣型文章
```
开头:讲述故事
├─ 故事展开:细节+情感
├─ 情感升华:引发共鸣
└─ 方法提炼:能给读者什么
结尾:金句收尾
```
#### 结构4:现象-本质-行动
**适用场景**:深度分析型文章
```
开头:描述现象
├─ 深挖本质:背后的逻辑
├─ 分析趋势:未来的走向
└─ 行动建议:应该怎么做
结尾:价值升华
```
### 4.2 段落节奏控制
**基本原则**:
- 段落长度:2-4行为宜,不超过6行
- 信息密度:每段一个核心观点
- 节奏变化:长短结合,有张有弛
**节奏示例**:
```
[短段] 这是一个看脸的时代。(1行)
[中段] 我们每天都在被各种"标准美"轰炸:短视频里的网红脸、广告里的模特身材、朋友圈里的精修自拍。(3行)
[长段] 这些信息不断告诉我们:你不够美,你需要改变。于是,我们开始焦虑,开始比较,开始怀疑自己。我们在镜子前停留的时间越来越长,在美颜相机里花费的精力越来越多。(5行)
[短段] 但这真的是我们想要的吗?(1行)
```
## 五、金句与爆点设计
### 5.1 金句创作公式
#### 公式1:对比式金句
```
模板:不是[A],而是[B]
示例:不是你不努力,而是你的方法错了
```
#### 公式2:转折式金句
```
模板:[常见认知],但[真相]
示例:我们总以为来日方长,却忘了世事无常
```
#### 公式3:排比式金句
```
模板:[A]的人,[结果A];[B]的人,[结果B];[C]的人,[结果C]
示例:自律的人,在享受自由;懒惰的人,在承受代价;犹豫的人,在蹉跎时光
```
#### 公式4:比喻式金句
```
模板:[事物]就像[比喻]
示例:成年人的世界,就像一座孤岛
```
#### 公式5:递进式金句
```
模板:[低层次]的人[行为A],[高层次]的人[行为B]
示例:低层次的人在抱怨,高层次的人在改变
```
### 5.2 爆点设计技巧
**什么是爆点**:
让读者忍不住想转发、点赞、评论的内容点
**爆点类型**:
| 爆点类型 | 触发情绪 | 设计方法 |
|---------|---------|---------|
| **共鸣点** | "这就是在说我" | 描述读者的真实处境 |
| **愤怒点** | "这太过分了" | 揭露不公、欺骗、侵害 |
| **感动点** | "太暖心了" | 讲述善良、奉献、温暖的故事 |
| **好奇点** | "原来如此" | 揭示反常识的真相 |
| **收获点** | "学到了" | 提供实用的方法和技巧 |
### 5.3 金句分布策略
**分布原则**:
- 开头:1个金句,吸引注意
- 中间:每300字1个金句,维持兴趣
- 结尾:1个金句,引发转发
**标记方法**:
在文章中用「」或【】标注金句,方便读者识别和引用
## 六、六种风格文章模板
### 6.1 情感共鸣型文章模板
**适用场景**:社会现象、民生话题、情感故事
**核心特点**:以情动人,让读者产生强烈代入感和情绪共鸣
**适用场景**:社会现象、民生话题、情感故事
**结构模板**:
```markdown
# [情感化标题]
[开头:故事引入,50-100字]
讲述一个真实或典型的故事场景,引发代入感。
## 一、[第一个情感触点]
[描述现象,200字]
用细节描绘读者的真实处境,让读者觉得"这就是在说我"。
> [金句1]
## 二、[第二个情感触点]
[深入剖析,300字]
分析现象背后的原因,引发深层共鸣。
> [金句2]
## 三、[第三个情感触点]
[情感升华,200字]
从个人到群体,从小情感到大情怀。
> [金句3]
## 结语
[总结+鼓励,100字]
给出温暖的结尾,让读者带着力量离开。
> [金句4 - 核心金句]
```
### 6.2 观点评论型文章模板
**适用场景**:社会事件、行业热点、争议话题
**结构模板**:
```markdown
# [争议性标题]
[开头:事件引入,50-100字]
简述事件经过,提出核心观点。
## 一、[现象描述]
[事件详情,200字]
客观描述事件,提供充分的事实依据。
## 二、[观点阐述]
[核心观点,400字]
明确表达立场,用论据和案例支撑观点。
**分论点1**:[论据+案例]
**分论点2**:[论据+案例]
**分论点3**:[论据+案例]
> [金句]
## 三、[深层分析]
[深度挖掘,300字]
分析事件背后的社会问题或深层逻辑。
## 四、[行动建议]
[解决方案,200字]
给出具体的建议或行动指南。
## 结语
[升华观点,100字]
从事件上升到价值观,引发思考。
```
### 6.3 实用干货型文章模板
**适用场景**:知识热点、技能话题、经验分享
**结构模板**:
```markdown
# [数字+结果标题]
[开头:痛点引入,50-100字]
描述读者遇到的问题,引发共鸣。
## 一、[问题诊断]
[分析原因,200字]
分析为什么会出现这个问题,指出关键症结。
## 二、[核心方法]
[方法介绍,500字]
提供系统的解决方案,步骤清晰。
**步骤1**:[具体操作]
**步骤2**:[具体操作]
**步骤3**:[具体操作]
> [金句]
**案例演示**:[真实案例]
用具体案例演示方法的应用。
## 三、[常见误区]
[避坑指南,200字]
列出常见错误,帮助读者少走弯路。
## 四、[进阶建议]
[提升方向,200字]
给出进一步优化的建议。
## 结语
[总结+鼓励,100字]
总结核心要点,鼓励读者行动。
```
### 6.4 故事叙事型文章模板
**适用场景**:个人经历、成长故事、创业历程、职业转型
**核心特点**:以叙事为主线,在故事中传递价值和启发
**结构模板**:
```markdown
# [悬念式标题]
[开头:设置悬念,100字以内]
用一个未解之谜或悬念开头,让读者想知道接下来发生了什么。
## [第一阶段:起点]
[背景交代,150-200字]
我是谁/我当时的处境/为什么会开始这段旅程。
提供足够的背景信息,让读者理解后续选择。
**转折点**:[一句话描述那个改变一切的瞬间]
## [第二阶段:挑战]
[困难描述,300-400字]
遇到了什么障碍?
- 困难1:[具体描述]
- 困难2:[具体描述]
- 困难3:[具体描述]
**最低谷时刻**:[那个几乎想放弃的瞬间]
## [第三阶段:突破]
[转折与成长,200-300字]
是什么让我坚持下来?
- 转机1:[发生了什么]
- 转机2:[又发生了什么]
> [金句 - 核心领悟]
## [第四阶段:结果]
[成果展示,150-200字]
最终取得了什么?
用数据或具体成果佐证故事的可信度。
## 结语
[启示与价值,100-150字]
这个故事想告诉读者什么?
提供一个可落地的建议或启发。
> [核心金句 - 用于引发转发]
---
**互动话题**:[与故事相关的问题]
```
---
### 6.5 清单盘点型文章模板
**适用场景**:趋势预测、工具推荐、资源汇总、年度盘点
**核心特点**:信息密度高、实用性强、易于收藏和转发
**结构模板**:
```markdown
# [数字+价值型标题]
[价值预告开头,50-100字]
直接告诉读者这篇文章能带来什么价值。
**快速预览**:
- [总数]个[核心主题]
- 预计阅读时间:[X]分钟
- 适合人群:[目标受众]
## [引导语]
[为什么需要这个清单,100-150字]
当前的问题/需求是什么?
为什么这个清单能解决问题?
## 一、[第一个要点]
[核心内容,150-200字]
- 核心观点/工具/方法
- 关键优势
- 适用场景
**案例**:[具体应用示例]
## 二、[第二个要点]
[核心内容,150-200字]
(同上结构)
## 三、[第三个要点]
[核心内容,150-200字]
(同上结构)
## 四、[第四个要点]
[核心内容,150-200字]
(同上结构)
> [金句 - 贯穿全文的核心观点]
## 五、[第五个要点]
[核心内容,150-200字]
(同上结构)
## 结语
[总结与行动指南,100-150字]
总结清单的核心价值。
给读者一个立即行动的理由。
**收藏清单**:
- [ ] [行动项1]
- [ ] [行动项2]
- [ ] [行动项3]
> [收尾金句]
---
**互动话题**:[关于清单的问题]
```
---
### 6.6 对话访谈型文章模板
**适用场景**:专家观点、人物采访、行业洞察、经验分享
**核心特点**:通过问答形式传递信息,真实感强、互动性好
**结构模板**:
```markdown
# [主题+访谈型标题]
[背景介绍,100字以内]
为什么要做这次访谈?
这个人物/话题有什么特别之处?
---
**受访者简介**:
- 身份:[职位/背景]
- 成就:[核心成就]
- 代表作:[相关作品/案例]
---
## Q1:[核心问题1]
**问题**:[直接切入痛点或核心的问题]
**回答**:
[深度回答内容,200-300字]
用受访者的原话/核心观点支撑。
> [精彩语录/核心金句]
---
## Q2:[核心问题2]
**问题**:[递进式问题]
**回答**:
[深度回答内容,200-300字]
**补充**:[相关案例或故事]
> [精彩语录/核心金句]
---
## Q3:[核心问题3]
**问题**:[升华性问题]
**回答**:
[深度回答内容,200-300字]
从具体到抽象,从技术到价值。
> [精彩语录/核心金句]
---
## Q4:[实用性问题]
**问题**:[给读者的行动建议]
**回答**:
[具体可操作的建议]
**快速清单**:
1. [建议1]
2. [建议2]
3. [建议3]
---
## 结语
[总结要点,100字]
这次访谈的核心收获。
对读者的启发。
---
**读者互动**:
你最认同受访者的哪个观点?欢迎在评论区分享。
```
---
## 七、写作自检清单
### 7.1 内容质量检查
- [ ] 选题是否有价值?(读者能得到什么)
- [ ] 观点是否明确?(一个核心观点贯穿全文)
- [ ] 论据是否充分?(案例/数据/逻辑支撑)
- [ ] 逻辑是否通顺?(过渡自然,无跳跃)
- [ ] 信息是否准确?(数据真实,人物真实)
- [ ] 是否有独特视角?(与同类文章的差异点)
### 7.2 情感共鸣检查
- [ ] 开头是否吸引人?(50字内抓住注意力)
- [ ] 是否有代入感?(读者能"对号入座")
- [ ] 是否引发情感?(愤怒/感动/焦虑/好奇/认同)
- [ ] 金句是否到位?(每篇至少4个金句)
- [ ] 结尾是否有力量?(引发转发)
### 7.3 传播动力检查
- [ ] 标题是否有吸引力?(引发好奇或共鸣)
- [ ] 是否值得转发?(身份认同/利他/情绪出口)
- [ ] 是否有收获感?(读完有学到/有启发)
- [ ] 是否有社交货币?(分享显得我有深度)
- [ ] 平台适配是否正确?(不同平台不同风格)
### 7.4 格式规范检查
- [ ] 字数是否合适?(1500-2500字,小红书≤1000字)
- [ ] 段落是否合理?(每段2-4行,不超过6行)
- [ ] 小标题是否清晰?(每300字一个)
- [ ] 是否有金句标注?(用引用格式突出)
- [ ] 小红书限制是否遵守?(标题≤20字)
- [ ] emoji和标签是否添加?(平台适配)
### 7.5 SEO优化检查(公众号/知乎/头条适用)
- [ ] 关键词是否自然融入标题?
- [ ] 文章开头是否包含核心关键词?
- [ ] 是否有2-3个长尾关键词分布全文?
- [ ] 标题是否包含搜索热词?
- [ ] 是否有内链锚文本?(公众号适用)
---
## 八、SEO搜索优化指南
### 8.1 SEO基础理论
**核心公式**:
```
搜索排名 = 内容质量 × 关键词优化 × 用户体验 × 外部信号
```
**排名因素权重**:
| 因素 | 权重 | 说明 |
|------|------|------|
| 内容质量 | 35% | 原创性、深度、价值 |
| 关键词优化 | 25% | 标题、正文、标签 |
| 用户体验 | 20% | 可读性、停留时间 |
| 外部信号 | 20% | 转发、评论、收藏 |
---
### 8.2 关键词策略
**关键词分类**:
| 类型 | 定义 | 示例 | 优化难度 |
|------|------|------|---------|
| **核心关键词** | 主题核心词 | "职场沟通" | ⭐⭐⭐⭐⭐ |
| **长尾关键词** | 具体问题词 | "如何让同事听我的建议" | ⭐⭐⭐ |
| **时效关键词** | 带时间词 | "2026年职场趋势" | ⭐⭐ |
| **疑问关键词** | 用户问句 | "为什么升职的是他" | ⭐⭐⭐ |
**关键词挖掘方法**:
```
1. 百度指数:查看搜索趋势
2. 5118工具:长尾词挖掘
3. 搜索下拉:自动联想词
4. 竞品分析:参考对手关键词
5. 用户调研:了解用户搜索习惯
```
**关键词布局模板**:
```
标题(Title):
格式:[核心关键词] + [修饰词] + [价值词]
示例:职场沟通技巧:3个方法让同事更愿意听你说
字数:≤30字
描述(Description):
格式:[核心主题] + [内容概括] + [价值承诺]
示例:本文分享3个实用的职场沟通技巧,帮助你更好地与同事沟通,提高工作效率和团队协作。
字数:≤80字
正文(Content):
- 开头100字:核心关键词 + 核心观点
- 中间段落:长尾关键词自然融入
- 结尾:核心关键词 + 行动号召
- 关键词密度:2-5%
标签(Tags):
- 3-5个标签
- 包含:核心词 + 长尾词 + 话题词
示例:#职场沟通 #职场技巧 #向上管理 #高效沟通
```
---
### 8.3 各平台SEO优化
#### 微信公众号SEO
**核心要素**:
| 要素 | 要求 | 说明 |
|------|------|------|
| 公众号名称 | 包含核心关键词 | 如"职场成长笔记" |
| 文章标题 | 前20字含关键词 | 微信显示有限制 |
| 原创声明 | 必须开启 | 影响推荐权重 |
| 阅读原文 | 添加外链 | 可跳转落地页 |
**优化技巧**:
```
1. 标题优化:
- 核心关键词靠前
- 避免纯标题党
- 包含数字和情绪词
2. 正文优化:
- 开头包含关键词
- 小标题含长尾词
- 自然融入2-3个长尾词
3. 底部优化:
- 引导关注公众号
- 引导转发朋友圈
- 添加往期推荐链接
```
#### 知乎SEO
**核心要素**:
| 要素 | 要求 | 说明 |
|------|------|------|
| 问题标题 | 含搜索词 | 用户搜索的问题 |
| 回答开头 | 正面回答 | 直接给出结论 |
| 内容深度 | 专业权威 | 影响推荐权重 |
| 互动数据 | 点赞评论 | 影响热度和排名 |
**优化技巧**:
```
1. 问题选择:
- 选择高搜索量问题
- 问题描述含关键词
- 优先选择关注者多的问题
2. 回答结构:
- 开头:直接回答问题
- 中间:详细分析和论证
- 结尾:总结+行动建议
3. SEO元素:
- 使用标题标签(H1/H2)
- 添加相关问题链接
- 引用权威来源和数据
```
#### 小红书SEO
**核心要素**:
| 要素 | 要求 | 说明 |
|------|------|------|
| 标题 | ≤20字,含关键词 | 决定搜索曝光 |
| 正文 | 开头含关键词 | 算法抓取 |
| 话题标签 | 3-5个相关标签 | 影响推荐 |
| 图片文字 | 关键词可识别 | ALT文字 |
**优化技巧**:
```
1. 标题优化:
- 前10字含核心关键词
- 包含数字和emoji
- 制造好奇或共鸣
2. 正文优化:
- 开头50字:核心关键词+痛点
- 中间段落:自然融入长尾词
- 结尾:关键词+互动引导
3. 标签优化:
- 选择高热度标签
- 组合:领域词+话题词+热点词
- 避免无关标签
```
#### 头条号SEO
**核心要素**:
| 要素 | 要求 | 说明 |
|------|------|------|
| 标题 | 含关键词+悬念 | 影响点击率 |
| 正文 | 时效性强 | 算法优先时效 |
| 配图 | 相关性高 | 影响推荐 |
| 领域垂直 | 内容一致 | 账号权重 |
**优化技巧**:
```
1. 标题优化:
- 包含关键词
- 制造悬念或好奇
- 控制字数25字左右
2. 内容优化:
- 保持时效性
- 信息密度高
- 结构清晰易读
3. 发布优化:
- 选择黄金时间
- 开启原创保护
- 添加话题标签
```
#### 百家号SEO
**核心要素**:
| 要素 | 要求 | 说明 |
|------|------|------|
| 标题 | 原创+关键词 | 百度收录关键 |
| 正文 | 原创度高 | ≥85%原创 |
| 配图 | 原创+高清 | 影响推荐 |
| 领域专注 | 内容垂直 | 账号权重 |
**优化技巧**:
```
1. 标题优化:
- 包含搜索热词
- 符合用户搜索习惯
- 避免标题党
2. 内容优化:
- 首发百家号
- 原创度≥85%
- 添加相关配图
3. SEO元素:
- 添加锚文本链接
- 使用小标题分段
- 关键词加粗
```
---
### 8.4 SEO自检清单
**发布前检查**:
```
基础SEO检查:
- [ ] 标题包含核心关键词
- [ ] 标题符合平台字数要求
- [ ] 正文开头包含关键词
- [ ] 有2-3个长尾关键词分布
- [ ] 关键词密度在2-5%
平台适配检查:
- [ ] 标题符合平台风格
- [ ] 标签/话题选择合适
- [ ] 配图与内容相关
- [ ] 原创度≥85%(百家号/头条)
内容质量检查:
- [ ] 提供独特价值
- [ ] 结构清晰易读
- [ ] 有数据和案例支撑
- [ ] 结尾有行动号召
```
---
### 8.5 SEO效果监测
**核心指标**:
| 指标 | 说明 | 优化方向 |
|------|------|---------|
| 搜索曝光 | 文章被搜索到的次数 | 优化关键词 |
| 点击率 | 曝光→点击比例 | 优化标题和配图 |
| 完读率 | 读完用户比例 | 优化内容和结构 |
| 互动率 | 评论/收藏/转发 | 优化结尾引导 |
| 搜索排名 | 具体词排名位置 | 长期优化积累 |
**优化周期**:
```
发布后24小时:
- 监测点击率和搜索排名
- 根据数据调整标题
发布后3天:
- 分析完读率和互动率
- 优化内容和结构
发布后7天:
- 评估整体SEO效果
- 记录成功策略
```
FILE:assets/article-template.md
# 文章输出模板
## 一、模板选择说明
**精写模式模板**(输出1篇精修 + 2个备选标题)
**批量模式模板**(输出3篇差异化版本)
---
## 二、文章头部信息
```markdown
---
标题:[文章标题]
副标题:[可选,用于补充说明]
作者:[作者名]
标签:#标签1 #标签2 #标签3
字数:[实际字数]
文章定位:[情感共鸣/观点评论/实用干货/故事叙事/清单盘点/对话访谈]
发布平台建议:[推荐平台]
最佳发布时间:[建议时间]
---
```
## 二、文章正文模板
### 模板A:情感共鸣型
```markdown
# [情感化标题]
[故事开头,50-100字]
用一个典型场景或故事引入,快速建立代入感。
## [第一个小标题 - 情感触点]
[正文段落,200-300字]
描述读者的真实处境,用细节引发共鸣。
> [金句1]
## [第二个小标题 - 深入剖析]
[正文段落,300-400字]
分析现象背后的原因,从表面深入本质。
**案例**:[具体案例]
用真实故事支撑观点。
> [金句2]
## [第三个小标题 - 情感升华]
[正文段落,200-300字]
从个人到群体,从小情感到大情怀,升华主题。
> [金句3]
## 结语
[总结段落,100-150字]
给出温暖的结尾,让读者带着力量和思考离开。
> [核心金句 - 用于引发转发]
---
**互动话题**:[提问,引发评论]
```
### 模板B:观点评论型
```markdown
# [争议性标题]
[事件引入,50-100字]
简述事件经过,提出核心观点。
## [第一个小标题 - 事件描述]
[正文段落,200-300字]
客观描述事件,提供充分的事实依据。
**时间线**:
- [时间1]:[事件节点1]
- [时间2]:[事件节点2]
- [时间3]:[事件节点3]
## [第二个小标题 - 观点阐述]
[正文段落,400-500字]
明确表达立场,用论据和案例支撑观点。
**核心观点**:[一句话概括观点]
**论据1**:[论据内容]
**论据2**:[论据内容]
**论据3**:[论据内容]
> [金句]
## [第三个小标题 - 深层分析]
[正文段落,300-400字]
分析事件背后的社会问题或深层逻辑,提供独特视角。
## [第四个小标题 - 行动建议]
[正文段落,200-300字]
给出具体的建议或行动指南,让读者有收获。
**建议清单**:
1. [建议1]
2. [建议2]
3. [建议3]
## 结语
[升华段落,100-150字]
从事件上升到价值观,引发读者思考。
---
**你的观点是什么?欢迎在评论区留言。**
```
### 模板C:实用干货型
```markdown
# [数字+结果标题]
[痛点引入,50-100字]
描述读者遇到的问题,引发强烈共鸣。
**你是否遇到这些问题**:
- [问题1]
- [问题2]
- [问题3]
## [第一个小标题 - 问题诊断]
[正文段落,200-300字]
分析为什么会出现这个问题,指出关键症结。
**根本原因**:[核心原因]
## [第二个小标题 - 核心方法]
[正文段落,500-600字]
提供系统的解决方案,步骤清晰可操作。
### 步骤一:[步骤名称]
[具体操作说明]
**操作要点**:
- [要点1]
- [要点2]
### 步骤二:[步骤名称]
[具体操作说明]
**操作要点**:
- [要点1]
- [要点2]
### 步骤三:[步骤名称]
[具体操作说明]
> [金句]
## [第三个小标题 - 案例演示]
[正文段落,200-300字]
用具体案例演示方法的应用,让读者看到效果。
**案例**:[案例描述]
**应用**:[如何应用方法]
**结果**:[取得的效果]
## [第四个小标题 - 常见误区]
[正文段落,200-300字]
列出常见错误,帮助读者少走弯路。
**常见错误**:
1. ❌ [错误做法] → ✅ [正确做法]
2. ❌ [错误做法] → ✅ [正确做法]
3. ❌ [错误做法] → ✅ [正确做法]
## 结语
[总结段落,100-150字]
总结核心要点,鼓励读者行动。
**行动清单**:
- [ ] [行动项1]
- [ ] [行动项2]
- [ ] [行动项3]
---
**如果你觉得有用,请点赞收藏,分享给更多人。**
```
---
## 三、SEO优化模板
### 3.1 SEO标题公式
```
格式:[核心关键词] + [修饰词] + [价值词/数字]
优秀示例:
✅ 职场沟通技巧:3个方法让同事更愿意听你说
✅ 月薪3000和30000的人,差别就在这5点
✅ 为什么你总是说不到点子上?学会这招就够了
❌ 差示例:
❌ 你绝对想不到!同事竟然这样说!(无关键词)
```
### 3.2 关键词布局
```
正文关键词分布:
├── 开头100字:核心关键词 ×1
├── 每个段落:长尾关键词 ×1-2
├── 小标题:含核心词
├── 结尾:核心关键词 ×1
└── 总计:核心词2-3次,长尾词3-5次
```
### 3.3 标签组合模板
```
标签选择(3-5个):
#核心关键词 ← 核心词(高搜索)
#相关领域词 ← 领域扩展
#受众词 ← 目标人群
#话题词 ← 具体话题
```
---
## 四、质量评分模板
### 4.1 评分报告格式
```
📊 文章质量评分报告
文章标题:[标题]
评分时间:[时间]
一、综合评分
┌────────────────────────────────────────┐
│ 总分:[X]/100 │
│ 等级:[⭐⭐⭐⭐⭐] │
│ 状态:[✅可发布/⚠️需优化/❌需重写] │
└────────────────────────────────────────┘
二、分项评分
├── 内容质量:[X]/30
├── 情感共鸣:[X]/25
├── 可读性:[X]/20
├── 传播性:[X]/15
└── SEO优化:[X]/10
三、违禁词检查
✅/❌ [检查结果]
四、优化建议
[具体优化建议列表]
```
### 4.2 评分维度说明
| 维度 | 权重 | 评分标准 |
|------|------|---------|
| 内容质量 | 30% | 原创性(0-10)、深度(0-10)、逻辑性(0-10) |
| 情感共鸣 | 25% | 代入感(0-10)、情绪触发(0-10)、金句(0-10) |
| 可读性 | 20% | 段落长度(0-10)、语言流畅(0-10)、结构清晰(0-10) |
| 传播性 | 15% | 标题吸引力(0-10)、转发动力(0-10)、社交货币(0-10) |
| SEO优化 | 10% | 关键词布局(0-10)、标签设置(0-10) |
---
## 五、输出规范说明
### 5.1 字数要求
- **总字数**:1500-2500字
- **开头**:50-100字
- **每个段落**:150-300字
- **结语**:100-150字
### 3.2 格式要求
- **段落长度**:每段2-4行,不超过6行
- **小标题**:每300字左右设置一个小标题
- **金句**:每篇文章至少4个金句,用引用格式标注
- **重点内容**:用粗体或列表突出
- **SEO关键词**:自然融入2-3个长尾关键词
### 3.3 标签规范
- 每篇文章设置3-5个标签
- 标签应包含:领域标签 + 话题标签 + 受众标签
- 示例:#职场 #个人成长 #年轻人
### 3.4 平台建议
根据文章风格和时效等级推荐发布平台:
| 文章类型 | 推荐平台 | 发布时间建议 | 时效策略 |
|---------|---------|-------------|---------|
| 情感共鸣型 | 微信公众号、小红书 | 晚上8-10点 | 通用 |
| 观点评论型 | 微博、知乎、今日头条 | 早上7-9点 | 快速 |
| 实用干货型 | 小红书、知乎、公众号 | 中午12-13点 | 深度 |
| 故事叙事型 | 微信公众号、小红书 | 晚上9-11点 | 通用 |
| 清单盘点型 | 知乎、微信公众号 | 周末/工作日午间 | 长效 |
| 对话访谈型 | 知乎、微信公众号 | 下午2-4点 | 通用 |
### 3.5 差异化定位说明(批量模式使用)
为三篇文章制定差异化定位:
```
文章一:[定位人群] - [核心卖点]
文章定位:情感共鸣型
核心卖点:[差异点]
预计爆款率:高/中/低
文章二:[定位人群] - [核心卖点]
文章定位:实用干货型
核心卖点:[差异点]
预计爆款率:高/中/低
文章三:[定位人群] - [核心卖点]
文章定位:观点评论型
核心卖点:[差异点]
预计爆款率:高/中/低
```
## 四、完整示例
### 示例:情感共鸣型文章
```markdown
---
标题:成年人的崩溃,往往只需要一个瞬间
标签:#职场 #成年人 #情感共鸣
字数:2100字
发布平台建议:微信公众号、小红书
最佳发布时间:晚上9点
---
# 成年人的崩溃,往往只需要一个瞬间
凌晨两点,小张还在公司加班。手机突然震动,是妻子的消息:"孩子睡了,你什么时候回来?"那一刻,他的眼眶湿润了。这个场景,多少中年人都经历过。
## 你以为的坚强,其实是一直在硬撑
我们总以为,成年人应该是坚强的。无论遇到什么困难,都要咬牙坚持,不能示弱,不能抱怨。于是,我们学会了在工作中忍耐,在生活中妥协,在深夜里独自消化所有的情绪。
> 真正的坚强,不是不流泪,而是含着眼泪继续奔跑。
但有时候,那个一直紧绷的弦,只需要一个微小的触动就会断裂。可能是一句关心的话,可能是一个温暖的目光,可能是深夜里的一条消息。在那一刻,所有的委屈、疲惫、无奈,全都涌上心头。
这就是成年人的崩溃,来得无声无息,却又排山倒海。
## 崩溃的背后,是无法言说的孤独
为什么成年人更容易崩溃?因为我们承受了太多的压力,却找不到可以倾诉的对象。
工作上,我们要面对领导的压力、同事的竞争、客户的挑剔。生活中,我们要承担房贷车贷、子女教育、父母养老。每一项都是沉重的负担,每一项都不能松懈。
> 成年人的世界,没有"容易"二字,只有"坚持"二字。
我们不敢在同事面前表现软弱,怕被认为能力不足。我们不敢在家人面前表达疲惫,怕让他们担心。我们不敢在朋友面前诉苦,怕被认为是负能量。
于是,我们学会了伪装,学会了压抑,学会了一个人扛下所有。但压抑的情绪不会消失,它们只是暂时被埋藏,等待一个出口。
## 允许自己崩溃,也是一种力量
很多人认为,崩溃是软弱的表现。但事实恰恰相反,允许自己崩溃,恰恰是一种勇气的体现。
当我们承认自己的脆弱,当我们允许自己流泪,当我们向他人寻求帮助,这都是在给自己减压。只有释放了积压的情绪,我们才能重新站起来,继续前行。
> 承认脆弱,不是放弃,而是为了更好地继续。
如果你正在经历崩溃,请记住:这不是你的错,也不是你的失败。这只是提醒你,你已经承受了太多,需要休息一下,需要给自己一些温柔。
## 结语
成年人的世界,确实不容易。但请相信,每一次崩溃过后,都是一次重生。我们会变得更加坚强,更加懂得珍惜自己。
如果你此刻正在经历崩溃,请允许自己休息一下。明天的太阳依然会升起,而你,依然可以重新出发。
> 愿你在崩溃过后,依然温柔地爱这个世界,也温柔地爱自己。
---
**互动话题**:你上一次崩溃是因为什么?欢迎在评论区分享你的故事。
```
热点分析与爆款挖掘工具;当用户需要热点查询、话题热度分析、选题推荐时使用。挖掘公众号、抖音、小红书三大平台爆款内容,聚合关键词。
---
name: 搜爆款作品小助手
description: 热点分析与爆款挖掘工具;当用户需要热点查询、话题热度分析、选题推荐时使用。挖掘公众号、抖音、小红书三大平台爆款内容,聚合关键词。
---
# 搜爆款作品小助手
触发本技能并需要执行完整流程时,**必须先读取**与本技能同目录下的 `references/core_workflow.md`,并**完整遵循**其中的触发规则、术语规范、数据来源约束、完整操作步骤、自检清单与注意事项。
FILE:_skillhub_meta.json
{
"name": "viral-content-miner",
"installedAt": 1775790343311,
"source": "import"
}
FILE:references/angle-mining-guide.md
# 创作角度挖掘指南
## 目录
- [角度挖掘框架](#角度挖掘框架)
- [空白角度](#1-空白角度)
- [差异化角度](#2-差异化角度)
- [热点结合角度](#3-热点结合角度)
- [人群细分角度](#4-人群细分角度)
- [角度评估维度](#角度评估维度)
- [爆款潜力评估](#爆款潜力评估)
- [评级标准](#评级标准)
- [平台适配建议](#平台适配建议)
- [小红书](#小红书)
- [抖音](#抖音)
- [公众号](#公众号)
- [B站](#b站)
- [快手](#快手)
## 角度挖掘框架
### 1. 空白角度
定义:高热度但内容少的方向
**识别方法**:
- 关键词搜索频率高 + 爆款文章少
- 用户需求明确 + 供给不足
- 平台有流量倾斜 + 内容稀缺
**示例**:
```
话题:户外露营
发现:搜索"懒人露营"频率高,但爆款文章少
角度:懒人露营攻略(一键搭建、极简装备)
```
### 2. 差异化角度
定义:现有爆款的反向或补充
**识别方法**:
- 现有爆款风格 + 反向表达
- 现有爆款内容 + 补充信息
- 现有爆款观点 + 不同立场
**示例**:
```
现有爆款:成都周边5个露营地推荐
差异化角度:成都周边露营踩坑记录(避雷指南)
```
### 3. 热点结合角度
定义:话题 + 当前热点事件
**识别方法**:
- 话题 + 节日/季节
- 话题 + 社会热点
- 话题 + 明星/网红
**示例**:
```
话题:户外露营
热点:五一假期
角度:五一露营攻略(避开人挤人)
```
### 4. 人群细分角度
定义:话题 + 特定人群
**识别方法**:
- 话题 + 新手
- 话题 + 宝妈
- 话题 + 学生
- 话题 + 老年人
- 话题 + 职场人
**示例**:
```
话题:户外露营
人群:宝妈
角度:带娃露营装备清单(省心版)
```
## 角度评估维度
### 爆款潜力评估
| 维度 | 权重 | 评估标准 |
|------|------|---------|
| 热度 | 30% | 搜索频率、话题热度 |
| 竞争 | 25% | 现有内容数量、质量 |
| 差异化 | 20% | 与现有爆款的区别度 |
| 实用性 | 15% | 能否解决用户问题 |
| 传播性 | 10% | 是否容易引发分享 |
### 评级标准
| 评级 | 分数 | 标识 | 建议 |
|------|------|------|------|
| 极高潜力 | 90-100 | ⭐⭐⭐⭐⭐ | 优先创作 |
| 高潜力 | 80-89 | ⭐⭐⭐⭐ | 推荐创作 |
| 中等潜力 | 70-79 | ⭐⭐⭐ | 可尝试 |
| 低潜力 | 60-69 | ⭐⭐ | 谨慎投入 |
| 极低潜力 | <60 | ⭐ | 不建议 |
## 平台适配建议
### 小红书
- **适合角度**:攻略型、种草型、避坑型
- **标题风格**:数字型、情绪词、人群标签
- **内容特点**:图文结合、实用性强、收藏率高
### 抖音
- **适合角度**:体验型、观点型、搞笑型
- **标题风格**:悬念型、反差型、话题型
- **内容特点**:快节奏、强情绪、音乐配合
### 公众号
- **适合角度**:深度分析型、观点型、行业型
- **标题风格**:标题党、悬念型、价值承诺
- **内容特点**:长文、专业性强、有深度
### B站
- **适合角度**:教程型、测评型、故事型
- **标题风格**:专业型、话题型、UP主风格
- **内容特点**:中长视频、弹幕互动、投币收藏
### 快手
- **适合角度**:真实体验型、接地气型
- **标题风格**:口语化、老铁风
- **内容特点**:真实感、互动性强
FILE:references/core_workflow.md
## 技能定位
**核心价值**:帮助内容创作者快速了解一个话题的热度全貌,挖掘公众号、抖音、小红书三大平台爆款内容。
**数据来源限制**:
- ✅ **允许**:公众号、抖音、小红书(共 3 个平台)
- ❌ **排除**:快手、B站、视频号、知乎、微博、今日头条、百度贴吧、豆瓣、网易号等其他平台
## 触发条件
当用户有以下需求时**必须**使用本技能:
### 场景 1:热点查询
- "最新的话题有哪些"
- "抖音/小红书/公众号有什么热点"
- "三大平台最近什么话题最火"
- "帮我看看热搜"
> 说明:虽然用户可能说"全网",但实际只查询以下 3 个平台数据
### 场景 2:指定话题分析
- "帮我分析一下 XX 话题的热度"
- "XX 事件最近有什么爆款内容"
- "我想了解 XX 话题的关键词"
- "帮我把 XX 话题的爆款内容挖出来"
- "分析一下 XX 为什么火了"
- "XX 话题在哪些平台比较火"
## 核心流程
```
输入话题 → 关键词提取 → 多平台搜索 → 数据验证 → 关键词聚合
```
### Step 1: 关键词提取与扩展
**输入处理**:
1. 用户输入话题/事件描述
2. 提取核心关键词(人名、地名、事件名、产品名等)
3. 扩展关联关键词:
- 相关人物/品牌/机构
- 相关地点/场景
- 相关话题/标签
- 相关情绪词/热词
**输出**:
```
核心关键词:[词1, 词2, 词3]
关联关键词:[词A, 词B, 词C, ...]
搜索关键词组合:[组合1, 组合2, 组合3, ...]
```
### Step 2: 平台爆款搜索
> **重要限制**:所有数据来源**必须且只能**来自以下 3 个平台,**严禁**延伸到其他平台(如快手、B站、视频号、知乎、微博、今日头条等)。
**核心平台清单**(严格限定,共 3 个):
| 平台 | 搜索策略 | 爆款标准 | 内容特点 |
| ------ | --------------------------------------- | ---------------------- | ---------------------- |
| 公众号 | "[话题] 公众号 10w+"、"[话题] 爆款文章" | 阅读 10w+ / 点赞 1000+ | 长文、深度、专业 |
| 抖音 | "[话题] 抖音热门"、"抖音 [话题] 爆款" | 点赞 10w+ / 播放 100w+ | 短视频、强情绪、快节奏 |
| 小红书 | "[话题] 小红书爆款"、"[话题] 收藏过万" | 收藏 1w+ / 点赞 5w+ | 图文、实用、种草属性 |
> **核心平台**:以上 3 个是唯一允许的数据来源,所有搜索结果、数据采集、分析报告**必须**来自以上平台
**搜索关键词组合**:
| 组合类型 | 搜索词模板 | 适用场景 |
| ------------ | ---------------------------------------------------------- | -------------- |
| **基础热门** | "[话题] 爆款"、"[话题] 热门" | 通用热门内容 |
| **基础数据** | "[话题] 点赞过万"、"[话题] 10w+" | 量化筛选内容 |
| **公众号** | "[话题] 公众号 10w+"、"公众号 [话题] 爆款文章" | 公众号内容 |
| **抖音** | "抖音 [话题] 热门"、"抖音 [话题] 爆款" | 抖音平台内容 |
| **小红书** | "小红书 [话题] 爆款"、"[话题] 小红书收藏过万" | 小红书平台内容 |
| **内容类型** | "[话题] 攻略"、"[话题] 教程"、"[话题] 测评"、"[话题] 吐槽" | 特定内容类型 |
> **⚠️ 平台限制**:所有搜索词**必须**包含平台名称,不得搜索其他平台(如知乎、微博、今日头条等)的内容
**数据采集字段**:
每次搜索需从以下平台采集信息:
1. **文章话题**:从标题和摘要中提取核心话题
2. **标题**:完整标题
3. **描述**:搜索结果摘要(50-100 字)
4. **平台**:识别来源平台(必须为以下 3 个之一:公众号/抖音/小红书)
5. **发布时间**:提取发布日期
6. **互动数据**:点赞/收藏/转发/评论数
7. **来源链接**:可访问的原文链接
> **⚠️ 数据来源限制**:只采集来自以上 3 个平台的数据。如果搜索结果中包含其他平台(如快手、B站、视频号、知乎、微博等)的内容,**必须排除**,不得纳入分析
### Step 3: 数据验证与清洗
**验证维度**:
| 验证项 | 验证标准 | 验证方法 | 优先级 |
| ---------------- | ------------------------------------------------------- | -------------------------- | ------ |
| **平台来源验证** | **必须**来自以下 3 个平台之一,其他平台内容**一律排除** | 检查 URL 域名/平台标识 | P0 |
| **时效性验证** | 必须为 2026 年后发布,优先近 30 天内 | 检查发布时间戳 | P0 |
| **互动数据验证** | 达到 P0 平台爆款标准 | 提取搜索结果中的数据关键词 | P1 |
| **数据真实性** | 有明确来源或可验证 | 交叉验证多个 P0 平台来源 | P2 |
> **允许的平台**:公众号、抖音、小红书
> **排除的平台**:快手、B站、视频号、知乎、微博、今日头条、百度贴吧、豆瓣、网易号、搜狐号、新浪看点等(一律不采集)
**时效性验证规则**(强制要求):
| 时效等级 | 时间范围 | 标识 | 处理方式 |
| ----------- | --------- | -------- | ---------- |
| ⚡ 实时热点 | 24 小时内 | 优先推荐 | 必须包含 |
| 🆕 新鲜爆款 | 3 天内 | 优先推荐 | 必须包含 |
| 📈 持续升温 | 7 天内 | 推荐使用 | 建议包含 |
| 📊 热度稳定 | 30 天内 | 可用 | 筛选后包含 |
| ❌ 超出范围 | 30 天以上 | 丢弃 | 排除 |
| ❌ 时间未知 | 无法确认 | 谨慎使用 | 标注后可选 |
> **重要**:根据 README 要求,**必须确保数据源为近一个月内(2026 年之后)**。任何 2026 年之前的内容都应标注为"历史数据"或排除。
**数据标注**:
| 标注 | 含义 | 使用场景 |
| ---- | ------------------------ | ---------------- |
| ✅ | 符合爆款标准,数据已验证 | 可直接使用 |
| ⚠️ | 数据待验证或部分缺失 | 建议交叉验证 |
| ❌ | 不符合爆款标准或数据虚假 | 不使用 |
| 📅 | 时间已验证(2026 年后) | 时效性达标 |
| 🕐 | 时间待确认 | 需要核实发布时间 |
**搜索频率等级**:
| 等级 | 搜索结果数 | 标识 | 说明 | 内容策略 |
| ------ | ---------- | ---------- | ------------------ | ---------------------- |
| 极高频 | 100w+ | 🔥🔥🔥🔥🔥 | 全网热点,全民关注 | 竞争激烈,需差异化角度 |
| 高频 | 10w-100w | 🔥🔥🔥🔥 | 热门话题,广泛讨论 | 热点红利期,优先创作 |
| 中高频 | 1w-10w | 🔥🔥🔥 | 垂直领域热点 | 蓝海机会,精准受众 |
| 中频 | 1000-1w | 🔥🔥 | 小众话题,精准人群 | 长尾流量,专业深度 |
| 低频 | <1000 | 🔥 | 新兴话题,机会窗口 | 先发优势,占领心智 |
**时效性判定**:
| 时效等级 | 时间范围 | 标识 | 热度特征 | 内容策略 |
| -------- | --------- | ---- | ------------------ | ------------------ |
| 实时热点 | 24 小时内 | ⚡ | 刚刚发生,热度最高 | 抢先发布,快讯形式 |
| 新鲜爆款 | 3 天内 | 🆕 | 近期爆款,热度上升 | 深度跟进,解读分析 |
| 持续升温 | 7 天内 | 📈 | 热度持续增长 | 趋势判断,预测分析 |
| 热度稳定 | 30 天内 | 📊 | 热度趋于稳定 | 总结盘点,方法论 |
| 超出范围 | 30 天以上 | ❌ | 历史内容 | 一般不采用 |
**文章话题提取规则**:
| 提取维度 | 识别方法 | 示例 |
| ---------- | -------------- | --------------------------- |
| **地点类** | 省市/景点/地标 | "成都周边" → 地域标签 |
| **人物类** | 名人/群体/职业 | "3 岁娃" → 亲子/育儿标签 |
| **事件类** | 热点事件/活动 | "露营" → 户外/生活方式标签 |
| **产品类** | 品牌/品类/型号 | "iPhone 16" → 数码/科技标签 |
| **情绪类** | 情感词/态度词 | "踩坑" → 避雷/攻略标签 |
**话题标签生成示例**:
| 原标题 | 提取标签 | 标签类型 |
| --------------------------------- | ------------------ | --------- |
| 成都周边这 5 个露营地,美到窒息! | 户外露营、成都周边 | 地点+活动 |
| 带 3 岁娃露营踩坑记录 | 亲子攻略、避坑指南 | 人群+情绪 |
| iPhone 16 深度测评:值不值得买 | 数码测评、购买建议 | 产品+类型 |
**描述生成规范**:
| 优先级 | 内容来源 | 使用条件 |
| ------ | ---------------- | ---------------------- |
| 1 | 搜索结果摘要 | 优先使用,需验证时效性 |
| 2 | 标题核心信息提取 | 摘要缺失时使用 |
| 3 | 原文前 100 字 | 可访问原文时补充 |
| 格式要求 | 说明 |
| -------- | ------------------------------ |
| 字数 | 50-100 字 |
| 内容 | 包含核心信息(谁/什么/为什么) |
| 规范 | 无敏感内容、无诱导点击 |
### Step 4: 关键词聚合分析
**聚合维度**:
| 维度 | 分析方法 | 输出形式 |
| ---------------- | ---------------------------- | --------------------- |
| **高频词云** | 提取爆款标题高频词,统计词频 | 词频表格 + 关键词列表 |
| **情绪词分布** | 分类统计情绪属性词 | 情绪分布表格 |
| **内容类型分布** | 按标题特征分类 | 类型占比表格 |
| **平台热度对比** | 统计各平台数据 | 平台对比表格 |
**情绪词分类表**:
| 情绪类型 | 示例词汇 | 作用 |
| -------- | -------------------------------- | ---------------------- |
| 正面 | 绝绝子、太香了、必看、神仙、宝藏 | 吸引点击,激发兴趣 |
| 负面 | 踩坑、避雷、后悔、千万别、警惕 | 引发警惕,提高打开率 |
| 中性 | 攻略、教程、测评、推荐、盘点 | 明确内容类型,精准受众 |
**内容类型分类表**:
| 类型 | 标题特征 | 适用平台 | 互动特点 |
| ------ | ----------------------------- | ------------ | ---------- |
| 攻略型 | XX 攻略、XX 教程、XX 指南 | 小红书 | 收藏率高 |
| 体验型 | 我去了 XX、真实体验、踩坑记录 | 抖音、小红书 | 评论互动多 |
| 观点型 | XX 看法、XX 吐槽、XX 评价 | 公众号 | 转发讨论多 |
| 信息型 | XX 新闻、XX 消息、XX 最新 | 抖音 | 阅读量大 |
## 场景分支说明
根据用户输入的不同,分为两种处理模式:
| 模式 | 用户输入特征 | 处理流程 | 输出重点 |
| ------------------------ | ----------------------------------- | ----------------------------------------------- | ------------------- |
| **模式 A:热点模式** | 没有具体话题,如"最新话题有哪些" | 搜索 3 个平台热榜 → 聚合热点 → 生成报告 | 热点榜单 + 趋势分析 |
| **模式 B:指定话题模式** | 有具体话题/平台,如"分析 AI 智能体" | 提取关键词 → 3 个平台搜索 → 聚合分析 → 生成报告 | 深度分析 + 数据报告 |
### 模式 A 流程(热点模式)
> **数据来源限制**:仅从以下 3 个平台获取热点数据,不扩展到其他平台
| 步骤 | 操作 | 输出 |
| ---- | ------------------------------------------------ | ------------ |
| 1 | 搜索平台热榜(公众号热榜、抖音热榜、小红书热榜) | 原始热点列表 |
| 2 | 提取共性话题,按搜索频率排序 | 热点排名表 |
| 3 | 对 TOP 热点进行平台数据分析 | 热点分析表 |
| 4 | 生成综合分析报告 | 综合报告 |
> **⚠️ 重要**:模式 A 仅分析指定平台内部的热点趋势,不引用站外数据
### 模式 B 流程(指定话题模式)
> **数据来源限制**:仅搜索和分析以下 3 个平台数据
| 步骤 | 操作 | 输出 |
| ---- | -------------------------------- | ---------- |
| 1 | 提取并扩展关键词 | 关键词列表 |
| 2 | 平台精准搜索(3 个平台) | 平台数据表 |
| 3 | 数据验证与清洗(仅保留指定平台) | 清洗后数据 |
| 4 | 聚合分析 | 分析报告 |
> **⚠️ 重要**:模式 B 仅搜索 3 个指定平台的内容,其他平台结果一律排除
---
## 输出规范
### 1. 爆款文章作品库
**字段说明**:
| 字段 | 说明 | 数据来源 | 置信度 |
| ------------ | ----------------------------- | ------------------ | ------ |
| 文章话题 | 文章所属话题/分类 | 从标题和内容中提取 | 85% |
| 标题 | 爆款文章完整标题 | 搜索结果 | 95% |
| 描述 | 文章核心内容摘要(50-100 字) | 搜索结果摘要 | 80% |
| 平台 | 发布平台 | 搜索来源 URL | 90% |
| 网络搜索频率 | 搜索热度等级 | 搜索结果数量估算 | 75% |
| 时效性 | 发布时间+热度特征 | 发布日期+互动趋势 | 70% |
| 验证数据 | 互动数据 | 搜索结果提取 | 65% |
| 爆款标准 | 是否符合标准 | 对照平台标准验证 | 80% |
| 来源链接 | 原文链接(可点击访问) | 搜索结果 | 95% |
| 链接状态 | 链接有效性(有效/失效/未知) | 自动检测 | 90% |
**输出格式**:
| 文章话题 | 标题 | 描述 | 平台 | 搜索频率 | 时效性 | 验证数据 | 爆款标准 | 来源链接 |
| --------- | ---------------------------------- | ------------------------------------------------ | ------ | -------- | -------- | --------- | -------- | -------------------------------------- |
| 户外露营 | 成都周边这 5 个露营地,美到窒息! | 盘点成都周边 5 个小众露营胜地,人少景美... | 小红书 | 🔥🔥🔥 | 🆕3 天内 | 收藏 1.2w | ✅ | [链接](https://xiaohongshu.com/xxx) |
| 亲子攻略 | 带 3 岁娃露营踩坑记录 | 真实踩坑经历,总结 3 个不适合带小宝宝去的营地... | 小红书 | 🔥🔥 | 📈7 天内 | 收藏 8k+ | ✅ | [链接](https://xiaohongshu.com/xxx) |
| AI 智能体 | 2026 年最值得关注的 10 个 AI Agent | 盘点今年最具潜力的 AI 智能体应用... | 公众号 | 🔥🔥🔥🔥 | 🆕3 天内 | 阅读 10w+ | ✅ | [链接](https://mp.weixin.qq.com/s/xxx) |
**标识说明**:
| 标识类型 | 含义 | 示例 |
| -------- | ----------------------------- | ------------- |
| 搜索频率 | 🔥 数量=频率等级 | 🔥🔥🔥=中高频 |
| 时效性 | 图标+时间范围 | 🆕3 天内 |
| 数据验证 | ✅ 已验证 ⚠️ 待验证 | ✅ 收藏 1.2w |
| 时间戳 | 📅2026 年后 🕐 时间未知 | 📅2026-04 |
| 链接状态 | ✅ 有效 / ⚠️ 待验证 / ❌ 失效 | ✅ 有效 |
**链接规范**:
| 要求项 | 说明 |
| ---------- | ---------------------------------------- |
| 格式 | Markdown 链接格式:`[链接](URL)` |
| URL 完整性 | 必须包含完整 URL(含 https://) |
| 平台匹配 | 链接域名必须与标注的平台一致 |
| 可访问性 | 优先提供可直接访问的链接,失效链接需标注 |
| 短链接 | 如有官方短链接可使用,但需注明原始平台 |
### 2. 平台热度分析
> **数据来源声明**:以下数据**仅**来自 3 个核心平台(公众号、抖音、小红书),不包含其他平台数据
**平台数据对比表**:
| 平台 | 爆款数量 | 平均互动量 | 热门内容类型 | 内容风格特点 | 推荐指数 |
| ------ | -------- | ---------- | -------------- | -------------- | ---------- |
| 公众号 | - | 阅读 10w+ | 深度分析型 | 专业、有深度 | ⭐⭐⭐⭐⭐ |
| 抖音 | - | 点赞 10w+ | 体验型、观点型 | 快节奏、强情绪 | ⭐⭐⭐⭐⭐ |
| 小红书 | - | 收藏 1w+ | 攻略型、种草型 | 精致、实用 | ⭐⭐⭐⭐⭐ |
**平台适配建议表**:
| 内容类型 | 推荐平台 | 标题特点 | 内容要点 |
| --------- | -------- | ---------------- | ------------------ |
| 攻略/教程 | 小红书 | 数字型、清单型 | 步骤清晰、可收藏 |
| 体验/测评 | 抖音 | 悬念型、反差型 | 真实感、情绪化 |
| 观点/分析 | 公众号 | 标题党、价值承诺 | 有深度、有洞见 |
| 热点/资讯 | 抖音 | 话题型、时效型 | 快速响应、信息密度 |
### 3. 关键词云报告
**格式要求**:使用表格呈现,便于快速浏览
| 报告模块 | 内容 | 格式 |
| ---------- | -------------- | ------------------------- |
| 核心关键词 | 3-5 个核心词 | 关键词列表 |
| 关联关键词 | 10-20 个扩展词 | 关键词列表 |
| 高频词云 | 按出现次数排序 | 表格(词+次数+属性+类型) |
**示例表格**:
| 关键词 | 出现次数 | 情绪属性 | 内容类型 | 搜索频率 |
| --------- | -------- | -------- | -------- | ---------- |
| AI 智能体 | 28 次 | 正面 | 信息型 | 🔥🔥🔥🔥🔥 |
| 短剧出海 | 15 次 | 正面 | 观点型 | 🔥🔥🔥🔥 |
| 谷子经济 | 12 次 | 正面 | 攻略型 | 🔥🔥🔥🔥 |
## 注意事项
### 数据局限性说明
1. 搜索工具无法获取所有平台的精确互动数据
2. 部分数据需要从搜索结果中提取关键词推断
3. 时效性:爆款数据反映的是搜索时点的快照
### 真实性要求
- 所有爆款内容必须有来源链接
- 互动数据必须来自搜索结果,禁止编造
- 数据待验证时需明确标注
### 平台特性速查表
> **数据来源范围**:严格限定以下 3 个核心平台,**不采集**其他平台数据
| 平台 | 内容形式 | 核心特点 | 爆款关键 | 内容风格 | 平台类型 |
| -------- | ------------------ | ------------------------------ | --------------------- | -------------------- | -------- |
| 公众号 | 长文(2000-5000 字) | 深度分析、专业性强、私域传播 | 标题吸引力、内容深度 | 专业、有洞见、故事性 | ✅ 核心 |
| 抖音 | 短视频(15-60s) | 强情绪、快节奏、音乐配合 | 前 3 秒抓人、情绪共鸣 | 夸张、直接、有感染力 | ✅ 核心 |
| 小红书 | 图文/短视频 | 实用性强、视觉精致、收藏率高 | 干货价值、美观排版 | 亲切、实用、种草感 | ✅ 核心 |
| 快手 | 短视频 | 接地气、真实感、老铁文化 | 真实感、互动性 | 朴实、亲切、生活化 | ❌ 排除 |
| B 站 | 中长视频(3-20min) | 内容深度、弹幕文化、UP 主人设 | 专业度、娱乐性平衡 | 专业、有趣、有态度 | ❌ 排除 |
| 视频号 | 短视频 | 社交传播、私域联动、中老年用户 | 社交货币、正能量 | 温馨、正能量、生活化 | ❌ 排除 |
| 知乎 | 问答/文章 | 知识性、讨论性强 | 专业回答、深度分析 | 理性、专业 | ❌ 排除 |
| 微博 | 短内容/图文 | 热点传播、明星效应 | 话题性、转发量 | 热点、娱乐 | ❌ 排除 |
| 今日头条 | 文章/视频 | 资讯聚合、算法推荐 | 点击率、停留时长 | 标题党、资讯 | ❌ 排除 |
| 百度贴吧 | 帖子/讨论 | 社区讨论、兴趣聚合 | 回复量、活跃度 | 话题、讨论 | ❌ 排除 |
## 异常处理指引
### 网络搜索工具不可用
| 情况 | 处理方式 |
| ---------------- | --------------------------------------------------------------------------------------------------- |
| 搜索工具返回错误 | 1. 向用户说明当前无法获取实时数据<br>2. 基于已有知识提供一般性分析<br>3. 建议稍后重试或提供具体话题 |
| 搜索结果为空 | 1. 检查关键词是否过于小众<br>2. 尝试使用更通用的搜索词<br>3. 说明该话题暂无爆款数据 |
| 部分平台无结果 | 1. 说明该平台暂无相关爆款<br>2. 重点展示有结果的平台数据<br>3. 建议关注其他平台的相关内容 |
### 数据质量问题
| 问题类型 | 处理方式 |
| --------------------- | ----------------------------------------------------------------------------- |
| **其他平台数据** | **一律排除**,不纳入分析和报告(如快手、B站、视频号、知乎、微博、今日头条等) |
| 时间信息缺失 | 标注 🕐 时间未知,谨慎使用 |
| 互动数据不明确 | 标注 ⚠️ 待验证,建议用户点击原文确认 |
| 内容链接失效 | 标注 ⚠️ 链接失效,提供标题和描述信息供用户自行搜索 |
| P0 平台数据来源不一致 | 优先使用平台官方数据,交叉验证多个 P0 平台来源,标注置信度 |
### 平台来源违规处理
| 情况 | 处理方式 |
| -------------------- | ------------------------------------------------------------------- |
| 搜索结果包含其他平台 | 自动过滤,**不采集**其他平台数据 |
| 用户询问其他平台 | 说明本工具仅分析公众号、抖音、小红书 3 个平台数据,建议关注这些平台 |
| 数据来源无法确认 | 标注 ⚠️ 平台未知,不纳入最终报告 |
## 资源索引
- 领域参考: 见 [references/data-confidence.md](references/data-confidence.md) (数据置信度标准)
- 领域参考: 见 [references/keyword-extraction-guide.md](references/keyword-extraction-guide.md) (关键词提取方法)
- 领域参考: 见 [references/platform-standards.md](references/platform-standards.md) (平台爆款标准)
## 附录:核心平台清单(唯一数据来源)
### ✅ 允许的数据来源(3 个)
| 序号 | 平台名称 | 官方域名参考 | 内容类型 |
| ---- | ---------- | ---------------- | ----------- |
| 1 | **公众号** | mp.weixin.qq.com | 长文 |
| 2 | **抖音** | douyin.com | 短视频 |
| 3 | **小红书** | xiaohongshu.com | 图文/短视频 |
### ❌ 排除的平台(禁止采集)
以下平台**一律不搜索、不采集、不分析**:
| 平台名称 | 排除原因 |
| ------------------------------- | -------------- |
| 快手 (kuaishou.com) | 不在允许列表中 |
| B站 (bilibili.com) | 不在允许列表中 |
| 视频号 (channels.weixin.qq.com) | 不在允许列表中 |
| 知乎 (zhihu.com) | 不在允许列表中 |
| 微博 (weibo.com) | 不在允许列表中 |
| 今日头条 (toutiao.com) | 不在允许列表中 |
| 百度贴吧 (tieba.baidu.com) | 不在允许列表中 |
| 豆瓣 (douban.com) | 不在允许列表中 |
| 网易号、搜狐号、新浪看点等 | 不在允许列表中 |
| 任何其他非上述 3 个平台 | 不在允许列表中 |
### 平台识别方法
在数据验证阶段,通过以下方式识别平台来源:
1. **URL 域名匹配**:检查链接是否包含上述 3 个平台的域名
2. **标题关键词**:检查标题是否包含 "公众号"、"抖音"、"小红书" 等标识
3. **内容来源标注**:搜索结果中明确标注的平台来源
> **硬性规定**:任何无法确认为上述 3 个平台来源的数据,**一律排除**,不得纳入分析
FILE:references/data-confidence.md
# 数据置信度说明
## 数据来源与可靠性
### 高置信度数据(可直接使用)
| 数据类型 | 来源 | 置信度 |
|---------|------|--------|
| 搜索结果数量 | 搜索引擎返回 | 95%+ |
| 平台标识 | 搜索结果URL | 90%+ |
| 标题信息 | 搜索结果标题 | 95%+ |
| 摘要内容 | 搜索结果摘要 | 85%+ |
### 中置信度数据(需要验证)
| 数据类型 | 来源 | 置信度 | 说明 |
|---------|------|--------|------|
| 互动数据 | 摘要中提取 | 60-80% | 可能有偏差 |
| 发布时间 | 搜索结果显示 | 50-70% | 部分不显示 |
| 搜索频率等级 | 估算 | 70-85% | 基于结果数量估算 |
### 低置信度数据(仅供参考)
| 数据类型 | 来源 | 置信度 | 说明 |
|---------|------|--------|------|
| 热度持续性 | 推断 | 40-60% | 基于有限信息推断 |
| 精确互动数值 | 摘要片段 | 30-50% | 可能不完整 |
## 数据标注规范
### 置信度标识
| 标识 | 含义 | 使用场景 |
|------|------|---------|
| ✅ 已验证 | 数据来自可靠来源 | 搜索结果明确显示 |
| ⚠️ 待验证 | 数据需要进一步确认 | 摘要中提取的片段 |
| 📊 估算值 | 基于有限信息估算 | 搜索频率等级 |
| ❓ 未知 | 数据无法获取 | 发布时间等缺失字段 |
### 标注示例
```
| 字段 | 值 | 置信度 |
|------|-----|--------|
| 标题 | 成都周边这5个露营地... | ✅ 已验证 |
| 收藏数 | 1.2w | ⚠️ 待验证 |
| 搜索频率 | 🔥🔥🔥高频 | 📊 估算值 |
| 发布时间 | - | ❓ 未知 |
```
## 数据局限性说明
### 搜索工具局限
1. **无法获取实时数据**:数据是搜索时点的快照
2. **部分平台数据受限**:小红书、抖音等平台数据难以精确获取
3. **互动数据不完整**:搜索摘要可能只显示部分数据
4. **发布时间缺失**:部分搜索结果不包含发布时间
### 建议补充方案
1. **手动验证**:点击链接查看原文确认数据
2. **多源对比**:使用多个搜索词交叉验证
3. **第三方工具**:使用新榜、千瓜等专业数据平台
4. **定期更新**:热点话题数据变化快,建议定期更新
## 数据使用建议
### 高置信度数据
- 可直接用于报告和分析
- 可作为创作决策依据
### 中置信度数据
- 建议交叉验证后使用
- 作为趋势参考,不建议精确引用
### 低置信度数据
- 仅作趋势判断参考
- 不建议用于精确分析
- 需要补充验证后使用
FILE:references/keyword-extraction-guide.md
# 关键词提取与扩展指南
## 核心关键词提取
### 识别方法
1. **人名识别**:大写字母开头、知名人物名称
2. **地名识别**:省市区、景点、地标
3. **事件名识别**:新闻事件、热点事件
4. **产品名识别**:品牌+型号、产品类别
### 提取规则
- 保留原始大小写
- 去除无意义修饰词
- 合并同义词
## 关联关键词扩展
### 扩展维度
| 维度 | 示例 | 扩展方法 |
|------|------|---------|
| 人物关联 | 明星 → 经纪公司、好友、对手 | 搜索相关人物 |
| 地点关联 | 成都 → 周边、四川、自驾路线 | 地理扩展 |
| 话题关联 | 露营 → 徒步、自驾、户外 | 话题聚类 |
| 情绪关联 | 避坑 → 踩雷、后悔、千万别 | 同义词扩展 |
| 产品关联 | 帐篷 → 睡袋、天幕、营地车 | 配套产品 |
### 扩展数量
- 核心关键词:3-5个
- 关联关键词:10-20个
- 搜索组合:20-30个
## 搜索关键词组合生成
### 组合模板
```
基础组合:
- "[话题] + 爆款"
- "[话题] + 热门"
- "[话题] + 高赞"
平台组合:
- "抖音 + [话题] + 热门"
- "小红书 + [话题] + 爆款"
- "[话题] + 公众号 + 10w+"
- "快手 + [话题] + 热门"
- "B站 + [话题] + 播放量"
内容类型组合:
- "[话题] + 攻略"
- "[话题] + 教程"
- "[话题] + 测评"
- "[话题] + 吐槽"
- "[话题] + 推荐"
```
### 优先级排序
1. 平台组合(精准度高)
2. 内容类型组合(覆盖面广)
3. 基础组合(通用性强)
FILE:references/platform-standards.md
# 平台爆款标准
## 各平台爆款量化标准
### 小红书
| 指标 | 爆款标准 | 验证关键词 |
|------|---------|-----------|
| 收藏 | 1w+ | "收藏过万"、"收藏1w+" |
| 点赞 | 5w+ | "点赞5w"、"点赞过5万" |
| 评论 | 1000+ | "评论过千" |
| 综合 | 收藏+点赞>3w | 高互动笔记 |
**内容特点**:
- 图文为主,强调视觉
- 实用性强,收藏率高
- 口语化表达,Emoji丰富
- 标签使用频繁(5-10个)
### 抖音
| 指标 | 爆款标准 | 验证关键词 |
|------|---------|-----------|
| 点赞 | 10w+ | "点赞10w"、"点赞过10万" |
| 评论 | 5000+ | "评论过5000" |
| 转发 | 1w+ | "转发过万" |
| 播放量 | 100w+ | "播放量100w+" |
**内容特点**:
- 短视频为主(15-60秒)
- 强情绪、快节奏
- 音乐配合
- 话题标签重要
### 公众号
| 指标 | 爆款标准 | 验证关键词 |
|------|---------|-----------|
| 阅读量 | 10w+ | "10w+"、"阅读10万+" |
| 点赞 | 1000+ | "点赞过千" |
| 在看 | 500+ | "在看过500" |
**内容特点**:
- 长文为主(2000-5000字)
- 深度分析、专业性强
- 标题党常见
- 排版重要
### 快手
| 指标 | 爆款标准 | 验证关键词 |
|------|---------|-----------|
| 播放量 | 50w+ | "播放量50w+" |
| 点赞 | 5w+ | "点赞过5万" |
| 评论 | 2000+ | "评论过2000" |
**内容特点**:
- 短视频为主
- 接地气、真实感
- 老铁文化
- 直播联动
### B站
| 指标 | 爆款标准 | 验证关键词 |
|------|---------|-----------|
| 播放量 | 50w+ | "播放量50w+"、"50万播放" |
| 点赞 | 5w+ | "点赞过5万" |
| 投币 | 1w+ | "投币过万" |
| 收藏 | 1w+ | "收藏过万" |
**内容特点**:
- 中长视频为主(3-20分钟)
- 内容深度、专业性强
- 弹幕文化
- UP主人设重要
## 搜索频率等级标准
| 等级 | 搜索结果数量 | 标识 | 说明 |
|------|-------------|------|------|
| 极高频 | 100w+ | 🔥🔥🔥🔥🔥 | 全网热点,全民关注 |
| 高频 | 10w-100w | 🔥🔥🔥🔥 | 热门话题,广泛讨论 |
| 中高频 | 1w-10w | 🔥🔥🔥 | 垂直领域热点 |
| 中频 | 1000-1w | 🔥🔥 | 小众话题,精准人群 |
| 低频 | <1000 | 🔥 | 新兴话题,机会窗口 |
## 时效性等级标准
| 等级 | 时间范围 | 标识 | 热度特征 |
|------|---------|------|---------|
| 实时热点 | 24小时内 | ⚡ | 刚刚发生,热度最高 |
| 新鲜爆款 | 3天内 | 🆕 | 近期爆款,热度上升 |
| 持续升温 | 7天内 | 📈 | 热度持续增长 |
| 热度稳定 | 30天内 | 📊 | 热度趋于稳定 |
| 经典长尾 | 30天以上 | 📚 | 长尾内容,持续有流量 |