明确需求
在正式开发之前,你可以提前了解,本文档将帮助你使用自定义机器人 Webhook 对应的 自定义机器人发送群消息接口发送群聊消息。它将以加签的方式来演示自定义机器人的使用。为了帮助你快速上手,您可以尝试运行“快速体验”提供的示例 demo。这将帮助你对自定义机器人的使用有一个直观的体验。前提条件
-
完成创建自定义机器人流程。
自定义机器人的安全设置选择加签的方式,详情参考自定义机器人安全设置。
- 完成获取自定义机器人 Webhook 地址流程。
-
开发环境准备:
开发环境 说明 Java - 已安装 JDK 1.8 及以上 - 已安装 Maven 3 Python - Python 3
快速体验
- 你可以下载示例 demo:
-
启动示例 demo:
类型 说明 Java 1. 修改 customRobotGroupMessage.java 的 main 方法参数: - CUSTOM_ROBOT_TOKEN:机器人应用的 access_token 的值,详情参考获取自定义机器人 Webhook 地址。 说明 仅需填写 Webhook 地址后access_token的值。不是整个webhook地址。 image - SECRET:安全设置,加签密钥。详情参考自定义机器人安全设置。 - (可选)USER_ID:用户的 userId 信息,详情参考用户 UserId。 内部群:可以填写用户的 UserId 实现 @ 能力。 外部群:机器人调用 OpenAPI 发送消息时,无法实现 @ 能力。 2. 启动 main 方法。 3. 此时,你可以在群内看到自定义机器人发送的消息了。 image.png Python 1. 在当前文件的目录下,输入启动命令: python3 send_custom_robot_group_message.py --access_token="your custom robot token" --secret="your custom robot secret" --userid="you need @ group user's userid"。 注意替换机器人 webhook 的 access_token、机器人的加签 secret 和用户 userid,参数如何获取请参考 Java 中的说明。 2. 此时,你可以在群内看到自定义机器人发送的消息了。
操作步骤
下方为 Java 示例,Python 示例请下载上方体验 demo。
-
添加依赖项到工程的
pom.xml文件。<dependencies> <dependency> <groupId>com.aliyun</groupId> <artifactId>alibaba-dingtalk-service-sdk</artifactId> <version>2.0.0</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.11</version> </dependency> </dependencies> -
创建 main 方法,并启动。
此时,你可以在群内看到自定义机器人发送的消息了。
import com.dingtalk.api.DefaultDingTalkClient; import com.dingtalk.api.DingTalkClient; import com.dingtalk.api.request.OapiRobotSendRequest; import com.dingtalk.api.response.OapiRobotSendResponse; import com.taobao.api.ApiException; import org.apache.commons.codec.binary.Base64; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Arrays; public class customRobotGroupMessage { public static final String CUSTOM_ROBOT_TOKEN = "<your custom robot token>"; public static final String USER_ID= "<you need @ group user's userId>"; public static final String SECRET = "<your custom robot SECRET>"; public static void main(String[] args) { try { Long timestamp = System.currentTimeMillis(); System.out.println(timestamp); String secret = SECRET; String stringToSign = timestamp + "\n" + secret; Mac mac = Mac.getInstance("HmacSHA256"); mac.init(new SecretKeySpec(secret.getBytes("UTF-8"), "HmacSHA256")); byte[] signData = mac.doFinal(stringToSign.getBytes("UTF-8")); String sign = URLEncoder.encode(new String(Base64.encodeBase64(signData)),"UTF-8"); System.out.println(sign); //sign字段和timestamp字段必须拼接到请求URL上,否则会出现 310000 的错误信息 DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.io/robot/send?sign="+sign+"×tamp="+timestamp); OapiRobotSendRequest req = new OapiRobotSendRequest(); /** * 发送文本消息 */ //定义文本内容 OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text(); text.setContent("钉钉,让进步发生"); //定义 @ 对象 OapiRobotSendRequest.At at = new OapiRobotSendRequest.At(); at.setAtUserIds(Arrays.asList(USER_ID)); //设置消息类型 req.setMsgtype("text"); req.setText(text); req.setAt(at); OapiRobotSendResponse rsp = client.execute(req, CUSTOM_ROBOT_TOKEN); System.out.println(rsp.getBody()); } catch (ApiException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } catch (InvalidKeyException e) { throw new RuntimeException(e); } } }
常见问题
调用频率限制
由于消息发送太频繁会严重影响群的使用体验,因此自定义机器人发送消息的频率限制如下:每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。
如果你有大量发消息的场景(譬如系统监控报警)可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里。