当你需要在自己的应用中集成消息推送时,飞书(Lark)提供了一套非常强大的API。今天,让我们一起来看看如何使用Python和飞书API实现智能消息推送功能。不用担心复杂的过程,我会一步步带你解析这段代码,让你了解每个环节的作用。
1. 准备工作
首先,确保你已经有了飞书开发者账户,以及创建了一个应用,这样你才能获得必须的app_id
和app_secret
。接着,我们需要安装lark_oapi
库,这样才能方便地调用飞书提供的API接口。
2. 功能点拆解
2.1 初始化客户端
client = lark.Client.builder() \
.app_id(app_id) \
.app_secret(app_secret) \
.log_level(lark.LogLevel.ERROR) \
.build()
在这里,我们初始化了一个lark
客户端,配置了应用的app_id
和app_secret
,这是我们身份的凭证。同时,我们设置了日志级别,这样只有错误信息会被记录,让日志更清爽。
2.2 获取用户ID
request: BatchGetIdUserRequest = BatchGetIdUserRequest.builder() \
.user_id_type("open_id") \
.request_body(BatchGetIdUserRequestBody.builder()
.mobiles([receive_phone_number])
.include_resigned(False)
.build()) \
.build()
response: BatchGetIdUserResponse = client.contact.v3.user.batch_get_id(request)
在这段代码中,我们通过用户的手机号获取其在飞书上的open_id
。这个open_id
是推送消息的关键,它是每个用户的标识。
2.3 消息推送
request: CreateMessageRequest = CreateMessageRequest.builder() \
.receive_id_type("open_id") \
.request_body(CreateMessageRequestBody.builder()
.receive_id(receive_open_id)
.msg_type(msg_type)
.content(msg_content)
.build()) \
.build()
response: CreateMessageResponse = client.im.v1.message.create(request)
接下来,我们构建了一个消息推送请求,指定了消息的类型和内容,然后调用client.im.v1.message.create
方法进行消息推送。
3. 完整示例代码
import lark_oapi as lark
from lark_oapi.api.im.v1 import *
from lark_oapi.api.contact.v3 import *
# 1. 用户消息推送
# 2. 群组消息推送
# https://open.feishu.cn/document/server-docs/im-v1/message/create
# 3. 批量消息推送
# https://open.feishu.cn/document/server-docs/im-v1/batch_message/send-messages-in-batches
def app_push_msg(
app_id: str,
app_secret: str,
receive_phone_number: str,
msg_type: str,
msg_content: str,
):
"""
应用用户消息推送
:param app_id: 应用ID (App ID)
:param app_secret: App Secret (应用密钥)
:param receive_phone_number: 消息接收方手机号列表 (仅支持单个用户推送)
:param msg_type: 消息类型
:param msg_content: 消息内容
"""
# 创建client
client = lark.Client.builder() \
.app_id(app_id) \
.app_secret(app_secret) \
.log_level(lark.LogLevel.ERROR) \
.build()
# 通过手机号获取飞书用户open_id
request: BatchGetIdUserRequest = BatchGetIdUserRequest.builder() \
.user_id_type("open_id") \
.request_body(BatchGetIdUserRequestBody.builder()
.mobiles([receive_phone_number])
.include_resigned(False) # 是否获取已离职员工ID
.build()) \
.build()
# 发起请求
response: BatchGetIdUserResponse = client.contact.v3.user.batch_get_id(request)
# 处理请求结果
if response.success():
result = lark.JSON.marshal(response.data, indent=4)
lark.logger.info(result)
else:
result = f"client.contact.v3.user.batch_get_id failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}"
lark.logger.error(result)
return result
# 解析open_id
receive_open_id = response.data.user_list[0].user_id
# 推送消息
request: CreateMessageRequest = CreateMessageRequest.builder() \
.receive_id_type("open_id") \
.request_body(CreateMessageRequestBody.builder()
.receive_id(receive_open_id)
.msg_type(msg_type)
.content(msg_content)
.build()) \
.build()
# 发起请求
response: CreateMessageResponse = client.im.v1.message.create(request)
# 处理结果
if response.success():
result = lark.JSON.marshal(response.data, indent=4)
lark.logger.info(result)
else:
result = f"client.im.v1.message.create failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}"
lark.logger.error(result)
return result
if __name__ == "__main__":
app_push_msg(
'cli_aXXXXXXXXXXXXXXX',
'bkZXXXXXXXXXXXXXXXXXXXXXXXXXXXXEuvbF',
"156XXXXXXXX",
"interactive",
"""{\"type\": \"template\", \"data\": { \"template_id\": \"ctp_AAXXXXXXXXXX\", \"template_variable\": {
\"alarm_title\": \"赚他一个亿\",
\"alarm_error_content\": \"叮铃,微信到账1亿元\",
\"alarm_error_datetime\": \"2023-1-30 15:27:00\",
\"alarm_error_rpc\": \"RPA888\",
\"alarm_error_rrb\": \"RPA888@nb\",
\"im_chat_link\": \"https://applink.feishu.cn/client/chat/open?openId=ou_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",
\"pm_chat_link\": \"https://applink.feishu.cn/client/chat/open?openId=ou_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\"
} } }
"""
)
推送的卡片消息示例:
结语
通过上述步骤,我们已经实现了一个简单的消息推送功能。虽然这只是冰山一角,但足以让你开始探索飞书API的强大功能。
希望你在实现自己的智能消息推送时也能有所启发,不过不要忘了,实际操作中还需要考虑很多细节,比如安全性、错误处理和用户体验等。开发是一门技术,也是一门艺术,代码的每一次迭代都是一次创造。