| 订阅方式 | 介绍 |
|---|---|
| 使用长连接接收事件 | 该方式是飞书 SDK 内提供的能力,你可以通过集成飞书 SDK 与开放平台建立一条 WebSocket 全双工通道(你的服务器需要能够访问公网)。后续当应用订阅的事件发生时,开放平台会通过该通道向你的服务器发送消息。相较 于传统的 Webhook 模式,长连接模式大大降低了接入成本,将原先 1 周左右的开发周期降低到 5 分钟。具体优势如下:测试阶段无需使用内网穿透工具,通过长连接模式在本地开发环境中即可接收事件回调。SDK 内封装了鉴权逻辑,只在建连时进行鉴权,后续事件推送均为明文数据,无需再处理解密和验签逻辑。只需保证运行环境具备访问公网能力即可,无需提供公网 IP 或域名。无需部署防火墙和配置白名单。 |
| 将事件发送至开发者服务器 | 传统的 Webhook 模式,该方式需要你提供用于接收事件消息的服务器公网地址。后续当应用订阅的事件发生时,开放平台会向服务器的公网地址发送 HTTP POST 请求,请求内包含事件数据。 |

import lark_oapi as lark
## P2ImMessageReceiveV1 为接收消息 v2.0;CustomizedEvent 内的 message 为接收消息 v1.0。
def do_p2_im_message_receive_v1(data: lark.im.v1.P2ImMessageReceiveV1) -> None:
print(f'[ do_p2_im_message_receive_v1 access ], data: {lark.JSON.marshal(data, indent=4)}')
def do_message_event(data: lark.CustomizedEvent) -> None:
print(f'[ do_customized_event access ], type: message, data: {lark.JSON.marshal(data, indent=4)}')
event_handler = lark.EventDispatcherHandler.builder("", "") \
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1) \
.register_p1_customized_event("这里填入你要自定义订阅的 event 的 key,例如 out_approval", do_message_event) \
.build()
def main():
cli = lark.ws.Client("YOUR_APP_ID", "YOUR_APP_SECRET",
event_handler=event_handler,
log_level=lark.LogLevel.DEBUG)
cli.start()
if __name__ == "__main__":
main()register_{事件版本}_{事件类型 或 customized_event} 方法处理不同的事件。
data: lark.im.v1.P2ImMessageReceiveV1 指定所选事件,其中:lark.im.v1表示对应的业务域以及版本,可通过事件类型的前缀获取业务域代码,例如 im.message.receive_v1 对应的业务域代码为 im。P2ImMessageReceiveV1 中,P2 表示事件版本为 v2.0,ImMessageReceiveV1 对应事件类型 im.message.receive_v1。.register_p2_im_message_receive_v1() 处理事件,其中:im.message.receive_v1。data: lark.CustomizedEvent 方法,表示处理自定义事件。.register_p1_customized_event("这里填入你要自定义订阅的事件类型,例如 out_approval", do_message_event)## P2ImMessageReceiveV1:
## P2 对应 v2.0 版本,
## ImMessageReceiveV1 对应接收消息事件类型 im.message.receive_v1。
def do_p2_im_message_receive_v1(data: lark.im.v1.P2ImMessageReceiveV1) -> None:
print(f'[ do_p2_im_message_receive_v1 access ], data: {lark.JSON.marshal(data, indent=4)}')
## 如果是 v1.0 版本事件,需要使用 lark.CustomizedEvent
def do_message_event(data: lark.CustomizedEvent) -> None:
print(f'[ do_customized_event access ], type: message, data: {lark.JSON.marshal(data, indent=4)}')
event_handler = lark.EventDispatcherHandler.builder("", "") \
## register_p2 对应 v2.0 版本,
## im_message_receive_v1 对应接收消息事件类型 im.message.receive_v1。
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1) \
## register_p1 对应 v1.0 版本,
## 参数值需要传入事件类型。例如 out_approval
.register_p1_customized_event("这里填入你要自定义订阅的 event 的 key,例如 out_approval", do_message_event) \
.build()

from flask import Flask
import lark_oapi as lark
from lark_oapi.adapter.flask import *
from lark_oapi.api.im.v1 import *
app = Flask(__name__)
def do_p2_im_message_receive_v1(data: P2ImMessageReceiveV1) -> None:
print(lark.JSON.marshal(data))
def do_customized_event(data: lark.CustomizedEvent) -> None:
print(lark.JSON.marshal(data))
handler = lark.EventDispatcherHandler.builder(lark.ENCRYPT_KEY, lark.VERIFICATION_TOKEN, lark.LogLevel.DEBUG) \
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1) \
.register_p1_customized_event("message", do_customized_event) \
.build()
@app.route("/event", methods=["POST"])
def event():
resp = handler.do(parse_req())
return parse_resp(resp)
if __name__ == "__main__":
app.run(port=7777)
data: P2ImMessageReceiveV1 指定所选事件,P2ImMessageReceiveV1 中,P2 表示事件版本为 v2.0,ImMessageReceiveV1 对应事件类型 im.message.receive_v1。.register_p2_im_message_receive_v1() 处理事件,其中:im.message.receive_v1。data: lark.CustomizedEvent 方法,表示处理自定义事件。.register_p1_customized_event("这里填入你要自定义订阅的事件类型,例如 out_approval", do_message_event)message(历史版本 接收消息v1.0 事件)。## P2ImMessageReceiveV1:
## P2 对应 v2.0 版本,
## ImMessageReceiveV1 对应接收消息事件类型 im.message.receive_v1。
def do_p2_im_message_receive_v1(data: P2ImMessageReceiveV1) -> None:
print(lark.JSON.marshal(data))
## 如果是 v1.0 版本事件,需要使用 lark.CustomizedEvent
def do_customized_event(data: lark.CustomizedEvent) -> None:
print(lark.JSON.marshal(data))
handler = lark.EventDispatcherHandler.builder(lark.ENCRYPT_KEY, lark.VERIFICATION_TOKEN, lark.LogLevel.DEBUG) \
## register_p2 对应 v2.0 版本,
## im_message_receive_v1 对应接收消息事件类型 im.message.receive_v1。
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1) \
## register_p1 对应 v1.0 版本,
## 参数值需要传入事件类型。例如 message(历史版本 接收消息v1.0 事件)
.register_p1_customized_event("message", do_customized_event) \
.build()
EventDispatcherHandler.builder 方法的参数中。handler = lark.EventDispatcherHandler.builder(lark.ENCRYPT_KEY, lark.VERIFICATION_TOKEN, lark.LogLevel.DEBUG) \
.register_p2_im_message_receive_v1(do_p2_im_message_receive_v1) \
.register_p1_customized_event("message", do_customized_event) \
.build()