关于 tiktok
tiktok 是通过 curl、jq 和配套脚本调用 TikTok API v2 的技能,适用于需要读取账号信息、发布视频或上传草稿的工作流。它强调发布前确认创作者选择,并跟踪操作状态。
主要功能
- 01读取基本账号资料
- 02向个人主页直接发布视频
- 03将视频上传至草稿收件箱
- 04查询发布处理状态
适用场景
- 01核对目标 TikTok 账号
- 02按创作者确认内容发布视频
- 03上传视频供创作者稍后完成发布
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ acedatacloud/ skills --skill tiktok安装后在 Claude Code 中输入/tiktok确认已加载。
附带文件scripts/tiktok.py
详细介绍
使用 curl + jq 调用 TikTok API v2。用户的 OAuth 持有者令牌位于
$TIKTOK_TOKEN;每次调用都需要 Authorization: Bearer $TIKTOK_TOKEN。基础
URL:https://open.tiktokapis.com/v2。
T="https://open.tiktokapis.com/v2"; AUTH="Authorization: Bearer $TIKTOK_TOKEN"
响应会将所有内容包装在 {"data":…,"error":{"code","message","log_id"}} 中。
检查 error.code,不要只看 HTTP 状态码——一些实际错误
(spam_risk_too_many_posts、spam_risk_user_banned_from_posting、
reached_active_user_cap)会以 HTTP 200 返回,但代码不是 ok。原样显示
error.message。401 / access_token_invalid = 重新连接 TikTok。
读取账号信息
# Basic profile — open_id identifies the user for every posting call
curl -sS -H "$AUTH" "$T/user/info/?fields=open_id,display_name,avatar_url" \
| jq '.data.user'
粉丝数 / 点赞数、简介和用户的视频列表需要 Display API
权限范围(user.info.stats、user.info.profile、video.list),但此应用
未获授这些权限——不要调用 /v2/video/list/,也不要请求这些字段,
否则会因 scope_not_authorized 失败。
直接发布到创作者的个人主页
生产应用已通过 TikTok Content Posting API 审核。直接发布会在处理完成后
发布到创作者的个人主页;它不是草稿。绝不要代替创作者选择隐私级别、
互动设置或披露选项。若某个 publish_id 正在处理中,绝不要重试初始化请求。
必需步骤:
-
确认视频及其来源。测量视频时长并预览。托管在服务器上的视频必须使用 位于已验证
acedata.cloud域名下、公开且不会重定向的 HTTPS URL(PULL_FROM_URL)。 创作者选定的设备本地 MP4 可以使用FILE_UPLOAD,且文件不得超过 64 MB。 -
使用
python3 skills/tiktok/scripts/tiktok.py creator-info查询所选连接。检查creator_username是否与创作者指定的账号一致。将当前昵称、头像、privacy_level_options、互动限制和最长时长,以及真实的视频预览,复制到request_action_confirmation中,并设置kind: "tiktok.publish"。不要虚构或预先选择隐私选项。 -
如果已取消,则停止。如果已确认,则严格使用卡片返回的
title、privacy_level、disable_comment、disable_duet、disable_stitch、brand_organic_toggle和brand_content_toggle。对于 AI 生成的内容, 添加is_aigc: true;否则添加false。对于 Ace Data Cloud 品牌推广, 创作者必须选择自有品牌推广披露选项。将这些值存储在仓库外的临时 JSON 文件中。 -
确认后,仅提交一次,并使用准确的所选账号:
# Server-hosted video on the verified domain: python3 skills/tiktok/scripts/tiktok.py post-url "$VIDEO_URL" \ --duration-sec "$DURATION" \ --expected-creator-username "$CONFIRMED_CREATOR_USERNAME" \ --values-file "$VALUES_JSON" --confirmed # Creator-selected device-local MP4: python3 skills/tiktok/scripts/tiktok.py post-file video.mp4 \ --duration-sec "$DURATION" \ --expected-creator-username "$CONFIRMED_CREATOR_USERNAME" \ --values-file "$VALUES_JSON" --confirmed两条命令都会重新查询创作者信息,并拒绝不同的账号、不可用的隐私级别、 已禁用的互动选项或超长视频。通过此检查后,绝不要替换已确认的字段。
-
使用
status轮询返回的publish_id,直到状态为PUBLISH_COMPLETE或出现 终止性失败。报告实际结果。初始化请求已被接受或文件传输成功,都不代表帖子已发布。
将视频上传到用户的草稿箱
当创作者明确要求保存为草稿时使用此流程。视频会进入他们的 TikTok 收件箱 / 草稿箱;他们打开 TikTok 应用,添加说明文字、声音和隐私设置,然后发布。
必须按以下顺序操作:
- 确认确切的视频及其来源:创作者设备本地的文件,或托管在已验证的
acedata.cloud域名下的 URL。预览视频。 - 调用
request_action_confirmation,其中kind: "generic",提供真实的视频预览,并在摘要中说明这会将视频上传到草稿箱,而不是发布。 - 如果用户取消,则停止。如果用户确认,则只执行一次上传。对于设备本地文件,使用
python3 skills/tiktok/scripts/tiktok.py upload video.mp4。对于托管在服务器上的视频,使用python3 skills/tiktok/scripts/tiktok.py upload-url "$VIDEO_URL"。 - 使用
python3 skills/tiktok/scripts/tiktok.py status PUBLISH_ID轮询,直到状态为终态。轮询期间绝不要再次调用upload。
有两种可用的来源模式。开发者门户于 2026-10-03 验证了 acedata.cloud,其子域名也在覆盖范围内。该域名上托管的视频必须使用 PULL_FROM_URL;只有创作者设备本地的文件才使用 FILE_UPLOAD。请确认确切的 URL 是公开的 HTTPS URL,且不会重定向。
FILE_UPLOAD(创作者设备本地文件)
仅对创作者从自己的设备中选择的文件使用此方式。小于 64 MB 的文件会作为单个分块上传。
SIZE=$(stat -f%z video.mp4 2>/dev/null || stat -c%s video.mp4)
INIT=$(curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d "$(jq -n --argjson s "$SIZE" \
'{source_info:{source:"FILE_UPLOAD", video_size:$s, chunk_size:$s, total_chunk_count:1}}')" \
"$T/post/publish/inbox/video/init/")
echo "$INIT" | jq '{publish_id:.data.publish_id, error:.error.code}'
UPLOAD_URL=$(echo "$INIT" | jq -r '.data.upload_url')
curl -sS -X PUT "$UPLOAD_URL" \
-H "Content-Type: video/mp4" \
-H "Content-Length: $SIZE" \
-H "Content-Range: bytes 0-$((SIZE-1))/$SIZE" \
--data-binary @video.mp4 -o /dev/null -w '%{http_code}\n'
整个文件上传完成时,PUT 会返回 201(中间分块返回 206)。upload_url 会在 1 小时后过期。
PULL_FROM_URL(仅限来自已验证域名的 URL)
python3 skills/tiktok/scripts/tiktok.py upload-url "$VIDEO_URL"
该辅助工具要求 URL 是来自已验证 acedata.cloud 域名的公开 HTTPS URL,视频类型为 video/mp4,且不会重定向。域名验证覆盖其下级子域名。
轮询状态
curl -sS -X POST -H "$AUTH" -H "Content-Type: application/json" \
-d "$(jq -n --arg id "$PUBLISH_ID" '{publish_id:$id}')" \
"$T/post/publish/status/fetch/" | jq '.data | {status, fail_reason}'
PROCESSING_UPLOAD / PROCESSING_DOWNLOAD → SEND_TO_USER_INBOX = 完成,视频正在创作者的 TikTok 收件箱中等待处理。告知他们打开 TikTok 应用完成发布,并说明处理需要几分钟。
对于 auth_removed、spam_risk_text、spam_risk 或
spam_risk_user_banned_from_posting,不要重试——这些都是终态。internal 可以重试。
注意事项
- 在确认卡片中绝不要预先选择
privacy_level。辅助工具会在执行唯一一次 Direct Post 调用前,根据最新的privacy_level_options检查创作者的选择。品牌内容不能设置为SELF_ONLY。 - 使用旧版 Sandbox 应用建立的连接必须重新连接到 Production 应用。如果 TikTok 返回
unaudited_client_can_only_post_to_private_accounts,请停止并让创作者重新连接;不要重试同一条帖子,也不要更改其隐私设置。 - 每个用户令牌的速率限制:
creator_info/query为 20 次/分钟,video/init/为 6 次/分钟,status/fetch/为 30 次/分钟。TikTok 还将每位创作者的发帖量限制在每天约 15 条,所有应用共享此限制——其他应用也可能耗尽额度。 - 在此流程中,
SEND_TO_USER_INBOX表示成功,并非中间状态。不要等待PUBLISH_COMPLETE——只有用户在应用中发布后才会出现该状态。