热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

php自定义机器人接入

场景介绍企业内部有较多系统支撑着公司的核心业务流程,譬如CRM系统、交易系统、监控报警系统等等。通过钉钉的自定义机器人,可以将这些系统事件同步到钉钉的

场景介绍

企业内部有较多系统支撑着公司的核心业务流程,譬如CRM系统、交易系统、监控报警系统等等。通过钉钉的自定义机器人,可以将这些系统事件同步到钉钉的聊天群。

说明 

当前机器人尚不支持应答机制,该机制指的是群里成员在聊天@机器人的时候,钉钉回调指定的服务地址,即Outgoing机器人。

调用频率限制

由于消息发送太频繁会严重影响群成员的使用体验,因此钉钉开放平台对自定义机器人发送消息的频率作出以下限制:

每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。

注意 

如果你有大量发消息的场景(譬如系统监控报警)可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里。

步骤一:获取自定义机器人Webhook


  1. 选择需要添加机器人的群聊,然后依次单击群设置 智能群助手

  2. 在机器人管理页面选择自定义机器人,输入机器人名字并选择要发送消息的群,同时可以为机器人设置机器人头像。

  3. 完成必要的安全设置,勾选我已阅读并同意《自定义机器人服务及免责条款》,然后单击完成

  4. 完成安全设置后,复制出机器人的Webhook地址,可用于向这个群发送消息,格式如下:

    https://oapi.dingtalk.com/robot/send?access_token=XXXXXX 注意 

    请保管好此Webhook 地址,不要公布在外部网站上,泄露后有安全风险。


步骤二:使用自定义机器人

获取到Webhook地址后,用户可以向这个地址发起HTTP POST 请求,即可实现给该钉钉群发送消息。

注意

  • 发起POST请求时,必须将字符集编码设置成UTF-8。

  • 每个机器人每分钟最多发送20条。消息发送太频繁会严重影响群成员的使用体验,大量发消息的场景 (譬如系统监控报警) 可以将这些信息进行整合,通过markdown消息以摘要的形式发送到群里。

当前自定义机器人支持文本 (text)、链接 (link)、markdown(markdown)、ActionCard、FeedCard消息类型,请根据自己的使用场景选择合适的消息类型,达到最好的展示样式。详情参考:消息类型及数据格式。

自定义机器人发送消息时,可以通过手机号码指定“被@人列表”。在“被@人列表”里面的人员收到该消息时,会有@消息提醒。免打扰会话仍然通知提醒,首屏出现“有人@你”。

步骤三:测试自定义机器人

通过以下方法,可以快速验证自定义机器人是否可以正常工作:

使用命令行工具curl。

说明 

为避免出错,将以下命令逐行复制到命令行,需要将xxxxxxxx替换为真实access_token;若测试出错,请检查复制的命令是否和测试命令一致,多特殊字符会报错。

curl 'https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx' \-H 'Content-Type: application/json' \-d '{"msgtype": "text","text": {"content":"我就是我, 是不一样的烟火"}}'

SDK请求示例(Java)

DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/robot/send?access_token=566cc69da782ec******");
OapiRobotSendRequest request = new OapiRobotSendRequest();
request.setMsgtype("text");
OapiRobotSendRequest.Text text = new OapiRobotSendRequest.Text();
text.setContent("测试文本消息");
request.setText(text);
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList("132xxxxxxxx"));
// isAtAll类型如果不为Boolean,请升级至最新SDK
at.setIsAtAll(true);
at.setAtUserIds(Arrays.asList("109929","32099"));
request.setAt(at);request.setMsgtype("link");
OapiRobotSendRequest.Link link = new OapiRobotSendRequest.Link();
link.setMessageUrl("https://www.dingtalk.com/");
link.setPicUrl("");
link.setTitle("时代的火车向前开");
link.setText("这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林");
request.setLink(link);request.setMsgtype("markdown");
OapiRobotSendRequest.Markdown markdown = new OapiRobotSendRequest.Markdown();
markdown.setTitle("杭州天气");
markdown.setText("#### 杭州天气 @156xxxx8827\n" +"> 9度,西北风1级,空气良89,相对温度73%\n\n" +"> ![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png)\n" +"> ###### 10点20分发布 [天气](http://www.thinkpage.cn/) \n");
request.setMarkdown(markdown);
OapiRobotSendResponse response = client.execute(request);

PHP程序测试

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证书验证, 未调通情况可尝试添加该代码// curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0); // curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0);$data = curl_exec($ch);curl_close($ch); return $data;
} $webhook = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxx";
$message="我就是我, 是不一样的烟火";
$data = array ('msgtype' => 'text','text' => array ('content' => $message));
$data_string = json_encode($data);$result = request_by_curl($webhook, $data_string);
echo $result;
?>

消息类型及数据格式


  • text类型

    {"at": {"atMobiles":["180xxxxxx"],"atUserIds":["user123"],"isAtAll": false},"text": {"content":"我就是我, @XXX 是不一样的烟火"},"msgtype":"text"
    }

    参数

    参数类型

    是否必填

    说明

    msgtype

    String

    消息类型,此时固定为:text。

    content

    String

    消息内容。

    atMobiles

    Array

    被@人的手机号。

    注意 

    在content里添加@人的手机号,且只有在群内的成员才可被@,非群内成员手机号会被脱敏。

    atUserIds

    Array

    被@人的用户userid。

    注意 

    在content里添加@人的userid。

    isAtAll

    Boolean

    是否@所有人。

  • link类型

    {"msgtype": "link", "link": {"text": "这个即将发布的新版本,创始人xx称它为红树林。而在此之前,每当面临重大升级,产品经理们都会取一个应景的代号,这一次,为什么是红树林", "title": "时代的火车向前开", "picUrl": "", "messageUrl": "https://www.dingtalk.com/s?__biz=MzA4NjMwMTA2Ng==&mid=2650316842&idx=1&sn=60da3ea2b29f1dcc43a7c8e4a7c97a16&scene=2&srcid=09189AnRJEdIiWVaKltFzNTw&from=timeline&isappinstalled=0&key=&ascene=2&uin=&devicetype=android-23&version=26031933&nettype=WIFI"}
    }

    参数

    参数类型

    是否必填

    说明

    msgtype

    String

    消息类型,此时固定为:link。

    title

    String

    消息标题。

    text

    String

    消息内容。如果太长只会部分展示。

    messageUrl

    String

    点击消息跳转的URL,打开方式如下:

    • 移动端,在钉钉客户端内打开

    • PC端

      • 默认侧边栏打开

      • 希望在外部浏览器打开,请参考消息链接说明

    picUrl

    String

    图片URL。

  • markdown类型

    {"msgtype": "markdown","markdown": {"title":"杭州天气","text": "#### 杭州天气 @150XXXXXXXX \n > 9度,西北风1级,空气良89,相对温度73%\n > ![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n > ###### 10点20分发布 [天气](https://www.dingtalk.com) \n"},"at": {"atMobiles": ["150XXXXXXXX"],"atUserIds": ["user123"],"isAtAll": false}}

    参数

    类型

    是否必填

    说明

    msgtype

    String

    消息类型,此时固定为:markdown。

    title

    String

    首屏会话透出的展示内容。

    text

    String

    markdown格式的消息。

    atMobiles

    Array

    被@人的手机号。

    注意 

    在text内容里要有@人的手机号,只有在群内的成员才可被@,非群内成员手机号会被脱敏。

    atUserIds

    Array

    被@人的用户userid。

    注意 

    在content里添加@人的userid。

    isAtAll

    Boolean

    是否@所有人。

    目前只支持markdown语法的子集,具体支持的元素如下:

    标题
    # 一级标题
    ## 二级标题
    ### 三级标题
    #### 四级标题
    ##### 五级标题
    ###### 六级标题引用
    > A man who stands for nothing will fall for anything.文字加粗、斜体
    **bold**
    *italic*链接
    [this is a link](http://name.com)图片
    ![](http://name.com/pic.jpg)无序列表
    - item1
    - item2有序列表
    1. item1
    2. item2

  • 整体跳转ActionCard类型

    {"actionCard": {"title": "乔布斯 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身", "text": "![screenshot](https://gw.alicdn.com/tfs/TB1ut3xxbsrBKNjSZFpXXcXhFXa-846-786.png) ### 乔布斯 20 年前想打造的苹果咖啡厅 Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划", "btnOrientation": "0", "singleTitle" : "阅读全文","singleURL" : "https://www.dingtalk.com/"}, "msgtype": "actionCard"
    }

    参数

    类型

    是否必填

    说明

    msgtype

    String

    消息类型,此时固定为:actionCard。

    title

    String

    首屏会话透出的展示内容。

    text

    String

    markdown格式的消息。

    singleTitle

    String

    单个按钮的标题。

    注意 

    设置此项和singleURL后,btns无效。

    singleURL

    String

    点击消息跳转的URL,打开方式如下:

    • 移动端,在钉钉客户端内打开

    • PC端

      • 默认侧边栏打开

      • 希望在外部浏览器打开,请参考消息链接说明

    btnOrientation

    String

    0:按钮竖直排列

    1:按钮横向排列

    通过整体跳转ActionCard类型消息发出的消息样式如下:

  • 独立跳转ActionCard类型

    {"msgtype": "actionCard","actionCard": {"title": "我 20 年前想打造一间苹果咖啡厅,而它正是 Apple Store 的前身", "text": "![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png) \n\n #### 乔布斯 20 年前想打造的苹果咖啡厅 \n\n Apple Store 的设计正从原来满满的科技感走向生活化,而其生活化的走向其实可以追溯到 20 年前苹果一个建立咖啡馆的计划", "btnOrientation": "0", "btns": [{"title": "内容不错", "actionURL": "https://www.dingtalk.com/"}, {"title": "不感兴趣", "actionURL": "https://www.dingtalk.com/"}]}
    }

    参数

    类型

    是否必填

    说明

    msgtype

    String

    此消息类型为固定actionCard。

    title

    String

    首屏会话透出的展示内容。

    text

    String

    markdown格式的消息。

    btns

    Array

    按钮。

    title

    String

    按钮标题。

    actionURL

    String

    点击按钮触发的URL,打开方式如下:

    • 移动端,在钉钉客户端内打开

    • PC端

      • 默认侧边栏打开

      • 希望在外部浏览器打开,请参考消息链接说明

    btnOrientation

    String

    0:按钮竖直排列

    1:按钮横向排列

    通过独立跳转ActionCard类型消息发出的消息样式如下:

  • FeedCard类型

    {"msgtype":"feedCard","feedCard": {"links": [{"title": "时代的火车向前开1", "messageURL": "https://www.dingtalk.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"},{"title": "时代的火车向前开2", "messageURL": "https://www.dingtalk.com/", "picURL": "https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png"}]}
    }

    参数

    类型

    是否必填

    说明

    msgtype

    String

    此消息类型为固定feedCard。

    title

    String

    单条信息文本。

    messageURL

    String

    点击单条信息到跳转链接。

    说明 

    PC端跳转目标页面的方式,参考消息链接在PC端侧边栏或者外部浏览器打开。

    picURL

    String

    单条信息后面图片的URL。

    通过FeedCard类型消息发出的消息样式如下:


常见问题


  1. 当出现以下错误时,表示消息校验未通过,请查看机器人的安全设置。

    // 消息内容中不包含任何关键词
    {"errcode":310000,"errmsg":"keywords not in content"
    }// timestamp 无效
    {"errcode":310000,"errmsg":"invalid timestamp"
    }// 签名不匹配
    {"errcode":310000,"errmsg":"sign not match"
    }// IP地址不在白名单
    {"errcode":310000,"errmsg":"ip X.X.X.X not in whitelist"
    }


推荐阅读
  • php自动部署笔记,php自动化部署工具
    本文目录一览:1、码云gitee利用PHP脚本拉取实现自动部署(可用于生产环境) ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • Gitlab接入公司内部单点登录的安装和配置教程
    本文介绍了如何将公司内部的Gitlab系统接入单点登录服务,并提供了安装和配置的详细教程。通过使用oauth2协议,将原有的各子系统的独立登录统一迁移至单点登录。文章包括Gitlab的安装环境、版本号、编辑配置文件的步骤,并解决了在迁移过程中可能遇到的问题。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文介绍了在Ubuntu 11.10 x64环境下安装Android开发环境的步骤,并提供了解决常见问题的方法。其中包括安装Eclipse的ADT插件、解决缺少GEF插件的问题以及解决无法找到'userdata.img'文件的问题。此外,还提供了相关插件和系统镜像的下载链接。 ... [详细]
  • Python15行代码实现免费发送手机短信,推送消息「建议收藏」
    Python15行代码实现免费发 ... [详细]
  • Smrti Lab 和 ArkStream Demo Day 10 个参展新项目一览
    元宇宙、跨链桥、NFT交易市场、期权产品服务商、Layer1、DID、Web3基础设施等领域的被投项目参与路演。 ... [详细]
  • syncd是一款开源的代码部署工具,它具有简单、高效、易用等特点,可以提高团队的工作效率. ... [详细]
  • html css在线便宜,在线HTML、CSS和JS工具汇总
    本文提供了在线HTML、CSS和JS工具汇总,它们都是直接在浏览器上可以使用的在线工具,基本上都是比较简单操作的,只适合简单的调试工作&# ... [详细]
  • 用React.jsEgg.js造轮子全栈开发旅游电商应用百度网盘最后附上下载链接百度网盘下载链接:链接:https:pan.baidu.coms1X0RBk0Gb ... [详细]
author-avatar
手机用户2702932962_848
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有