大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。
免责声明:该工具仅供学习使用,禁止使用该工具从事违法活动,否则永久拉黑封禁账号!!!本人不对任何工具的使用负责!!!
前言
最近改造了下机器人,接口改的更加灵活,可以通过自定义接口给自己的社群或者好友中。废弃掉之前的发送接口,简直为开发者的福音;不仅支持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;}
入参说明:
序号 | 字段名 | 类型 | 说明 |
---|---|---|---|
1 | username | string | 服务端用户名 |
2 | password | string | 服务端密码 |
响应参数说明:
序号 | 字段名 | 类型 | 说明 | 示例 |
---|---|---|---|---|
1 | msg | string | 接口返回信息 | 操作成功 |
2 | code | int | 返回code | 200 |
3 | expireTime | long | token失效时间 | 1704810495445 |
4 | token | string | token的值 | 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"]
}
参数名 | 示例值 | 参数类型 | 是否必填 | 参数描述 |
---|---|---|---|---|
wxid | xxxxx@chatroom | String | 是 | 需要发送的群或者好友 |
tag | 0 | Integer | 是 | 消息类型,-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());}