1. 引言
随着企业协作效率要求的不断提升,将内部工具与飞书深度集成已成为许多团队的刚需。WorkBuddy 作为一款灵活的工作流自动化平台,通过接入飞书,可以实现消息推送、审批提醒、机器人交互等场景的自动化。本文将从飞书开放平台的准备工作开始,逐步讲解如何将 WorkBuddy 接入飞书,并提供丰富的代码实例,帮助读者快速上手。
2. 准备工作
在开始接入之前,需要完成以下准备工作:
- 注册飞书开放平台账号,并创建企业自建应用。
- 获取应用的 App ID 和 App Secret。
- 在飞书开放平台中开通机器人能力,并获取机器人 Webhook 地址。
- 准备 WorkBuddy 环境,确保可以运行自定义脚本或 Webhook 服务。
3. 创建飞书自建应用
首先,登录飞书开放平台,进入「开发者后台」,点击「创建企业自建应用」。填写应用名称和描述后,即可获得应用的 App ID 和 App Secret。这两个凭证是后续调用飞书 API 的基础。
{
"app_id": "cli_a5f8e2c1b3d4",
"app_secret": "your_app_secret_here"
}
4. 获取访问令牌
飞书开放平台使用 tenant_access_token 作为调用 API 的凭证。通过 App ID 和 App Secret 可以获取该令牌。以下是一个使用 Python 获取访问令牌的示例:
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
}
response = requests.post(url, json=payload)
data = response.json()
if data.get("code") == 0:
return data["tenant_access_token"]
else:
raise Exception(f"获取令牌失败: {data}")
使用示例
token = get_tenant_access_token("cli_a5f8e2c1b3d4", "your_app_secret_here")
print(token)
5. 配置机器人 Webhook
在飞书开放平台中,为应用添加「机器人」能力后,可以获取机器人的 Webhook 地址。WorkBuddy 可以通过该 Webhook 向飞书群发送消息。以下是一个发送文本消息的示例:
import requests
def send_feishu_message(webhook_url, content):
headers = {"Content-Type": "application/json"}
payload = {
"msg_type": "text",
"content": {
"text": content
}
}
response = requests.post(webhook_url, json=payload, headers=headers)
return response.json()
使用示例
webhook = "https://open.feishu.cn/open-apis/bot/v2/hook/your_webhook_token"
result = send_feishu_message(webhook, "Hello from WorkBuddy!")
print(result)
6. WorkBuddy 中配置飞书节点
在 WorkBuddy 的工作流编辑器中,添加一个「HTTP 请求」节点,将飞书 Webhook 地址填入 URL 字段,并设置请求方法为 POST。请求体使用 JSON 格式,内容如下:
{
"msg_type": "text",
"content": {
"text": "{{workflow.variables.message}}"
}
}
其中 {{workflow.variables.message}} 是 WorkBuddy 中的变量引用,可以在工作流中动态传入消息内容。
7. 实现消息卡片推送
除了纯文本消息,飞书还支持富文本卡片消息。以下是一个发送卡片消息的 Python 示例:
import requests
def send_card_message(webhook_url, title, content):
headers = {"Content-Type": "application/json"}
payload = {
"msg_type": "interactive",
"card": {
"header": {
"title": {
"tag": "plain_text",
"content": title
}
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": content
}
}
]
}
}
response = requests.post(webhook_url, json=payload, headers=headers)
return response.json()
使用示例
result = send_card_message(webhook, "任务完成通知", "你的任务 #123 已完成,请及时查看。")
print(result)
8. 处理飞书事件回调
如果需要实现双向交互,例如接收飞书群内的指令并触发 WorkBuddy 工作流,则需要配置事件订阅。飞书通过回调 URL 将事件推送给你的服务。以下是一个使用 Flask 处理飞书事件回调的示例:
from flask import Flask, request, jsonify
import json
app = Flask(name)
@app.route("/feishu/callback", methods=["POST"])
def feishu_callback():
data = request.json
# 处理 URL 验证
if data.get("type") == "url_verification":
return jsonify({"challenge": data["challenge"]})
# 处理消息事件
if data.get("type") == "event_callback":
event = data.get("event", {})
if event.get("type") == "message":
message_content = json.loads(event.get("message", {}).get("content", "{}"))
text = message_content.get("text", "")
print(f"收到消息: {text}")
# 在这里触发 WorkBuddy 工作流
return jsonify({"code": 0})
if name == "main":
app.run(port=5000)
9. 在 WorkBuddy 中调用飞书 API
WorkBuddy 支持通过自定义脚本节点调用飞书 API。以下是一个在 WorkBuddy 中获取用户信息的示例脚本:
import requests
def get_user_info(tenant_access_token, user_id):
url = f"https://open.feishu.cn/open-apis/contact/v3/users/{user_id}"
headers = {
"Authorization": f"Bearer {tenant_access_token}"
}
response = requests.get(url, headers=headers)
data = response.json()
if data.get("code") == 0:
return data["data"]["user"]
else:
raise Exception(f"获取用户信息失败: {data}")
在 WorkBuddy 中调用
token = get_tenant_access_token(app_id, app_secret)
user = get_user_info(token, "ou_xxx")
print(user["name"])
10. 常见问题与排查
在接入过程中,可能会遇到以下常见问题:
- 获取令牌失败:检查 App ID 和 App Secret 是否正确,确保应用已启用。
- Webhook 发送失败:确认 Webhook 地址完整,且机器人已添加到目标群。
- 事件回调不触发:检查回调 URL 是否公网可访问,并在飞书后台正确配置事件订阅。
- 权限不足:在飞书开放平台中为应用添加相应的权限范围,并发布应用版本。
11. 总结
本文详细介绍了 WorkBuddy 接入飞书的完整流程,包括创建自建应用、获取访问令牌、配置机器人 Webhook、发送文本和卡片消息、处理事件回调等核心环节,并提供了丰富的代码实例。通过本文的实践,读者可以快速实现 WorkBuddy 与飞书的深度集成,提升团队协作效率。后续还可以根据业务需求,扩展更多飞书 API 的调用场景。

281

被折叠的 条评论
为什么被折叠?



