用户名:  密码:   
您当前的位置:首页 > 程序设计 >  Delphi > 

关于向钉钉群自动发消息的机器人https

上次修改时间: 2023-06-09 17:30:40      来源:网络总结      作者:钢铁长陈
上一页      路径:DSD\Learn\Delphi语言\      下一页

关于向钉钉群自动发消息的机器人

1. 开启机器人及自动发消息的方法:
https://open.dingtalk.com/document/robots/custom-robot-access#title-nfv-794-g71

2. 在PHP下测试通过,在Delphi7下测试没通过,一提交代码就提示:IOhandler value is not valid错误。
原因是不支持https协议的网址,说是要添加IdHTTP和TIdSSLIOHandlerSocket控件(),但后面这个控件找不到。还需要把libeay32.dll和ssleay32.dll放在程序目录
两个Dll文件下载地址:https://indy.fulgan.com/SSL/Archive/,
可能delphi7的indy9没有TIdSSLIOHandlerSocket控件,可能要更高版本的indy9才有这个控件

3. 主要遇到的错误1
复制官方demo测试的PHP代码,发现发英文可以,发中文提示错误{"errcode":40035,"errmsg":"缺少参数 json"}
原因是不要用Notepad++编辑PHP代码,而要用VScode,因为而把网上的代码复制到notepad++看着没有问题,但用VScode打开Notepad++保存的PHP文件中文都是乱码,用VScode把那些乱码改好后再测试就成功了

3.1 不成功时,中文提示乱码,要加上下面这句
echo '<meta http-equiv="content-type" content="text/html; charset=utf-8">';

4.不成功原因2
在添加群机器人的时候在那个安全设置那里要把公司的公网地址IP地址添加进去,而且公网地址每次变了都要改。还有种方法就是自定义关键词,发送到群的消息中要包含这些关键词,否则也发送不成功
详见:https://open.dingtalk.com/document/robots/custom-robot-access

5. 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=4b957a4377a07b4de617b1942b70c31df6483c2dbc3cc0bf00e5748e75a8c000";
$message="我就是我, 是不一样的烟火";
$data = array ('msgtype' => 'text','text' => array ('content' => $message));
$data_string = json_encode($data);

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