共计 2940 个字符,预计需要花费 8 分钟才能阅读完成。
为什么需要飞书 Skill?
如今企业内部协作工具如飞书、钉钉等已经成为日常办公的重要平台。通过开发飞书 Skill(机器人应用),可以实现自动化流程、智能问答、数据推送等功能,极大提升工作效率。

对于新手开发者来说,最大的痛点往往是环境配置和认证过程。飞书的开放平台文档虽然全面,但对于初学者来说信息量较大,容易在初期遇到如应用创建失败、消息接收不到、签名验证错误等问题。
飞书 Skill 与其他平台的对比
与其他主流企业 IM 平台相比,飞书 Skill 的开发有一些显著特点:
- 认证机制:飞书采用双重验证(verification_token+encrypt_key),比企业微信更严格,但比钉钉的加密方式更易理解
- 消息格式:飞书的事件订阅使用统一的事件模型,而钉钉和企业微信有更多自定义字段
- 开发语言支持:飞书官方 SDK 对 Node.js 和 Python 支持最好,而钉钉对 Java 支持更友好
从零开始创建飞书 Skill
第一步:创建飞书开放平台应用
- 登录 飞书开放平台
- 在开发者后台点击 ” 创建应用 ”
- 填写应用名称、描述等基本信息
- 记录下生成的
App ID和App Secret(后续认证要用)
第二步:配置应用权限和事件订阅
在应用管理页面需要配置两个关键信息:
- 权限配置:根据你的机器人功能需求,勾选相应的权限(如消息接收、用户信息读取等)
- 事件订阅 :这里需要填写你的服务端 URL,并设置
verification_token和encrypt_key
// Node.js 示例 - 基础 HTTP 服务框架
const express = require('express');
const crypto = require('crypto');
const app = express();
app.use(express.json());
// 验证飞书服务器推送的 URL
app.post('/webhook', (req, res) => {
// 1. 验证签名
const signature = req.headers['x-lark-signature'];
const timestamp = req.headers['x-lark-request-timestamp'];
const nonce = req.headers['x-lark-request-nonce'];
// 2. 计算签名(使用你的 verification_token)const sigStr = `${timestamp}\n${nonce}\n${JSON.stringify(req.body)}`;
const computedSig = crypto
.createHmac('sha256', '你的 verification_token')
.update(sigStr)
.digest('hex');
// 3. 验证签名是否匹配
if (signature !== computedSig) {return res.status(403).send('Invalid signature');
}
// 处理不同类型的事件
if (req.body.type === 'url_verification') {
// 飞书首次配置时的 URL 验证
return res.json({challenge: req.body.challenge});
}
// 处理实际业务消息
console.log('收到消息:', req.body);
res.send('OK');
});
app.listen(3000, () => {console.log('Server running on port 3000');
});
第三步:处理消息事件
飞书的消息推送采用事件驱动模型,常见的事件类型包括:
message:用户发送消息时触发app_open:用户打开应用时触发im.chat.member.bot.added_v1:机器人被添加到群聊时触发
新手常见错误及解决方案
- 忽略 URL 验证请求 :飞书首次配置时会发送
type=url_verification的请求,必须正确处理并返回challenge字段 - 签名验证失败:确保使用正确的
verification_token,并且签名计算时的时间戳、随机数与 header 中的一致 - 错误的事件类型判断:不同版本的事件可能有不同的 type 字段(如 v1/v2 版本差异)
- 未处理消息加密:如果配置了 encrypt_key,需要先解密消息内容
- 响应超时:飞书要求 5 秒内必须响应,长时间操作应该先返回 200 再异步处理
进阶开发建议
安全性增强
- 实现防重放攻击:记录已处理的 request_id,避免重复处理
- 敏感操作二次验证:如关键数据变更需要用户确认
性能优化
- 耗时操作异步化:如调用第三方 API 时,可以先响应飞书再后台处理
- 使用飞书提供的批量接口:当需要处理大量数据时
# Python 示例 - 处理消息事件
from flask import Flask, request, jsonify
import hashlib
import hmac
app = Flask(__name__)
VERIFICATION_TOKEN = "你的 verification_token"
@app.route('/webhook', methods=['POST'])
def webhook():
# 验证签名
signature = request.headers.get('X-Lark-Signature')
timestamp = request.headers.get('X-Lark-Request-Timestamp')
nonce = request.headers.get('X-Lark-Request-Nonce')
# 计算签名
body = request.get_data(as_text=True)
sign_str = f"{timestamp}\n{nonce}\n{body}"
computed_sig = hmac.new(VERIFICATION_TOKEN.encode('utf-8'),
sign_str.encode('utf-8'),
digestmod=hashlib.sha256
).hexdigest()
if signature != computed_sig:
return "Invalid signature", 403
# 处理事件
data = request.json
if data.get('type') == 'url_verification':
return jsonify({'challenge': data['challenge']})
# 处理实际业务逻辑
print(f"收到事件: {data}")
return "OK"
if __name__ == '__main__':
app.run(port=3000)
总结
通过本文的介绍,你应该已经掌握了飞书 Skill 开发的基本流程。从创建应用到处理消息事件,最关键的环节在于正确理解飞书的事件订阅机制和签名验证流程。
实际开发中,建议先从简单的消息响应开始,逐步增加更复杂的功能。飞书的开发者社区和文档资源非常丰富,遇到问题时可以多查阅官方资料。
当你完成第一个可用的飞书机器人后,可以尝试将其发布到飞书应用商店,让更多用户使用你的作品。开发过程中积累的经验,也同样适用于其他企业 IM 平台的机器人开发,有助于你扩展技术广度。
正文完
