# @zhengxs/dingtalk-sdk-js

[![Typescript](https://img.shields.io/badge/lang-typescript-informational?style=flat-square)](https://www.typescriptlang.org)[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)[![npm package](https://img.shields.io/npm/v/@zhengxs/dingtalk-sdk-js.svg?style=flat-square)](https://www.npmjs.com/package/@zhengxs/dingtalk-sdk-js)[![npm downloads](https://img.shields.io/npm/dt/@zhengxs/dingtalk-sdk-js.svg?style=flat-square)](https://www.npmjs.com/package/@zhengxs/dingtalk-sdk-js)![License](https://img.shields.io/npm/l/@zhengxs/dingtalk-sdk-js.svg?style=flat-square)

当前状态：Alpha

> 非官方 JS-SDK，请勿在生产中使用。

## 文档

- 获取访问凭证
  - [获取企业内部应用的身份凭证](#获取企业内部应用的身份凭证)
- 机器人开发
  - [企业机器人开发](#企业机器人开发)
  - [自定义机器人开发](#自定义机器人开发)
- 互动卡片
  - [发送互动卡片](#发送互动卡片)

## 安装

```sh
# With NPM
$ npm i -S @zhengxs/dingtalk-sdk-js

# With Yarn
$ yarn add @zhengxs/dingtalk-sdk-js

# With PNPM
$ pnpm add @zhengxs/dingtalk-sdk-js
```

## 使用

## 企业机器人开发

```ts
import { DingtalkClient, StreamClient } from '@zhengxs/dingtalk-sdk-js';

const client = new DingtalkClient({
  clientId: 'My Client ID',
  clientSecret: 'My Client Secret',
});

// 订阅消息
const connection = new StreamClient(client);

// 监听机器人消息
connection.onImMessage(function (message) {
  console.log('接收到的消息', message.data);

  // 回复消息给当前发送者
  message.reply('hello,world');
});

connection.connect();
```

**链接**

- [企业内部开发机器人](https://open.dingtalk.com/document/isvapp/send-messages-based-on-enterprise-robot-callback)
- [服务端 Stream 模式](https://open.dingtalk.com/document/resourcedownload/introduction-to-stream-mode)

### 自定义机器人开发

如果传递 `secret` 参数，会自动对 URL 进行签名

```ts
import { CustomizeWebhook } from '@zhengxs/dingtalk-sdk-js';

const webhook = new CustomizeWebhook({
  token: 'webhook token',
  secret: 'webhook secret',
});

webhook.say('hello,world');
```

详见 [自定义机器人接入](https://open.dingtalk.com/document/isvapp/custom-bot-access-send-message)

### 获取企业内部应用的身份凭证

如果凭证过期，内部会自动获取最新的可用凭证，无需外部处理。

```ts
import { SessionCredentials } from '@zhengxs/dingtalk-sdk-js';

const session = new SessionCredentials({
  clientId: 'My Client ID',
  clientSecret: 'My Client Secret',
});

async function main() {
  const token = await session.getAccessToken();

  console.log(token);
}

main();
```

详见 [获取企业内部应用的身份凭证](https://open.dingtalk.com/document/orgapp/obtain-the-access_token-of-an-internal-app)

### 发送互动卡片

```ts
import { DingtalkClient, StreamClient } from '@zhengxs/dingtalk-sdk-js';

const client = new DingtalkClient({
  clientId: process.env.DINGTALK_CLIENT_ID,
  clientSecret: process.env.DINGTALK_CLIENT_SECRET,
});

const connection = new StreamClient(client);

connection.onImMessage(async message => {
  // 发送互动卡片
  const data = await client.card.instances.send({
    outTrackId: 'Your out trackId',
    cardTemplateId: 'Your card templateId',
    openConversationId: message.conversationId,
    receiverUserIdList: [message.talker.staffId],
    conversationType: message.conversationType === '2' ? 1 : 0, // 互动卡片和消息卡片的聊天类型值不一致
    chatBotId: message.robot.id, // 根据做了判断，如果是私聊，会直接删除机器人ID
    robotCode: message.robot.code, // 根据做了判断，如果是私聊，会直接删除机器人编码
    cardData: {
      cardParamMap: {},
    },
    // 其他参数...
  });

  console.log(data);
});

connection.connect();
```

## 参考

- [钉钉官方: dingtalk-stream-sdk-nodejs](https://github.com/open-dingtalk/dingtalk-stream-sdk-nodejs)

## License

MIT
