利用扣子来制作获取抖音视频音频url的插件以及提取视频信息并写入文档的工作流
本文介绍了如何通过TikHub平台获取抖音用户数据的完整流程。首先需要注册TikHub账户并获取API密钥,然后在Apifox中配置接口参数进行调试。接着在字节跳动开发者平台创建插件,通过解析抖音用户主页URL获取用户ID,最后编写工作流代码实现数据获取功能。整个过程包括环境搭建、API配置、接口调试和工作流创建四个主要步骤,最终可实现自动化获取抖音用户数据的目标。
1. 准备阶段:账户注册与环境搭建
-
- 注册Tikhub账户:
- 访问Tikhub官网:Tikhub - AI工具集市与API聚合平台
- 创建账户,完成邮箱验证和身份认证
- 获取密钥,自己保存好

- 安装Apifox:进入apifox界面,进入你想要实现的接口的界面(本文以获取用户主页作品数据为例)。
链接地址:
TikHub.io - Your Ultimate Social Media Data & API Marketplace
在这一步中获取GET后面的接口信息:/api/v1/douyin/web/fetch_user_post_videos - 注册扣子工作台账户:
- 访问字节跳动官方开发者平台(扣子工作台),注册开发者账户
- 创建新插件,插件URL填写https://api.tikhub.dev

- 注册Tikhub账户:
2. API设置:获取和配置API密钥
现在回到apifox里面,页面上有文档和调试,可以切换

3.接口调试
我们先进入文档来了解这个接口的基本信息,然后再切回调试,填写相关参数
sec_user_id字段需要填写抖音用户的id,我们可以在网页端打开抖音,然后进入用户界面,在网址栏我们可以得到如下一段:
https://www.douyin.com/user/ {USER_ID} ?from_tab_name=main
复制黄色的那一栏,填到下图的sec_user_id的参数值中,其他按照图中默认写即可

然后我们进入Auth,在中填入我们第一步在TikHub申请的密钥。
接下来我们就可以点击发送,下面会获取json信息。点击下载在vscode中打开查看json,或者使用在线json查看的网页。
在vscode中右键格式化json文件,然后找到如图所示的位置

4.填写扣子的插件工具设置
对照着apifox中的文档内容,以及json的字段,我们来填写扣子的插件工具设置


编写完毕以后点击右上角试运行,通过测试以后返回扣子,新建一个工作流

5.工作流
新建一代码块,写入解析抖音用户id的脚本

async function main({ params }: Args): Promise<Output> {
const url = params.homeurl //获取输入
// 移除查询参数部分
const path = url.split('?')[0];
// 按'/'分割路径
const parts = path.split('/');
// 找到'user'的索引并提取后面的内容
const userIndex = parts.indexOf('user');
const userPath = userIndex !== -1 ? parts.slice(userIndex + 1).join('/') : '';
//console.log(userPath); // 输出:MS4wLjABAAAA9JqcOs1tMgVrOaxuMw3tfArAQObY_jp5PaLGjd9H8lU
// 构建输出对象
const ret = {
"sec_id": userPath, // 输出用户的sec_id
};
return ret;
}
6.然后插入自己刚刚写的插件并编写


6.通过ali生成弹幕加入多维表格
请确保已拥有阿里云账号并开通相关服务。多维表格需支持API接入(如飞书多维表格或Airtable等)。请保存该文档URL作为tableurl输入,并设置权限为所有人可编辑。获取API教程,开通服务后创建获取APIKey用于鉴权-大模型服务平台百炼-阿里云
6.1创建一个ai工具初步提取文字。

6.2添加判断和阿里云的语音识别插件


6.3添加一个变量聚合来收集两个工具生成的字幕:

6.4对获取结果进行格式修正

// 在这里,您可以通过 'params' 获取节点中的输入变量,并通过 'ret' 输出结果
// 'params' 已经被正确地注入到环境中
// 下面是一个示例,获取节点输入中参数名为'input'的值:
// const input = params.input;
// 下面是一个示例,输出一个包含多种数据类型的 'ret' 对象:
// const ret = { "name": '小明', "hobbies": ["看书", "旅游"] };
async function main({ params }: Args): Promise<Output> {
// 构建输出对象
const ret = [{
"fields": {
"标题": params.video.desc,
"文案": params.caption,
"作者": params.video.author.nickname,
"下载地址" : params.video.video.bit_rate[0].play_addr.url_list.pop(), //最后一个视频地址
"分享链接": params.video.share_info.share_url,
"发布时间": timestampToDateTime(params.video.create_time), //时间戳
"点赞": params.video.statistics.digg_count,
"分享": params.video.statistics.share_count,
"评论": params.video.statistics.comment_count,
"收藏": params.video.statistics.collect_count,
"封面图": params.video.video.cover.url_list[0],
"时长": msToMinSec(params.video.duration) //毫秒时长转换成分秒格式
}
}]
return ret;
}
function timestampToDateTime(timestamp) {
// 处理秒级时间戳(如果小于1e12,视为秒,转换为毫秒)
const msTimestamp = timestamp < 1e12 ? timestamp * 1000 : timestamp;
const date = new Date(msTimestamp);
// 获取年月日时,不足两位补零
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 月份从0开始
const day = String(date.getDate()).padStart(2, '0');
const hour = String(date.getHours()).padStart(2, '0');
// 拼接为 "年月日时" 格式(可根据需要调整分隔符)
return `${year}年${month}月${day}日${hour}时`;
}
// 测试示例
// const timestamp1 = 1730188800; // 秒级时间戳
// const timestamp2 = 1730188800000; // 毫秒级时间戳
// console.log(timestampToDateTime(timestamp1)); // 输出示例:2024年10月30日00时
// console.log(timestampToDateTime(timestamp2)); // 输出示例:2024年10月30日00时
function msToMinSec(milliseconds) {
// 处理非数字或负数情况
if (typeof milliseconds !== 'number' || milliseconds < 0) {
return '00:00';
}
// 转换为总秒数(向下取整)
const totalSeconds = Math.floor(milliseconds / 1000);
// 计算分钟和剩余秒数
const minutes = Math.floor(totalSeconds / 60);
const seconds = totalSeconds % 60;
// 补零并拼接为 "分:秒" 格式
return `${String(minutes).padStart(2, '0')}:${String(seconds).padStart(2, '0')}`;
}
// // 测试示例
// console.log(msToMinSec(63000)); // 1分3秒 → "01:03"
// console.log(msToMinSec(125000)); // 2分5秒 → "02:05"
// console.log(msToMinSec(59000)); // 0分59秒 → "00:59"
// console.log(msToMinSec(3661000)); // 61分1秒 → "61:01"(超过60分钟也能正确处理)
// console.log(msToMinSec(-5000)); // 无效值 → "00:00"
6.5添加输入文档的插件来接收输出的内容。

然后就可以试运行了
在我们的飞书上面就可以看见已经写入了(注意飞书的标题要跟输出的内容匹配)
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)