Hi~上午好!

服务器推送消息通知到钉钉(PHP版)

   

最近又在闲鱼入手了一台低功耗的mini主机(一天的功耗只有0.2W)部署docker,然后在里面部署了青龙面板执行一些定时的脚本任务。然后看到青龙面板里面有通知设置,里面选项有好多,最后选了server酱,了解之后发现使用挺方便。由于免费用户一天只有5条的额度,而且我本身已经对接过很多钉钉的接口(平常工作用.NET开发,但是钉钉自带调试案例,PHP开发业不难),于是就有了下面的代码了。

实现原理:服务器或者智能设备调用此PHP接口,然后调用钉钉的工作通知接口推送消息到钉钉客户端。
准备工作:
1、钉钉注册一个团队,然后在开发者后台(https://open-dev.dingtalk.com/fe/app#/corp/app)创建一个H5应用(复制AgentID、AppKey、APPSecret)
2、下载钉钉SDK(https://open.dingtalk.com/document/resourcedownload/download-server-sdk),解压后放到同一目录
3、一台服务器(环境最好是nginx+php)

PHP代码如下:
  1. <?php
  2. header('Content-Type:application/json; charset=utf-8');
  3. //ini_set("display_errors","On"); //显示报错信息
  4. //error_reporting(E_ALL);//显示所有
  5. require "Dingtalk/TopSdk.php";
  6. date_default_timezone_set('Asia/Shanghai');
  7. try {
  8.     //unicode解码
  9.     function decodeUnicode($str) {
  10.         return preg_replace_callback('/\\\\u([0-9a-f]{4})/i',
  11.                 create_function(
  12.                   '$matches',
  13.                   'return mb_convert_encoding(pack("H*"$matches[1]), "UTF-8""UCS-2BE");'
  14.                 ), $str);
  15.     }
  16.     //秘钥
  17.     $key = $_REQUEST['key'];
  18.     //标题
  19.     $title = $_REQUEST['title'];
  20.     //内容
  21.     $desc = $_REQUEST['desc'];
  22.     $rst = array("code" => 1, "msg" => """success" => "N""data" => "");
  23.     if ($key != null && $key == "自己设置的密钥") {
  24.         if ($desc != null && $desc != "") {
  25.             $c = new DingTalkClient(DingTalkConstant::$CALL_TYPE_OAPI, DingTalkConstant::$METHOD_GET, DingTalkConstant::$FORMAT_JSON);
  26.             $req_token = new OapiGettokenRequest;
  27.             $req_token -> setAppkey("钉钉应用Appkey");
  28.             $req_token -> setAppsecret("钉钉应用Appsecret");
  29.             $resp_token = $c -> execute($req_token$access_token"https://oapi.dingtalk.com/gettoken");
  30.             $errcode = $resp_token -> errcode;
  31.             $token_msg = $resp_token -> errmsg;
  32.             if ($errcode == 0) {
  33.                 $access_token = $resp_token -> access_token;
  34.                 $time_str = date("Y-m-d H:i:s", time());
  35.                 $req = new OapiMessageCorpconversationAsyncsendV2Request;
  36.                 $req -> setAgentId("钉钉AgentId");
  37.                 $req -> setUseridList("钉钉用户id");
  38.                 $msg = new Msg;
  39.                 $msg -> msgtype = "markdown";
  40.                 $markdown = new Markdown;
  41.                 if ($title == null || $title == "") {
  42.                     $title = "新消息";
  43.                 }
  44.                 $descstr_replace("\\n","  \n",$desc);
  45.                 $markdown -> text = "### ".$title."  \n*************\n".$desc."  \n*************\n".$time_str;
  46.                 $markdown -> title = $title;
  47.                 $msg -> markdown = $markdown;
  48.                 $req -> setMsg($msg);
  49.                 $resp = $c -> execute($req$access_token"https://oapi.dingtalk.com/topapi/message/corpconversation/asyncsend_v2");
  50.                 $errcode = $resp -> errcode;
  51.                 $errmsg = $resp -> errmsg;
  52.                 if ($errcode == 0) {
  53.                     $rst = array("code" => 0, "msg" => "发送成功!""success" => "Y""data" => $errmsg);
  54.                 } else {
  55.                     $rst = array("code" => 1, "msg" => "推送消息出错!""success" => "N""data" => $errmsg);
  56.                 }
  57.             } else {
  58.                 $rst = array("code" => 1, "msg" => "获取钉钉token出错!""success" => "N""data" => $errmsg);
  59.             }
  60.         } else {
  61.             $rst = array("code" => 1, "msg" => "参数:内容(desc)不能为空!""success" => "N""data" => "");
  62.         }
  63.     } else {
  64.         if($key==null||$key=="") {
  65.             $rst = array("code" => 1, "msg" => "实例:http://push.risingsun.cc?key=密钥&title=标题&desc=内容;PS:标题可为空;换行符\\n;换行分割线\\n*************\\n""success" => "N""data" => "");
  66.         } else {
  67.             $rst = array("code" => 1, "msg" => "参数:密钥(key)有误!""success" => "N""data" => "");
  68.         }
  69.     }
  70.     echo decodeUnicode(json_encode($rst));
  71. }
  72. catch (Exception $e) {
  73.     $rst = array("code" => 1, "msg" => $e->getMessage(), "success" => "N""data" => "异常");
  74.     echo decodeUnicode(json_encode($rst));
  75. }

 

因为考虑到跨域使用的问题,这里就顺便开启了nginx的跨域

在nginx对应的vhost配置文件“server”里面增加:

  1. #允许跨域请求的域,*代表所有
  2. add_header 'Access-Control-Allow-Origin' *;
  3. #允许带上cookie请求
  4. add_header 'Access-Control-Allow-Credentials' 'true';
  5. #允许请求的方法,比如 GET/POST/PUT/DELETE
  6. add_header 'Access-Control-Allow-Methods' *;
  7. #允许请求的header
  8. add_header 'Access-Control-Allow-Headers' *;

然后重启nginx即可

调用推送的实例:http://push.risingsun.cc?key=密钥&title=标题&desc=内容

推送到钉钉客户端(PC/手机都能收到)就是这样的:

未经允许不得转载:Rising Sun's Blog » Linux / php » 服务器推送消息通知到钉钉(PHP版)
标签:
评论 0
 
 
发表评论