跳转到主要内容
如果你需要开发机器人接收消息,你可以依据本文档操作步骤完成机器人接收消息服务端的开发。

背景信息

机器人接收消息的模式可以分为 Stream模式 和 HTTP 模式。下面将针对两种模式介绍机器人如何接收消息。

前提条件

  1. 需要完成创建应用流程。
  2. 需要完成添加应用能力流程

操作步骤

Stream 模式(推荐)

更多语言请参考服务端Stream模式。
  1. Java 开发环境准备:
  • 运行环境:JDK 1.8 及以上
  • 安装 Java SDK: 添加依赖项到工程的pom.xml文件或下载对应的 jar 包,最新的 SDK 版本可以在这里查看和下载。
    <dependency>
      <groupId>com.dingtalk.open</groupId>
      <artifactId>app-stream-client</artifactId>
      <version>{sdk-version}</version>
    </dependency>
    
  1. 服务端接入示例:
    public class BotExample {
    
      public static void main(String[] args) {
        OpenDingTalkClient client = OpenDingTalkStreamClientBuilder
                    .custom()
                    .credential(new AuthClientCredential("${ClientId}", "${ClientSecret}"))
                    .registerCallbackListener("${topic}", new RobotMsgCallbackConsumer())
                    .build();
         client.start();
      }
    
      public static class RobotMsgCallbackConsumer implements OpenDingTalkCallbackListener<JSONObject, JSONObject> {
    
        /*
         * @param request
         * @return
         */
        @Override
        public JSONObject execute(JSONObject request) {
            System.out.println(JSON.toJSONString(request));
            try {
                JSONObject text = request.getJSONObject("text");
                if (text != null) {
                    //机器人接收消息内容
                    String msg = text.getString("content").trim();
                    String openConversationId = request.getString("conversationId");
                }
            } catch (Exception e) {
                log.error("receive group message by robot error:" +e.getMessage(), e);
            }
            return new JSONObject();
        }
      } 
    }
    
    参数名称说明
    ClientId企业内部应用的应用凭证ClientId。
    ClientSecret企业内部应用的应用凭证ClientSecret。
    topic机器人回调名称,固定值:/v1.0/im/bot/messages/get
  2. 开发完成后,你需要添加机器人入群,当你@机器人发送“你好”,服务端接收消息格式如下:
    {
      "conversationId": "cidjMOsz******AhS4Jg==",
      "atUsers": [
        {
          "dingtalkId": "$:LWCP_v1:$v*********f1+2ow21Zzg"
        }
      ],
      "chatbotCorpId": "ding9f50*****6741",
      "chatbotUserId": "$:LWCP_v1:$v*********1+2ow21Zzg",
      "msgId": "msg2*****p+w==",
      "senderNick": "小钉",
      "isAdmin": true,
      "senderStaffId": "452523285939877041",
      "sessionWebhookExpiredTime": 1695204671648,
      "createAt": 1695199269062,
      "senderCorpId": "ding9f50*****6741",
      "conversationType": "2",
      "senderId": "$:LWCP_v1:$C*********pnNGsP0HS+",
      "conversationTitle": "统一应用模型-测试群",
      "isInAtList": true,
      "sessionWebhook": "https://oapi.dingtalk.io/robot/sendBySession?session=c610ee93e4d96899d9236bd4bea185dd",
      "text": {
        "content": " 你好"
      },
      "robotCode": "ding1f*******dabddc",
      "msgtype": "text"
    }
    
    参数名称说明
    conversationId会话 ID。
    atUsers被@人的信息: - dingtalkId:加密的发送者 ID。
    chatbotCorpId机器人所在的企业 corpId。
    chatbotUserId加密的机器人 ID,暂无使用场景,可忽略。
    msgId加密的消息 ID,暂无使用场景,可忽略。
    senderNick发送者昵称。
    isAdmin是否为管理员。
    senderStaffId企业内部群中@该机器人的用户 ID。
    sessionWebhookExpiredTime当前会话的 Webhook 地址过期时间。
    createAt消息的时间戳,单位毫秒。
    senderCorpId企业内部群有的发送者当前群的企业 corpId。
    conversationType会话类型: - 1:单聊 - 2:群聊
    senderId加密的发送者 ID。 说明 使用 senderStaffId,为发送者 userId 值。
    conversationTitle群聊时才有的会话标题。
    isInAtList是否在@列表中。
    sessionWebhook当前会话的 Webhook 地址。
    text文本消息: - content:文本内容
    robotCode机器人编码。
    msgtype消息类型。

HTTP 模式

  1. Java 开发环境准备:
    • 运行环境:JDK 1.7 及以上
  2. 服务端接入示例:
    @RestController
    public class RobotsController {
      	// 下方 value = "/robots", 决定下方设置机器人消息接收地址,例如:https://example.com/robots
        @RequestMapping(value = "/robots", method = RequestMethod.POST)
        public String helloRobots(@RequestBody(required = false) JSONObject json) {
            System.out.println(json);
          	//机器人接收消息内容
            String content = json.getJSONObject("text").get("content").toString().replaceAll(" ", "");
    
            return null;
        }
    }
    
  3. 开发完成后,你需要添加机器人入群,当你@机器人发送“你好”,服务端接收消息格式如下:
    {
      "conversationId": "cidjMOsz******AhS4Jg==",
      "atUsers": [
        {
          "dingtalkId": "$:LWCP_v1:$v*********f1+2ow21Zzg",
          "staffId": "452523285939877041"
        }
      ],
      "chatbotCorpId": "ding9f50*****6741",
      "chatbotUserId": "$:LWCP_v1:$v*********1+2ow21Zzg",
      "msgId": "msg2*****p+w==",
      "senderNick": "小钉",
      "isAdmin": true,
      "senderStaffId": "452523285939877041",
      "sessionWebhookExpiredTime": 1695204671648,
      "createAt": 1695199269062,
      "senderCorpId": "ding9f50*****6741",
      "conversationType": "2",
      "senderId": "$:LWCP_v1:$C*********pnNGsP0HS+",
      "conversationTitle": "统一应用模型-测试群",
      "isInAtList": true,
      "sessionWebhook": "https://oapi.dingtalk.io/robot/sendBySession?session=c610ee93e4d96899d9236bd4bea185dd",
      "content": " 你好"
      "msgtype": "text"
    }
    
    参数名称说明
    conversationId会话 ID。
    atUsers被@人的信息: - dingtalkId:加密的发送者 ID。 - staffId:当前企业内部群中员工 userId 值。
    chatbotCorpId机器人所在的企业 corpId。
    chatbotUserId加密的机器人 ID,暂无使用场景,可忽略。
    msgId加密的消息 ID,暂无使用场景,可忽略。
    senderNick发送者昵称。
    isAdmin是否为管理员。
    senderStaffId企业内部群中@该机器人的用户 ID。
    sessionWebhookExpiredTime当前会话的 Webhook 地址过期时间。
    createAt消息的时间戳,单位毫秒。
    senderCorpId企业内部群有的发送者当前群的企业 corpId。
    conversationType会话类型: - 1:单聊 - 2:群聊
    senderId加密的发送者 ID。 说明 使用 senderStaffId,为发送者 userId 值。
    conversationTitle群聊时才有的会话标题。
    isInAtList是否在@列表中。
    sessionWebhook当前会话的 Webhook 地址。
    content消息文本。
    msgtype消息类型。

后续步骤

机器人接收消息开发完成后,你可以针对接收的消息进行回复或发送消息,可继续以下操作: