钉钉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);

你可能感兴趣的:(钉钉webhook封装接口)