Python调用飞书API实战:从认证到机器人开发的完整指南
1. 项目概述用Python与飞书API高效协作如果你正在寻找一种自动化处理飞书消息、管理多维表格甚至构建一个智能机器人的方法那么直接调用飞书开放平台的API几乎是唯一的高效路径。作为一名长期与各类办公自动化工具打交道的开发者我发现在众多协同平台中飞书API的设计在清晰度和功能完整性上表现相当出色但初次接触时其认证流程和参数细节也容易让人踩坑。本文不是一份官方的API文档翻译而是基于我多次集成飞书API的实际项目经验为你梳理出一条从零开始、可复现的实操路径。我们将绕过那些繁琐的概念介绍直接切入核心如何用Python快速、稳定地完成认证、发送消息、操作表格并妥善处理那些令人头疼的400错误。无论你是想自动同步数据到飞书多维表格还是打造一个能自动回复的团队助手这里的内容都能让你少走弯路。2. 核心思路与工具选型为什么是Python Requests在开始敲代码之前明确技术选型的理由至关重要。飞书官方提供了多种语言的SDK但为什么我强烈推荐直接使用Python的requests库而非官方SDK2.1 选型理由掌控感与灵活性官方SDK固然方便它封装了认证、请求构造等底层细节。但在实际复杂业务中这种封装有时会成为“黑箱”。当出现诸如api error: 400 ‘type’ must be in [“enabled”, “disabled”, “auto”]这类参数错误时你很难快速定位是SDK的封装逻辑问题还是自己传入的数据有误。直接使用requests库意味着你完全掌控每一次HTTP请求的URL、Header和Body任何错误都一目了然调试效率极高。此外requests库是Python生态的基石其简洁的APIrequests.get(),requests.post()和强大的会话管理功能足以应对飞书API的所有调用场景。搭配json模块处理数据整个流程非常清晰。对于需要长期维护的项目这种透明性带来的收益远大于初期学习SDK的那点时间成本。2.2 环境准备与依赖安装确保你有一个可用的Python环境3.7及以上版本均可。我推荐使用venv创建独立的虚拟环境避免包依赖冲突。# 创建并激活虚拟环境以Mac/Linux为例 python3 -m venv feishu-api-env source feishu-api-env/bin/activate # 安装核心依赖 pip install requests如果你的项目涉及更复杂的数据处理可以一并安装pandas用于处理将要写入多维表格的表格型数据。pip install pandas注意很多网络教程会提到pygraphviz等图形库那是用于绘制关系图的与调用HTTP API无关切勿混淆安装。我们的核心就是requests。3. 飞书API接入核心认证机制全解析调用飞书API的第一步也是最大的一只“拦路虎”就是认证。飞书主要使用两种令牌tenant_access_token应用授权和user_access_token用户授权。对于机器人自动化和数据操作我们99%的场景使用的是应用授权。3.1 创建应用与获取凭证登录开发者后台访问飞书开放平台使用企业管理员的账号登录。创建企业自建应用在“应用开发”中创建新应用。务必记录下App ID和App Secret这相当于你的应用账号密码。配置应用权限在应用详情页的“权限管理”中根据你的需求添加对应权限。例如发送消息需添加im:message相关权限。读写多维表格需添加bitable:app相关权限。访问知识库需添加wiki:wiki相关权限。发布与启用在“版本管理与发布”中创建一个版本并申请发布。企业管理员审核通过后应用才真正具备调用API的能力。3.2 获取Tenant Access Token的代码实现这个令牌代表你的应用身份是调用大多数API的通行证。其获取方式固定代码如下import requests import json def get_tenant_access_token(app_id, app_secret): 获取租户访问令牌 url https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal headers { Content-Type: application/json; charsetutf-8 } payload { app_id: app_id, app_secret: app_secret } response requests.post(url, headersheaders, jsonpayload) result response.json() if result.get(code) 0: access_token result[tenant_access_token] print(fToken获取成功: {access_token[:20]}...) return access_token else: print(fToken获取失败: {result}) return None # 使用你的实际App ID和Secret替换 APP_ID your_app_id APP_SECRET your_app_secret tenant_token get_tenant_access_token(APP_ID, APP_SECRET)实操心得这个Token默认有效期为2小时。切勿在每次请求前都获取一次而应该将其缓存起来例如存到内存变量或Redis中并在接近过期时刷新。一个简单的做法是记录获取Token的时间戳每次使用前判断是否已超过1.5小时是则重新获取。4. 实战一发送消息到群聊或用户发送消息是最常见的场景。飞书支持文本、富文本、卡片等多种消息格式。这里以发送纯文本消息到群聊为例。4.1 获取聊天IDchat_id在发送消息前你需要知道目标的唯一标识chat_id对于群聊或open_id/user_id对于个人。获取chat_id最方便的方式是在飞书客户端中右键点击群组选择“复制群聊ID”。4.2 构造请求并发送有了chat_id和tenant_access_token就可以调用发送消息接口了。def send_text_message(tenant_token, chat_id, text_content): 发送文本消息到指定群聊 url https://open.feishu.cn/open-apis/im/v1/messages params { receive_id_type: chat_id # 根据目标类型也可以是 open_id, user_id } headers { Authorization: fBearer {tenant_token}, Content-Type: application/json; charsetutf-8 } payload { receive_id: chat_id, msg_type: text, content: json.dumps({text: text_content}) # 注意content需要是JSON字符串 } response requests.post(url, headersheaders, paramsparams, jsonpayload) result response.json() if result.get(code) 0: print(f消息发送成功消息ID: {result.get(data, {}).get(message_id)}) return result.get(data, {}).get(message_id) else: print(f消息发送失败: {result}) return None # 使用示例 CHAT_ID oc_xxxxxxxxxxxxxxxxxx # 替换为你的群聊ID message_id send_text_message(tenant_token, CHAT_ID, 这是一条由Python API自动发送的测试消息。)4.3 处理复杂消息与成员如果你想发送更复杂的消息比如特定成员需要构造富文本。关键在于content字段的构造。# 发送一条某人并包含链接的富文本消息 open_id ou_xxxxxxxxxxxxxxxxxx # 被成员的open_id rich_text_content { text: fat user_id\{open_id}\/at 请查收本季度报告。详情请点击a href\https://example.com/report\报告链接/a } payload { receive_id: CHAT_ID, msg_type: text, content: json.dumps(rich_text_content) }避坑指南content字段的值必须是一个JSON序列化后的字符串这是新手最容易出错的地方。直接传入Python字典会导致400错误。务必使用json.dumps()进行转换。5. 实战二操作飞书多维表格Bitable多维表格是飞书的核心功能之一通过API进行增删改查能极大提升数据管理效率。操作前你需要知道目标表格的app_token表格容器标识和table_id子表标识。5.1 获取表格标识在飞书多维表格中打开浏览器地址栏URL格式通常为https://xxx.feishu.cn/base/{app_token}?table{table_id}。从中即可提取app_token和table_id。5.2 新增记录假设我们有一个记录任务的多维表格包含“任务名”文本和“截止日期”日期两个字段。def add_bitable_record(tenant_token, app_token, table_id, fields_data): 向多维表格添加一条记录 url fhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records headers { Authorization: fBearer {tenant_token}, Content-Type: application/json; charsetutf-8 } # fields_data 是一个字典键是字段名值是字段值 payload { fields: fields_data } response requests.post(url, headersheaders, jsonpayload) result response.json() if result.get(code) 0: print(f记录添加成功记录ID: {result.get(data, {}).get(record, {}).get(record_id)}) return result.get(data, {}).get(record, {}).get(record_id) else: print(f记录添加失败: {result}) return None # 使用示例 APP_TOKEN bascnxxxxxxxxxxxxxxxx TABLE_ID tblxxxxxxxxxxxxxxxx new_task { 任务名: 完成API集成测试, 截止日期: 1730304000000 # 日期字段需传入时间戳毫秒级 } record_id add_bitable_record(tenant_token, APP_TOKEN, TABLE_ID, new_task)5.3 批量查询与更新记录对于数据分析或同步场景批量操作必不可少。飞书API支持分页查询和批量更新。def query_bitable_records(tenant_token, app_token, table_id, filter_formulaNone, page_size100): 分页查询多维表格记录 filter_formula: 筛选公式例如 CurrentValue.[任务名]测试 url fhttps://open.feishu.cn/open-apis/bitable/v1/apps/{app_token}/tables/{table_id}/records/search headers { Authorization: fBearer {tenant_token}, Content-Type: application/json; charsetutf-8 } payload { filter: { conjunction: and, conditions: [] if not filter_formula else [ { field_name: 任务名, # 根据实际字段名修改 operator: is, value: [测试] } ] }, page_size: page_size } # 更复杂的筛选可以直接使用filter_formula # payload { # filter: { # conjunction: and, # conditions: [] # }, # automatic_fields: False, # field_names: [任务名, 截止日期], # sort: [{field_name: 截止日期, desc: False}] # } all_records [] page_token None while True: if page_token: payload[page_token] page_token response requests.post(url, headersheaders, jsonpayload) result response.json() if result.get(code) ! 0: print(f查询失败: {result}) break data result.get(data, {}) items data.get(items, []) all_records.extend(items) page_token data.get(page_token) if not page_token: break print(f共查询到 {len(all_records)} 条记录。) return all_records注意事项多维表格API对日期、人员、附件等特殊字段类型的值格式有严格要求。例如日期是毫秒时间戳人员是ou_开头的ID数组。在操作前最好先在表格中手动创建一条记录然后通过查询接口看看API返回的字段值具体是什么格式以此作为你写入数据的模板。这是避免400错误最有效的方法。6. 实战三处理文件与知识库除了消息和表格管理文件也是常见需求。例如将本地报告上传到飞书知识库的指定位置。6.1 分步上传文件飞书的大文件上传采用分片上传机制。对于小文件通常小于20MB可以使用简单上传接口。def upload_small_file(tenant_token, file_path, parent_type, parent_node): 上传小文件到知识库或云空间 parent_type: 父节点类型wiki知识库或 space云空间 parent_node: 父节点token如知识库节点token或空间ID url https://open.feishu.cn/open-apis/drive/v1/files/upload_all headers { Authorization: fBearer {tenant_token}, } # 注意文件上传的Content-Type是multipart/form-data files { file: open(file_path, rb) } data { file_name: os.path.basename(file_path), parent_type: parent_type, parent_node: parent_node, } response requests.post(url, headersheaders, filesfiles, datadata) result response.json() if result.get(code) 0: file_token result.get(data, {}).get(file_token) print(f文件上传成功File Token: {file_token}) return file_token else: print(f文件上传失败: {result}) return None6.2 获取知识库节点信息上传文件前你需要知道目标目录的node_token。可以通过遍历知识库节点来获取。def get_wiki_nodes(tenant_token, wiki_token): 获取知识库下的节点列表 url fhttps://open.feishu.cn/open-apis/wiki/v2/spaces/{wiki_token}/nodes headers { Authorization: fBearer {tenant_token}, } response requests.get(url, headersheaders) result response.json() if result.get(code) 0: return result.get(data, {}).get(items, []) else: print(f获取节点失败: {result}) return []7. 错误处理与调试实战精要调用API时遇到错误是常态。飞书API的错误响应通常比较规范关键在于快速解读。7.1 常见HTTP状态码与错误解析状态码常见原因排查步骤400 Bad Request请求参数错误。这是最高频的错误。1. 检查content字段是否已json.dumps()。2. 检查字段值类型如日期是否为时间戳。3. 检查枚举值是否在允许范围内如‘type’ must be in [“enabled”, “disabled”, “auto”]。401 UnauthorizedToken无效或过期。1. 检查Token字符串是否正确Bearer前缀后是否有空格。2. Token是否已过期应用Token2小时用户Token根据授权而定。3. 应用是否已发布并获得相应权限。403 Forbidden权限不足。1. 在开发者后台检查应用是否已添加并开通所需权限。2. 检查操作的资源如文件、表格是否对该应用可见。429 Too Many Requests触发频率限制。飞书API有QPS限制。需在代码中加入延时如time.sleep(0.2)进行限流。500/502/503飞书服务器内部错误。通常为临时性问题。记录request_id等待一段时间后重试或联系飞书技术支持。7.2 深度排查400错误一个真实案例我曾遇到一个典型的400错误api error: 400 this model‘s maximum context length is 1048576 tokens. however, your messages resulted in 1200435 tokens.。这个错误信息非常具体它提示你输入的文本长度超过了模型的最大上下文限制。排查与解决思路定位接口首先确认这个错误来自哪个接口。虽然错误信息提到了“model”和“tokens”这听起来像大模型API但在飞书生态中可能是你调用了飞书AI助手Skill相关的接口或者集成了DeepSeek等第三方大模型时传入了过长的对话历史或文档内容。计算文本长度你需要计算你传入的messages或content的总token数。对于中文一个粗略的估算方法是1个汉字约等于1.5-2个token。120万个token大约相当于60-80万汉字这显然是一本长篇小说的体量。解决方案截断文本对于过长的输入必须进行截断。只保留最相关的部分内容。分块处理如果必须处理长文档将其分割成多个小于上限如100万个token的块分别调用API再合并结果。检查参数确认调用的是否是正确的模型端点。例如DeepSeek API可能要求model参数为deepseek-v4-pro或deepseek-v4-flash传错了也会报错。对应的代码调试技巧在发送请求前打印出你构造的请求体和目标URL。使用pprint格式化输出JSON便于肉眼检查。import pprint def debug_request(url, headers, payload): print( 请求调试信息 ) print(fURL: {url}) print(Headers:) pprint.pprint(headers) print(Payload:) pprint.pprint(payload) print() # 在调用requests.post前加入 debug_request(url, headers, payload) response requests.post(url, headersheaders, jsonpayload) print(Response:, response.status_code, response.text) # 同时打印状态码和原始响应7.3 网络问题与重试机制网络环境不稳定可能导致连接中途关闭出现类似api error: connection closed mid-response的错误。为此必须实现健壮的重试机制。import time from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_retry_session(retries3, backoff_factor0.5): 创建一个带重试机制的requests Session session requests.Session() retry_strategy Retry( totalretries, backoff_factorbackoff_factor, # 重试等待时间{backoff factor} * (2 ** ({retry number} - 1)) status_forcelist[429, 500, 502, 503, 504], # 对这些状态码进行重试 allowed_methods[GET, POST, PUT, DELETE] # 只对这些HTTP方法重试 ) adapter HTTPAdapter(max_retriesretry_strategy) session.mount(https://, adapter) session.mount(http://, adapter) return session # 使用示例 session create_retry_session() try: response session.post(url, headersheaders, jsonpayload, timeout10) # 设置超时 except requests.exceptions.Timeout: print(请求超时请检查网络或调整超时时间。) except requests.exceptions.RequestException as e: print(f网络请求异常: {e})8. 进阶构建一个简单的飞书机器人框架将上述模块组合起来我们可以构建一个简单的机器人框架用于处理事件回调如接收消息并回复。8.1 验证飞书事件回调飞书机器人需要提供一个公网可访问的URL来接收事件。飞书服务器会发送一个携带加密参数的验证请求。from flask import Flask, request, jsonify import hashlib import base64 import json app Flask(__name__) ENCRYPT_KEY your_encrypt_key # 在事件订阅配置中获取 def decrypt_event(encrypt): # 飞书事件解密逻辑需参考官方文档实现 # 此处为简化示例实际需使用AES解密 pass app.route(/webhook/event, methods[POST]) def handle_event(): data request.json # 1. 验证签名略 # 2. 处理挑战请求URL验证 if challenge in data: return jsonify({challenge: data[challenge]}) # 3. 解密并处理事件 event decrypt_event(data[encrypt]) if event.get(type) message: # 处理消息事件 handle_message_event(event) return jsonify({code: 0}) def handle_message_event(event): # 提取消息内容、发送者、聊天ID等 message_content json.loads(event[event][message][content]) sender_id event[event][sender][sender_id][open_id] chat_id event[event][message][chat_id] # 根据消息内容进行回复 reply_text f收到你的消息: {message_content.get(text, )} send_text_message(tenant_token, chat_id, reply_text) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)8.2 实现关键词触发与自动任务在handle_message_event函数中可以加入逻辑判断实现更智能的交互。def handle_message_event(event): message_content json.loads(event[event][message][content]) user_text message_content.get(text, ).strip() chat_id event[event][message][chat_id] # 关键词触发 if 状态 in user_text: # 查询系统状态并回复 status_info check_system_status() send_text_message(tenant_token, chat_id, status_info) elif user_text.startswith(添加任务): # 解析任务文本格式如“添加任务 写周报 2024-12-31” parts user_text.split() if len(parts) 3: task_name parts[1] due_date parts[2] # 调用多维表格API添加记录 add_bitable_record(tenant_token, APP_TOKEN, TABLE_ID, {任务名: task_name, 截止日期: due_date}) send_text_message(tenant_token, chat_id, f任务“{task_name}”已添加到表格。) else: send_text_message(tenant_token, chat_id, 你好我是助手。你可以问我‘状态’或说‘添加任务 [名称] [日期]’来创建任务。)这个框架虽然简单但涵盖了接收、解析、判断、动作响应的完整闭环是构建更复杂自动化流程的基石。在实际部署时你需要使用ngrok等工具将本地服务暴露到公网并在飞书开发者后台配置事件订阅URL。

相关新闻

JavaScript全栈性能优化实战与关键策略

JavaScript全栈性能优化实战与关键策略

1. JavaScript全栈性能优化实战指南作为一名长期奋战在一线的全栈开发者,我深知性能优化是贯穿整个开发周期的核心命题。不同于单纯的客户端或服务端优化,全栈性能优化需要我们从浏览器到数据库的整条链路进行系统性思考。本文将分享我在多个大型项目中积…

2026/10/19 3:28:06 阅读更多 →
从宝塔面板迁移到Docker的实战指南与核心概念解析

从宝塔面板迁移到Docker的实战指南与核心概念解析

1. 为什么需要从宝塔面板迁移到Docker?十年前我刚入行时,宝塔面板确实是最佳选择。它把复杂的Linux命令封装成可视化操作,让新手也能轻松搭建网站。但随着项目复杂度提升,我逐渐发现了它的局限性:环境依赖混乱、多版本…

2026/10/20 10:41:28 阅读更多 →
C# WinForm部署SAM2 ONNX模型实战指南

C# WinForm部署SAM2 ONNX模型实战指南

1. 项目概述:C# WinForm部署SAM2 ONNX模型的核心价值在工业检测和图像分析领域,Segment Anything Model(SAM)的出现彻底改变了传统图像分割的工作流程。作为第二代模型,SAM2在保持零样本迁移能力的同时,显著…

2026/10/15 23:48:35 阅读更多 →

最新新闻

多摩川绝对式编码器读取:STM32与RS485通信实现及伺服调试避坑指南

多摩川绝对式编码器读取:STM32与RS485通信实现及伺服调试避坑指南

简介:基于STM32F429的多摩川TS5668N21编码器读取程序完整源码包,面向工业自动化、电机控制与精密定位领域的嵌入式软硬件开发者。工程围绕ADM485(RS-485)半双工通信协议展开,涵盖STM32CubeMX引脚分配、时钟树与UART参数…

2026/10/20 20:23:58 阅读更多 →
汇编ADC指令详解:从进位标志CF到多字节加法的底层原理

汇编ADC指令详解:从进位标志CF到多字节加法的底层原理

学汇编一段时间后,大家基本都会遇到ADC这条指令。说实话,这条指令在指令表里毫不起眼,最多被解释成一句"带进位加法",但真到了实战里,你会发现它远比表面复杂:写大数加法要用它,调试进…

2026/10/20 20:23:58 阅读更多 →
降AI率实操指南:从原理到工具,教你打造真人感文本

降AI率实操指南:从原理到工具,教你打造真人感文本

1. 先弄明白“降AI率”到底在降什么最近不少同学来找我,张口就是“哥,有没有降AI率的工具推荐?”。一开始我以为是小众需求,结果问了一圈才发现,这事已经成了很多人的刚需。无论是交课程论文、写实训报告,还…

2026/10/20 20:23:58 阅读更多 →
大模型知识更新利器:RAG检索增强生成原理与实战指南

大模型知识更新利器:RAG检索增强生成原理与实战指南

大模型知识更新的老难题,RAG(Retrieval-Augmented Generation,检索增强生成)确实是我近两年见过最实用的解法。它给大模型开了一场“开卷考试”,让模型不再凭记忆硬答,而是先翻书、再答题,从根上…

2026/10/20 20:23:58 阅读更多 →
纯HTML+CSS重构游戏平台首页:Flexbox与Grid布局实战

纯HTML+CSS重构游戏平台首页:Flexbox与Grid布局实战

1. 为什么我要拿一个游戏平台首页做重构练习先说说这个项目的由来。我在带新人的时候经常遇到一个尴尬情况:简历上写着“精通 HTML 和 CSS”,丢过来一个静态页面,结构全是 div 套 div,类名清一色box1、box2、left、right&#xff…

2026/10/20 20:23:58 阅读更多 →
Jenkinsfile核心难点:作用域、凭据、并行与错误处理四大陷阱

Jenkinsfile核心难点:作用域、凭据、并行与错误处理四大陷阱

1. 这不是写脚本,是在给流水线“立规矩”:Jenkinsfile 的真实定位与核心难点本质很多人第一次打开 Jenkinsfile,下意识把它当成“写个 shell 脚本就行”,结果跑起来要么阶段莫名失败、要么环境变量死活不生效、要么并行任务互相污…

2026/10/20 20:22:55 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →