安全风险
OpenViking
基于OpenViking的RAG系统,支持文档查询、知识管理与向量检索。
下载 196
通过PowerShell管理TikTok账号,支持发布、查看视频及账户数据。
openclaw skills install @seph1709/tiktok-page命令、参数、文件名以原文为准
根据用户需求内联构建并执行 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_TOKEN | OAuth2 访问令牌 — 用于所有 API 调用 |
| TIKTOK_REFRESH_TOKEN | 在访问令牌过期时用于刷新令牌 |
| TIKTOK_CLIENT_KEY | 来自 TikTok 开发者平台的应用客户端密钥 |
| TIKTOK_CLIENT_SECRET | 应用客户端密钥 — 仅用于令牌刷新 |
| TIKTOK_OPEN_ID | OAuth 过程中返回的 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 "令牌已刷新。"| 用户需求 | 方法 | 接口路径 |
|---|---|---|
| 获取账号信息 | 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} |
获取账号信息:
$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_timetry {
# ... 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_invalid | Token 已撤销或无效 | 重新执行步骤 1 的 OAuth2 流程 |
| access_token_expired | Access 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 | 隐藏或删除评论 |
若缺少某项权限:
TIKTOK_ACCESS_TOKEN。TIKTOK_CLIENT_SECRET 仅用于刷新令牌。TIKTOK_REFRESH_TOKEN 和 TIKTOK_ACCESS_TOKEN。open.tiktokapis.com,禁止外部转发或使用第三方服务。access_token_expired,请先执行步骤 2,再重试。error.code,对照上方表格,明确告知用户应采取的操作。developers.tiktok.com,并提示用户重新授权。env:OS 等于 Windows_NT,则使用 PowerShell;否则使用 pwsh。credentials.json。已收录 1 个 Skill