钉钉企业机器人单聊消息发送实践-大数据平台(XSailboat)消息中心消息推送

这篇具有很好参考价值的文章主要介绍了钉钉企业机器人单聊消息发送实践-大数据平台(XSailboat)消息中心消息推送。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 背景

在笔者开发的大数据平台XSailboat中有 消息中心 模块,用来全平台的消息收集,整理分拆、订阅发送等功能。消息推送方式支持钉钉群聊、钉钉单聊、短信通知。现记录一下企业机器人消息单聊推送的实现过程。

2. 钉钉开发文档

这是官方的开发文档地址:《机器人发送、查询和撤回单聊消息》

将其中的主要过程抄录一下:

步骤一:登录开发者后台,点击应用开发-企业内部开发,创建机器人。
步骤二:点击机器人应用-基础信息,获取AppKey和AppSecret。
步骤三:添加接口调用权限,点击“机器人”,申请企业内机器人发送消息权限。申请权限无需审批,默认开通。
步骤四:上线机器人。进入版本管理与发布页面,点击上线,机器人的状态变更为已发布。
步骤五:获取应用访问凭证获取企业内部应用的accessToken。调用接口时,通过accessToken鉴权调用者身份。
步骤六:调用机器人单聊相关的API:

  • 调用服务端API-批量发送单聊消息,获取消息processQueryKey。
  • 根据消息processQueryKey,调用服务端API-批量查询单聊机器人是否已读,查询机器人发送的单聊消息对方是否已读。
  • 根据消息processQueryKey,调用服务端API-批量撤回单聊消息,撤回机器人发送的单聊消息。

3. 记录自己的操作过程

  1. 上企业的 开发者后台 创建应用(应用名:大数据平台-消息中心)。
  2. 创建了应用之后,再点进应用,创建机器人,创建好了之后发布。
    钉钉企业机器人单聊消息发送实践-大数据平台(XSailboat)消息中心消息推送,大数据平台开发技术,钉钉,机器人,大数据
  3. 申请“机器人”里面的 “企业内机器人发送消息权限” 和“通讯录管理”中的 “根据手机号姓名获取成员信息的接口访问权限”
  4. 根绝Appkey和AppSecret获取token。
  • 《获取企业内部应用的access_token》
  1. 定向向某人发送钉钉消息时需要指定userId,而消息中心配置的消息订阅人设置的是手机号。所以需要将手机号翻译成userId。
  • 《根据手机号查询企业账号用户》
  1. 发送消息的API。
  • 《批量发送人与机器人会话中机器人消息》

4. 示例代码

package com.cimstech.sailboat.ms.msg;

import com.cimstech.sailboat.ms.msg.sender.Letter;
import com.cimstech.xfront.common.http.HttpClient;
import com.cimstech.xfront.common.http.Request;
import com.cimstech.xfront.common.json.JSONArray;
import com.cimstech.xfront.common.json.JSONObject;
import com.cimstech.xfront.common.text.XString;
import com.cimstech.xfront.common.time.XTime;

public class Test
{
	/**
	 * 获取token,查询userId的服务地址
	 */
	static final String sDingService = "https://oapi.dingtalk.com" ;
	
	/**
	 * 发送钉钉消息的服务地址
	 */
	static final String sDingSendService = "https://api.dingtalk.com" ;
	
	/**
	 * 凭借appKey和appSecret获取token
	 */
	static final String sPath_GetToken = "/gettoken" ;
	
	/**
	 * 通过手机号获取企业账号用户
	 */
	static final String sPath_GetUserByMobile = "/topapi/v2/user/getbymobile" ;
	
	static final String sPath_SendMsgOfSingleChat = "/v1.0/robot/oToMessages/batchSend" ;
	
	static final String sDetailPtn_n = "[以及另外{}条详情..]({})" ;
	static final String sDetailPtn_1 = "[详情..]({})" ;
	
	static final String sNoLink = "以及另外{}条" ;
	
	static String[] sColors = new String[] {"#FF0000"
			, "#ffa500"
			, "#0fdbdb"
			, "#12e512"} ;
	
	static String sDetailLink = "http://XXXXX/sailmsg/msgrow?sendBatch={}&totalAmount={}" ;
	
	static JSONObject toJSON(Letter aLetter)
	{
		int level = aLetter.getLevel() ;
		String color = level < sColors.length? sColors[level]:null ;
		StringBuilder strBld = new StringBuilder("【消息中心-").append(aLetter.getSubscriberItemName())
				.append("】")
				.append("-[") ;
		if(color != null)
			strBld.append("<font color=").append(color).append(">") ;
		strBld.append(level).append("级") ;
		if(color != null)
			strBld.append("</font>") ;
//		String partition = aLetter.getPartition() ;
		strBld.append("]") ; // .append(sSiteMap.getOrDefault(partition , partition)) ;
		String title = strBld.toString() ;
		
		strBld.setLength(0);
		strBld.append("**").append(title).append("**  \n  > ")
				.append("<font color=#000000>")
				.append(aLetter.getContent())
				.append("</font>")
				.append("  \n  \n  ") ;
		strBld.append("<font color=#666666>")
				.append(aLetter.getEventTime())
				.append("</font>")
				.append("&nbsp;&nbsp;&nbsp;&nbsp;") ;
		
		if(XString.isEmpty(sDetailLink))
		{
			if(aLetter.getReduceAmount() > 0)
				strBld.append(XString.msgFmt(sNoLink , aLetter.getReduceAmount())) ;
		}
		else
		{
			if(aLetter.getReduceAmount() > 1)
			{
				strBld.append(XString.msgFmt(sDetailPtn_n, aLetter.getReduceAmount()
						, XString.msgFmt(sDetailLink , aLetter.getSendBatch() , aLetter.getReduceAmount()))) ;
			}
			else
			{
				strBld.append(XString.msgFmt(sDetailPtn_1
						, XString.msgFmt(sDetailLink , aLetter.getSendBatch() , aLetter.getReduceAmount()))) ;
			}
		}
		String content = strBld.toString() ;
		
		return new JSONObject().put("title" , title)
						.put("text", content)
				;
	}

	public static void main(String[] args) throws Exception
	{
		String appKey = "ddddddddddddddd" ;
		String appSecret = "ssssssssssssssssssssssssssssssss" ;
		String mobile = "130XXXXXXXXX" ;
		String robotCode = "dingXXXXXXXXX" ;
		
		// 1.获取AccessToken
		HttpClient client = HttpClient.ofUrl(sDingService) ;
		long expireTime = System.currentTimeMillis() ;
		/**
		 * {
		 *   "errcode": 0,
		 *   "access_token": "aaaaaaaaaaaaaaaaa",
		 *   "errmsg": "ok",
		 *   "expires_in": 7200
		 * }
		 */
		JSONObject jo = client.askJo(Request.GET().path(sPath_GetToken)
				.queryParam("appkey" , appKey)
				.queryParam("appsecret", appSecret)) ;
		System.out.println("获取到的Token:"+jo) ;
		String accessToken = jo.optString("access_token") ;
		expireTime += jo.optLong("expires_in") * 1000 ;
		
		/**
		 * {
         *   "errcode": 0,
         *   "errmsg": "ok",
         *   "result":
         *   {
         *     "exclusive_account_userid_list": [],
         *     "userid": "bbbbbbbbbbbbb"
         *   },
         *   "request_id": "ccccccc"
         * }
		 */
		// 2. 查询userId
		jo = client.askJo(Request.POST().path(sPath_GetUserByMobile).queryParam("access_token" , accessToken)
				.setJsonEntity(new JSONObject().put("mobile" , mobile)
						.put("support_exclusive_account_search" , true))) ;
		System.out.println("获取到的User信息:"+jo);
		
		String userId = jo.pathString(null , "result" , "userid") ;
		
		
		Letter letter = new Letter(null) ;
		letter.setLevel(5);
		letter.setContent("单聊测试") ;
		letter.setEventTime(XTime.current$yyyyMMddHHmmss());
		letter.setReduceAmount(1) ;
		letter.setSendBatch("xxxxxxxxxxxxxxx") ;
		letter.setSubscriberItemName("单聊测试订阅项");
		
		String msgParam = toJSON(letter).toJSONString() ;
		
		/**
		 * {
         *   "flowControlledStaffIdList": [],
         *   "invalidStaffIdList": [],
         *   "processQueryKey": "xxxxxxxxxxxxxx"
         * }
		 */
		// 3.发送消息
		jo = HttpClient.ofUrl(sDingSendService).askJo(Request.POST().path(sPath_SendMsgOfSingleChat)
				.header("x-acs-dingtalk-access-token" , accessToken)
				.setJsonEntity(new JSONObject().put("robotCode" , robotCode)
						.put("userIds", new JSONArray().put(userId))
						.put("msgKey", "sampleMarkdown")
						.put("msgParam" , msgParam))) ;
		
		System.out.println("发送消息收到的回复:"+jo);
	}

}

效果:
钉钉企业机器人单聊消息发送实践-大数据平台(XSailboat)消息中心消息推送,大数据平台开发技术,钉钉,机器人,大数据文章来源地址https://www.toymoban.com/news/detail-823624.html

到了这里,关于钉钉企业机器人单聊消息发送实践-大数据平台(XSailboat)消息中心消息推送的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 钉钉自定义机器人定时发送消息(超详细)

    钉钉自定义机器人定时发送消息(超详细)

            因为工作需要,需要在钉钉群里添加一个可以每天定时发送消息的机器人,我找了很多网页查看,发现资料并不是很全,现在做出来了,就想发表出来,看看能不能帮到大家。接下来就进入正题。         详细步骤可以参考:钉钉群设置创建一个机器人-CSDN博客  

    2024年03月11日
    浏览(12)
  • java实现钉钉自定义机器人发送消息

    java实现钉钉自定义机器人发送消息

           钉钉作为现在很多企业的移动办公平台,具有很多很强大的功能,可以帮助我们更加及时的发现问题,解决问题,今天我们做一个java实现钉钉自定义机器发送消息的功能。         首先,先放出官方文档地址:https://open.dingtalk.com/document/orgapp/custom-robot-access        

    2024年02月15日
    浏览(14)
  • C#实现钉钉自定义机器人发送群消息帮助类

    C#实现钉钉自定义机器人发送群消息帮助类

            在企业中,针对一些关键指标内容(如每天的生产产量、每天的设备报警信息等信息),需要同时给多人分享,此时就可以将需要查看这些数据的人员都拉到一个群中,让群里的机器人将这些关键指标内容推送到群里即可【(目前已实现在钉钉群里创建自定义机器

    2024年02月04日
    浏览(14)
  • 【办公自动化】钉钉机器人每日定时向不同群组发送消息

    【办公自动化】钉钉机器人每日定时向不同群组发送消息

            实现每日上午10点自动向各供应商群同步前一日产品数据。通过python+钉钉机器人实现该功能。具体步骤如下: 目录 1.创建机器人获得token 2.编写脚本 2.1 数据整理 2.2 消息发送 3.设置定时任务 群设置--智能群助手--添加机器人--自定义(通过Webhook接入自定义服务)

    2024年02月08日
    浏览(13)
  • Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知

    Outlook无需API开发连接钉钉群机器人,实现新增会议日程自动发送群消息通知

    Outlook用户使用场景: 在企业中,会议和活动的顺利举行对于业务运转和团队协作至关重要。然而,计划的变动总是无法避免,这可能会导致其他人的计划受到影响,打乱原有的安排。为了解决这个问题,许多企业开始使用各种工具和技术来确保信息的及时传递和更新。其中

    2024年02月09日
    浏览(9)
  • 如何使用企业微信群机器人定时发送消息

    如何使用企业微信群机器人定时发送消息

    每天早上8点钟通过企业微信群机器人发消息提醒大家打卡。在Aboter中该如何实现呢? 首先创建一个IPaaS流程,触发条件组件编辑区选择【定时触发】类型。编辑区进行如下设置: 拖动左侧【应用连接器 即时通讯 企业微信群机器人】组件到执行流程块中,并配置好相关参数。

    2024年02月06日
    浏览(45)
  • 【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

    【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

    2022/4/22更新:新增可发送文件消息。 发送文件消息需要先将文件上传到企业微信的临时素材,url为https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?type=filekey=**********,这个key就是群机器人Webhook地址的key参数,在代码里我已经处理好了,只要有Webhook地址就行。获取到media_id,再拿

    2023年04月08日
    浏览(5)
  • 封装Python脚本:使用企业微信机器人发送消息至企业微信

    官方文档地址:https://developer.work.weixin.qq.com/document/path/91770#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%BE%A4%E6%9C%BA%E5%99%A8%E4%BA%BA 可以通过如下步骤设置企业微信机器人: 首先建立或者进入某个群聊 进入群聊设置页面, 点击“群机器人添加”可添加一个机器人成功 添加成功后,复制并保

    2024年02月09日
    浏览(11)
  • 工作随记-Java利用企业微信群机器人定时发送消息

    工作随记-Java利用企业微信群机器人定时发送消息

    hi,大家好,我是恰恰 阅读本文需要2分钟~ 最近利用企业微信群机器人做的需求主要有 1.返奖率通知与告警: 抽奖箱能抽出垃圾也能抽出大货,每隔5分钟查询一下这个返奖率,如果用户频繁抽出大货,这个抽奖箱的返奖率已经高出了阈值,那么我们就将其下架。 2.自动发送导

    2024年02月09日
    浏览(9)
  • 对接钉钉机器人发送钉钉通知

    对接钉钉机器人发送钉钉通知

    实现效果 话不多说 直接上代码 http工具类

    2024年01月25日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包