Project Icon

oapi-sdk-python

Python SDK加速飞书应用开发集成

oapi-sdk-python是飞书开放平台的官方Python SDK,支持API调用、事件订阅和卡片交互等核心功能。该SDK提供简洁接口和丰富示例,适用于Python 3.7及以上版本,支持自建和商店应用开发。它简化了飞书应用的开发流程,有助于开发者快速集成飞书开放能力。

飞书开放接口 SDK

为帮助开发者更便捷地使用飞书开放能力开发应用,简化接入飞书开放平台时的操作步骤,开放平台提供了统一的服务端 SDK。开发者可使用 SDK 快速开发功能,提高开发效率。

安装

pip install lark-oapi -U

支持 Python 3.7 及以上版本

简单示例

import lark_oapi as lark

# 创建客户端
client = lark.Client.builder().app_id("APP_ID").app_secret("APP_SECRET").build()

# 构造请求对象
request = lark.contact.v3.GetUserRequest.builder().user_id("7be5fg9a").build()

# 发起请求
response = client.contact.v3.user.get(request)

更多示例可参考:请求示例

API 客户端

开发者在调用 API 前,需要先创建一个 API 客户端,然后才能基于该客户端发起 API 调用。

创建客户端

  • 自建应用
import lark_oapi as lark

client = lark.Client.builder() \
    .app_id("APP_ID") \
    .app_secret("APP_SECRET") \
    .build()
  • 商店应用
import lark_oapi as lark

client = lark.Client.builder() \
    .app_id("APP_ID") \
    .app_secret("APP_SECRET") \
    .app_type(lark.AppType.ISV) \
    .build()

客户端配置项

创建 API 客户端时,可以对客户端进行一些配置,比如设置日志级别、HTTP 请求超时时间等。

import lark_oapi as lark

client = lark.Client.builder() \
    .app_id("APP_ID") \
    .app_secret("APP_SECRET") \
    .domain(lark.FEISHU_DOMAIN) \       # 域名,默认为 https://open.feishu.cn
    .timeout(3) \                       # 客户端超时时间,单位秒,默认永不超时
    .app_type(lark.AppType.ISV) \       # 应用类型,默认为自建应用;若设为 ISV 需在 request_option 中配置 tenant_key
    .app_ticket("xxxx") \               # 获取 app_access_token 的凭证,app_type = ISV 时需配置
    .enable_set_token(False) \          # 是否允许手动设置 token,默认不开启;开启后需在 request_option 中配置 token
    .cache(Cache()) \                   # 自定义缓存,默认使用预置的本地缓存
    .log_level(lark.LogLevel.DEBUG) \   # 日志级别,默认为 WARNING
    .build()

API 调用

创建完 API 客户端后,我们可以使用 client.业务域.版本.资源.方法名称 来定位具体的 API 方法,然后对特定的 API 发起调用。

client_expr

飞书开放平台开放的所有 API 列表,可点击这里查看

基本用法

如下示例,我们通过 client 调用 通过手机号或邮箱获取用户 ID 接口。

# Code generated by Lark OpenAPI.

import lark_oapi as lark
from lark_oapi.api.contact.v3 import *


client = lark.Client.builder() \
    .app_id("APP_ID") \
    .app_secret("APP_SECRET") \
    .log_level(lark.LogLevel.DEBUG) \
    .build()

# 构造请求对象
request: BatchGetIdUserRequest = BatchGetIdUserRequest.builder() \
    .user_id_type("open_id") \
    .request_body(BatchGetIdUserRequestBody.builder()
                  .emails(["xxxx@bytedance.com"])
                  .mobiles(["15000000000"])
                  .build()) \
    .build()

# 发起请求
response: BatchGetIdUserResponse = client.contact.v3.user.batch_get_id(request)

# 处理失败返回
if not response.success():
    lark.logger.error(
        f"client.contact.v3.user.batch_get_id failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")

# 处理业务结果
lark.logger.info(lark.JSON.marshal(response.data, indent=4))

更多示例可参考:请求示例

Request 配置项

在每次发起 API 调用时,可以设置请求级别的一些参数,比如传递 userAccessToken、自定义 headers 等。

import lark_oapi as lark
from lark_oapi.api.contact.v3 import *

# 创建客户端
import lark_oapi as lark
from lark_oapi.api.contact.v3 import *

# 创建客户端
client = lark.Client.builder() \
    .enable_set_token(True) \
    .log_level(lark.LogLevel.DEBUG) \
    .build()

# 构造请求对象
request: BatchGetIdUserRequest = BatchGetIdUserRequest.builder() \
    .user_id_type("open_id") \
    .request_body(BatchGetIdUserRequestBody.builder()
                  .emails(["xxxx@bytedance.com"])
                  .mobiles(["15000000000"])
                  .build()) \
    .build()

# 设置请求选项
headers = {"key1": "value1", "key2": "value2"}
req_opt = lark.RequestOption.builder()\
    .tenant_access_token("t-g1047hjTXIZKCBFYWXUCK3D2LJWZYCWYL7USXXXX")\
    .headers(headers)\
    .build()

# 发起请求
response: BatchGetIdUserResponse = client.contact.v3.user.batch_get_id(request, req_opt)

# 处理失败返回
if not response.success():
    lark.logger.error(
        f"client.contact.v3.user.batch_get_id failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")

# 处理业务结果
lark.logger.info(lark.JSON.marshal(response.data, indent=4))

如上使用 RequestOptions 的 Builder 模式构建请求级别的参数。下表展示了所有可设置的选项:

配置选项 描述
tenant_key 租户 key,商店应用必须设置该选项。
user_access_token 用户 token,创建 Client 时 enable_set_token 需要设置为 True。
tenant_access_token 租户 token,创建 Client 时 enable_set_token 需要设置为 True。
app_access_token 应用 token,创建 Client 时 enable_set_token 需要设置为 True。
headers 自定义请求头,这些请求头会被透传到飞书开放平台服务端。

原生方式调用

部分老版本接口,由于没有元数据信息,所以无法生成对应的 SDK 模型,需要使用原生方式调用。

如下示例,使用 client 原生方式同样调用 通过手机号或邮箱获取用户 ID 接口。

import lark_oapi as lark


# 创建客户端
client = lark.Client.builder() \
    .app_id("APP_ID") \
    .app_secret("APP_SECRET") \
    .log_level(lark.LogLevel.DEBUG) \
    .build()

# 构造请求对象
request: lark.BaseRequest = lark.BaseRequest.builder() \
    .http_method(lark.HttpMethod.POST) \
    .uri("/open-apis/contact/v3/users/batch_get_id") \
    .token_types({lark.AccessTokenType.TENANT}) \
    .queries([("user_id_type", "open_id")]) \
    .body({"emails": ["xxxx@bytedance.com"], "mobiles": ["15000000000"]}) \
    .build()

# 发起请求
response: lark.BaseResponse = client.request(request)

# 处理失败返回
if not response.success():
    lark.logger.error(
        f"client.request failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")

# 处理业务结果
lark.logger.info(str(response.raw.content, lark.UTF_8))

更多示例可参考:原生调用

处理消息事件回调

了解消息订阅相关的知识,可以 点击这里

获取飞书开放平台开放的所有事件列表,可以 点击这里

基本用法

开发者订阅消息事件后,可以使用下面代码,对飞书开放平台推送的消息事件进行处理。

如下示例中使用 flask 启动 httpServer,如使用其他 web 框架,只需处理 http 出入参转换即可。

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("这里填入你要自定义订阅的 event 的 key,例如 out_approval", 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)

其中 EventDispatcherHandler.builder(encrypt_key: str, verification_token: str) 方法参数用于签名验证和消息解密使用,可在 开发者后台 ->「事件订阅」中查看。

console 需要注意的是,在注册处理器时,例如使用 register_p2_im_message_receive_v1 注册接收消息事件回调时,其中的 P2 表示消息协议版本。目前飞书开放平台有两种消息协议,分别是 1.0 和 2.0。

如下图所示,开发者在注册消息处理器时,需要从事件列表中查看自己需要的是哪种协议的事件。

如果是 1.0 的消息协议,则注册处理器时需要找以 register_p1_xxxx 开头的。如果是 2.0 的消息协议,则注册处理器时需要找以 register_p2_xxxx 开头的。

如果在 SDK 中未找到处理器,可以使用 register_p1_customized_event 或 register_p2_customized_event 注册自定义事件。

event_prot

更多示例可参考:事件回调

处理卡片行为回调

关于卡片行为相关的知识,可以点击这里查看

基本用法

开发者可以使用以下代码处理卡片回调,示例中使用 flask 启动 httpServer,如使用其他 web 框架,只需处理 http 出入参转换即可。

from typing import Any

from flask import Flask

import lark_oapi as lark
from lark_oapi.adapter.flask import *

app = Flask(__name__)


def do_interactive_card(data: lark.Card) -> Any:
    print(lark.JSON.marshal(data))
    content = {
        "header": {
            "title": {
                "tag": "plain_text",
                "content": "更新卡片成功"
            },
            "template": "green"
        },
        "elements": [
            {
                "tag": "div",
                "text": {
                    "tag": "lark_md",
                    "content": "**Success!\n成功啦😄**"
                }
            },
        ]
    }
    return content


handler = lark.CardActionHandler.builder(lark.ENCRYPT_KEY, lark.VERIFICATION_TOKEN, lark.LogLevel.DEBUG) \
    .register(do_interactive_card) \
    .build()


@app.route("/card", methods=["POST"])
def card():
    resp = handler.do(parse_req())
    return parse_resp(resp)


if __name__ == "__main__":
    app.run(port=7777)

更多示例可参考:事件回调

扩展示例

我们还基于 SDK 封装了常用的 API 组合调用及业务场景示例,如:

更多示例可参考:https://github.com/larksuite/oapi-sdk-python-demo

许可证

MIT

加入讨论群

点击或扫码加入讨论群

讨论群
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

稿定AI

稿定设计 是一个多功能的在线设计和创意平台,提供广泛的设计工具和资源,以满足不同用户的需求。从专业的图形设计师到普通用户,无论是进行图片处理、智能抠图、H5页面制作还是视频剪辑,稿定设计都能提供简单、高效的解决方案。该平台以其用户友好的界面和强大的功能集合,帮助用户轻松实现创意设计。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号