1. 获取自定义机器人webhook
参考https://open-doc.dingtalk.com/docs/doc.htm?spm=a219a.7629140.0.0.karFPe&treeId=257&articleId=105735&docType=1
2.封装markdown类
Class MarkDown {
private $markdown = '';
/**
* 增加标题
* @param String $title 标题内容
* @param Int $level 标题级别 1-6
* @return Void
*/
public function addTitle($title,$level=1)
{
$level = intval($level) < 1 ? 1 : intval($level);
$level = intval($level) > 6 ? 6 : intval($level);
$title = str_repeat('# ',$level).$title." \n";
$this->markdown .= $title;
return $title;
}
/**
* 增加引用
* @param String $text 引用内容
* @return Void
*/
public function addQuote($text)
{
$text = '> '.$text;
$this->markdown .= $text;
return $text;
}
/**
* 文字加粗
* @param String $text 需要加粗的文字内容
* @return Void
*/
public function setBold($text)
{
$text = '**'.$text.'**';
$this->markdown .= $text;
return $text;
}
/**
* 文字倾斜
* @param String $text 需要倾斜的文字内容
* @return Void
*/
public function setItalic($text)
{
$text = '*'.$text.'*';
$this->markdown .= $text;
return $text;
}
/**
* 增加超链接
* @param String 超链接显示文字
* @param Stirng 超链接跳转地址
* @return Void
*/
public function addLink($title,$url)
{
$title = '['.$title.']('.$url.')';
$this->markdown .= $title;
return $title;
}
/**
* 增加图片
* @param String 图片地址
* @param Stirng 图片标题
* @return Void
*/
public function addPic($picUrl,$title='')
{
$picUrl = '!['.$title.']('.$picUrl.')';
$this->markdown .= $picUrl;
return $picUrl;
}
/**
* 增加无序列表
* @param Array 列表内容数组
* @return Void
*/
public function addNoneList($list)
{
$text = '';
foreach ($list as $item) {
$text .= '- '.$item."\n";
}
$this->markdown .= $text;
return $text;
}
/**
* 增加有序列表
* @param Array 列表内容数组
* @return Void
*/
public function addList($list)
{
$text = '';
foreach ($list as $key => $item) {
$text .= ($key+1).'. '.$item."\n";
}
$this->markdown .= $text;
return $text;
}
/**
* 增加换行符
* @return Void
*/
public function addLine()
{
$this->markdown .= "\n\n";
}
/**
* 获取markdown文字
* @return String markdown文本内容
*/
public function getMarkdown()
{
return $this->markdown;
}
}
3.封装webhook类
class Webhock {
private $webhook;
private $links;
public function __construct($webhook)
{
$this->webhook = $webhook;
}
public function request_by_curl($post_string)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->webhook);
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 json_decode($data,true);
}
/*********************************发送文字消息*****************************************/
/**
* 发送文字消息
* @param String $message 消息内容
* @param Array $at 需要@组员的手机号数组
* @param Boolean $atAll 是否@所有人
* @return Array ['errsmg':'消息内容','errcode':'消息代码'] 发送消息返回结果
*/
public function sendText($message,$at=[],$atAll=false)
{
$msg_data = [
'msgtype' => 'text',
'text' => [
'content' => $message,
],
];
if($at) {
$msg_data['at'] = [
'atMobiles' => $at,
'isAtAll' => $atAll,
];
}
return $this->request_by_curl(json_encode($msg_data));
}
/*********************************发送Markdown消息*****************************************/
/**
* 发送markdown消息
* @param String $title 消息标题
* @param String $text 消息文本
* @param Array $at 需要@组员的手机号数组
* @param Boolean $atAll 是否@所有人
* @return Array ['errsmg':'消息内容','errcode':'消息代码'] 发送消息返回结果
*/
public function sendMarkdown($title,$text,$at=[],$atAll=false)
{
$msg_data = [
'msgtype' => 'markdown',
'markdown' => [
'title' => $title,
'text' => $text,
],
];
if($at) {
$msg_data['at'] = [
'atMobiles' => $at,
'isAtAll' => $atAll,
];
}
return $this->request_by_curl(json_encode($msg_data));
}
/*********************************发送链接消息*****************************************/
/**
* 发送链接消息
* @param String $title 链接标题
* @param String $content 链接描述内容
* @param String $msgUrl 链接跳转地址
* @param String $picUrl 链接展示图标
* @return Array ['errsmg':'消息内容','errcode':'消息代码'] 发送消息返回结果
*/
public function sendLink($title,$content,$msgUrl,$picUrl='')
{
$msg_data = [
'msgtype' => 'link',
'link' => [
'text' => $content,
'title' => $title,
'picUrl' => $picUrl,
'messageUrl' => $msgUrl,
],
];
return $this->request_by_curl(json_encode($msg_data));
}
/*********************************发送FeedCard消息*****************************************/
/**
* 增加FeedCard的Links内容
* @param String $title 链接标题
* @param String $msgUrl 链接跳转地址
* @param String $picUrl 链接展示图标
* @return Void
*/
public function addLinks($title,$msgUrl,$picURL='')
{
$this->links[] = [
'title' => $title,
'messageURL' => $msgUrl,
'picURL' => $picURL,
];
}
/**
* 发送FeddCard消息,使用前需要调用$this->addLinks函数增加links
* @return Array ['errsmg':'消息内容','errcode':'消息代码'] 发送消息返回结果
*/
public function sendFeedCard()
{
if(!$this->links) return ['errmsg'=> 'FeedCard链接内容不能为空','errcode'=> -1];
$msg_data = [
'msgtype' => 'feedCard',
'feedCard' => [
'links' => $this->links,
],
];
$this->links = [];
return $this->request_by_curl(json_encode($msg_data));
}
/*********************************发送ActionCard消息*****************************************/
/**
* 向ActionCard消息里增加按钮的函数
* @param String $title 按钮显示的文字
* @param String $actionURL 点击按钮后跳转的链接
* @return Void
*/
public function addButtons($title,$actionURL)
{
$this->action_card_btns[] = [
'title' => $title,
'actionURL' => $actionURL,
];
}
/**
* 发送ActionCard消息,需要先使用$this->addButtons增加按钮
* @param String $title 消息标题
* @param String $text markdown格式的消息内容
* @param Boolean $hideAvatar 是否隐藏发消息者的头像
* @param Boolean $btnOrientation 是否进行横向排列按钮
* @return Array ['errsmg':'消息内容','errcode':'消息代码'] 发送消息返回结果
*/
public function sendActionCard($title,$text,$btnOrientation=false,$hideAvatar=false)
{
if(!$this->action_card_btns) return ['errmsg'=> 'ActionCard按钮不能为空','errcode'=> -1];
$msg_data = [
'msgtype' => 'actionCard',
'actionCard' => [
'title' => $title,
'text' => $text,//markdown格式的消息
'hideAvatar' => $hideAvatar,//0-正常发消息者头像,1-隐藏发消息者头像
'btnOrientation' => $btnOrientation,//0-按钮竖直排列,1-按钮横向排列
]
];
if(sizeof($this->action_card_btns) == 1) {
$msg_data['actionCard']['singleTitle'] = $this->action_card_btns[0]['title'];//按钮标题
$msg_data['actionCard']['singleURL'] = $this->action_card_btns[0]['actionURL'];//点击按钮后跳转的URL
} else {
$msg_data['actionCard']['btns'] = $this->action_card_btns;
}
$this->action_card_btns = [];
return $this->request_by_curl(json_encode($msg_data));
}
}
4. 例子
$m = new MarkDown();
$m->addTitle('杭州天气');
$m->addLine();
$m->addQuote('9℃');
$m->addLine();
$m->setBold('测试加粗');
$m->addLine();
$m->setItalic('测试倾斜');
$m->addLine();
$m->addLink('运维系统','http://www.baidu.com');
$m->addLine();
$m->addPic('http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg','logo');
$m->addLine();
// $m->addNoneList(['测试1','测试2']);
$m->addLine();
$m->addList(['测试','测试']);
$md = $m->getMarkdown();
$dtalk = new Webhook('webhook参数');
$result = $dtalk->sendText('我就是我,不一样的花火!@18236593010',['18236593010']);
$result = $dtalk->sendLink('测试连接','测试链接内容','http://yunwei.bjtzh.gov.cn','http://yunwei.bjtzh.gov.cn/static/index/img/favicon.ico');
$result = $dtalk->sendMarkdown('测试markdown',$md,[],true);
$dtalk->addButtons('支持','http://yunwei.bjtzh.gov.cn');
$dtalk->addButtons('反对','http://www.baidu.com');
$result = $dtalk->sendActionCard('请投票',$md);
$dtalk->addLinks('百度','https://www.baidu.com','http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg');
$dtalk->addLinks('京东','http://www.jd.com','http://www.pptok.com/wp-content/uploads/2012/08/xunguang-4.jpg');
$dtalk->addLinks('淘宝','https://www.taobao.com','http://uploads.oh100.com/allimg/1709/117-1FZ5102542-52.jpg');
$result = $dtalk->sendFeedCard();
print_r($result);