钉钉群里开放了智能机器人的webhook功能,可以通过PHP等代码,实现向群里发送信息,这里有钉钉的说明文档。 我用它实现了公司钉钉群的定时发送新闻功能,主要思路是:

1、用网易的新闻源

2、通过PHP的正则函数preg_match_all,来获取我们需要的新闻短标题,形式json数据。

3、把json通过钉钉webhook发送到群,当然需要经过一系列的认证。

4、实现定时发送功能,解放双手。

PHP代码如下:

<?php
header("Content-Type: text/html; charset=utf-8");

//配置信息,在建立webhook时,在安全设置里,选择“加签”,会得到以下参数。
$secret = "SEC*************************************"; 
$hookurl = "https://oapi.dingtalk.com/robot/send?access_token=*****************";


//当前时间戳 毫秒
function getMillisecond() {
    list($s1, $s2) = explode(' ', microtime());
    return (float)sprintf('%.0f', (floatval($s1) + floatval($s2)) * 1000);
}
//钉钉CURL函数
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_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 线下环境不用开启curl证书验证, 未调通情况可尝试添加该代码
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}
//163 news
$url = "http://3g.163.com/touch/reconstruct/article/list/BBM54PGAwangning/0-20.html"; //这里是网易的新闻源,当然如果你有更好的,自己可以换,当然后面的正则规则也得一起换。
$con = file_get_contents("compress.zlib://" . $url); //为了防止乱码,要在前面拼上“compress.zlib:
$today = date("Y-m-d");
$preg = "#{\"liveInfo\":null,\"docid\":\"(.*)\",\"source\":\"(.*)\",\"title\":\"(.*)\",\"priority\":(.*),\"hasImg\":(.*),\"url\":\"(.*)\",\"commentCount\":(.*),\"imgsrc3gtype\":\"(.*)\",\"stitle\":\"(.*)\",\"digest\":\"(.*)\",\"imgsrc\":\"(.*)\",\"ptime\":\"" . $today . " (.*)\"}#isU";
preg_match_all($preg, $con, $res);
//print_r($res);exit;
for ($i = 0; $i < count($res[3]); $i++) {
    //echo ($i+1).".".$res[3][$i]."\n";
    $message = $message . ($i + 1) . "、" . $res[3][$i] . "\n\n";
}
$message = "今天是" . date("Y年m月d日"). ",为您转发来自网易的早新闻:\n\n" . str_replace('\"', '"', $message);
$timestamp = getMillisecond(); //获取时间戳
$signaturestring = $timestamp . "\n" . $secret; //定义签名字符串
$sign = urlencode(base64_encode(hash_hmac('sha256', $signaturestring, $secret, true))); //编码字符串
$webhook = $hookurl . "&timestamp=" . $timestamp . "&sign=" . $sign; //钉钉GET的完整URL
//数据编码
$data = array(
    'msgtype' => 'text',
    'text' => array(
        'content' => $message
    )
);
$data_string = json_encode($data);
//执行
$result = request_by_curl($webhook, $data_string);
//结果
//echo $result;
$json = json_decode($result, true); //将json解析成数组
if ($json['errcode'] = 200) { //判断状态码
    echo "发送成功,共计发送新闻" . count($res[3]) . "条。";
}
?>


接下来说一下如何实现定时发送。 其实,PHP文件测试没问题以后,只要每运行一次就会发送一次,只要能定时运行PHP文件就行了, 网上有很多PHP定时任何的教程,但我感觉都不太可靠,好像也更消耗服务器资源, 因为我的服务器是windows的,所以,只要新建一个windows任务,来定时运行一个批处理文件,来运行这个php文件就可以了。

批处理文件(命名为163news.bat)代码如下:

D:\PHP\php-cgi.exe -c D:\PHP\php.ini -f D:\news\163news.php 

最后一步,新建一个windows任务吧,设定为每日8时运行一次,运行内容就是这个批处理文件, 这样每天我们都能在钉钉群里自动收到新闻了,非常实用。