从视频到脚本手把手搭建 AI 分镜提示词 AgentDify 飞书本教程基于 Dify 工作流实现上传视频 → 提取关键帧 → AI 生成分镜脚本 → 自动写入飞书电子表格的全流程自动化。目录整体流程概览前置准备节点详细配置节点 1开始节点 2提取视频关键帧节点 3解析并内嵌图片节点 4生成分镜脚本LLM节点 5获取飞书 Access Token节点 6提取 Access Token节点 7新建飞书电子表格节点 8获取 Sheet ID节点 9拼接写入 Body节点 10写入表格内容节点 11结束节点连线顺序常见报错与解决方法运行效果说明1. 整体流程概览开始上传视频 ↓ 提取视频关键帧FFmpeg 插件 ↓ 解析并内嵌图片Code 节点 ↓ 生成分镜脚本LLM / 通义千问 ↓ 获取飞书 Access TokenHTTP 请求 ↓ 提取 Access TokenCode 节点 ↓ 新建飞书电子表格HTTP 请求 ↓ 获取 Sheet IDCode 节点 ↓ 拼接写入 BodyCode 节点 ↓ 写入表格内容HTTP 请求 ↓ 结束整个工作流共11 个节点其中 HTTP 请求节点 3 个、代码执行节点 4 个、工具节点 1 个、LLM 节点 1 个。2. 前置准备2.1 Dify 插件安装在 Dify 的插件市场中安装以下两个插件插件名用途langgenius/tongyi通义千问模型用于生成分镜脚本livien/ffmpeg_tools_difyFFmpeg 工具用于提取视频关键帧2.2 飞书开放平台配置进入飞书开放平台创建一个企业自建应用。记录下应用的App ID和App Secret。在应用的「权限管理」中开通以下权限sheets:spreadsheet电子表格读写权限drive:drive云盘权限用于新建文件发布应用或在测试环境下启用。3. 节点详细配置节点 1开始节点类型开始节点描述上传视频文件可选填产品背景和风格偏好。输入变量配置变量名类型必填说明video_file文件视频是支持 .MP4 / .MOV / .M4V / .AVI / .MKV / .WEBM最大 100MBproduct_context段落文本否产品或内容背景描述最多 2000 字style_hint段落文本否风格偏好描述最多 2000 字节点 2提取视频关键帧节点类型工具节点FFmpeg 插件工具get_video_frame_list参数配置参数类型值video变量引用开始.video_filegap_time常量2每隔 2 秒提取一帧count常量20最多提取 20 帧输出textJSON 格式的帧信息字符串files图片文件列表包含公网 URL节点 3解析并内嵌图片节点类型代码执行Python3描述从 FFmpeg 工具的输出中提取分镜信息构建时间轴和图片 Markdown。输入变量变量名来源json_data提取视频关键帧.textfiles提取视频关键帧.files代码importjsondefmain(files:list,json_data:str)-dict:shots[]frame_lines_text[]frame_lines_md[]json_list[]try:json_listjson.loads(json_data)ifjson_dataelse[]except:passtime_map{}ifjson_listandisinstance(json_list,list):forframe_infoinjson_list:ifisinstance(frame_info,dict)andframesinframe_info:forfinframe_info.get(frames,[]):frame_numf.get(frame_number,0)seek_timef.get(seek_time,0)time_map[frame_num]seek_timefori,file_infoinenumerate(files):ifnotisinstance(file_info,dict):continuefilenamefile_info.get(filename,fframe_{i1:03d}.jpg)try:frame_numint(filename.split(_)[-1].replace(.jpg,))except:frame_numi1seek_timetime_map.get(frame_num,i*2.0)start_sround(seek_time,2)end_sround(seek_time2.0,2)image_urlfile_info.get(url,)shots.append({shot_no:i1,start:start_s,end:end_s,duration:2.0,frame_number:frame_num,filename:filename,keyframe_url:image_url,})frame_lines_text.append(f分镜{i1:02d}| 时间:{start_s}s -{end_s}s |{filename})frame_lines_md.append(f### 分镜{i1:02d}{start_s}s -{end_s}s\nf![{filename}]({image_url}))return{shots_json:json.dumps(shots,ensure_asciiFalse,indent2),frame_urls:\n.join(frame_lines_text),frames_md:\n\n.join(frame_lines_md),shot_count:len(shots),total_frames:len(files)iffileselse0,}输出变量声明变量名类型shots_jsonStringframe_urlsStringframes_mdStringshot_countNumbertotal_framesNumber节点 4生成分镜脚本LLM节点类型LLM模型通义千问qwen3.6-plus-2026-04-02temperature 0.3开启视觉模式vision: highSystem Prompt你是视频反推分镜提示词 Agent擅长把视频拆解为可复拍、可复用的广告/短视频分镜脚本。 重要规则 1. 必须输出中文 Markdown。 2. 每个分镜必须包含以下字段缺一不可 分镜编号与标题含精确时间、分镜图片、画面主体、动作、环境、运镜、风格控制 3. 分镜图片字段直接使用 分镜图片Markdown 中对应编号的完整图片标签 格式为 ![分镜XX关键帧](https://...) 原样复制不要截断或修改 URL。 4. 时间范围严格使用 JSON 中的 start/end不可自行更改。 5. 每个字段必须有具体描述严禁只写无或暂无。 6. 结尾附整体创作建议段落。User Prompt请根据以下信息生成完整分镜脚本。 产品或内容背景 {{#start.product_context#}} /产品或内容背景 用户风格偏好 {{#start.style_hint#}} /用户风格偏好 分镜数量 共 {{#parse_result.shot_count#}} 个分镜 /分镜数量 ffmpeg分镜JSON含时间轴 {{#parse_result.shots_json#}} /ffmpeg分镜JSON 分镜时间轴清单 {{#parse_result.frame_urls#}} /分镜时间轴清单 分镜图片Markdown每个分镜对应一张原样复制到输出中 {{#parse_result.frames_md#}} /分镜图片Markdown --- 请严格按照以下格式输出 # 视频反推分镜脚本 --- ## 分镜 01场景标题 (0.0s - 2.0s) **分镜图片** ![分镜01关键帧](原样复制对应的完整URL) **画面主体** 描述画面中心元素。 **动作** 描述人物/物体运动或变化。 **环境** 描述背景、光线、氛围。 **运镜** 如固定镜头、缓慢推进、Pan right等。 **风格控制** 3-5个关键词如简洁、明亮、产品特写。 --- 依次输出全部分镜格式相同 --- ## 整体创作建议输出text分镜脚本全文节点 5获取飞书 Access Token节点类型HTTP 请求标题HTTP 请求 3-获取 access-tokenMethodPOSTURLhttps://open.feishu.cn/open-apis/auth/v3/app_access_token/internalHeadersContent-Type: application/json; charsetutf-8BodyJSON{app_id:你的App ID,app_secret:你的App Secret}⚠️ 将app_id和app_secret替换为飞书开放平台中你的应用凭证。建议将这两个值存入 Dify 的环境变量中通过变量引用而不是硬编码。输出body包含tenant_access_token的 JSON 字符串节点 6提取 Access Token节点类型代码执行Python3标题代码执行-提取 body输入变量变量名来源bodyHTTP请求3-获取access-token.body代码importjsondefmain(body:str)-dict:datajson.loads(body)tokendata[tenant_access_token]return{access_token:fBearer{token}}注意这里直接在代码里拼接Bearer前缀后续 HTTP 节点 Header 中直接引用此变量无需再手动拼接。输出变量声明变量名类型access_tokenString节点 7新建飞书电子表格节点类型HTTP 请求标题HTTP 请求-创建表格MethodPOSTURLhttps://open.feishu.cn/open-apis/sheets/v3/spreadsheetsHeaders键值Authorization引用变量代码执行-提取body.access_tokenContent-Typeapplication/jsonBodyJSON{title:视频反推分镜脚本}输出body包含新建表格的spreadsheet_token节点 8获取 Sheet ID节点类型代码执行Python3标题代码执行-取 sheetid描述解析创建表格的返回并调用飞书 API 获取默认 Sheet 的 ID。输入变量变量名来源bodyHTTP请求-创建表格.bodyaccess_token代码执行-提取body.access_token代码importjsonimportrequestsdefmain(body:str,access_token:str)-dict:api_datajson.loads(body)spreadsheet_tokenapi_data[data][spreadsheet][spreadsheet_token]# 调用 sheets/query 接口获取 sheet_idurlfhttps://open.feishu.cn/open-apis/sheets/v3/spreadsheets/{spreadsheet_token}/sheets/queryresprequests.get(url,headers{Authorization:access_token})metajson.loads(resp.text)ifmeta.get(code)!0:raiseException(f获取sheet_id失败:{meta})sheet_idmeta[data][sheets][0][sheet_id]return{spreadsheet_token:spreadsheet_token,sheet_id:sheet_id,debug:sheet_id}输出变量声明变量名类型spreadsheet_tokenStringsheet_idStringdebugString节点 9拼接写入 Body节点类型代码执行Python3标题代码执行-拼接 body描述解析 LLM 输出的分镜脚本提取结构化字段生成飞书表格写入所需的 JSON Body。输入变量变量名来源llm_text生成分镜脚本.textsheet_id代码执行-取sheetid.sheet_idspreadsheet_token代码执行-取sheetid.spreadsheet_token代码importjson,redefmain(llm_text:str,sheet_id:str,spreadsheet_token:str)-dict:rows[[分镜编号,时间范围,图片URL,画面主体,动作,环境,运镜,风格控制]]# 按分镜分割shots_rawre.split(r(?## 分镜\s*\d),llm_text)forblockinshots_raw:ifnotblock.strip().startswith(## 分镜):continue# 提取编号和时间范围mre.search(r## 分镜\s*(\d)[:](.*?)\((.?)\),block)numf分镜{m.group(1)}ifmelsetime_rangem.group(3)ifmelse# 提取图片 URL只保留 https:// 链接丢弃 base64img_mre.search(r!\[.*?\]\((https://[^\)])\),block)img_urlimg_m.group(1)ifimg_melse# 提取各文字字段defget_field(field):fmre.search(rf\*\*{field}[:]\*\*\s*(.),block)returnfm.group(1).strip()iffmelserows.append([num,time_range,img_url,get_field(画面主体),get_field(动作),get_field(环境),get_field(运镜),get_field(风格控制),])end_rowlen(rows)# 注意飞书 v2 API 使用驼峰命名 valueRanges不是 value_rangesbodyjson.dumps({valueRanges:[{range:f{sheet_id}!A1:H{end_row},values:rows}]},ensure_asciiFalse)return{body:body,debug:f共{end_row-1}个分镜}输出变量声明变量名类型bodyStringdebugString节点 10写入表格内容节点类型HTTP 请求标题HTTP 请求 2-写入内容MethodPOSTURL在 URL 输入框中依次输入以下内容spreadsheet_token部分通过变量选择器插入https://open.feishu.cn/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/values_batch_update其中{spreadsheet_token}引用变量代码执行-取sheetid.spreadsheet_tokenHeaders键值Authorization引用变量代码执行-提取body.access_tokenContent-Typeapplication/jsonBody类型选择raw内容引用变量代码执行-拼接body.body输出body写入结果成功时code为 0updatedCells为写入的单元格数量节点 11结束节点类型结束节点输出变量变量名来源说明final_script生成分镜脚本.text完整分镜脚本文本shot_count解析并内嵌图片.shot_count分镜总数debug代码执行5.debug写入结果调试信息4. 节点连线顺序按以下顺序连接节点从左到右开始 → 提取视频关键帧 → 解析并内嵌图片 → 生成分镜脚本 → HTTP请求3-获取access-token → 代码执行-提取body → HTTP请求-创建表格 → 代码执行-取sheetid → 代码执行-拼接body → HTTP请求2-写入内容 → 结束5. 常见报错与解决方法Missing access token for authorization原因Authorization Header 中的 token 未正确传入。解决检查「代码执行-提取body」节点的输出access_token是否有值。确认写入 HTTP 节点的 Header 中Authorization 值引用的是access_token变量而不是spreadsheet_token。确保代码里已经拼好了Bearer前缀Header 中不要重复拼接。Missing required parameter: valueRanges原因Body 中字段名写错使用了下划线value_ranges而不是驼峰valueRanges。解决飞书 v2 API 要求驼峰命名将代码中的value_ranges改为valueRanges。JSONDecodeError: Extra data原因传入 Code 节点的body变量不是纯 JSON 字符串或者包含额外内容。解决确认 Code 节点输入变量引用的是 HTTP 节点的.body字段而不是整个节点输出。Dify HTTP 节点的body输出是固定的字符串类型直接用json.loads(body)解析即可。KeyError: data原因API 调用失败返回的 JSON 里没有data字段通常是鉴权失败导致。解决在 Code 节点里加print(resp.text)打印原始返回检查实际错误信息。常见原因是access_token传了两次Bearer比如变量里已有Bearer xxxHeader 里又写了Bearer {变量}。404 page not found原因飞书 API 路径错误。解决检查 URL 中是否有open-apis含短横线容易误写成openapis。检查 API 版本路径是否正确v2 vs v3。输入显示null原因节点运行时上游变量没有流过来通常是单独调试某个节点而不是从头运行整个工作流。解决点击左上角「运行」按钮从头跑完整个工作流不要单独点节点的运行按钮。6. 运行效果说明工作流运行成功后飞书电子表格中将自动创建一个名为**「视频反推分镜脚本」**的表格包含以下 8 列列内容A分镜编号如分镜01B时间范围如0.0s - 2.0sC图片 URL可点击查看关键帧D画面主体E动作F环境G运镜H风格控制每次运行会新建一张表格不会覆盖历史记录。表格链接格式为https://你的飞书域名.feishu.cn/sheets/{spreadsheet_token}可在工作流结束节点的输出中或飞书云盘中找到。