mxxWechatBot主动发送消息至微信

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。

免责声明:该工具仅供学习使用,禁止使用该工具从事违法活动,否则永久拉黑封禁账号!!!本人不对任何工具的使用负责!!!

前言

最近改造了下机器人,接口改的更加灵活,可以通过自定义接口给自己的社群或者好友中。废弃掉之前的发送接口,简直为开发者的福音;不仅支持java,其他类型的编程语言均可。

接口说明

为了避免接口被滥用,接口地址暂时隐藏,(详细接口地址请咨询博主或者进群查看):

1.获取token

接口:

/getWechatToken

代码示例:

/*** 获取服务端机器人的token*/public String getmxxWecharBotToken(){String url = APIURL + "/getWechatToken";JSONObject o = new JSONObject();o.put("username",LOGIN_USER_NAME);  //自己服务端的账号o.put("password",LOGIN_USER_PASSWORD); //自己服务端的密码String params = JSON.toJSONString(o);String body = HttpUtil.createPost(url).body(params).execute().body();log.info("请求获取服务端的token:{}",body);JSONObject jsonObject = JSON.parseObject(body);String token  = "";if(jsonObject.getInteger("code") == 200){//获取tokentoken = jsonObject.getString("token");//将token放在缓存中redisService.setCacheObject("mxxWechatBotToken",token,28, TimeUnit.MINUTES);}return token;}

入参说明:

序号字段名类型说明
1usernamestring服务端用户名
2passwordstring服务端密码

响应参数说明:

序号字段名类型说明示例
1msgstring接口返回信息操作成功
2codeint返回code200
3expireTimelongtoken失效时间1704810495445
4tokenstringtoken的值eyJhbGciOiJIUzUxMiJ9.eyJsb2dpbl91c2VyX2tleSI6ImE2OWE1ZTRkLWUyMjUtNGE1OS05NmMyLTVkYzcwNmNiYTJjZSJ9.eyGLy_smEeGH_d3u8QknBlcAyYxuJfqTxFyud4iN8mqLFQjSSp5Avz-MPvLXHG5EXq6oIlnN7tvA3jSFIN1GnA

2. 封装主动发送消息的公共接口

接口:

system/object/customApiSendMsg
请求方式

POST

Content-Type

json

请求Body参数
{"wxid": "xxxx@chatroom","tag": 0,"appkey": "xxxxx","message": "你好","isAt": false,"atList": ["wxid_ehfxxxxbt22"]
}
参数名示例值参数类型是否必填参数描述
wxidxxxxx@chatroomString需要发送的群或者好友
tag0Integer消息类型,-1设置百度的appkey和秘钥 0表示发送文字,1表示发送图片;2发送本地文件; 3发送H5小卡片; 4发送小程序 ; 5发送音乐卡片; 6发送xml文件; 7发送聊天记录 ; 8语言消息; 9名片消息 ;10视频消息; 11动态表情 ;12地理位置 ;13分享链接或者附件; 14红包 ;15群邀请 ;16系统消息 ; 17其他类型的xml;18引用消息

原文链接:https://blog.csdn.net/qq_34137397/article/details/135351008
appkey | xxxx | String | 是 | 用户appkey
message | 你好 | String | 是 | 消息
isAt | true | Boolean | 是 | 是否需要艾特
atList | wxid_ehfdzxxx | Array | 是 | 艾特的人

认证方式
bearer
成功响应示例
{"msg":"发送成功","code":200}
java中的调用示例:
 /*** 给微信机器人中发送信息的公共方法*/public String sendMsgToWechat(String wxid,Integer tag,String appkey,String message,boolean isAt,JSONArray atList){String url = WECHAT_SERVE_API + "/system/object/customApiSendMsg";String token = "";//获取tokenObject redisToken =  redisService.getCacheObject("mxxWechatRotToken");if (redisToken==null){token = getmxxWecharBotToken();}else{token = redisToken.toString();}log.info("token的值是{}",token);//将消息放在body中JSONObject paramsObject = new JSONObject();paramsObject.put("tag",tag);paramsObject.put("wxid",wxid);paramsObject.put("appkey",appkey);paramsObject.put("message",message);paramsObject.put("isAt",isAt);paramsObject.put("atList",atList);String body = HttpUtil.createPost(url).header(Header.AUTHORIZATION,"Bearer "+token).header(Header.CONTENT_TYPE,"application/json").body(JSON.toJSONString(paramsObject)).execute().body();log.info("给微信群中发送的结果:" + body);return body;}

3.6版本发送文本消息

效果

在这里插入图片描述

  • 换行单行使用\r
  • 换行两行使用\r\r或者\n

示例代码:

 /*** (微信机器人)每天早上6点将国内新闻发送至群中*/@GetMapping("/sendAlapiNewsV1")// @Scheduled(cron = " 0 0 6 * * ?")public void sendAlapiNewsV1() throws UnsupportedEncodingException {//请求接口中的数据String url = ALAPI_API+"/zaobao?token="+ALAPI_KEY+"&format=json";String body = HttpUtil.createGet(url).execute().body();JSONObject objectResult = JSON.parseObject(body);Integer code = objectResult.getInteger("code");JSONObject object = new JSONObject();StringBuilder sb = new StringBuilder();if (code != 200) {log.info("获取新闻失败");return;}SimpleDateFormat formatChina = new SimpleDateFormat("yyyy年MM月dd日");// 将今天日期转换为 SimpleDateFormat 格式,并将明天的日期转换为 SimpleDateFormat 格式String todayDate = formatChina.format(new Date());//根据阳历计算农历Calendar today = Calendar.getInstance();today.setTime(new Date());Date tomorrowDate = today.getTime();String dateTomorrow = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()).format(tomorrowDate);sb.append("早上好[太阳],今天是:" + todayDate);String week = "";try {week = DateUtils.getDaysByWeekChina(dateTomorrow);DateUtils lunar = new DateUtils(today);String nongli = lunar.toString();nongli = nongli.substring(nongli.indexOf("年") + 1);sb.append(",星期").append(week).append(",农历").append(nongli);} catch (ParseException e) {e.printStackTrace();}sb.append("。每天三分钟,读懂全世界!祝:工作愉快,生活喜乐!");sb.append("\r");JSONObject dataObject = objectResult.getJSONObject("data");//获取微语String weiyu = dataObject.getString("weiyu");//获取新闻列表JSONArray arrayNews = dataObject.getJSONArray("news");int index = 1;for (Object o : arrayNews) {sb.append(o);if (index == 7) {sb.append("#公众号:雄雄的小课堂");}sb.append("\r");index++;}sb.append("\r");sb.append(weiyu);sb.append("\r");sb.append("\r");String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_TEXT,XIAOTANGYUAN_REBOT_APPKEY,sb.toString(),false,new JSONArray());log.info("发送新闻信息结果:" + result);}

3.7版本发送文本消息

效果

  • 换行单行使用\r
  • 换行两行使用\r\r或者\n
    /*** 给微信机器人中发送信息的公共方法* wxid:群的wxid* tag:消息类型* message:消息* userNickList:需要艾特的用户昵称* userNameList:需要艾特的用户wxid*/public String sendMsgToWechatV37(String wxid,Integer tag,String appkey,String message,JSONArray userNameList,JSONArray userNickList){//String url = WECHAT_SERVE_API + "/system/object/customApiSendMsg";String url = WECHAT_SERVE_API + "/system/object/customApiSendMsg";String token = "";//获取tokenObject redisToken =  redisService.getCacheObject("mxxWechatRotToken");if (redisToken==null){token = getmxxWecharBotToken();}else{token = redisToken.toString();}//将消息放在body中JSONObject paramsObject = new JSONObject();paramsObject.put("tag",tag);paramsObject.put("chatRoomName",wxid);paramsObject.put("appkey",appkey);paramsObject.put("message",message);paramsObject.put("version","3730");paramsObject.put("userNickList",userNickList);paramsObject.put("userNameList",userNameList);String body = HttpUtil.createPost(url).header(Header.AUTHORIZATION,"Bearer "+token).header(Header.CONTENT_TYPE,"application/json").body(JSON.toJSONString(paramsObject)).execute().body();log.info(paramsObject.toString());log.info("给微信群中发送的结果:" + body);return body;}

需要注意的是:

  • chatRoomName:群的wxid
  • version:版本号,如果是3.7,则传入:3730
  • userNickList:需要艾特的好友昵称
  • userNameList:需要艾特的好友wxid

3.7版本在自定义接口中,客户端传给用户业务端时,会多传入两个字段,分别为:

  • finalFromNick:发消息人的昵称
  • fromNick:群的昵称
    这两个字段传给用户业务端后,用户可以更便捷的实现艾特发消息的人进行进一步操作。

发送图片消息

效果

在这里插入图片描述

注意,message的值为图片的地址,或者本地图片路径或者网络直链。

代码示例:

/*** (微信机器人)定时发送每日天气图片到微信群中*/@GetMapping("/sendWetherInfoByDaysImg")@Scheduled(cron = " 0 1 9 * * ?")public void sendWetherInfoByDaysImg() {//获取中央气象台每日天气信息JSONObject objectZhongYang = collectWebDataUtils.getZYWetherDay();//图片信息JSONArray imgList = objectZhongYang.getJSONArray("imgArray");for (int i = 0; i < imgList.size() - 1; i++) {// 生成一个 1-5 秒之间的随机延迟Random random = new Random();int delay = random.nextInt(5) + 1; // 生成一个 1-10 的随机整数try {// 等待随机延迟时间,如果需要换成分钟,则乘以60Thread.sleep(delay * 1000);String imgPath = imgList.get(i).toString();String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_IMG,XIAOTANGYUAN_REBOT_APPKEY,imgPath,false,new JSONArray());log.info("发送天气图片信息结果:" + result);} catch (Exception e) {e.printStackTrace();}}}

发送本地文件

效果

在这里插入图片描述

代码示例

 /*** (微信机器人)定时发送每日天气图片到微信群中*/@GetMapping("/sendWetherInfoByDaysImg")@Scheduled(cron = " 0 1 9 * * ?")public void sendWetherInfoByDaysImg() {sendMsgToWechat(xunXiWxid, XIAOTANGYUAN_REBOT_File, XIAOTANGYUAN_REBOT_APPKEY, "D://muxiongxiong.txt",false,new JSONArray());}

对,就这么简单。message为本地文件的路径。

发送xml消息

效果

在这里插入图片描述

在这里插入图片描述

代码示例:

@GetMapping("/sendH5")public void sendH5(){JSONObject object = new JSONObject();//标题object.put("title","雄雄的小课堂");//描述object.put("content","这是内容描述");//跳转连接object.put("jumpUrl","https://www.88688.team");//预览图,需要小于200kobject.put("path","https://blogobs.88688.team/blog/zaobao_logo.png");String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_H5,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),false,new JSONArray());System.out.println("发送情况:"+result);}

其中,message的格式为如下json

{"title":"标题","content":"这是内容描述","jumpUrl":"https://www.88688.team","path":"https://blogobs.88688.team/blog/zaobao_logo.png"
}

设置百度的appkey

主要用于百度文心大模型,在群内可以直接使用;

效果

在这里插入图片描述
在这里插入图片描述

代码

 /*** 设置百度的key之类的*/@GetMapping("/sendSetBaiDuKey")public void sendSetBaiDuKey(){JSONObject object = new JSONObject();//标题object.put("baiduApiKey","你的");//描述object.put("baiduSecretKey","你的");//处理url中的特殊字符try{String result = sendMsgToWechat(xunXiWxid,-1,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),false,new JSONArray());log.info("发送信息结果:" + result);}catch (Exception e){e.printStackTrace();}}

发送小程序卡片

效果

在这里插入图片描述

代码示例

自己根据我的代码,看下封装的json哈,我都有注释,困了,写完赶紧睡觉,我就不写那么详细了。

/*** 发送小程序卡片*/@GetMapping("/sendApplet")public void sendApplet(){JSONObject object = new JSONObject();//标题object.put("title","雄雄的工具箱");//描述object.put("content","一款万能免费的工具箱");//点击跳转地址:pages/index/indexobject.put("jumpUrl","pages/index/index");//预览图,需要小于200kobject.put("path","https://blogobs.88688.team/blog/zaobao_logo.png");//原始id gh_4a2xxxxxobject.put("gh","gh_4axxxxxxx");//处理url中的特殊字符try{String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_Applet,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),false,new JSONArray());log.info("发送信息结果:" + result);}catch (Exception e){e.printStackTrace();}}

发送音乐卡片

效果

在这里插入图片描述

代码

/*** 发送音乐卡片*/@GetMapping("/sendMusic")public void sendMusic(){JSONObject object = new JSONObject();//歌曲名称object.put("name","好汉歌");//作者object.put("author","刘欢");//appid   例如:酷狗/wx79f2c4418704b4f8,网易云/wx8dd6ecd81906fd84,QQ音乐/wx5aa333606550dfd5object.put("app","wx5aa333606550dfd5");//点击跳转地址object.put("jumpUrl","http://y.qq.com/n/yqq/song/003flDfR0oxrPX.html");//音乐地址object.put("musicUrl","http://y.qq.com/n/yqq/song/003flDfR0oxrPX.html");//图片地址,图片必须小于200kobject.put("imageUrl","https://y.qq.com/music/photo_new/T002R300x300M000001nYpd82yFZOK_1.jpg");//处理url中的特殊字符try{String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_Music,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),false,new JSONArray());log.info("发送信息结果:" + result);}catch (Exception e){e.printStackTrace();}}

发送xml文件

效果

在这里插入图片描述

代码

/*** 发送xml文件*/@GetMapping("/sendXml")public void sendXml(){JSONObject object = new JSONObject();//歌曲名称object.put("title","穆雄雄的博客");//描述object.put("des","公众号:雄雄的小课堂");//链接object.put("url","https://www.88688.team");//封面object.put("thumburl","https://blogobs.88688.team/blog/zaobao_logo.png");//来源id,如果是公众号,则是gh_eexxxxxxobject.put("sourceusername","gh_ee62xxxxc6");//来源名字object.put("sourcedisplayname","雄雄的小课堂");//处理url中的特殊字符try{String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_XML,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),false,new JSONArray());log.info("发送信息结果:" + result);}catch (Exception e){e.printStackTrace();}}

发送聊天记录

效果图

在这里插入图片描述

代码示例

/*** 发送聊天记录*/@GetMapping("/sendRecord")public void sendRecord(){JSONObject object = new JSONObject();//歌曲名称object.put("title","公众号:雄雄的小课堂");JSONArray array = new JSONArray();JSONObject arrayObject = new JSONObject();arrayObject.put("wxid","wxid_ehfdzccct22");arrayObject.put("nickName","雄雄");arrayObject.put("timestamp",System.currentTimeMillis());arrayObject.put("msg","你说的是啥小程序来着?雄雄的工具箱");array.add(arrayObject);object.put("data",array);//处理url中的特殊字符try{String result = sendMsgToWechat(xunXiWxid,XIAOTANGYUAN_REBOT_Record,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),false,new JSONArray());log.info("发送信息结果:" + result);}catch (Exception e){e.printStackTrace();}}

发送引用消息

效果图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

请求参数如下

{"tag": 18,            //消息类型"appkey":"你的appkey","version":"3730",     //版本号,3618版本不支持引用消息,只有这个版本支持"chatRoomName":"filehelper","userNickList":[],	//需要艾特用户的昵称"userNameList":[],//需要艾特用户的wxid"message": {"content": "这是引用一条消息","subType": 1701,      //引用消息的类型,1701:文字  1703图片的mxl  1747动态表情的xml  1749 文件 链接 小程序的xml"param": "我是原文信息" //引用消息的参数,例如:文字内容,图片的mxl,动态表情的xml,文件的url,小程序的xml}
}

代码示例

/*** 发送引用消息*/
@GetMapping("/sendYinYong")
public void sendYinYong(){JSONObject object = new JSONObject();//描述object.put("content","这是一条引用消息");//跳转连接object.put("param","公众号:雄雄的小课堂");//引用消息的类型,1701:文字  1703图片的mxl  1747动态表情的xml  1749 文件 链接 小程序的xmlobject.put("subType",1701);//处理url中的特殊字符try{String result = sendMsgToWechatV37(testWxid,18,XIAOTANGYUAN_REBOT_APPKEY,object.toString(),new JSONArray(),new JSONArray());log.info("发送信息结果:" + result);}catch (Exception e){e.printStackTrace();}
}

移除群成员

效果图

请求参数如下

{"tag": 19,            //消息类型"appkey":"你的appkey","version":"3730",     //版本号,3618版本不支持引用消息,只有这个版本支持"chatRoomName":"xxxxxx@chatroom",   //群聊wxid"userNameList":[]  //需要移除的群成员的wxid
}

代码示例

/*** 移除群成员* @param fromWxid   群聊的wxid* @param userNameList  要踢掉的人的wxid*  @param finalFromWxid  发送指令的人的wxid*/
public void delUser(String fromWxid, JSONArray userNameList,String finalFromWxid){if (userNameList.isEmpty()) {return;}//发指令者必须是群管理if(!finalFromWxid.equals(WECHAT_WXID)){return;}//踢人sendMsgToWechatV37(fromWxid, 19, "xxx","",  userNameList, new JSONArray());//发送消息String text = "踢掉了 \uFE0F ";sendMsgToWechatV37(fromWxid, XIAOTANGYUAN_REBOT_TEXT, "xxxx", text,  new JSONArray(), new JSONArray());}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/466276.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++多态重难点

CSDN上已经有很多关于C多态方面的一些系统介绍了&#xff0c;但是我看了一下一些有关于多态问题的细节问题文章较少&#xff0c;因此我想要出一片文章重点讲一讲我认为比较重点且容易被遗忘的知识点&#xff0c;一些比较基本的知识这里就不过多赘述了&#xff0c;可以参考其他优…

AtCoder Beginner Contest 340(A-G)

A - Arithmetic Progression (atcoder.jp) 1.思路&#xff1a;循环输出即可 2.代码&#xff1a; #include <bits/stdc.h> #define rep(i,z,n) for(int i z;i < n; i) #define per(i,n,z) for(int i n;i > z; i--) #define PII pair<int,int> #define fi f…

2024年2月5日-2月11日周报

论文阅读 1. 本周计划2. 完成情况2.1 论文摘要2.2 网络结构2.3 损失函数2.4 优化器2.5 代码2.5.1 代码结果2.5.2 代码大致流程 4. 总结及收获4. 下周计划 1. 本周计划 阅读论文《Data-Driven Seismic Waveform Inversion: A Study on the Robustness and Generalization》并实…

TELNET 远程终端协议

远程终端协议 TELNET TELNET 是一个简单的远程终端协议&#xff0c;也是互联网的正式标准。 用户用 TELNET 就可在其所在地通过 TCP 连接注册&#xff08;即登录&#xff09;到远地的另一个主机上&#xff08;使用主机名或 IP 地址&#xff09;。 TELNET 能将用户的击键传到…

为什么总有人觉得前端很简单?尤其是水平半瓶水的人。

造成这个印象的原因很多&#xff0c;贝格前端工场结合自己的经验&#xff0c;为大家揭开这个谜底。低端的前端确实简单&#xff0c;但是高级阶段确实不简单。 缺乏深入了解&#xff1a; 有些人可能只是对前端开发有一些浅显的了解&#xff0c;没有深入研究过前端开发的技术和知…

T-Sql 也能更新修改查询JSON?

今天看见一个澳洲项目里面使用了 JSON_VALUE 这样的函数解析 JSON 我倍感诧异&#xff0c;我印象当中Sql Server并不支持JOSN的相关操作&#xff0c;他最多只把JSON当成一个字符串来存储&#xff0c;更不要说去解析&#xff0c;查询和更新了 我随后查询了下此函数&#xff0c;…

第三节 zookeeper基础应用与实战2

目录 1. Watch事件监听 1.1 一次性监听方式&#xff1a;Watcher 1.2 Curator事件监听机制 2. 事务&异步操作演示 2.1 事务演示 2.2 异步操作 3. Zookeeper权限控制 3.1 zk权限控制介绍 3.2 Scheme 权限模式 3.3 ID 授权对象 3.4 Permission权限类型 3.5 在控制台…

牛客周赛 Round 32 解题报告 | 珂学家 | 状压 + 前缀和异或map技巧

前言 整体评价 属于补题&#xff0c;大致看了下&#xff0c;题都很典。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏 A. 小红的 01 背包 思路: 数学题 v, x, y list(map(int, input().split()))print (v // x * y)B. 小红的 dfs 思路: 枚举 其实横竖都有dfs…

Java编程练习之类的继承

1.创建银行卡类&#xff0c;并分别设计两个储蓄卡和信用卡子类。 import javax.swing.plaf.BorderUIResource;import java.util.Scanner;class Card {int Id; //银行卡&#xff1b;int password; //密码&#xff1b;double balance2000; //账户存款金额&#xff1b;String A…

软件安全测试报告如何编写?权威的安全测试报告如何获取?

软件安全测试报告是一份详尽的文件&#xff0c;它主要通过对软件进行全面、系统的测试&#xff0c;评估软件的安全性&#xff0c;并在测试结束后起草编写的报告。该报告能清晰地展示出软件的各项安全风险以及潜在威胁&#xff0c;为用户提供安全方面的决策依据&#xff0c;并帮…

指针的基本含义及其用法

1.前言 在学习C语言的时候&#xff0c;我们会经常接触一个概念&#xff0c;指针和地址&#xff0c;关于这两个概念很多人并不能理解地十分透彻&#xff0c;接下来我将详细介绍一下这两者的概念 2.地址 我们知道计算机的上CPU&#xff08;中央处理器&#xff09;在处理数据的时…

Java常用类与基础API--String的理解与不可变性

文章目录 一、字符串相关类之不可变字符序列&#xff1a;String&#xff08;1&#xff09;对String类的理解(以JDK8为例说明)1、环境2、类的声明3、内部声明的属性 &#xff08;2&#xff09;String的特性&#xff08;3&#xff09;字符串常量的存储位置1、举例2、String的存储…