大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。
免责声明:该工具仅供学习使用,禁止使用该工具从事违法活动,否则永久拉黑封禁账号!!!本人不对任何工具的使用负责!!!
前言
最近改造了下机器人,接口改的更加灵活,可以通过自定义接口给自己的社群或者好友中。废弃掉之前的发送接口,简直为开发者的福音;不仅支持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){
//获取token
token = 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 = "";
//获取token
Object 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 = "";
//获取token
Object 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 {
// 等待随机延迟时间,如果需要换成分钟,则乘以60
Thread.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");
//预览图,需要小于200k
object.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/index
object.put("jumpUrl","pages/index/index");
//预览图,需要小于200k
object.put("path","https://blogobs.88688.team/blog/zaobao_logo.png");
//原始id gh_4a2xxxxx
object.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音乐/wx5aa333606550dfd5
object.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");
//图片地址,图片必须小于200k
object.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_eexxxxxx
object.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 文件 链接 小程序的xml
object.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());
}