import lark_oapi as lark
client = lark.Client.builder() \
.app_id("APP_ID") \
.app_secret("APP_SECRET") \
.domain(lark.FEISHU_DOMAIN) \
.timeout(3) \
.app_type(lark.AppType.ISV) \
.app_ticket("xxxx") \
.enable_set_token(False) \
.cache(Cache()) \
.log_level(lark.LogLevel.DEBUG) \
.build()| 配置选项 | 配置方式 | 是否必填 | 描述 |
|---|---|---|---|
| app_id | client.app_id("APP_ID") | 是 | 用于设置应用的 App ID。app_id、app_secret 需要传入真实的应用凭证 App ID 和 App Secret,需登录开发者后台,在应用详情页的 凭证与基础信息 > 应用凭证 区域获取。 |
| app_secret | client.app_secret("APP_SECRET") | 是 | 用于设置应用的 App Secret。 |
| domain | client.domain(lark.FEISHU_DOMAIN) | 否 | 用于设置飞书域名。飞书(默认值): https://open.feishu.cnLark:https://open.larksuite.com |
| timeout | client.timeout(3) | 否 | 用于设置客户端超时时间,单位:秒。不传值默认为永不超时。 |
| app_type | client.app_type(lark.AppType.ISV) | 否 | 用于指定应用类型。不传值默认表示企业自建应用传入 lark.AppType.ISV 表示商店应用,且需要在 RequestOption 中配置 tenant_key |
| app_ticket | client.app_ticket("xxxx") | 否 | 当 app_type 指定商店应用时,需要在该参数内传入应用的 app_access_token。获取方式参见商店应用获取 app_access_token。 |
| enable_set_token | client.enable_set_token(False) | 否 | 是否允许手动设置 token。False(默认值):不允许True:允许,传入该值后需要在 RequestOption 中手动配置 token |
| cache | client.cache(Cache()) | 否 | 用于自定义缓存,默认使用预置的本地缓存。 |
| log_level | client.log_level(lark.LogLevel.DEBUG) | 否 | 用于设置日志级别。枚举值:lark.LogLevel.CRITICAL:严重错误日志,程序可能中断或崩溃。lark.LogLevel.ERROR:错误日志,程序部分功能无法运行。lark.LogLevel.WARNING(默认值):潜在问题或警告,一般不阻塞程序运行。lark.LogLevel.INFO:程序运行日志,一般用于确认程序是否按预期工作。lark.LogLevel.DEBUG:调试日志,一般用于调试时诊断问题。 |
import lark_oapi as lark
client = lark.Client.builder() \
.app_id("APP_ID") \
.app_secret("APP_SECRET") \
.build()app_type(lark.AppType.ISV) 方法指定 AppType 为商店应用。import lark_oapi as lark
client = lark.Client.builder() \
.app_id("APP_ID") \
.app_secret("APP_SECRET") \
.app_type(lark.AppType.ISV) \
.build()
# 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))https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id,根据 /open-apis后的 Path 引入相匹配的包。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)

| 配 置选项 | 描述 |
|---|---|
| tenant_key | 租户 key,商店应用必须设置该选项。 |
| user_access_token | 用户身份 Token,创建 Client 时 enable_set_token 如果设置为 True,则需要根据接口实际所需选择传入该值。获取方式:获取 user_access_token |
| tenant_access_token | 应用身份 Token,创建 Client 时 enable_set_token 如果设置为 True,则需要根据接口实际所需选择传入该值。获取方式:商店应用获取 tenant_access_token自建应用获取 tenant_access_token |
| app_access_token | 应用身份短期令牌,创建 Client 时 enable_set_token 如果设置为 True,则需要根据接口实际所需选择传入该值。获取方式:商店应用获取 app_access_token自建应用获取 app_access_token |
| headers | 自定义请求头,Key:Value 形式。这些请求头会被透传到飞书开放平台服务端。 |
import lark_oapi as lark
from lark_oapi.api.contact.v3 import *
# 创建client
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()\
.user_access_token("u-dqBLyo0Mp7Ar7j2x1d.Qi71gjoR0kgTxUy00050E2zTz")\
.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))python {.py 项目文件} 命令运行。



import lark_oapi as lark
# 创建client
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))request: lark.BaseRequest = lark.BaseRequest.builder() 构造请求对象,配置说明如下:| 配置项 | 说明 |
|---|---|
| lark.BaseRequest.http_method(lark.HttpMethod.POST) | 设置 HTTP Method。格式为 lark.HttpMethod.XXX,例如,POST 请求取值 lark.HttpMethod.POST、GET 请求取值 lark.HttpMethod.GET。 |
| lark.BaseRequest.uri("/open-apis/contact/v3/users/batch_get_id") | 设置 HTTP URL,仅取值域名后的 Path。例如 https://open.feishu.cn/open-apis/contact/v3/users/batch_get_id 实际取值为 /open-apis/contact/v3/users/batch_get_id。如果接口有路径参数(Path),则需要拼接在 HTTP URL 内。 |
| lark.BaseRequest.token_types({lark.AccessTokenType.TENANT} | 设置所用的身份 token。枚举值:lark.AccessTokenType.TENANT:使用 tenant_access_tokenlark.AccessTokenType.USER:使用 user_access_tokenlark.AccessTokenType.APP:使用 app_access_token |
| lark.BaseRequest.queries([("user_id_type", "open_id")]) | 如果接口有查询参数(Query),则需要通过该配置项传入。 |
| lark.BaseRequest.body({"emails": ["xxxx@example.com"], "mobiles": ["1500000xxxx"]}) | 接口请求体(Body)通过该配置项传入。 |

a 前缀,即可变成 async/await 模式的异步方法。示例代码如下:import lark_oapi as lark
from lark_oapi.api.im.v1 import *
# 同步调用版本的「发送消息」
def main():
# 创建client
client = lark.Client.builder() \
.app_id(lark.APP_ID) \
.app_secret(lark.APP_SECRET) \
.log_level(lark.LogLevel.DEBUG) \
.build()
# 构造请求对象
request: CreateMessageRequest = CreateMessageRequest.builder() \
.receive_id_type("open_id") \
.request_body(CreateMessageRequestBody.builder()
.receive_id("ou_7d8a6e6df7621556ce0d21922b676706ccs")
.msg_type("text")
.content("")
.uuid("a0d69e20-1dd1-458b-k525-dfeca4015204")
.build()) \
.build()
# 发起请求
response: CreateMessageResponse = client.im.v1.message.create(request)
# 处理失败返回
if not response.success():
lark.logger.error(
f"client.im.v1.message.create failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")
return
# 处理业务结果
lark.logger.info(lark.JSON.marshal(response.data, indent=4))
# 异步方式版本的「发送消息」
async def amain():
# 创建client
client = lark.Client.builder() \
.app_id(lark.APP_ID) \
.app_secret(lark.APP_SECRET) \
.log_level(lark.LogLevel.DEBUG) \
.build()
# 构造请求对象
request: CreateMessageRequest = CreateMessageRequest.builder() \
.receive_id_type("open_id") \
.request_body(CreateMessageRequestBody.builder()
.receive_id("ou_7d8a6e6df7621556ce0d21922b676706ccs")
.msg_type("text")
.content("")
.uuid("a0d69e20-1dd1-458b-k525-dfeca4015204")
.build()) \
.build()
# 发起请求
response: CreateMessageResponse = await client.im.v1.message.acreate(request)
# 处理失败返回
if not response.success():
lark.logger.error(
f"client.im.v1.message.acreate failed, code: {response.code}, msg: {response.msg}, log_id: {response.get_log_id()}")
return
# 处理业务结果
lark.logger.info(lark.JSON.marshal(response.data, indent=4))
if __name__ == "__main__":
asyncio.run(amain()) # 异步方式
# main()