---
title: 发送直接消息 API
slug: world-sdk-guide-ch/api
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

您可以使用发送直接消息（DM）API向ZEPETO世界中的其他用户发送直接消息。

在已启动的世界中使用直接消息（DM）发送API时，消息底部会自动提供一个进入世界的链接，非常适合推广该世界。

使用时请务必遵循注意事项。



## 安装

窗口 → 包管理器 → ZEPETO.World包，请先安装版本1.21.14或更高版本。

之后，请安装版本为1.0.7或更高的‘ZEPETO.Module’包。

确保ZEPETO应用程序运行版本3.46.000或更高。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-T9TuAabUuLAT0LuugnJ06-20240904-102426.png)



## 发送直接消息API

- 要使用发送DM API，请添加以下导入语句。

```typescript
import { SocialService } from 'ZEPETO.Module.Social';
```



### 发送DM核心功能

- 声明
  - public static OpenPopupDirectMessage($sendMessage: string, $userIds?: string\[], $onComplete?: System.Action$1)\:void;
- 参数

| **参数**      | **描述**                                                                                                                             |
| ----------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| sendMessage | 这是一个必需的参数。这是您要发送的消息的主体。如果它是空白或空的，传输将被视为失败。                                                                                         |
| userIds     | 这是一个可选参数。<br /><br />如果您传递 userIds<br />- 选择 UI 将配置相应的用户 ID 列表。<br /><br />当未传递 userIds 或传递空列表时<br />- 选择 UI 将构建为发送消息的用户的关注/被关注列表。 |
| onComplete  | 这是一个回调，当消息发送完成或失败时调用。                                                                                                              |

### 直接消息弹出状态

| **响应** | **描述**            |
| ------ | ----------------- |
| 取消     | 当弹出窗口被手动关闭或发送失败时。 |
| 发送完成   | 当发送请求完成并关闭时。      |



### 按错误代码的情况

| **响应** | **描述**                                                             |
| ------ | ------------------------------------------------------------------ |
| 31002  | 如果在 userIds 参数中输入的用户 ID 列表中包含至少一个不正确的 UserID（不存在的 UserID），则会发生此情况。 |
| 37011  | 当您尝试在访客帐户下发送消息时，会发生此情况。                                            |
| 8001   | 当您不断重复发送相同的消息时，会发生此情况。每 10 秒可以发送一次。                                |
| 2001   | 当“发送”字段中的消息内容为空、仅包含空格或超过 1000 个字符时，会发生此情况。                         |
| 0      | 网络连接错误情况，例如网络断开、连接不稳定和其他一般错误情况。                                    |
| -1     | 无法识别的错误。                                                           |



## 使用示例

### 直接输入发送者并发送

1\) 请将发送 DM 按钮添加到画布中。

2\) 请按照以下示例代码编写。

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { SocialService, DirectMessagePopupState } from 'ZEPETO.Module.Social';
import { Button } from "UnityEngine.UI";
import { WorldService } from 'ZEPETO.World';
 
export default class SendDirectMessage extends ZepetoScriptBehaviour {
 
    // 存储直接消息的变量
    public message: string;
 
    // 要发送直接消息的用户 ID 数组
    public userIds: string[];
 
    // 对按钮 UI 组件的引用
    public sendDMButton: Button;
 
    Start() {
 
        this.sendDMButton.onClick.AddListener(() => {
 
            // 检查我的 ID 是否包含在 userIds 数组中，如果包含则返回
            if (this.userIds.includes(WorldService.userId)) {
                console.log("userIds 包含我的 userId");
                return;
            }
 
            // 使用 SocialService 打开发送直接消息的弹出窗口
            SocialService.OpenPopupDirectMessage(this.message, this.userIds, (popupState: DirectMessagePopupState) => {
 
                // 检查直接消息弹出窗口的状态
                if (popupState === DirectMessagePopupState.Cancel) {
                    console.log("您关闭了弹出窗口或未能发送消息");
                } else if (popupState === DirectMessagePopupState.SendComplete) {
                    console.log("DM 消息已成功发送，弹出窗口已关闭。");
                }
            });
        });
    }
}
```



3\) 编写脚本后，返回 Unity 编辑器并将按钮拖到检查器中进行设置。输入消息正文和目标用户的 UserID。

- 最多显示20人，因此请最多输入20人。

4\) 当您按下发送DM按钮时，好友列表UI会出现。

- 选择目标用户并点击发送。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-ltxU4LpgiD3Cb_S8P-B5n-20240904-102426.png)



5\) 如果发送DM成功，将出现一个Toast UI，指示成功，并且示例脚本将输出日志。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-3H38WwOdHHfnlwKLPpCOr-20240904-102426.jpg)



6\) 此外，目标用户已收到DM。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-9LGy617GHDh0OR11wIcs9-20240904-102426.png "在预发布世界中进行测试时，仅发送消息。")



![](https://archbee-doc-uploads.s3.amazonaws.com/BtCo2cIFh9h5Mo0EP64o_-oRNWP8wKpywlhoCB6O0Y7-20240909-101729.PNG "在已发布的世界中使用DM发送API时，世界链接也会被发送。")



- 如果发生错误，例如连续发送消息或消息内容为空，DM传输将被视为失败。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-P34IPXnC-SFmAdr8ttnBa-20240904-102426.jpg)



### 使用以下/关注者列表 UI 发送

1\) 请在画布上添加一个按钮。

2\) 请按照以下示例代码编写。

- 如果您将空列表传递给 targetUserID 参数，将会出现以下/关注者列表 UI。

```typescript
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
import { SocialService, DirectMessagePopupState } from 'ZEPETO.Module.Social';
import { Button } from "UnityEngine.UI";
 
export default class SendDirectMessage extends ZepetoScriptBehaviour {
 
    // 存储直接消息的变量
    public message: string;
 
    // 引用按钮 UI 组件
    public sendDMButton: Button;
 
    // 私有变量，用于存储用户 ID 数组，初始化为 null
    private emptyIds: string[];
 
 
    Start() {
 
        this.sendDMButton.onClick.AddListener(() => {
 
            // 打开一个弹出窗口以使用 SocialService 发送直接消息
            // 使用类的消息内容和一个空的用户 ID 数组
            SocialService.OpenPopupDirectMessage(this.message, this.emptyIds, (popupState: DirectMessagePopupState) => {
 
                // 检查返回的直接消息弹出窗口状态
                if (popupState === DirectMessagePopupState.Cancel) {
                    console.log("您关闭了弹出窗口或未能发送消息");
                } else if (popupState === DirectMessagePopupState.SendComplete) {
                    console.log("直接消息发送成功，弹出窗口已关闭。");
                }
            });
        });
    }
}
```



3\) 编写脚本后，返回Unity编辑器并在检查器中拖动按钮进行设置。然后请输入消息的主体。

4\) 当你按下发送DM按钮时，出现关注/粉丝界面。

- 选择目标用户并点击发送。（最多可以选择5人）

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-XbkJOIi0aM9bSFITPZT8g-20240904-102426.png)



:::hint{type="danger"}
- 您一次最多可以向5人发送DM。
- 您不能向自己发送DM。
- 实际关注/粉丝用户的数量可能与发送DM弹出窗口中显示的用户数量不同。
  - 这是因为可以选择的用户经过筛选并显示。
- 如果您选择了一个已阻止接收DM的用户，将视为失败，DM将不会发送。
- 如果您频繁调用发送DM的API，将受到限制，传输将失败。
  - 您每10秒可以发送一次。请注意不要发送无差别的DM。
- 如果您发送的消息包含URL，将无法正常工作，因此禁止发送包含URL的消息。
- 如果发送的消息为空或空白，将视为失败。请务必写下消息的内容。
:::

