尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

飞书与腾讯会议API对接实战:从机器人推送到会议全流程自动化

飞书与腾讯会议API对接实战:从机器人推送到会议全流程自动化 做企业办公集成这几年我越来越确定一件事工具好不好用不完全取决于工具本身更取决于它在你公司的协作流里有没有被接起来。飞书和腾讯会议就是这么一对典型——两家都是各自赛道里的头部选手飞书的文档、机器人、多维表格确实好用腾讯会议的音视频质量和网络适应能力也确实是硬实力很多公司两个都在用。但用归用这两个系统之间几乎是断开的每次开会都有人在飞书群里复制粘贴会议号每次改时间都得全体重新收一遍链接。我最初决定做飞书和腾讯会议的对接就是被这种低效操作逼的。这篇文章把我从方案选型、接口联调、到上线跑通的全过程都梳理一遍重点说说那些文档里没写、只有实际调过才会踩的坑。如果你也在飞书和腾讯会议之间来回切换这篇文章能帮你少走至少一周的弯路。1. 为什么非要折腾这个对接飞书生态里的腾讯会议使用痛点1.1 两种工具各有各的护城河谁也没法替代谁我见过不少团队内部沟通主阵地早就搬到了飞书文档、审批、多维表格用得飞起但一到对外开会、跨公司协作还是会切回腾讯会议。原因很现实飞书原生音视频会议能力虽然这些年进步明显但在大并发、弱网环境、以及外部嘉宾的客户端覆盖上和腾讯会议这种专攻音视频的老牌产品还是有不小差距。不少公司还干脆采购了腾讯会议的企业版不把这些资源用起来属实浪费。这意味着什么呢意味着双系统并行不是少数团队的临时状态而是相当多企业的长期常态。既然两个系统都会长期存在那两者之间那些靠人工搬运的信息就成了一个持续消耗团队精力的隐性成本。这个成本平时不起眼但一旦团队规模上来每周几十场会议每场会都要有人发链接、记会议号、转纪要浪费的时间就非常可观了。1.2 三个真实到扎心的使用场景第一个场景是每周例会。我们团队每周一上午有跨部门周会用的固定腾讯会议号。看起来没什么问题但实际上每次有新人加入、或者嘉宾临时接入都要有人在飞书群里重新发一遍会议链接和会议号。有一次负责人出差忘发了结果十几个人在会议时间到了之后还在群里问链接呢。这种场景任何一个在群里当过会议管理员的人都懂。第二个场景是销售对外的产品演示。销售手里的腾讯会议链接散落在各自的聊天记录里别说新同事有时候本人都找不到。更麻烦的是销售在用飞书管客户会议信息却不在客户跟进记录里复盘的时候根本串不起来。第三个场景是会议纪要。腾讯会议自带的纪要功能做的是挺好但纪要默认存在腾讯会议自己的后台里和飞书里推进的项目任务、多维表格完全隔离。开完会还得人工把待办事项搬到飞书里派活这一搬就是十几分钟。这三个场景共同指向同一个需求让飞书和腾讯会议这两套系统在关键节点上能自动通气减少人工搬运。这也就是我做这次对接的根本动机。2. 对接方案选型三条路线的优缺点对比2.1 先把可选的路线看清楚在动手之前我把市面上常见的几种对接路线梳理了一遍。我习惯先列一张表把选项摊开看再结合实际团队情况做决策不然很容易被某个方案的美好表象带偏。路线实现方式开发成本维护成本用户体验适合团队路线一飞书机器人 腾讯会议OpenAPI通过后端服务单向推送低低较好通知及时、入口统一小团队、无专职客户端开发路线二飞书小程序/网页应用内嵌腾讯会议SDK高高最好接近原生体验有专职客户端/音视频团队路线三日历互通 API双向同步中高高最完整但受平台权限限制多有长期集成规划的团队路线一的本质是单向推送飞书机器人把腾讯会议的链接、时间、状态推送到群里数据流向是腾讯会议→中间服务→飞书反方向只做少量查询。路线二则是把腾讯会议的SDK嵌进飞书小程序里用户在飞书里直接发起和加入会议体验上差距很大。路线三想做到飞书日历和腾讯会议日程双向更新一方改了另一方自动同步听起来最理想。2.2 我为什么最终选了路线一我自己的团队情况是后端两个人前端一个人没有专职客户端开发也没有专职运维。路线二听起来很美好但SDK集成涉及小程序审核、音视频权限、以及后续跟随两个平台版本升级的持续维护如果团队没有长期投入很容易做一半就搁置。路线三的双向同步听上去最彻底但日历系统是两个产品最核心的功能壁垒飞书和腾讯会议官方都没有开放完全对等的双向写权限真要做就得绕很多弯子收益却不明显。所以最终选了路线一。理由很简单我们最痛的点是别再手动复制链接不是必须在飞书里开腾讯会议。先花最少的成本把最大的痛点解决掉跑通之后有精力了再往会中、会后的场景延伸。说实话很多团队一上来就想做大而全结果做三个月也没上线。先把推链接这种最朴素的需求做好反而是落地最快的路径。技术选型这件事从来不是选最炫的而是选最匹配团队现实资源的。3. 核心步骤飞书机器人 腾讯会议API 的完整打通流程3.1 前期准备一个都不能少动手前要把三样东西准备好缺一个都会在中途卡住。飞书这边的准备企业管理员在飞书开放平台创建自建应用开启机器人能力拿到App ID和App Secret。还要开通发消息相关的权限点比如im:message:send_as_bot。配置完之后记住一定要走创建版本→提交审核→发布这个流程这个流程不走完后面接口调通了也发不出消息这一点我后面会专门讲。腾讯会议这边的准备企业管理员在腾讯会议OpenAPI平台创建企业级应用拿到App ID、Secret ID和Secret Key。注意腾讯会议的Secret ID和Secret Key是配对使用的和飞书的App ID/App Secret概念不太一样后面生成JWT鉴权的时候要用到。服务器一台能访问公网的云服务器或者直接用云函数、容器服务都行。我们的脚本用Python写的部署在一台2核4G的小机器上就够用了。这里想说句实在话很多人低估了小机器跑定时任务的性价比其实这类对接脚本对资源要求极低不需要一上来就上K8s。3.2 先用JWT打通腾讯会议OpenAPI腾讯会议OpenAPI用的是JWT鉴权JSON Web Token简单理解就是给每次请求盖一个带有效期的戳。生成JWT需要用到刚才说的App ID、Secret ID和Secret Key。下面这段Python代码是我一直在用的生成JWT的函数import time import jwt app_id 你的AppID secret_id 你的SecretID secret_key 你的SecretKey def generate_jwt(): payload { appid: app_id, secret_id: secret_id, time: int(time.time()), expire: 14400 # 有效期4小时 } token jwt.encode(payload, secret_key, algorithmHS256) return tokenJWT里的time字段是当前Unix时间戳expire是有效时长单位是秒。生成的token要放在请求头里格式是Authorization: Bearer token。这里有个关键点生成JWT时的服务器时间必须准确否则腾讯会议会直接判定签名无效。时间偏差是第一个大坑我后面会展开讲。拿到token之后调用创建会议的接口import requests def create_meeting(topic, start_time, end_time, userid): token generate_jwt() url https://api.meeting.qq.com/v1/meetings headers { Authorization: fBearer {token}, Content-Type: application/json } payload { topic: topic, start_time: start_time, # Unix时间戳秒 end_time: end_time, meeting_type: 0, # 0表示预约会议 userid: userid, media_type: 0 # 0表示纯视频会议 } resp requests.post(url, jsonpayload, headersheaders) return resp.json()响应里最关键的就是meeting_info里的join_url这个就是参会链接。把这串链接拿到手后面飞书机器人推送的就是它。3.3 让飞书机器人把会议信息说出来飞书这边的调用核心也是两条先拿tenant_access_token再发消息。拿token的接口import requests def get_tenant_access_token(app_id, app_secret): url https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal payload { app_id: app_id, app_secret: app_secret } resp requests.post(url, jsonpayload) data resp.json() return data[tenant_access_token]发消息我强烈建议用交互卡片不要用纯文本。因为交互卡片可以把会议主题、时间、会议号、入会链接、按钮全部结构化展示用户一眼就能看全还可以加一个一键入会的按钮体验比干巴巴的文本好太多。import json def send_meeting_card(chat_id, topic, start_time, join_url, meeting_code): token get_tenant_access_token(app_id, app_secret) url https://open.feishu.cn/open-apis/im/v1/messages?receive_id_typechat_id headers { Authorization: fBearer {token}, Content-Type: application/json } card { config: {wide_screen_mode: True}, header: { title: {tag: plain_text, content: 会议预约提醒}, template: blue }, elements: [ {tag: div, text: {tag: lark_md, content: f**会议主题**{topic}}}, {tag: div, text: {tag: lark_md, content: f**开始时间**{start_time}}}, {tag: div, text: {tag: lark_md, content: f**会议号**{meeting_code}}}, {tag: action, actions: [ {tag: button, text: {tag: plain_text, content: 一键入会}, type: primary, url: join_url} ]} ] } payload { receive_id: chat_id, msg_type: interactive, content: json.dumps(card, ensure_asciiFalse) } resp requests.post(url, jsonpayload, headersheaders) return resp.json()注意一点飞书消息接口的content字段是一个字符串不是JSON对象。很多第一次写的人直接把字典塞进去结果发消息一直报错。要先json.dumps一下这是飞书接口比较坑的地方。3.4 用定时任务把整条链路串起来光有接口还不够还得有一个定时触发的机制。我们用的是云函数加定时触发器每天在会议开始前15分钟自动执行一次查询当天有没有需要提醒的会议从飞书多维表格里查或者本地数据库查对每个还有效的会议调用腾讯会议API确认会议状态生成或复用已有的join_url调用飞书机器人接口把卡片发到指定群里以腾讯云云函数为例定时触发器用cron表达式比如每个工作日上午9点触发0 0 9 ? * MON-FRI *用云函数的好处是不用自己维护常驻进程对没有专职运维的团队特别友好。触发后脚本跑完就结束按调用次数计费成本几乎可以忽略不计。4. 踩坑实录我在对接过程中遇到的五个坎4.1 JWT鉴权失败的根因服务器时间不准这个坑是我最先遇到的也是最容易误导人的。第一次调腾讯会议API时返回的报错信息是invalid signature或者是token expired。我第一反应是签名算法写错了反复检查了JWT生成的代码确认HS256没错appid和secret也没拼错。排查了很久我才把本地时间和腾讯云服务器的响应时间做了一次对比发现问题就出在我用的那台测试服务器上——它的系统时间快了将近5分钟。腾讯会议的JWT校验对时间戳非常敏感你生成token时用的time和服务器当前时间一旦偏差过大就会判定token无效。解决办法很简单给服务器配上NTP时间同步或者干脆用云厂商提供的标准镜像。我个人的建议是写代码的时候再加一个容错如果API返回签名错误重新生成一次JWT再重试避免偶发的时间偏差影响线上服务。这两层保障叠加起来基本就不会再被这个坑绊住了。4.2 会议时间神秘地差了8小时第一次成功建会后我满心欢喜地点开飞书卡片结果发现会议开始时间比预期晚了8小时。排查了很久发现是时间戳单位的问题。腾讯会议API的文档里写的是Unix时间戳但接口文档对单位没有特别醒目的标注。我用Node.js写前端脚本时习惯性用了Date.now()它返回的是毫秒我直接把这个毫秒值传过去了服务端解析出来的时间自然就乱了。加上不同语言的转换习惯不一样特别容易踩。我的解决方式是在后端统一处理时间所有发往腾讯会议API的时间戳都强制用秒前端只负责传一个格式化的日期字符串由后端来解析转换。这样就算前端换了人、换了语言也不会再出现差8小时这种玄学问题。另外提醒一句飞书的日历事件API用的是毫秒时间戳和腾讯会议的秒时间戳刚好相反。两边对接的时候一定要在数据入口的地方就统一好单位最好写个工具函数注释清楚否则过两个月你自己都会忘。4.3 飞书消息卡片的内容截断问题我用飞书交互卡片推会议信息内容里有会议主题、时间、会议号、还有一段备注。第一次发出来发现备注信息被截断了点开详情看不到完整内容。查了一下飞书文档交互卡片的文本元素有长度限制超过一定字符数会被截断。我当时把会议备注、参会人、议程全塞进一个div里显然超了。解决办法是把长文本拆成多个div或者用lark_md格式配合适当的换行而不是把所有内容堆在一个字段里。另外卡片里不建议放超过两行的纯文本描述最好把关键信息会议号、时间、链接独立成字段重要信息放在最显眼的位置备注放在最后。这个经验适用于所有飞书卡片场景不只是会议提醒。4.4 定时任务重试导致重复建会系统上线第二天运营反馈怎么会收到三个一样的会议邀请我查了一下发现是定时任务的触发机制导致的云函数在某个时段恰好发生了重试而我的代码逻辑是每次触发都直接调用腾讯会议创建会议API完全没有做幂等处理。腾讯会议OpenAPI本身没有提供基于业务ID的幂等创建能力所以这个去重要自己做。我的方案是在本地数据库中维护一个会议任务表用业务ID比如飞书多维表格里的会议记录ID作为唯一键。触发任务时先查这张表如果这个业务ID已经建过会就直接复用已有的join_url不再重新调用创建接口。另外我还加了一步保险在调用创建会议API之前先通过腾讯会议查询会议接口按主题和创建人查一下是否已经存在相同会议。双重校验之后重复建会的问题基本就杜绝了。这个思路也适用于其他平台的API对接凡是创建型的接口调用都建议自己维护一份业务层的幂等记录。4.5 飞书应用权限审核的隐藏成本很多第一次对接飞书的同学会忽略一个问题在飞书开放后台配置权限时你以为勾选好了权限但其实有些权限的生效是要跟着应用版本走的发布前需要管理员审核。我当时只是把应用发到了内部使用但没有走完整的创建版本-提交审核-发布流程。结果机器人发消息接口一直报权限不足。这个报错并不是说你没勾权限而是你的应用版本没有发布权限变更没有生效。所以对接飞书第一件事就是把发布流程走完创建应用、配置权限、创建版本、提交审核、发布。这一步做完后面接口调试才是顺畅的。千万不要觉得内部应用就不用走审核飞书的安全机制对自建应用同样严格。5. 联动进阶从推链接到会前-会中-会后全流程5.1 会前飞书日历和多维表格一起管起来推送链接只是开始。把会前流程打通之后我又做了两步优化。第一步把会议任务同步到飞书日历。用飞书日历API在会议开始时间创建日程事件描述里直接带上腾讯会议的链接。这样团队成员在飞书日历上看到的就是一个完整日程点开就能入会不再需要去群里翻卡片。第二步用飞书多维表格管理会议台账。每一条会议记录就是一行包含会议主题、时间、负责人、状态待开始/进行中/已结束、腾讯会议号、纪要文档链接。放在多维表格里的好处是可以配合飞书的自动化流程当会议状态变成已结束时自动触发后续动作比如提醒负责人填写纪要。这个过程很像给每个会议配了一条流水线从创建到归档每一步都有迹可循。5.2 会中机器人实时同步会议状态腾讯会议OpenAPI支持查询会议状态我也把这一步接进了飞书机器人。会议开始后机器人会自动推送一条会议进行中的状态卡片里面包含当前在线人数、会议录制状态。如果会议提前结束机器人也会收到回调推送会议已结束的提示方便后续跟进。这个功能做起来不复杂但很实用。尤其是跨部门协作时大家不用主动问会开了没有没有人录音看卡片状态一目了然。状态卡片本质上就是一个面向群聊的会议监控面板虽然比不上真正的仪表盘但胜在零门槛人人都能看到。5.3 会后纪要自动沉淀到飞书知识库最后一步是会后沉淀。腾讯会议的录制转写文件可以通过API获取拿到转写文本之后我用飞书云文档API自动创建一个文档标题是【会议纪要】会议主题正文包含会议时间、参会人、关键讨论内容和待办项文档创建后自动归档到指定的知识库文件夹。这一步做完整个闭环就完整了会前自动通知、会中状态同步、会后纪要归档。团队里再也没有人问上次那个会的纪要在哪。顺带提一句飞书云文档API的鉴权方式也是走tenant_access_token如果前面的机器人已经跑通了接云文档只是多调几个接口的事并没有想象中复杂。6. 落地效果与后续扩展思路6.1 上线两个月的实际变化对接方案跑通到现在最直观的变化是每周例会不再有人问会议链接呢新成员进群就会收到机器人推送的会议卡片销售例会纪要自动归档到知识库销售总监月底复盘直接看文档不用挨个找人要会议台账在多维表格里一目了然哪些会开了、哪些会没开、哪些纪要是空的十秒钟排查完这些都是真实的数据虽然不惊天动地但确确实实省掉了团队大量低效操作。算笔账的话以前每场会平均要花5分钟处理链接和纪要相关的事现在基本归零一个月下来省下的时间非常可观。6.2 顺着这个方向还能扩什么目前这套对接只是把飞书和腾讯会议之间的人工搬运去掉了。再往后我认为有三个方向值得探索。一个是智能建会通过飞书审批流程触发建会比如某个审批通过后自动创建对应的腾讯会议并邀请相关人员参会。第二个是AI纪要到任务拿到腾讯会议的转写文本后用大模型自动抽取出待办事项直接写入飞书多维表格并给负责人发送任务卡片。这一步我们已经开始小范围试点了效果比预期好尤其适合那种信息量大、节奏快的项目会。第三个是跨工具数据联通飞书多维表格里维护好的项目计划到节点时自动创建会议并带上相关文档链接。核心思路是让飞书成为业务数据的底座腾讯会议只负责音视频两者通过中间服务衔接。做这种企业工具集成我的切身体会是一开始别贪大。先把推链接、发提醒这种最痛的点做扎实再从会前、会中、会后逐步补齐。随着团队使用习惯的固化你自然会发现下一步最值得做的是什么。这个对接项目到现在也没有停因为每跑一段时间团队就会冒出新的需求而这些需求又反过来让两套系统真正融进了日常工作流里。
返回列表