贾栾:实战:用于运营报告的基础数据获取
✅
贾栾:实战:用于运营报告的基础数据获取 ✅ 贾栾:实战:用于运营报告的基础数据获取 Modified November 27, 2025 Code block JavaScript Copy // ==================== 工具函数 ==================== / 获取当前时间戳字符串 @returns {string} 格式化的时间字符串 / function getCurrentTimestamp() { return new Date().toLocaleString('zh CN', { timeZone: 'Asia/Shanghai', year: 'numeric', month: '2 digit', day: '2 digit', hour: '2 digit', minute: '2 digit', second: '2 digit' }); } / 写入日志 @param {string} level 日志级别(INFO, ERROR, WARNING) @param {string} message 日志消息 / function writeLog(level, message) { const timestamp = getCurrentTimestamp(); // 获取当前时间 const logMessage = ; // 格式化日志消息 // 输出到控制台 if (LOG CONFIG.enableConsole) { if (level === 'ERROR') { console.error(logMessage.trim()); } else if (level === 'WARNING') { console.warn(logMessage.trim()); } else { console.log(logMessage.trim()); } } // 写入日志文件 try { // 检查日志文件大小 if (fs.existsSync(LOG CONFIG.logFile)) { const stats = fs.statSync(LOG CONFIG.logFile); if (stats.size LOG CONFIG.maxLogSize) { // 如果日志文件过大,备份并创建新文件 const backupFile = LOG CONFIG.logFile + '.backup'; fs.renameSync(LOG CONFIG.logFile, backupFile); writeLog('INFO', '日志文件已备份,创建新的日志文件'); } } // 追加写入日志 fs.appendFileSync(LOG CONFIG.logFile, logMessage, 'utf8'); } catch (error) { console.error('写入日志文件失败:', error.message); } } // ==================== 核心功能函数 ==================== / 调用Coze平台的workflow接口 @returns {Promise<boolean } 返回调用是否成功 / async function callCozeWorkflow() { try { writeLog('INFO', '开始调用Coze workflow接口...'); // 构建请求数据 const requestData = { workflow id: COZE CONFIG.workflowId, parameters: { table name: COZE CONFIG.tableName, feishu url: COZE CONFIG.feishuDocUrl, max page: COZE CONFIG.max page, api key: COZE CONFIG.api key, cookie: COZE CONFIG.userCookie }, is async: true,//开启异步模式 app id: COZE CONFIG.appId }; // 构建请求头 const headers = { 'Content Type': 'application/json', 'Authorization': }; writeLog('INFO', ); // 发送POST请求 const response = await axios.post(COZE CONFIG.workflowUrl, requestData, { headers: headers, timeout: 600000 // 600秒超时 }); // 检查响应状态 if (response.status === 200) { writeLog('INFO', ); return true; } else { writeLog('ERROR', ); return false; } } catch (error) { // 错误处理 if (error.response) { // 服务器响应了错误状态码 writeLog('ERROR', ); writeLog('ERROR', ); } else if (error.request) { // 请求发送失败 writeLog('ERROR', ); } else { // 其他错误 writeLog('ERROR', ); } return false; } } / 定时任务执行函数 / async function executeTimerTask() { writeLog('INFO', '=== 定时任务开始执行 ==='); try { // 调用Coze workflow接口 const success = await callCozeWorkflow(); if (success) { writeLog('INFO', '定时任务执行成功!'); } else { writeLog('WARNING', '定时任务执行失败,但程序将继续运行'); } } catch (error) { writeLog('ERROR', ); } writeLog('INFO', '=== 定时任务执行结束 ===\n'); } // ==================== 主程序 ==================== / 主函数 启动定时任务 / function main() { writeLog('INFO', '=== Coze Workflow 定时器启动 ==='); writeLog('INFO', ); writeLog('INFO', '定时任务设置: 每10分钟执行一次'); // 立即执行一次任务 writeLog('INFO', '立即执行首次任务...'); executeTimerTask(); // 设置定时任务:每5分钟执行一次 // cron表达式: ' /5 ' 表示每5分钟执行一次 const task = cron.schedule(' /5 ', () = { executeTimerTask(); }, { scheduled: true, // 立即启动 timezone: 'Asia/Shanghai' // 设置时区为中国标准时间 }); writeLog('INFO', '定时任务已启动,按 Ctrl+C 停止程序'); // 优雅停止处理 process.on('SIGINT', () = { writeLog('INFO', '接收到停止信号,正在关闭定时任务...'); task.stop(); // 停止定时任务 writeLog('INFO', '定时任务已停止,程序退出'); process.exit(0); }); // 未捕获异常处理 process.on('uncaughtException', (error) = { writeLog('ERROR', ); writeLog('ERROR', ); }); // 未处理的Promise拒绝 process.on('unhandledRejection', (reason, promise) = { writeLog('ERROR', ); }); } // ==================== 程序入口 ==================== // 检查是否直接运行此脚本 if (require.main === module) { main(); // 启动主程序 } // 导出模块(供其他文件调用) module.exports = { callCozeWorkflow, executeTimerTask, writeLog }; 注意:工作流中的所有的多维表格节点都设置好授权,否则API执行时会卡住。方便起见,可以都设置为共享授权。 四、执行效果示例: 执行定时任务脚本,自动执行效果 No access 20251029113650 rec 00:00 过滤掉抖音平台 小红书关键词笔记 抖音账号列表 账号下的所有笔记 抖音账号下所有笔记对应的评论 END 感兴趣的同学添加关注,持续更新分享更多实战内容~ 我的开源知识库: ✅ AIGC之路社群知识库 ⛱️ 个人简介 贾栾 一个喜欢跑马的 AI 研究者 | 专注于 AIGC 应用落地。 ~全马 PB324,半马 127~ 10 年+研发管理经验、7 年+创业,传统软件公司转型中,目前 All in AI。 致力于打造让每个人都能用的 AI 应用工具。 个人微信 服务号:WayToAIGC You don't have permission to access this synced block. Please log in and try again. Log In ✅ AIGC之路社群知识库 注意:工作流中的所有的多维表格节点都设置好授权,否则API执行时会卡住。方便起见,可以都设置为共享授权。 四、执行效果示例: 执行定时任务脚本,自动执行效果 No access 20251029113650 rec 00:00 No access 20251029113650 rec 00:00 END 感兴趣的同学添加关注,持续更新分享更多实战内容~ 我的开源知识库: ✅ AIGC之路社群知识库 ✅ AIGC之路社群知识库 ⛱️ 个人简介 贾栾 一个喜欢跑马的 AI 研究者 | 专注于 AIGC 应用落地。 ~全马 PB324,半马 127~ 10 年+研发管理经验、7 年+创业,传统软件公司转型中,目前 All in AI。 致力于打造让每个人都能用的 AI 应用工具。 个人简介 贾栾 一个喜欢跑马的 AI 研究者 | 专注于 AIGC 应用落地。 ~全马 PB324,半马 127~ 10 年+研发管理经验、7 年+创业,传统软件公司转型中,目前 All in AI。 致力于打造让每个人都能用的 AI 应用工具。 个人微信 服务号:WayToAIGC 个人微信 服务号:WayToAIGC You don't have permission to access this synced block. Please log in and try again. Log In 👉 项目需求:这是一个项目投标的前期数据抓取需求,用于运营分析报告。 根据关键词获取笔记、账号获取评论。 1、10 个关键词,每个关键词分别从 2 个平台(抖音、小红书)获取最多 1000 条或所有笔记(不需要评论)。 2、5 个抖音账号的全部评论(优先一级) 项目需求:这是一个项目投标的前期数据抓取需求,用于运营分析报告。 根据关键词获取笔记、账号获取评论。 1、10 个关键词,每个关键词分别从 2 个平台(抖音、小红书)获取最多 1000 条或所有笔记(不需要评论)。 2、5 个抖音账号的全部评论(优先一级) 一、分析 现状: 已有功能: 1. 根据关键词获取抖音笔记工作流 2. 根据关键词获取小红书笔记工作流 3. 根据抖音账号获取抖音笔记工作流 缺失功能: 1. 根据抖音笔记获取评论工作流 2. 所有工作流的分页查询功能(单个工作流无法实现,需要借助多维表格存储分页数据) 3. 如何实现自动化查询(需要将搜索的内容实现添加在多维表格,然后自动自行) 成本: 1、插件基本一次是 1 毛,20 条数据,如果按需求的数据量,成本预估在 100 元+。后续还需要考虑降低成本。 2、视频转文案,需要消耗阿里云百炼的资源。根据笔记数量及视频时长计算。 二、多维表格搭建 1. 创建关键词表、账号表 先创建关键词表、账号表,用于存储要查询的数据,并且通过是否完成、分页相关字段,来实现分页查询。通过账号平台来分发调用的工作流。 注意:抖音插件分页查询需要 cursor、search id,小红书插件需要 page、search id、session id,所以就将所有字段都加上,用于分页查询。 2. 根据抖音关键词搜索抖音笔记工作流(单页搜索) 👉 单页搜索是基础核心查询数据的工作流,不需要复杂的逻辑,只需要根据插件的查询参数传入指定的分页参数即可。 这里以抖音关键词搜索抖音笔记工作流详细拆解。 单页搜索是基础核心查询数据的工作流,不需要复杂的逻辑,只需要根据插件的查询参数传入指定的分页参数即可。 这里以抖音关键词搜索抖音笔记工作流详细拆解。 整体工作流如下: 开始节点参数说明如图: 抖音插件配置如图,根据输入参数需求配置即可。 注意:考虑到通用性,建议这些参数都做成动态配置,即都放在开始节点里,由调用方传递。 其它就是常规操作,将数据写入多维表格,返回本次执行结果,做好异常判断处理,最终将所有数据聚合一起返回。(聚合功能很很实用) 3. 搭建根据关键词搜索笔记工作流(支持多平台搜索、分页查询) 核心原则: 1、通过关键词表获取需要查询的关键词。 2、根据关键词所在的渠道不同,调用不同的工作流进行分页查询。 3、分页查询工作流用于控制分页,调用子工作流用于单页查询。 具体工作流实现 该模块涉及到 5 个工作流,具体细节如下: 3.1 b1 kw 2 notes by table: 工作流概况: 读取多维表格中需要获取笔记的关键词,根据关键词所在的渠道不同调用对应的分页查询工作流。 注意:入参中我增加了 max page 字段,用于防止过多查询,消耗资源。 第一部分:读取多维表格中需要查询的关键词 多维表格的过滤配置如下: 注意:每次读取数量要控制一下,避免超过限制。 第二部分:根据读取的关键词的不同渠道分发执行调用分页查询工作流 1、这里的循环节点也可以用批处理节点,提高执行效率。 2、这里没有什么额外配置,就是批量循环执行即可。(所有的分页配置都在分页工作流中) 3.2 b21 dy kw2notes all 根据关键词搜索抖音笔记,分页查询。分页实际上就是循环查询,需要将分页查询的结果再写入 b1 关键词表。 分页工作流起到承上启下的作用,看着好像没有实际业务,但却是最关键以及最容易出错的地方。 分页工作流概况 开始节点参数 循环节点参数 说明: 根据分页参数 cursor、search id 进行分页查询,page no 是当前循环读取的第几页,每次循环置零。 循环体部分一 1、根据分页参数执行单页查询。 2、单页查询后页码加 1(page no+1),判断是否 = max page。 循环体部分二 3、将本次分页返回的 cursor、search id 参数根据多维表格的记录 id 再更新到多维表格,用于后续断点查询。 4、已经读取最大页数或者接口没有更多数据时,结束循环;否则进行下一页循环。 3.3 b22 dy kw2notes page 根据关键词搜索抖音笔记,单页查询。根据指定页数查询条件进行查询。(详情前边已讲) 3.4 b31 xhs kw2notes all 根据关键词搜索小红书笔记,分页查询 需要将分页查询的结果再写入 b1 关键词表。 说明:逻辑同抖音分页查询基本一致,就是要区分分页查询条件。 3.5 b32 xhs kw2notes page 小红书 根据关键词搜索笔记 调用小红书关键词查询笔记插件,进行单页查询。 试运行: 将测试用的关键词的“是否完成”设置为“否”,运行工作流 b1 kw 2 notes by table 即可自动化读取多维表格中的关键词进行查询。 查询结果示例: 👉 小技巧: 保存的 这些分页查询条件,可以用于后续继续查询,只需要将“是否完成”设置为“否”即可。 小技巧: 保存的 这些分页查询条件,可以用于后续继续查询,只需要将“是否完成”设置为“否”即可。 4. 根据抖音账号的全部评论 如图,先将要获取的账号写入多维表格。 核心原则: 1、根据多维表格中的账号,循环获取账号下的所有笔记。(分页查询) 2、对所有笔记表,再单独循环获取单个笔记的所有评论。 3、获取所有评论是,也是分页查询逻辑进行查询。 由此可见,本功能需要两轮的分页查询。即先分页查询所有笔记,再根据笔记分页查询所有评论。 所需工作流如下: a1 模块工作流用于根据账号查找所有笔记,a2 模块工作流用于根据所有笔记查询分页。 具体工作流实现逻辑原理基本相同,不再详细说明。 三、批量执行 👉 由于数据量较多,并且扣子工作流有单次执行最多 1000 个节点的数量限制,所以不能只依靠工作流一次执行就完成所有数据的抓取。 解决方案,将扣子工作流发布为 API,通过 Trae 写一个 Python/node.js 脚本,定时执行工作流。 由于数据量较多,并且扣子工作流有单次执行最多 1000 个节点的数量限制,所以不能只依靠工作流一次执行就完成所有数据的抓取。 解决方案,将扣子工作流发布为 API,通过 Trae 写一个 Python/node.js 脚本,定时执行工作流。 如图所示,最终我们只需要在定时任务中执行这三个工作流,即可自动批量抓取。 定时任务脚本: 使用Trae生成,可直接使用,修改对应输入参数即可。