
Douyin Realtime Hot Rise
- 135 installs
- 45 repo stars
- Updated June 6, 2026
- allinherog-star/ai-skills
For development and infrastructure management.
About
douyin-realtime-hot-rise is an AI coding tool that enhances development workflows. Builders use it for infrastructure, integration, and platform development within the catalog ecosystem.
- douyin-realtime-hot-rise
- Development
Douyin Realtime Hot Rise by the numbers
- 135 all-time installs (skills.sh)
- Ranked #2,658 of 4,347 Backend & APIs skills by installs in the Skillselion catalog
- Data as of Aug 4, 2026 (Skillselion catalog sync)
npx skills add https://github.com/allinherog-star/ai-skills --skill douyin-realtime-hot-riseAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 135 |
|---|---|
| repo stars | ★ 45 |
| Last updated | June 6, 2026 |
| Repository | allinherog-star/ai-skills ↗ |
What it does
For development and infrastructure management.
Files
douyin-realtime-hot-rise 抖音上升热点选题助手(爆款选题)
概述
抖音上升热点选题助手用于回答「拍什么会有流量」、找上升选题、看赛道是否升温、辅助内容策划会,适合内容创作者、运营、电商、营销在明确业务目标、内容材料或分析对象后调用。 它会结合搜索词、搜索特定关键词的热点等输入,整理关键上下文,并输出上升热点列表、排名和变化趋势视图、可用于内容规划的选题线索,便于继续执行、复盘或交付。
什么时候使用
适用场景
- 用户想知道接下来拍什么、写什么更可能有流量
- 用户想找正在上升的抖音热点或赛道机会
- 用户需要增长导向的选题参考
调用方式
通过导出的 Python runner 直接调用 AI Skills API:
命令示例
按关键词追热点
python3 scripts/run.py --params '{"keyword":"奥运","order":"rank_diff"}'按分类看热点
python3 scripts/run.py --params '{"tag":"5000","order":"rank"}'参数说明
| 参数 | 类型 | 必填 | 默认 | 说明 |
|---|---|---|---|---|
tag | string | 否 | - | 筛选特定分类的热点(从分类接口获取) |
order | string | 否 | rank | 选择热点排序方式;可选值:热度排序(rank)、变化排序(rank_diff) |
keyword | string | 否 | - | 搜索特定关键词的热点 |
完整机器可读参数结构见 references/form-schema.json。
参数取值参考
当前技能没有需要额外查表的分类参数。
支持的输入格式
当前技能直接接收 JSON 参数,不涉及分享链接解析。
示例请求
下面的示例参数可直接传给 scripts/run.py,runner 会把它们发送给 AI Skills API。
python3 scripts/run.py --params '{"keyword":"奥运","order":"rank_diff"}'等价的 --params JSON:
{
"keyword": "奥运",
"order": "rank_diff"
}返回结果示例
{
"success": true,
"data": {
"title": "抖音实时上升热点榜",
"updateTime": "2026-04-24T11:30:00.000Z",
"pagination": {
"page": 1,
"pageSize": 30,
"total": 100
},
"items": [
{
"rank": 1,
"rankDiff": 12,
"keyword": "奥运开幕式",
"id": 1234567890,
"hotScore": 9876543,
"videoCount": 1860,
"tagId": 5000,
"tagName": "体育",
"trends": [
{
"time": "10:00",
"score": 6320000
},
{
"time": "11:00",
"score": 9876543
}
],
"createdAt": "2026-04-24T11:20:00.000Z"
}
]
},
"meta": {
"executionTime": 842,
"cached": false
}
}交付内容
- 上升热点清单:给出关键词、分类、排名变化和热度趋势。
- 趋势判断依据:帮助判断热点是刚开始升温、持续走高还是已经接近峰值。
- 选题参考:可直接用于短视频脚本、内容会选题和赛道观察。
结果使用建议
- 优先关注排名变化明显、仍在上升、且与账号赛道匹配的关键词。
- 结合分类和趋势变化判断跟进窗口,尽量把热点转成具体脚本角度。
- 适合内容会、选题池更新和临时热点响应。
运行前准备
AISKILLS_BASE_URL:默认https://ai-skills.aiAISKILLS_API_KEY:必填,用于认证调用AISKILLS_TENANT_ID:默认default
interface:
display_name: "抖音上升热点选题助手"
short_description: "抖音上升热点选题助手"
default_prompt: "Use $douyin-realtime-hot-rise to help with 抖音上升热点选题助手"
policy:
allow_implicit_invocation: true
{
"type": "object",
"properties": {
"tag": {
"type": "string",
"title": "热点分类",
"description": "筛选特定分类的热点(从分类接口获取)",
"x-component": "CategorySelect",
"x-component-props": {
"allowClear": true,
"placeholder": "全部分类"
}
},
"order": {
"enum": [
"rank",
"rank_diff"
],
"type": "string",
"title": "排序方式",
"default": "rank",
"enumNames": [
"热度排序",
"变化排序"
],
"description": "选择热点排序方式"
},
"keyword": {
"type": "string",
"title": "搜索词",
"description": "搜索特定关键词的热点",
"x-component-props": {
"maxLength": 100,
"allowClear": true,
"placeholder": "输入关键词搜索"
}
}
}
}
{
"id": "douyin-realtime-hot-rise",
"slug": "douyin-realtime-hot-rise",
"question": "拍什么会有流量?",
"skillName": "抖音上升热点选题助手",
"tags": [
"抖音",
"热点",
"趋势",
"内容创作",
"流量"
],
"profession": [
"内容创作者",
"运营",
"电商",
"营销"
],
"industry": [
"新媒体",
"电商",
"娱乐",
"通用"
],
"hidden": false,
"auth": {
"type": "api-key",
"header": "X-API-Key",
"tenantHeader": "X-Tenant-Id"
},
"comingSoon": false,
"providerType": "api",
"providerConfig": {
"catalog": {
"icon": "TrendingUp",
"rating": 4.9,
"displayOrder": 3,
"subProfession": [
"content-creator",
"analyst"
]
},
"endpoint": "/api/v1/douyin/billboard/fetch_hot_rise_list",
"apiSource": "tikhub",
"fixedParams": {
"page": 1,
"page_size": 50
}
},
"invocationMode": "execute",
"invocation": {
"type": "execute",
"executePath": "/api/execute"
},
"formSchema": {
"type": "object",
"properties": {
"tag": {
"type": "string",
"title": "热点分类",
"description": "筛选特定分类的热点(从分类接口获取)",
"x-component": "CategorySelect",
"x-component-props": {
"allowClear": true,
"placeholder": "全部分类"
}
},
"order": {
"enum": [
"rank",
"rank_diff"
],
"type": "string",
"title": "排序方式",
"default": "rank",
"enumNames": [
"热度排序",
"变化排序"
],
"description": "选择热点排序方式"
},
"keyword": {
"type": "string",
"title": "搜索词",
"description": "搜索特定关键词的热点",
"x-component-props": {
"maxLength": 100,
"allowClear": true,
"placeholder": "输入关键词搜索"
}
}
}
}
}
#!/usr/bin/env python3
import argparse
import json
import os
import ssl
import sys
import time
import urllib.error
import urllib.request
SKILL_ID = "douyin-realtime-hot-rise"
EXECUTE_PATH = "/api/execute"
DEFAULT_BASE_URL = "https://ai-skills.ai"
RECHARGE_URL = "https://ai-skills.ai/user/billing"
def fail(message):
print(json.dumps({"success": False, "error": {"code": "RUNNER_ERROR", "message": message}}, ensure_ascii=False))
sys.exit(1)
def load_params(raw):
try:
return json.loads(raw or "{}")
except json.JSONDecodeError as exc:
fail(f"Invalid params JSON: {exc}")
def build_base_url():
return os.getenv("AISKILLS_BASE_URL", DEFAULT_BASE_URL).rstrip("/")
def build_headers():
api_key = os.getenv("AISKILLS_API_KEY", "").strip()
tenant_id = os.getenv("AISKILLS_TENANT_ID", "default").strip() or "default"
if not api_key:
fail("AISKILLS_API_KEY is required")
return {
"Content-Type": "application/json",
# Cloudflare blocks urllib's default Python user agent for this endpoint.
"User-Agent": "ai-skills-runner/1.0 (+https://ai-skills.ai)",
"Accept": "application/json",
"X-API-Key": api_key,
"X-Tenant-Id": tenant_id,
}
def build_ssl_context():
if os.getenv("SSL_CERT_FILE") or os.getenv("SSL_CERT_DIR"):
return ssl.create_default_context()
try:
import certifi
except ImportError:
return ssl.create_default_context()
return ssl.create_default_context(cafile=certifi.where())
SSL_CONTEXT = build_ssl_context()
def print_url_error(exc):
reason = getattr(exc, "reason", exc)
code = "SSL_CERTIFICATE_VERIFY_FAILED" if isinstance(reason, ssl.SSLCertVerificationError) else "NETWORK_ERROR"
message = str(reason)
if code == "SSL_CERTIFICATE_VERIFY_FAILED":
message = (
"HTTPS certificate verification failed. Install certifi or set SSL_CERT_FILE "
f"to a valid CA bundle, then retry: {reason}"
)
print(json.dumps({"success": False, "error": {"code": code, "message": message}}, ensure_ascii=False))
sys.exit(1)
def print_http_error(exc):
payload_text = exc.read().decode("utf-8")
try:
parsed = json.loads(payload_text)
except json.JSONDecodeError:
parsed = {"success": False, "error": {"code": f"HTTP_{exc.code}", "message": str(exc)}}
error = parsed.setdefault("error", {})
code = error.get("code") or f"HTTP_{exc.code}"
if exc.code == 402 or code == "BILLING_BALANCE_INSUFFICIENT":
error["code"] = "BILLING_BALANCE_INSUFFICIENT"
error["message"] = f"余额不足,请前往 {RECHARGE_URL} 充值后重试"
meta = parsed.setdefault("meta", {})
meta["rechargeUrl"] = RECHARGE_URL
print(json.dumps(parsed, ensure_ascii=False))
sys.exit(1)
def request_json(method, path, payload):
body = json.dumps(payload).encode("utf-8")
req = urllib.request.Request(
f"{build_base_url()}{path}",
data=body,
method=method,
headers=build_headers(),
)
try:
with urllib.request.urlopen(req, context=SSL_CONTEXT) as response:
return json.loads(response.read().decode("utf-8"))
except urllib.error.HTTPError as exc:
print_http_error(exc)
except urllib.error.URLError as exc:
print_url_error(exc)
def is_async_terminal(data):
status = data.get("status")
return status in {"completed", "failed", "needs_input", "cancelled"}
def poll_async_result(start_response, max_attempts, interval_seconds):
data = start_response.get("data") or {}
if data.get("mode") != "async":
return start_response
if is_async_terminal(data):
return start_response
execution_id = data.get("executionId") or data.get("turnId")
job_id = data.get("jobId")
if not execution_id and not job_id:
return start_response
for _ in range(max_attempts):
time.sleep(interval_seconds)
response = request_json("POST", EXECUTE_PATH, {
"skillId": SKILL_ID,
"params": {},
"execution": {
"action": "poll",
"executionId": execution_id,
"jobId": job_id,
},
})
data = response.get("data") or {}
if data.get("mode") == "async" and is_async_terminal(data):
return response
fail("Async skill execution did not reach a terminal state in time")
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--params", default="{}")
parser.add_argument("--poll-attempts", type=int, default=180)
parser.add_argument("--poll-interval", type=float, default=2.0)
args = parser.parse_args()
params = load_params(args.params)
response = request_json("POST", EXECUTE_PATH, {"skillId": SKILL_ID, "params": params})
print(json.dumps(poll_async_result(response, args.poll_attempts, args.poll_interval), ensure_ascii=False))
if __name__ == "__main__":
main()