import * as lark from '@larksuiteoapi/node-sdk';
const client = new lark.Client({
appId: 'app id',
appSecret: 'app secret'
});appType: lark.AppType.ISV 标识当前的应用为商店应用。import * as lark from '@larksuiteoapi/node-sdk';
const client = new lark.Client({
appId: 'app id',
appSecret: 'app secret',
appType: lark.AppType.ISV,
});| 参数 | 类型 | 是否必填 | 描述 |
|---|---|---|---|
| appId | string | 是 | 应用的 App ID。获取方式:登录开发者后台,在应用详情页的 凭证与基础信息 页面内,获取应用凭证(包括 App ID 和 App Secret)。 |
| appSecret | string | 是 | 应用的 App Secret。 |
| domain | Domain | string | 否 | 应用域名。一般用于指定飞书域名:飞书:https://open.feishu.cnLark:https://open.larksuite.com如需配置其它域名,则需确保传递完整的域名。**默认值**:Domain.Feishu,该默认值表示使用飞书域名,如果是 Lark 需要设置为 Domain.Lark。 |
| httpInstance | HttpInstance | 否 | SDK 发送请求的 HTTP 实例。SDK 内部默认使用 axios.create() 构造出一个 defaultHttpInstance 进行 HTTP 调用。可以从 SDK 中 import defaultHttpInstance,在其中添加 interceptors 完成业务需求。例如,SDK 默认过滤了响应结果中的 data,如需获取 logid 等数据,可以重置 interceptors。示例代码如下:import { defaultHttpInstance } from '@larksuiteoapi/node-sdk';defaultHttpInstance.interceptors.response.use((resp) => { // 这里可以做一些业务逻辑处理 // 记得返回resp.data return resp.data;})默认值:defaultHttpInstance |
| loggerLevel | LoggerLevel | 否 | 日志级别。枚举值:error:记录错误事件,这些事件阻止了部分程序的执行。warn:记录一些异常问题,但这些异常可能不影响程序继续运行。info:记录运行过程中关键的、需要被监控的信息。debug:记录调试信息,用于在调试时诊断问题。trace:记录详细信息,可用于开发或调试时跟踪程序运行过程。默认值:info |
| logger | Logger | 否 | 日志器,可根据需要自定义配置。 |
| cache | Cache | 否 | 缓存器,用于缓存数据的存储与获取,如 token。如果你没有指定缓存器,SDK 会初始化一个缓存器。如果需要和现有系统共享数据,可以自定义缓存器,实现 Cache 的接口即可。默认缓存器的实现:default-cache.ts`import get from 'lodash.get';import { Cache } from '@node-sdk/typings';export class DefaultCache implements Cache { values: Map< string |
| disableTokenCache | boolean | 否 | 是否禁用用于保存 token 的缓存。如果禁用(取值 true),则不会缓存 token,系统会在每次需要使用 token 时自动重新拉 取。默认值:false,表示不禁用 |
| appType | AppType | 否 | 应用类型。默认不传值表示企业自建应用,如果是商店应用则必须传入 AppType.ISV。AppType.ISV:商店应用AppType.SelfBuild:自建应用默认值:AppType.SelfBuild |
| helpDeskId | string | 否 | 服务台的 ID。仅在调用服务台业务的 API 时需要配置。可在服务台管理后台 设置中心 > API 凭证 处获取,详情参见服务台接入指南。注意:服务台的 ID、Token 只有服务台创建者可以查看到。![]() |
| helpDeskToken | string | 否 | 服务台的 token。仅在调用服务台业务的 API 时需要配置。可在服务台管理后台 设置中心 > API 凭证 处获取,详情参见服务台接入指南。注意:服务台的 ID、Token 只有服务台创建者可以查看到。![]() |



import * as lark from '@larksuiteoapi/node-sdk';
// 构建 API Client
const client = new lark.Client({
appId: 'app id',
appSecret: 'app secret'
});
// 通过 Client 调用「发送消息」接口
const res = await client.im.message.create({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'receive_id',
content: JSON.stringify({text: 'hello world'}),
msg_type: 'text',
},
});
appType: lark.AppType.ISV,SDK 会根据该声明执行不同的逻辑分支。商店应用的逻辑分支不同于企业自建应用,商店应用必须在代码内传入租户 Key(tenant_key)以及 app_ticket。app_ticket作为安全凭证,用于获取商店应用的 app_access_token。每隔 1 小时向商店应用配置的事件订阅请求地址自动推送一次 app_ticket。tenant_access_token 时,需要用到这两个值,但这两个值通过 SDK 无法主动获取到,必须由外部传递进来。因此对于商店应用,SDK 提供了一种方式来传递这两个值。EventDispatcher 接收并处理 app_ticket 事件。import * as http from "http";
const ISVEventDispatcher = new lark.EventDispatcher();
const server = http.createServer();
// /webhook/event 为在开放平台配置的事件接收地址的 Path
server.on('request', lark.adaptDefault('/webhook/event', ISVEventDispatcher));
server.listen(3000);EventDispatcher 内部会默认接收 app_ticket 事件,将获得的 app_ticket 写到缓存(Cache) 中。withTenantKey 方法显示传递 tenant_key 值。app_ticket,完成 tenant_access_token 的获取(并缓存),最后发起接口调用请求。import * as fs from "fs";
const res = await SDKClient.im.file.create({
data: {
file_type: "mp4",
file_name: "测试.mp4",
file: fs.readFileSync("文件路径"),
}
}, lark.withTenantKey('tenant key'));
console.log(res);await client.im.message.create({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'receive_id',
content: JSON.stringify({text: 'hello world'}),
msg_type: 'text',
},
}, {
headers: {
customizedHeaderKey: 'customizedHeaderValue'
}
});| 方法 | 描述 |
|---|---|
| withTenantKey | 设置租户 Key(tenant_key),使用商店应用调用 API 时,必须传入该值。如何获取参见 tenant_key。 |
| withTenantToken | 设置应用身份 Token(tenant_access_token)。获取方式:商店应用获取 tenant_access_token自建应用获取 tenant_access_token |
| withUserAccessToken | 设置用户身份 Token(user_access_token)。获取方式:获取 user_access_token |
| withHelpDeskCredential | 是否在请求中带入服务台 Token。仅在调用服务台业务的 API 时需要配置,Token 可在服务台管理后台 设置中心 > API 凭证 处获取,详情参见服务台接入指南。注意:服务台的 Token 只有服务台创建者可以查看到。![]() |
| withAll | 用于合并上述方法的结果。 |
// 单个方法的使用示例
await client.im.message.create({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'receive_id',
content: JSON.stringify({text: 'hello world'}),
msg_type: 'text',
},
}, lark.withTenantToken('tenant token'));
// 多个方法的使用示例,需要使用 withAll 合并方法
await client.im.message.create({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'receive_id',
content: JSON.stringify({text: 'hello world'}),
msg_type: 'text',
},
}, lark.withAll([
lark.withTenantToken('tenant token'),
lark.withTenantKey('tenant key')
]));node {.js 项目文件} 命令运行,如下图所示。

// 每次处理20条数据
for await (const items of await client.contact.user.findByDepartment({
params: {
department_id: '0',
page_size: 20,
},
})) {
console.log(items);
}
// 也可用next来手动控制迭代,每次取20条数据
const listIterator = await SDKClient.contact.user.findByDepartment({
params: {
department_id: '0',
page_size: 20,
},
});
const { value } = await listIterator[Symbol.asyncIterator]().next();
console.log(value);import * as fs from 'fs';
const resp = await client.im.file.get({
path: {
file_key: 'file key',
},
});
const readableStream = resp.getReadableStream();
const writableStream = fs.createWriteStream('file url');
readableStream.pipe(writableStream);template_id 和 template_variable 即可。client.im.message.createByCard({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'your receive_id',
template_id: 'your template_id',
template_variable: {
content: "Card Content",
title: "Card Title"
}
}
});title 和 content 的卡片为例,示例代码如下。client.im.message.create({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'your receive_id',
content: JSON.stringify({
"config": {
"wide_screen_mode": true
},
"elements": [
{
"tag": "markdown",
"content": "Card Content"
}
],
"header": {
"template": "blue",
"title": {
"content": "Card Title",
"tag": "plain_text"
}
}
}
),
msg_type: 'interactive'
}
})
import * as lark from '@larksuiteoapi/node-sdk';
client.im.message.create({
params: {
receive_id_type: 'chat_id',
},
data: {
receive_id: 'your receive_id',
content: lark.messageCard.defaultCard({
title: 'Card Title',
content: 'Card Content'
}),
msg_type: 'interactive'
}
})

import * as lark from '@larksuiteoapi/node-sdk';
const client = new lark.Client({
appId: 'app id',
appSecret: 'app secret'
});
const res = await client.request({
method: 'POST',
url: 'xxx',
data: {},
params: {},
});domain: https://www.example.com 后面不需要加 /。axios.get('/myController/myAction', {
params: {
storeIds: [1,2,3]
},
paramsSerializer: params => {
return qs.stringify(params)
}
})