import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.nio.charset.StandardCharsets;
public class WechatBot {
static String message = "这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第一行内容\n" +
"第二行内容\n" +
"第三行内容\n\n" +
"这是第四行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第0行内容\n" +
"第0行内容\n" +
"第0行内容\n\n" +
"这是第0行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第1行内容\n" +
"第1二行内容\n" +
"第1三行内容\n\n" +
"这是第1四行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第2一行内容\n" +
"第2二行内容\n" +
"第2三行内容\n\n" +
"这是第2四行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。\n"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第3一行内容\n" +
"第3二行内容\n" +
"第3三行内容\n\n" +
"这是第3四行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第4一行内容\n" +
"第4二行内容\n" +
"第4三行内容\n\n" +
"这是第4四行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第5一行内容\n" +
"第5二行内容\n" +
"第5三行内容\n\n" +
"这是第5四行内容,确保消息格式和内容的完整性。\n\n" +
"测试结束。"+"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试内容包括多个换行符,以确保消息能够正确处理并发送。\n\n" +
"第6一行内容\n" +
"第6二行内容\n" +
"第6三行内容\n\n" +
"这是第6四行内容,确保消息格式和内容的完整性测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能测试结束。\"+\"这是一个测试消息,用于验证企业微信群机器人的消息发送功能。\n\n" +
"测试结束。";
public static void main(String[] args) {
noticeSplittedMessages(message,"\n","https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=932af38b-7d7b-4b5c-befb-ab5bta8dcu74");
}
private static final int MAX_LENGTH = 4096;
/**
* 分段通知(适用于消息超过限制的内容)
*
* @param message 发送的消息
* @param splitBy 以什么作为分割标识,默认以“\n”
* @param robot 机器人 webhook
* @return true 如果所有消息段都成功发送,否则返回 false
*/
public static boolean noticeSplittedMessages(String message, String splitBy, String robot) {
// 默认分割标识
splitBy = (splitBy == null || splitBy.isEmpty()) ? "\n" : splitBy;
// 处理超出长度的消息
while (message.getBytes(StandardCharsets.UTF_8).length > MAX_LENGTH) {
int currentByteLength = 0;
int lastSplitIndex = -1;
// 找到最后一个分割标识的索引,并计算字节长度
for (int i = 0; i < message.length(); i++) {
char currentChar = message.charAt(i);
currentByteLength += String.valueOf(currentChar).getBytes(StandardCharsets.UTF_8).length;
if (currentByteLength > MAX_LENGTH) {
break;
}
if (message.substring(0, i + 1).endsWith(splitBy)) {
lastSplitIndex = i + 1;
}
}
// 如果没有找到分割标识或当前字节长度未超过MAX_LENGTH,直接在当前字节长度处分割
if (lastSplitIndex == -1 || currentByteLength <= MAX_LENGTH) {
lastSplitIndex = message.substring(0, MAX_LENGTH).getBytes(StandardCharsets.UTF_8).length;
}
// 获取分割的消息部分
String partToSend = message.substring(0, lastSplitIndex);
// 发送当前消息部分
noticeQWechat(robot,"markdown",partToSend);
// 更新剩余消息
message = message.substring(lastSplitIndex);
}
// 发送剩余的消息
return noticeQWechat(robot,"markdown",message);
}
/**
* 发送到企微机器人
* @param webhook
* @param msgType
* @param content
* @return
*/
public static boolean noticeQWechat(String webhook, String msgType, String content) {
// Log the message information
System.out.println("向:" + webhook.substring(webhook.length()-30) + " 发送消息:msgType=" + msgType + " 内容:" + content.substring(0, Math.min(content.length(), 50)));
// Prepare the JSON payload
JSONObject json = new JSONObject();
json.put("msgtype", msgType);
JSONObject msg = new JSONObject();
msg.put("content", content);
json.put(msgType, msg);
// Send the HTTP request
try (CloseableHttpClient client = HttpClients.createDefault()) {
HttpPost post = new HttpPost(webhook);
post.setEntity(new StringEntity(json.toJSONString(), ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = client.execute(post)) {
HttpEntity entity = response.getEntity();
String resp = EntityUtils.toString(entity);
JSONObject responseJson = JSON.parseObject(resp);
if (!"200".equals(responseJson.getString("status"))) {
return false;
}
}
} catch (Exception e) {
e.printStackTrace(); // Or use a logging framework
return false;
}
return true;
}
}