TikTok Page

通过PowerShell管理TikTok账号,支持发布、查看视频及账户数据。

已扫描
适合谁
TikTok内容创作者、数字营销运营人员
不适合谁
无PowerShell环境的用户、无法访问TikTok开发者平台者
国内可用性
需网络配置。可能需要网络配置或第三方服务可访问。
安装难度
新手友好(★☆☆)。基于终端操作、依赖、API Key 和本地环境要求的初步判断。

安装与下载

openclaw skills install @seph1709/tiktok-page

Skill 说明

命令、参数、文件名以原文为准

tiktok-page — 通用 TikTok API 技能

根据用户需求内联构建并执行 TikTok API 调用,无需编写脚本。

API 域名:https://open.tiktokapis.com/v2


第一步 - 加载凭证

凭证存储在 ~/.config/tiktok-page/credentials.json 文件中。

$cfg          = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$accessToken  = $cfg.TIKTOK_ACCESS_TOKEN
$refreshToken = $cfg.TIKTOK_REFRESH_TOKEN
$clientKey    = $cfg.TIKTOK_CLIENT_KEY
$clientSecret = $cfg.TIKTOK_CLIENT_SECRET
$openId       = $cfg.TIKTOK_OPEN_ID

如果文件不存在,请引导用户完成设置:

字段用途
TIKTOK_ACCESS_TOKENOAuth2 访问令牌 — 用于所有 API 调用
TIKTOK_REFRESH_TOKEN在访问令牌过期时用于刷新令牌
TIKTOK_CLIENT_KEY来自 TikTok 开发者平台的应用客户端密钥
TIKTOK_CLIENT_SECRET应用客户端密钥 — 仅用于令牌刷新
TIKTOK_OPEN_IDOAuth 过程中返回的 TikTok 用户 open_id

一次性 OAuth2 设置流程:

1. 访问 https://developers.tiktok.com — 创建或选择您的应用
2. 添加重定向 URI(例如 https://localhost 或您的回调地址)
3. 记下您的客户端密钥和客户端密钥
4. 引导用户访问:
   https://www.tiktok.com/v2/auth/authorize/?client_key=CLIENT_KEY&redirect_uri=REDIRECT_URI&response_type=code&scope=user.info.basic,video.list,video.publish,video.upload,comment.list&state=random
5. 重定向后,从回调 URL 中复制 code 参数
# 使用授权码换取令牌
$clientKey   = "<your-client-key>"
$clientSecret = "<your-client-secret>"
$code        = "<auth-code-from-redirect>"
$redirectUri = "<your-redirect-uri>"

$body = "client_key=$clientKey&client_secret=$clientSecret&code=$code&grant_type=authorization_code&redirect_uri=$redirectUri"
$r = Invoke-RestMethod "https://open.tiktokapis.com/v2/oauth/token/" -Method POST `
    -Headers @{ "Content-Type" = "application/x-www-form-urlencoded" } -Body $body -ErrorAction Stop

New-Item -ItemType Directory -Force -Path "$HOME/.config/tiktok-page" | Out-Null
@{
    TIKTOK_ACCESS_TOKEN  = $r.access_token
    TIKTOK_REFRESH_TOKEN = $r.refresh_token
    TIKTOK_CLIENT_KEY    = $clientKey
    TIKTOK_CLIENT_SECRET = $clientSecret
    TIKTOK_OPEN_ID       = $r.open_id
} | ConvertTo-Json | Set-Content "$HOME/.config/tiktok-page/credentials.json" -Encoding UTF8

保存后立即限制文件权限:

# Windows
icacls "$HOME/.config/tiktok-page/credentials.json" /inheritance:r /grant:r "$($env:USERNAME):(R,W)"
# macOS / Linux
# chmod 600 ~/.config/tiktok-page/credentials.json

请勿将此文件提交到版本控制系统。它包含长期有效的敏感信息。

此技能仅调用 open.tiktokapis.com,不向第三方转发任何数据。


第二步 - 刷新令牌

TikTok 访问令牌有效期为 24 小时。如需调用 API,应在使用前检查并刷新令牌:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$body = "client_key=$($cfg.TIKTOK_CLIENT_KEY)&client_secret=$($cfg.TIKTOK_CLIENT_SECRET)&grant_type=refresh_token&refresh_token=$($cfg.TIKTOK_REFRESH_TOKEN)"
$r = Invoke-RestMethod "https://open.tiktokapis.com/v2/oauth/token/" -Method POST `
    -Headers @{ "Content-Type" = "application/x-www-form-urlencoded" } -Body $body -ErrorAction Stop

$cfg.TIKTOK_ACCESS_TOKEN  = $r.access_token
$cfg.TIKTOK_REFRESH_TOKEN = $r.refresh_token
$cfg | ConvertTo-Json | Set-Content "$HOME/.config/tiktok-page/credentials.json" -Encoding UTF8
Write-Host "令牌已刷新。"

第三步 - 确定 API 调用

常用接口

用户需求方法接口路径
获取账号信息POST/user/info/
获取个人视频列表POST/video/list/
获取视频详情POST/video/query/
获取评论列表GET/video/comment/list/?video_id={id}
通过 URL 发布视频POST/post/publish/video/init/(使用 PULL_FROM_URL)
从文件上传视频POST 后接 PUT/post/publish/video/init/ 后获取 upload_url
查询发布状态GET/post/publish/status/fetch/?publish_id={id}

API 调用示例

获取账号信息:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)"; "Content-Type" = "application/json; charset=UTF-8" }
$body    = @{ fields = "display_name,avatar_url,follower_count,following_count,likes_count,video_count" } | ConvertTo-Json
$result  = Invoke-RestMethod "https://open.tiktokapis.com/v2/user/info/" -Method POST -Headers $headers -Body $body -ErrorAction Stop
$result.data.user

列出视频:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)"; "Content-Type" = "application/json; charset=UTF-8" }
$body    = @{ max_count = 20; fields = "id,title,create_time,cover_image_url,share_url,view_count,like_count,comment_count,share_count" } | ConvertTo-Json
$result  = Invoke-RestMethod "https://open.tiktokapis.com/v2/video/list/" -Method POST -Headers $headers -Body $body -ErrorAction Stop
$result.data.videos | Format-Table id, title, view_count, like_count, create_time

通过视频 ID 获取详细信息:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)"; "Content-Type" = "application/json; charset=UTF-8" }
$body    = @{ filters = @{ video_ids = @("<video_id>") }; fields = "id,title,view_count,like_count,comment_count,share_count,embed_html" } | ConvertTo-Json -Depth 4
$result  = Invoke-RestMethod "https://open.tiktokapis.com/v2/video/query/" -Method POST -Headers $headers -Body $body -ErrorAction Stop
$result.data.videos

从 URL 发布视频:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)"; "Content-Type" = "application/json; charset=UTF-8" }
$body = @{
    post_info = @{
        title           = "您的视频标题"
        privacy_level   = "PUBLIC_TO_EVERYONE"
        disable_duet    = $false
        disable_stitch  = $false
        disable_comment = $false
    }
    source_info = @{
        source            = "PULL_FROM_URL"
        video_url         = "https://example.com/video.mp4"
        video_size        = 12345678
        chunk_size        = 10000000
        total_chunk_count = 1
    }
} | ConvertTo-Json -Depth 5
$result = Invoke-RestMethod "https://open.tiktokapis.com/v2/post/publish/video/init/" -Method POST -Headers $headers -Body $body -ErrorAction Stop
Write-Host "发布 ID: $($result.data.publish_id)"

从本地文件上传视频:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)"; "Content-Type" = "application/json; charset=UTF-8" }
$filePath  = "C:\path\to\video.mp4"
$fileSize  = (Get-Item $filePath).Length
$chunkSize = 10MB

$initBody = @{
    post_info = @{
        title           = "您的标题"
        privacy_level   = "PUBLIC_TO_EVERYONE"
        disable_duet    = $false
        disable_stitch  = $false
        disable_comment = $false
    }
    source_info = @{
        source            = "FILE_UPLOAD"
        video_size        = $fileSize
        chunk_size        = $chunkSize
        total_chunk_count = [math]::Ceiling($fileSize / $chunkSize)
    }
} | ConvertTo-Json -Depth 5
$initResult = Invoke-RestMethod "https://open.tiktokapis.com/v2/post/publish/video/init/" -Method POST -Headers $headers -Body $initBody -ErrorAction Stop
$uploadUrl  = $initResult.data.upload_url
$publishId  = $initResult.data.publish_id

# 上传分块
$fileStream = [System.IO.File]::OpenRead($filePath)
$buffer     = New-Object byte[] $chunkSize
$chunkIndex = 0
while (($bytesRead = $fileStream.Read($buffer, 0, $chunkSize)) -gt 0) {
    $chunk      = $buffer[0..($bytesRead - 1)]
    $rangeStart = $chunkIndex * $chunkSize
    $rangeEnd   = $rangeStart + $bytesRead - 1
    Invoke-RestMethod $uploadUrl -Method PUT -Headers @{
        "Content-Range" = "bytes $rangeStart-$rangeEnd/$fileSize"
        "Content-Type"  = "video/mp4"
    } -Body $chunk | Out-Null
    $chunkIndex++
}
$fileStream.Close()
Write-Host "上传完成。发布 ID: $publishId"

检查发布状态:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)" }
$result  = Invoke-RestMethod "https://open.tiktokapis.com/v2/post/publish/status/fetch/?publish_id=<publish_id>" -Headers $headers -ErrorAction Stop
Write-Host "状态: $($result.data.status)"

获取评论:

$cfg = Get-Content "$HOME/.config/tiktok-page/credentials.json" -Raw | ConvertFrom-Json
$headers = @{ "Authorization" = "Bearer $($cfg.TIKTOK_ACCESS_TOKEN)" }
$result  = Invoke-RestMethod "https://open.tiktokapis.com/v2/video/comment/list/?video_id=<video_id>&fields=id,text,create_time,like_count" -Headers $headers -ErrorAction Stop
$result.data.comments | Format-Table id, text, like_count, create_time

第四步 - 错误处理

try {
    # ... API 调用 ...
} catch {
    $err     = $_.ErrorDetails.Message | ConvertFrom-Json -ErrorAction SilentlyContinue
    $code    = $err.error.code
    $message = $err.error.message
    Write-Host "TikTok API 错误 $code: $message"
}
错误码含义解决方法
access_token_invalidToken 已撤销或无效重新执行步骤 1 的 OAuth2 流程
access_token_expiredAccess token 已过期(有效期 24 小时)执行步骤 2 的令牌刷新操作
spam_risk_too_many_requests请求频率过高,被限流等待后重试;降低请求频率
scope_not_authorized缺少必要的 OAuth 权限范围使用所需权限重新授权(见下文)
video_not_found视频 ID 无效或已被删除验证视频 ID 是否正确
privacy_level_not_allowed不允许的隐私设置使用 PUBLIC_TO_EVERYONE 或 SELF_ONLY
file_size_check_failed视频文件过大必须小于 4GB 且不超过 60 分钟
duration_check_failed视频过短或过长最短 1 秒,最长 10 分钟(部分账号支持 60 分钟)

权限范围参考

权限范围用途
user.info.basic获取账户信息
video.list列出自己的视频
video.publish发布视频
video.upload上传视频分块
comment.list读取自己视频下的评论
comment.list.manage隐藏或删除评论

若缺少某项权限:

  1. 访问 https://developers.tiktok.com — 选择您的应用
  2. 在“产品”中添加所需的权限范围
  3. 重新授权(重复步骤 1 的 OAuth2 流程),并在 URL 中包含新增的权限
  4. 将新的令牌保存至 credentials.json 文件

代理规则

  • 始终优先加载凭证。若缺失,请引导用户从步骤 1 开始进行 OAuth2 设置。
  • 仅在 API 调用中使用 TIKTOK_ACCESS_TOKENTIKTOK_CLIENT_SECRET 仅用于刷新令牌。
  • 若主机曾被泄露,立即轮换 TIKTOK_REFRESH_TOKENTIKTOK_ACCESS_TOKEN
  • 切勿向凭证文件中写入额外字段。
  • 所有 API 调用必须指向 open.tiktokapis.com,禁止外部转发或使用第三方服务。
  • 根据用户意图直接构造 API 调用——不要查找脚本文件。
  • 访问令牌有效期为 24 小时。若调用返回 access_token_expired,请先执行步骤 2,再重试。
  • 遇到任何错误时:解析 error.code,对照上方表格,明确告知用户应采取的操作。
  • 若缺少权限范围:指出具体缺失的 scope,提供开发者文档链接 developers.tiktok.com,并提示用户重新授权。
  • 操作系统检测:若 env:OS 等于 Windows_NT,则使用 PowerShell;否则使用 pwsh。
  • 禁止硬编码用户 ID、视频 ID 或令牌——所有信息均需来自 credentials.json
S
@seph1709

已收录 1 个 Skill

相关推荐