一、前言
废话不多的实现简单的钉钉机器人。我们分为下面几个步骤来逐步讲解。
1.钉钉机器人的类型
2.如何打造一个最最简单的钉钉机器人
二、钉钉机器人的类型
常用的钉钉机器人有两种,
1、通知类型的机器人:适合在群内进行一些通知,推荐消息等内容。
2、可以回复消息的机器人:能够回复@机器人的消息,机器人会将响应内容发送到群里。
本次,我们分别讲解两种机器人是如何实现的
三、打造一个最简单的通知类型钉钉机器人
首先用通知类型的机器人为例子。1. 打开一个你想创建机器人的钉钉群。2.在右边栏选择更多选项,点击群助手的打开:
然后选择添加机器人
选择自定义机器人
然后需要注意!在这个配置页面中。
安全设置我们选择【自定义关键词】
只要每次发送的消息带有该自定义关键词,消息就能成功发送。接下来选择同意并完成。
拷贝标记出来的完整链接【Webhook】,然后选择完成
钉钉机器人的配置就完成了。
3.第三步开始开始写代码:
直接上发起的示例代码:
apiurl 就是获取的完整链接【Webhook】
jsonString是发起的请求内容,json格式示例如下:
{
"msgtype": "text", //钉钉的发送样式
"text": {
"content": "我就是我, 是不一样的烟火@156xxxx8827" //发送到群中的内容
},
"at": { //需要消息@对应人的手机号
"atMobiles": [
"156xxxx8827",
"189xxxx8325"
],
"isAtAll": false //如果需要@所有人 这个值设置为true
}
}
下面就是发送代码:
/// <summary>
/// 以Post方式发送请求
/// </summary>
/// <param name="apiurl">请求的URL</param>
/// <param name="jsonString">请求的json参数</param>
/// <param name="headers">请求头的key-value字典</param>
public static string PostDingDing(string jsonString, string apiurl = null, Dictionary<String, String> headers = null)
{
if (apiurl == null)
{
apiurl = AppSettings.WebHook;//机器人的webhook
}
WebRequest request = WebRequest.Create(@apiurl);
request.Method = "POST";
request.ContentType = "application/json";
if (headers != null)
{
foreach (var keyValue in headers)
{
if (keyValue.Key == "Content-Type")
{
request.ContentType = keyValue.Value;
continue;
}
request.Headers.Add(keyValue.Key, keyValue.Value);
}
}
if (String.IsNullOrEmpty(jsonString))
{
request.ContentLength = 0;
}
else
{
byte[] bs = Encoding.UTF8.GetBytes(jsonString);
request.ContentLength = bs.Length;
Stream newStream = request.GetRequestStream();
newStream.Write(bs, 0, bs.Length);
newStream.Close();
}
WebResponse response = request.GetResponse();
Stream stream = response.GetResponseStream();
Encoding encode = Encoding.UTF8;
StreamReader reader = new StreamReader(stream, encode);
string resultJson = reader.ReadToEnd();
return resultJson;
}
好了,我们的钉钉机器人消息就发起成功了,如下图:
四、打造一个最简单的自动回复机器人
自动回复消息的机器人,能够回复@机器人的消息,机器人会将响应内容发送到群里。
该功能能够直接在钉钉中就实现简单的数据查询与交互。
接下来我们实现一个简单的自动回复机器人的例子。1. 首先需要登陆钉钉开发者后台,创建一个机器人。
登录钉钉开发者后台,
选择应用开发-企业内部开发-机器人,点击创建机器人。
2.选择创建机器人:
选择应用类型是机器人,想一个机器人的名称等等,然后直接点击【确定创建】,机器人就创建好了。
3.机器人简易配置:
参数 | 描述 |
服务器出口IP | 填写本企业服务器的公网IP |
消息接收地址 | 填写一个公网可访问的本企业HTTPS服务地址,用于接收POST过来的消息 |
只用配置如上两个参数。一个简单的机器人配置就完成了。
4.后端代码配置:
机器人配好了,但是目前还是调试模式,正式上线前,可以在测试群进行调试。
在测试群中,新增一个刚刚建好的机器人,保存好Webhook
5.接下来是代码了:
首先构建一个接收类
public class dingRotBotDto
{
public string msgtype { get; set; }
public dingText text { get; set; }
public string msgId { get; set; }
public string createAt { get; set; }
public string conversationType { get; set; }
public string conversationId { get; set; }
public string conversationTitle { get; set; }
public string senderId { get; set; }
public string senderNick { get; set; }
public string senderCorpId { get; set; }
public string senderStaffId { get; set; }
public string chatbotUserId { get; set; }
public List<dingUser> atUsers { get; set; }
}
public class dingText
{
public string content { get; set; }
}
public class dingUser
{
public string dingtalkId { get; set; }
public string staffId { get; set; }
}
参数 | 是否必填 | 类型 | 描述 |
msgtype | 是 | String | 目前只支持text |
content | 是 | String | 消息文本 |
msgId | 是 | String | 加密的消息ID |
createAt | 是 | String | 消息的时间戳,单位ms |
conversationType | 是 | String | 1-单聊、2-群聊 |
conversationId | 是 | String | 加密的会话ID |
conversationTitle | 否 | String | 会话标题(群聊时才有) |
senderId | 是 | String | 加密的发送者ID |
senderNick | 是 | String | 发送者昵称 |
senderCorpId | 否 | String | 发送者当前群的企业corpId(企业内部群有) |
senderStaffId | 否 | String | 发送者在企业内的userid(企业内部群有) |
chatbotUserId | 是 | String | 加密的机器人ID |
atUsers | 否 | Array | 被@人的信息dingtalkId: 加密的发送者IDstaffId: 发送者在企业内的userid(企业内部群有) |
然后构建一个返回消息类:
public class DingDingMessage
{
public DingDingMessage()
{
this.at = new At();
this.text = new Text();
this.markdown = new MarkDown();
}
public string msgtype { set; get; }//消息类型
public Text text { set; get; }//text类型
public MarkDown markdown { set; get; }//markdown类型
public At at { set; get; }//@
}
参数 | 是否必填 | 类型 | 描述 |
msgtype | 是 | String | text |
content | 是 | String | 消息文本 |
atMobiles | 否 | Array | 被@人的手机号 |
isAtAll | 否 | Boolean | @所有人是true,否则为false |
现在开始写一个接收钉钉机器人消息的方法:
[HttpPost("GetDingRoBot")]
public async Task<IActionResult> GetDingRoBot([FromBody] dingRotBotDto input)
{
var phone=await _fuluDing.GetUserPhone(input.senderStaffId);//获取发送人的电话,回复消息的时候可以@对应的发送人。
if (input.text.content.Contains("[XXXX]"))///input.text.content就是接受到的消息, 可以通过改字段进行消息过滤
{
var s = input.text.content.Split(']')[1];
var text=await todo...;//调用自己的方法,返回需要回复的消息
SendMessage(text, phone); //发送回复的消息
}
else
{
await SendMessage("请输入正确的命令:[流水上账查询]XXXX", phone);
}
return Ok(ResponseResult.Execute("0", null, $"发送成功"));
}
public SendMessage(string text,string atMobiles)//发送消息
{
DingDingMessage message = new DingDingMessage();
message.msgtype = "text";
message.text.content = text;
message.at.atMobiles.Add(atMobiles);
String data = JsonConvert.SerializeObject(message);//Json将对象序列化
var json = await _client.PostAsync("xxxxx", new StringContent(data, Encoding.UTF8, "application/json"));//post 发起一个请求到 配置该机器人群的 Webhook 地址xxxxx
}
这样 ,一个可以回复消息的机器人就配置好了。我们可以试一试。
6.上线:
好了,当我们一切弄好就可以正式上线了
只要我们点击管理页面的上线。机器人就正式上线了。文章的最后,顺带分享下几个踩坑问题
1.发起的消息中一定要带上【自定义关键词】的内容,不然发起不成功。
2.钉钉机器人发送消息有限制,1min最多20条,超过的无法发送,钉钉会进行限流一段时间。
福禄ICH·ERP项目部 福小智