钉钉webhook封装接口

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);
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容