由于某种不可抗因素,我被迫使用上了钉钉...

打开充满设计感(?)的界面,听到那动听(????)的音乐,我也成了1.2亿钉选之子中的一员。

打开钉钉>单击头像>机器人管理
看到没有!!熟悉的Webhook!! 不熟悉的这边=> TelegramBot初体验 - PHP
于是我就创建了个incoming机器人(指钉钉的Bot),开始折腾,尝试发送消息

目录

点击标签快速跳转

Incoming机器人发送消息

创建Incoming机器人

这个创建比TelegramBot还要简便。

打开钉钉>单击头像>机器人管理照着填写就完事了.

3b829609c6c84ef766c1de6583c4ef8e.png

12563b255a12b51e41ad8c390cf084c7.png

安全设置选用IP地址,填写自己服务器的IP。确保在token泄露情况下不被恶意利用。
保存我们的Webhook地址,将其拉入目标群组。

使用机器人

官方介绍

(1)获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请 求,即可实现给该钉钉群发送消息。注意,发起POST请求时,必须将字符集编码设置成UTF-8
(2)当前自定义机器人支持文本 text、链接 link、markdown、ActionCard、FeedCard消息类型,大家可以根据自己的使用场景选择合适的消息类型,达到最好的展示样式。
(3)自定义机器人发送消息时,可以通过手机号码指定“被@人列表”。在“被@人列表”里面的人员收到该消息时,会有@消息提醒(免打扰会话仍然通知提醒,首屏出现“有人@你”)。
(4)当前机器人尚不支持应答机制 (该机制指的是群里成员在聊天@机器人的时候,钉钉回调指定的服务地址,即Outgoing机器人,下文中有描述)。

发送测试消息

在服务器创建test.php,修改代码中token,然后通过http(s)访问这个文件。如果环境配置正确就能在群聊中看到"我就是我, 是不一样的烟火"了。
PHP程序测试:

<?php  
function request_by_curl($remote_server, $post_string) {  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $remote_server);
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
    // curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    // curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);
    $data = curl_exec($ch);
    curl_close($ch);                
    return $data;  
}  

$webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxx";
$message="我就是我, 是不一样的烟火";
$data = array ('msgtype' => 'text','text' => array ('content' => $message));
$data_string = json_encode($data);

$result = request_by_curl($webhook, $data_string);  
echo $result;
?>

小结

优势:

  1. incoming机器人操作便捷,可以通过POST,Htpp等方式控制机器人发送消息。
  2. 可以实现快捷聚合消息,发送预警信息等
    不足:
  3. 仅支持主动发送消息,无法实现用户交互
    所以需要请出我们的Outgoing机器人

Outgoing机器人-实现交互

创建Outgoing机器人

这个创建流程就比较复杂了。首先你需要创建钉钉企业并获取企业管理员身份。
PS:已经加入企业并拥有管理员身份的点我跳转
钉钉开放平台地址

  • 打开链接>登陆控制台>登陆(没有账号先完成注册)
  • 随后选择钉钉企业创建,按照要求填写企业信息
    创建企业

PS:看来钉钉早为个人用户做好了准备(滑稽)
个人

  • 创建完成,点击应用管理
    创建完成

应用管理

设置挨个填写就好了,最重要的有这两个,出口IP和消息接收地址。

设置

上一篇文章提到过Webhook是推机制,同理这里我们需要填写接收消息地址。当有用户在群聊中@你的机器人,钉钉就会把消息内容传给 接受信息地址服务器出口ip则是指定post请求来源ip,以确保回传消息的安全性。

接收消息地址: https://example.com/xxxx.php
服务器出口ip: 你的服务器ip(尽量使用IPV4,IPV6没试过)

获取token

钉钉的token种类繁多,笔者在这就浪费了不少时间。先是尝试企业内部小程序token,向指定url发送bot的AK/SK,获取一小时时效的token,发现不能发送消息。然后又查看官方文档,怀疑回调url有问题,尝试未果。下面是笔者找到企业群内bot token获取方式。
(当然你可以改为使用sessionWebhook,这样更安全)

  • 进入开发者后台,以企业管理员身份登陆 传送门
  • 上方选项栏选择应用开发>机器人>进入你的机器人管理
  • 机器人发布>机器人发布 (鬼知道上线调试能避开多少坑)
    机器人发布
  • 进入钉钉创建群组>进入你创建的群组>群设置>智能群助手>添加机器人>将您创建的机器人拉入

这里说明一下,钉钉会在创建完成机器人后自动创建调试群组。这里不建议使用,因为HTTP BODY缺少两个参数(具体哪两个忘了,有待补充)。

  • 群设置>智能群助手>小钉下方就是你的机器人了,我们打开它。找到webhook,将它复制下来
    accesss_token后就是发送消息需要的token。在此猜测一下,钉钉的机器人token是一个群一个专属token,通过切换token实现向不同群组发送消息

 PS:所以为什么我不用sessionWebhook,理智-1-1-1-1

 sessionWebhook是一个时效90min的tok(有待验证)

编写机器人

根据官方开发文档说明消息类型及数据格式包含以下几种。

text类型
link类型
markdown类型
整体跳转ActionCard类型
独立跳转ActionCard类型
FeedCard类型

查看官方文档发现传入HTTP BODY请求如下

{
     // 会话id
    "conversationId": "8Yu7H8H8890kkl7h==",
    "atUsers": [
        {
            "dingtalkId": "$:DFDS51:$R7E8dffdufdfjsdf2/oUCO/"
        }
    ],
    "chatbotUserId": "$:df3234:$sdfsdfsdfsdfd234234/oUCO/",
    "msgId": "msg4sdf35jh8jc9b51ss6/noYdzw==",
    "senderNick": "Neo",
    "isAdmin": false,
    "sessionWebhookExpiredTime": 1561711409165,
    // 消息发送的时间
    "createAt": 1561710209132,
    // 群聊消息类型还是单聊
    "conversationType": "2",
    "senderId": "$:ASDD_v1:$df8sdfj&JS*J#FF==",
    // 当类型是群聊时,这个参数有效
    "conversationTitle": "avalon",
    "isInAtList": true,
     // sessionWebhook是临时的发送消息接口
    "sessionWebhook": "https://oapi.dingtalk.com/robot/sendBySession?session=qwe",
    // 消息内容
    "text": {
        "content": "我就是我, 是不一样的烟火" 
    }, 
     // 消息类型
    "msgtype": "text",
}

观察一下消息数据结构不难发现消息包含在textcontent中。
我们先获取钉钉发送的数据,并对json解码

$file_contents = json_decode(file_get_contents('php://input'), true);

获取Webhook

$sessionWebhook = $file_contents['sessionWebhook'];

获取消息文本

$text = $file_contents['text']['content'];    

将文本信息复读回去

//钉钉消息发送方法
function request_by_curl($remote_server, $post_string) {  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $remote_server);
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    $data = curl_exec($ch);
    curl_close($ch);                
    return $data;  
}

$data = array(
    'msgtype' => 'text', 
    'text' => array(
        'content' =>$text
        )
    );
$data_string = json_encode($data);
$result = request_by_curl($sessionwebhook, $data_string);
echo $result;

完整代码如下,复读机完成。

<?php
//钉钉消息发送方法
function request_by_curl($remote_server, $post_string) {  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $remote_server);
    curl_setopt($ch, CURLOPT_POST, 1); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array ('Content-Type: application/json;charset=utf-8'));
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_string);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    $data = curl_exec($ch);
    curl_close($ch);                
    return $data;  
}

$file_contents = json_decode(file_get_contents('php://input'), true);
$sessionWebhook = $file_contents['sessionWebhook'];
$text = $file_contents['text']['content'];    
$data = array(
    'msgtype' => 'text', 
    'text' => array(
        'content' =>$text
        )
    );
$data_string = json_encode($data);
$result = request_by_curl($sessionWebhook, $data_string);
echo $result;

效果展示

复读

后记

既然能实现了简单交互,结合互联网上各种强大API或者自己的轮子可以开发更多功能。我后续给机器人加上了腾讯智能闲聊的API,可以作为智能智障陪聊,当然钉钉机器人强大的功能还需要各位开发者去探索挖掘。

请输入图片描述