
Douyin Daily Hot
- 252 installs
- 316 repo stars
- Updated August 4, 2026
- redfox-data/redfox-community
Use douyin-daily-hot for development tasks
About
douyin-daily-hot: A skill for development. This provides functionality for development workflows.
- douyin-daily-hot
Douyin Daily Hot by the numbers
- 252 all-time installs (skills.sh)
- +15 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,525 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/redfox-data/redfox-community --skill douyin-daily-hotAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 252 |
|---|---|
| repo stars | ★ 316 |
| Last updated | August 4, 2026 |
| Repository | redfox-data/redfox-community ↗ |
What it does
Use douyin-daily-hot for development tasks
Files
抖音每日热门作品榜
📝 简介
日度内容热度监测工具,每日人工收录核验全平台万级抖音作品,输出单日点赞 TOP50 榜单。
- 更新时间:每日 06:00 更新昨日数据
- 回溯范围:最多回溯过去 30 天
- 每个分类最多返回 50 条
✨ 功能特性
| 功能模块 | 能力描述 | 核心价值 |
|---|---|---|
| 日榜排名 | 每日输出单日点赞 TOP50 榜单 | 快速获取全平台当日最热作品 |
| 赛道筛选 | 支持 28 个赛道分类查询 | 精准定位垂直领域热门内容 |
| 历史回溯 | 支持回溯过去 30 天数据 | 追溯往期热门趋势 |
| 可点击链接 | 作品标题以超链接格式输出 | 一键跳转查看原作品 |
| 分页展示 | 默认 TOP20,可查看完整 TOP50 | 按需获取全量或摘要数据 |
| 订阅推送 | 支持赛道和时间偏好订阅 | 定时获取热门动态 |
🔑 鉴权
获取 API Key
请前往 红狐hub 获取API KEY
配置 API Key
方案1: 以OpenClaw为例,将REDFOX_API_KEY添加到~/.openclaw/openclaw.json中,部分内容如下:
{ "env": { "REDFOX_API_KEY": "ak_xxxx..." } }方案2: 终端配置
export REDFOX_API_KEY="ak_xxxx..."📡 API 调用
- 接口地址:
POST https://redfox.hk/story/api/dy/search/likesRank - 认证方式:请求头
X-API-KEY,值从环境变量REDFOX_API_KEY获取 - 固定参数:
source(值见脚本) - 可选参数:
type(赛道)、startTime、endTime(日期范围)
详见 api-config.md。
🔄 交互流程
1. 时间判断
| 用户输入 | 处理方式 |
|---|---|
| 今天 / 当前 / 最新 | 回复说明最新为昨日,提供昨日数据 |
| 未来日期 | 回复提示,提供昨日数据 |
| 30天内历史日期 | 直接查询对应日期 |
| 超过30天前 | 回复提示,提供最接近时间范围内的数据 |
时间提示语:
- 当日/未来:「非常抱歉🙏,我们最新的是昨日数据,将为您提供最接近您需求的昨日热榜。」
- 超出回溯:「非常抱歉🙏,目前榜单最多支持回溯「过去30天」,我将为您查询最接近您需求的时间范围~」
2. 赛道判断
将用户描述归类至以下支持赛道,未能匹配时明确告知并列出全部赛道,询问用户选择:
全部、小剧场、财富理财、二次元、身体锻炼、居家装修、数码科技、科学普及、
旅行、美食、动物、明星娱乐、汽车、亲子、人文、三农、潮流风尚、游戏、
生活记录、体育、舞蹈才艺、学习教育、休闲玩乐、影视、音乐、颜值造型、
健康医学、综艺、个人成长3. 默认行为
无特殊说明时,默认返回昨日全品类日榜。所有查询(包括全品类和特定赛道)均默认展示 TOP20,用户明确要求查看完整榜单时再输出全部 50 条数据。
📊 标准输出格式
榜单以 Markdown 表格呈现,作品标题必须使用 `[标题](workUrl)` 格式输出为可点击的超链接:
💡 榜单说明:每日 06:00 更新昨日数据,[如有时间偏差提示则插入]。互动数据为入库时间,与实时数据存在差异。
📊 抖音每日点赞TOP20(YYYY-MM-DD)[查询全部时含"赛道"列,查询特定赛道时不含]
| 排名 | 作品标题 | 作者(粉丝数) | 赛道* | 收藏 | 评论 | 分享 | **点赞** | 发布时间 |
|------|---------|--------------|-------|------|------|------|------|---------|
| 1 | [红烧肉的教程](https://www.douyin.com/video/xxx) | 美食达人(10w+) | 美食 | 10w+ | 10w+ | 10w+ | **10w+** | 05-28 12:00 |
*查询特定赛道时去掉"赛道"列
⚡ 更多操作
• 本次榜单完整共50条数据,是否需要查看剩余30条?
📬 订阅服务
1️⃣ 我们每日 06:00 更新昨日数据,是否需要订阅每日的抖音作品最新排名,订阅后定时推送给您
2️⃣ 是否需要订阅具体赛道的作品表现?我们支持:[列出28个赛道]作品标题超链接规范(必须遵守)
- 作品标题必须以 Markdown 链接格式输出:
[作品标题](workUrl) workUrl为接口返回字段,是作品在抖音的访问链接- 禁止使用 HTML
<a>标签或终端 OSC 转义序列 - 即使终端不支持直接点击,Markdown 链接格式也能确保对话界面正确渲染为可点击超链接
数据字段说明
| 字段 | 来源字段 | 说明 |
|---|---|---|
| 排名 | rank | 当日点赞排名 |
| 作品标题 | video_title + workUrl | 必须展示为 `[标题](workUrl)` 超链接格式 |
| 作者 | author_name + author_fans | 账号名 + 粉丝总数 |
| 赛道 | category | 仅全品类查询时展示 |
| 收藏 / 评论 / 分享 / 点赞 | collect / comment / share / like | 互动数据(入库时间快照),点赞列数值需加粗显示 |
| 发布时间 | publish_time | 格式 MM-DD HH:00 |
📬 文件输出与订阅
- 默认展示 20 条;用户请求完整版时输出 Markdown 表格(含 50 条)
- 订阅:支持用户选择赛道和时间偏好,按每日 06:00 更新后自动推送
📚 其他资源
- API 配置与调用:api-config.md
- 赛道分类与交互示例:interaction-guide.md
Douyin Daily Hot Content Ranking / douyin-daily-hot
---
Introduction
Daily collection of Douyin (TikTok China) works across the entire platform, delivering a daily likes TOP 50 ranking with category-based filtering and historical date lookback.
Core Value
- Daily Verified Collection: Manually collected and verified tens of thousands of Douyin works daily, ensuring ranking quality.
- Full Category Coverage: Supports 28 mainstream category filters, from food to gaming — one click to reach your target.
- Historical Lookback: Up to 30 days of historical data for easy trend review and analysis.
Target Users
- 📊 Content Operations — Quickly get hot content across categories to track platform trends.
- 🎬 Creators / Influencers — Understand top-performing works in your category and benchmark against hits.
- 📈 Brands / MCNs — Monitor competitor accounts and category rankings to optimize content and ad strategies.
---
Features
Core Features
- Daily Ranking: Daily TOP50 ranking by likes — quickly get the hottest works on the platform.
- Category Filtering: Supports 28 category filters for precise vertical-niche targeting.
- Historical Lookback: Up to 30 days of historical data for trend review.
- Clickable Links: Work titles output as hyperlinks — one click to the original Douyin video.
- Paginated Display: Defaults to TOP20; full TOP50 available on request.
- Subscription Push: Subscribe by category and time preference for automated daily updates.
---
API Key Acquisition & Security
- This skill requires the environment variable:
REDFOX_API_KEY. REDFOX_API_KEYis provided by RedFoxHub (https://redfox.hk).- Please visit RedFoxHub to register and obtain
REDFOX_API_KEY. - Configure the environment variable
REDFOX_API_KEYon your device before using this skill. - Before providing a key, confirm its source, scope, validity period, and whether it supports reset/revocation.
- Do not hard-code or expose keys in plain text within code, prompts, logs, or output files.
---
Usage Guide
Simply describe your needs in natural language — no commands to memorize.
Quick Reference
| Intent | Example Phrase | Result |
|---|---|---|
| Today's ranking | "Douyin hot list" / "Today's ranking" | Yesterday's all-category likes TOP 20 |
| By category | "Check the food category" / "ACG hot" | Category-specific likes TOP 20 |
| Historical data | "May 20th ranking" | Ranking for the specified date |
| Full data | "Show all" / "Show remaining 30" | Full 50 items |
Output Example
Results are presented as a Markdown table, default TOP 20:
| Rank | Title | Author (Followers) | Category | Collects | Comments | Shares | Likes | Published |
|---|---|---|---|---|---|---|---|---|
| 1 | How to Make Braised Pork | Food Master (10w+) | Food | 10w+ | 10w+ | 10w+ | 10w+ | 05-28 12:00 |
The "Category" column is omitted when querying a specific category; item titles are clickable links to the original Douyin work.
---
Use Cases
| Scenario | Role | Example Query | Benefit |
|---|---|---|---|
| Daily trend tracking | Content Ops | "What's hot on Douyin today?" | Get daily all-category hits, stay on top of trends |
| Category benchmarking | Creators / Influencers | "Check the food category ranking" | Understand category hits, benchmark top works |
| Competitor monitoring | Brands / MCNs | "Who's performing well in automotive?" | Monitor competitor rankings, optimize strategy |
| Historical review | Data Analysts | "May 25th all-category ranking" | Lookback historical data, analyze trend shifts |
---
Important Data Notes
- Data is updated daily at 06:00 with yesterday's data (T-1, meaning the latest available data is from the previous day).
- Historical lookback supports up to 30 days.
- Engagement metrics are snapshots from the time of data ingestion and may differ from live real-time data.
- Each category returns up to 50 items.
抖音每日热门作品榜 / douyin-daily-hot
---
简介
日度收录全平台抖音作品,输出单日点赞 TOP50 榜单,支持按赛道分类查询与历史日期回溯。
核心价值
- 每日收录核验:每日人工收录核验全平台万级抖音作品,榜单质量有保障。
- 赛道全覆盖:支持 28 个主流赛道分类查询,从美食到游戏一键直达。
- 历史可回溯:最多回溯过去 30 天数据,轻松复盘热度趋势。
适用对象
- 📊 内容运营 — 快速获取各赛道热门内容,把握平台热度风向。
- 🎬 创作者 / 博主 — 了解同赛道爆款表现,对标热门作品优化创作。
- 📈 品牌 / MCN — 监测竞品账号与赛道排名,优化投放与内容策略。
---
功能特性
核心功能
- 日榜排名:每日输出单日点赞 TOP50 榜单,快速获取全平台当日最热作品。
- 赛道筛选:支持 28 个赛道分类查询,精准定位垂直领域热门内容。
- 历史回溯:支持回溯过去 30 天数据,追溯往期热门趋势。
- 可点击链接:作品标题以超链接格式输出,一键跳转查看原作品。
- 分页展示:默认 TOP20,可查看完整 TOP50,按需获取全量或摘要数据。
- 订阅推送:支持赛道和时间偏好订阅,定时获取热门动态。
---
密钥获取与安全说明
- 本技能需要使用环境变量:
REDFOX_API_KEY。 REDFOX_API_KEY由 红狐 hub (https://redfox.hk)提供。- 请前往 红狐 hub 注册账号,获取
REDFOX_API_KEY。 - 配置设备环境变量
REDFOX_API_KEY后使用本技能。 - 在提供密钥前,请先确认密钥来源、可用范围、有效期及是否支持重置/撤销。
- 禁止在代码、提示词、日志或输出文件中硬编码/明文暴露密钥。
---
使用指南
直接用自然语言描述需求即可,无需记忆固定命令。
常用说法速查
| 意图 | 示例话术 | 效果 |
|---|---|---|
| 查看今日榜单 | 「抖音热榜」「今日榜单」 | 返回昨日全品类点赞 TOP20 |
| 按赛道查看 | 「看看美食赛道」「二次元热门」 | 返回对应赛道点赞 TOP20 |
| 查看历史 | 「5月20号的榜单」 | 返回指定日期的榜单 |
| 查看完整数据 | 「查看全部」「看剩余30条」 | 展示完整 50 条数据 |
输出示例
查询后将以 Markdown 表格呈现,默认展示 TOP20:
| 排名 | 作品标题 | 作者(粉丝数) | 赛道 | 收藏 | 评论 | 分享 | 点赞 | 发布时间 |
|---|---|---|---|---|---|---|---|---|
| 1 | 红烧肉的教程 | 美食达人(10w+) | 美食 | 10w+ | 10w+ | 10w+ | 10w+ | 05-28 12:00 |
查询特定赛道时不含「赛道」列;作品标题可直接点击跳转抖音原作品。
---
使用场景
| 场景 | 角色 | 示例问法 | 收益 |
|---|---|---|---|
| 日常热度追踪 | 内容运营 | 「今天抖音什么最火?」 | 每日获取全品类热门,把握内容风向 |
| 赛道对标分析 | 创作者 / 博主 | 「看看美食赛道排名」 | 了解同赛道爆款表现,对标热门作品 |
| 竞品监测 | 品牌 / MCN | 「汽车赛道最近谁表现好」 | 监测竞品排名,优化投放与内容策略 |
| 历史复盘 | 数据分析师 | 「5月25日的全品类榜单」 | 回溯历史数据,分析热度趋势变化 |
---
重要数据说明
- 每日 06:00 更新昨日数据(数据为 T-1,即最新可用数据为昨日)。
- 支持回溯过去 30 天的历史数据。
- 互动数据为入库时间快照,与实时数据存在差异。
- 每个赛道最多返回 50 条数据。
API 配置说明
环境变量配置
在使用本 skill 前,需配置以下环境变量(或在 Qoder 设置中配置 API Key):
REDFOX_API_KEY=your_api_key_here接口说明
查询点赞排行榜
POST https://redfox.hk/story/api/dy/search/likesRank
Content-Type: application/json请求头:
| Header | 说明 |
|---|---|
| X-API-KEY | API 密钥,从环境变量 REDFOX_API_KEY 中获取 |
请求体(JSON):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| type | string | 否 | 赛道分类,默认"全部",见下方分类列表 |
| startTime | string | 否 | 查询起始时间,格式 YYYY-MM-DD |
| endTime | string | 否 | 查询结束时间,格式 YYYY-MM-DD |
| source | string | 是 | 固定参数(值见脚本) |
请求示例:
curl -X POST \
-H "X-API-KEY: $REDFOX_API_KEY" \
-H "Content-Type: application/json" \
-d '{"source":"<见脚本>","type":"美食","startTime":"2026-05-28","endTime":"2026-05-28"}' \
"https://redfox.hk/story/api/dy/search/likesRank"响应示例:
{
"code": 2000,
"data": [
{
"accountId": "1234567890",
"accountName": "账号名",
"avatarUrl": "https://p3.douyinpic.com/aweme-avatar/xxx.jpeg",
"category": "美食",
"followerCount": 1000000,
"collectCount": 100000,
"commentCount": 50000,
"shareCount": 30000,
"likeCount": 500000,
"title": "作品标题",
"content": "作品正文",
"publishTime": "2026-05-28 12:00:00",
"workId": "7644570847852254031",
"workUrl": "https://www.iesdouyin.com/share/video/7644570847852254031"
}
]
}状态码说明
| 状态码 | 说明 |
|---|---|
| 2000 | 请求成功 |
错误处理
| 错误码 | 说明 | 处理方式 |
|---|---|---|
| 401 | API Key 无效或未配置 | 提示用户检查 API Key 配置 |
| 404 | 该日期数据不存在 | 提示用户该日期暂无数据 |
| 429 | 请求频率超限 | 提示稍后重试 |
| 500 | 服务端错误 | 提示稍后重试 |
支持的赛道分类
全部、小剧场、财富理财、二次元、身体锻炼、居家装修、数码科技、科学普及、
旅行、美食、动物、明星娱乐、汽车、亲子、人文、三农、潮流风尚、游戏、
生活记录、体育、舞蹈才艺、学习教育、休闲玩乐、影视、音乐、颜值造型、
健康医学、综艺、个人成长数据更新时间
- 每日 06:00 更新昨日全天数据
- 可回溯范围:最近 30 天
交互逻辑与示例
完整对话示例
示例 1:查询全品类日榜(今天)
用户: 给我今天的抖音全品类日榜
Agent:
💡 榜单说明:每日 06:00 更新昨日数据,非常抱歉🙏,我们最新的是昨日数据,将为您提供最接近您需求的昨日热榜。互动数据为入库时间,与实时数据存在差异。
📊 抖音每日点赞TOP20(2026-05-28)
| 排名 | 作品标题 | 作者(粉丝数) | 赛道 | 收藏 | 评论 | 分享 | 点赞 | 发布时间 |
|------|---------|--------------|------|------|------|------|------|---------|
| 1 | [红烧肉的教程](https://www.douyin.com/video/xxx) | 程十安an(10w+) | 颜值造型 | 10w+ | 10w+ | 10w+ | 10w+ | 05-28 12:00 |
| 2 | [辣炒年糕](https://www.douyin.com/video/xxx) | 小贝饿了(8w+) | 美食 | 9w+ | 8w+ | 7w+ | 9w+ | 05-28 09:00 |
...
⚡ 更多操作
• 本次榜单完整共50条数据,是否需要查看剩余30条?
📬 订阅服务
1️⃣ 我们每日 06:00 更新昨日数据,是否需要订阅每日的抖音作品最新排名,订阅后定时推送给您
2️⃣ 是否需要订阅具体赛道的作品表现?我们支持:小剧场、财富理财、二次元、身体锻炼、居家装修、数码科技、科学普及、旅行、美食、动物、明星娱乐、汽车、亲子、人文、三农、潮流风尚、游戏、生活记录、体育、舞蹈才艺、学习教育、休闲玩乐、影视、音乐、颜值造型、健康医学、综艺、个人成长---
示例 2:查询特定赛道
用户: 4月25日美食赛道热榜
Agent:
📊 抖音美食赛道点赞TOP20(2026-04-25)
| 排名 | 作品标题 | 作者(粉丝数) | 收藏 | 评论 | 分享 | 点赞 | 发布时间 |
|------|---------|--------------|------|------|------|------|---------|
| 1 | [家常红烧肉](https://www.douyin.com/video/xxx) | 爱做饭的芋头(50w+) | 8w+ | 5w+ | 3w+ | 10w+ | 04-25 18:00 |
...
⚡ 更多操作
• 本次榜单完整共50条数据,是否需要查看剩余30条?---
示例 3:查询超出回溯范围
用户: 三个月前的抖音榜单
Agent:
非常抱歉🙏,目前榜单最多支持回溯「过去30天」,我将为您查询最接近您需求的时间范围~
📊 抖音每日点赞TOP20(2026-04-29)[最早可查日期]
...---
示例 4:赛道未匹配
用户: 给我直播赛道的榜单
Agent:
抱歉,暂未匹配到「直播」对应的独立赛道分类。目前支持以下28个赛道:
全部、小剧场、财富理财、二次元、身体锻炼、居家装修、数码科技、科学普及、旅行、美食、动物、明星娱乐、汽车、亲子、人文、三农、潮流风尚、游戏、生活记录、体育、舞蹈才艺、学习教育、休闲玩乐、影视、音乐、颜值造型、健康医学、综艺、个人成长
请问您是想查看以上哪个赛道的榜单,还是查看「全部」综合榜单?---
示例 5:请求完整 50 条输出
用户: 给我美食赛道今天的完整50条榜单
Agent:
调用 API 获取完整 50 条数据,以 Markdown 表格形式输出全部数据,作品标题以 [标题](workUrl) 超链接格式展示。
---
输出数量规则
| 场景 | 展示条数 |
|---|---|
| 默认输出 | 20条,附"是否查看剩余30条"提示 |
| 用户请求完整 | 输出全部50条(Markdown 表格,标题为可点击超链接) |
订阅功能
- 支持用户订阅指定赛道 + 指定时间推送
- 若用户未指定时间,默认每日 06:00 推送
- 订阅确认后告知用户推送时间点
#!/usr/bin/env python3
"""
抖音每日最热作品榜查询工具
日度收录全平台抖音作品,输出单日点赞TOP50榜单,
支持按赛道分类查询、历史日期回溯。
用法:
python douyin_daily_hot.py # 默认:昨日全品类 TOP20
python douyin_daily_hot.py --type 美食 # 指定赛道
python douyin_daily_hot.py --start 2026-05-28 # 指定日期
python douyin_daily_hot.py --type 美食 --start 2026-05-20 --end 2026-05-28 # 日期范围
python douyin_daily_hot.py --full # 输出全部 50 条
环境变量:
REDFOX_API_KEY API 密钥(必填)
"""
import os
import sys
import json
import argparse
from datetime import datetime, timedelta
from urllib.request import Request, urlopen
from urllib.error import HTTPError, URLError
# ────────────────────────────────────────────────────
# 常量
# ────────────────────────────────────────────────────
API_BASE = "https://redfox.hk/story/api/dy/search/likesRank"
DEFAULT_LIMIT = 20
FULL_LIMIT = 50
CATEGORIES = [
"全部", "小剧场", "财富理财", "二次元", "身体锻炼", "居家装修",
"数码科技", "科学普及", "旅行", "美食", "动物", "明星娱乐",
"汽车", "亲子", "人文", "三农", "潮流风尚", "游戏",
"生活记录", "体育", "舞蹈才艺", "学习教育", "休闲玩乐", "影视",
"音乐", "颜值造型", "健康医学", "综艺", "个人成长",
]
# ────────────────────────────────────────────────────
# 工具函数
# ────────────────────────────────────────────────────
def format_number(n):
"""将数字格式化为可读字符串,如 10w+、1.2w、5000"""
if n is None:
return "-"
n = int(n)
if n >= 100000:
return f"{n // 10000}w+"
elif n >= 10000:
return f"{n / 10000:.1f}w"
else:
return str(n)
def format_fans(fans_str):
"""格式化粉丝数,若已是字符串则直接返回"""
if fans_str is None:
return "-"
if isinstance(fans_str, str):
return fans_str
return format_number(fans_str)
def format_time(ts):
"""将时间字符串 YYYY-MM-DD HH:MM 转为 MM-DD HH:00 格式"""
if not ts:
return "-"
try:
dt = datetime.strptime(ts, "%Y-%m-%d %H:%M:%S")
return dt.strftime("%m-%d %H:00")
except ValueError:
return ts
def yesterday():
"""返回昨日日期字符串 YYYY-MM-DD"""
return (datetime.now() - timedelta(days=1)).strftime("%Y-%m-%d")
# ────────────────────────────────────────────────────
# API 调用
# ────────────────────────────────────────────────────
def call_api(category="全部", start_time=None, end_time=None):
"""调用抖音点赞排行榜接口,返回解析后的数据列表"""
api_key = os.environ.get("REDFOX_API_KEY", "")
if not api_key:
print("❌ 错误:未配置环境变量 REDFOX_API_KEY,请先设置 API 密钥。")
sys.exit(1)
if start_time is None:
start_time = yesterday()
if end_time is None:
end_time = yesterday()
body = {
"source": "抖音每日热门作品榜-GitHub",
}
if category and category != "全部":
body["type"] = category
if start_time:
body["startTime"] = start_time
if end_time:
body["endTime"] = end_time
json_body = json.dumps(body).encode("utf-8")
req = Request(API_BASE, data=json_body, method="POST")
req.add_header("X-API-KEY", api_key)
req.add_header("Content-Type", "application/json")
req.add_header("Accept", "application/json")
try:
with urlopen(req, timeout=30) as resp:
data = json.loads(resp.read().decode("utf-8"))
except HTTPError as e:
error_handlers = {
401: "API Key 无效或未配置,请检查 REDFOX_API_KEY 环境变量。",
404: "该日期暂无数据。",
429: "请求频率超限,请稍后重试。",
}
msg = error_handlers.get(e.code, f"服务端错误 (HTTP {e.code}),请稍后重试。")
print(f"❌ 错误:{msg}")
sys.exit(1)
except URLError as e:
print(f"❌ 网络错误:无法连接到 API 服务。{e.reason}")
sys.exit(1)
except json.JSONDecodeError:
print("❌ 错误:无法解析 API 响应。")
sys.exit(1)
# 解析响应
code = data.get("code", -1)
if code != 2000:
print(f"❌ API 返回错误码:{code},消息:{data.get('msg', '未知错误')}")
sys.exit(1)
items = data.get("data", [])
if not items:
print("📭 未查询到数据,该条件下暂无榜单记录。")
sys.exit(0)
return items
# ────────────────────────────────────────────────────
# Markdown 输出
# ────────────────────────────────────────────────────
def print_table(items, category, start_time, end_time, limit=20):
"""按 SKILL.md 标准输出 Markdown 格式榜单,作品标题为 [标题](workUrl) 超链接"""
display_limit = min(limit, len(items))
date_label = start_time if start_time == end_time else f"{start_time} ~ {end_time}"
is_all = (category == "全部" or category is None)
print()
print("💡 榜单说明:每日 06:00 更新昨日数据。互动数据为入库时间,与实时数据存在差异。")
print()
if is_all:
print(f"📊 抖音每日点赞TOP{display_limit}({date_label})")
else:
print(f"📊 抖音{category}赛道点赞TOP{display_limit}({date_label})")
print()
# Markdown 表头
if is_all:
print("| 排名 | 作品标题 | 作者(粉丝数) | 赛道 | 收藏 | 评论 | 分享 | **点赞** | 发布时间 |")
print("|------|---------|--------------|------|------|------|------|------|---------|")
else:
print("| 排名 | 作品标题 | 作者(粉丝数) | 收藏 | 评论 | 分享 | **点赞** | 发布时间 |")
print("|------|---------|--------------|------|------|------|------|---------|")
# 数据行
for idx, item in enumerate(items[:limit], start=1):
raw_title = (item.get("title") or "-").replace("|", "|").replace("[", "【").replace("]", "】").replace("\n", " ").replace("\r", " ")
work_url = item.get("workUrl", "")
if work_url:
title = f"[{raw_title}]({work_url})"
else:
title = raw_title
author = item.get("accountName", "-")
fans = format_fans(item.get("followerCount"))
author_display = f"{author}({fans})"
cat = item.get("category") or "-"
collect = format_number(item.get("collectCount"))
comment = format_number(item.get("commentCount"))
share = format_number(item.get("shareCount"))
like = f"**{format_number(item.get('likeCount'))}**"
pub_time = format_time(item.get("publishTime"))
if is_all:
print(f"| {idx} | {title} | {author_display} | {cat} | {collect} | {comment} | {share} | {like} | {pub_time} |")
else:
print(f"| {idx} | {title} | {author_display} | {collect} | {comment} | {share} | {like} | {pub_time} |")
print()
if len(items) > limit:
remaining = len(items) - limit
print("⚡ 更多操作")
print(f"• 本次榜单完整共 {len(items)} 条数据,是否需要查看剩余 {remaining} 条?")
print("• 使用 --full 参数查看完整榜单")
print()
# ────────────────────────────────────────────────────
# 主函数
# ────────────────────────────────────────────────────
def main():
parser = argparse.ArgumentParser(
description="抖音每日最热作品榜查询工具",
formatter_class=argparse.RawDescriptionHelpFormatter,
epilog=f"""
示例:
%(prog)s # 昨日全品类 TOP20
%(prog)s --type 美食 # 美食赛道 TOP20
%(prog)s --start 2026-05-28 # 指定日期 TOP20
%(prog)s --type 美食 --start 2026-05-28 # 指定日期 + 赛道
%(prog)s --type 美食 --start 2026-05-20 --end 2026-05-28 # 日期范围
%(prog)s --full # 输出完整 50 条
支持赛道:
{', '.join(CATEGORIES)}
""",
)
parser.add_argument(
"--type", "-t",
default="全部",
choices=CATEGORIES,
help="赛道分类(默认:全部)",
)
parser.add_argument(
"--start", "-s",
default=None,
help="起始日期,格式 YYYY-MM-DD(默认:昨日)",
)
parser.add_argument(
"--end", "-e",
default=None,
help="结束日期,格式 YYYY-MM-DD(默认:同 start)",
)
parser.add_argument(
"--full", "-f",
action="store_true",
help="输出全部 50 条数据",
)
parser.add_argument(
"--limit", "-l",
type=int,
default=None,
help="自定义输出条数(默认 20,最大 50)",
)
args = parser.parse_args()
start_time = args.start or yesterday()
end_time = args.end or start_time
# 获取数据
items = call_api(
category=args.type,
start_time=start_time,
end_time=end_time,
)
# 确定输出条数
if args.full:
limit = FULL_LIMIT
elif args.limit is not None:
limit = min(args.limit, FULL_LIMIT)
else:
limit = DEFAULT_LIMIT
# 输出
print_table(items, args.type, start_time, end_time, limit=limit)
if __name__ == "__main__":
main()