在这篇教程中,我们将介绍如何使用Java实现企业微信的消息推送功能,特别是在完成任务后,将结果信息通过企业微信推送给指定的用户。我们将基于您提供的代码进行说明。
1. 环境准备
1.1 依赖库
在开始编写代码之前,确保您的项目中已经引入了必要的依赖库。以下是 pom.xml
文件中的依赖配置:
<dependencies>
<!-- Apache HttpClient 用于发送 HTTP 请求 -->
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.1</version>
</dependency>
<!-- SnakeYAML 用于解析 YAML 文件 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.0</version>
</dependency>
<!-- dotenv-java 用于加载 .env 文件中的环境变量 -->
<dependency>
<groupId>io.github.cdimascio</groupId>
<artifactId>dotenv-java</artifactId>
<version>2.2.0</version>
</dependency>
<!-- Lombok 提供日志功能和简化代码 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<scope>provided</scope>
</dependency>
</dependencies>
确保您已经正确配置了这些依赖项,以便后续的代码可以正常运行。
2. 编写推送消息的核心代码
在 utils
包下创建一个 Bot
类,用于处理消息推送的逻辑。以下是该类的代码:
package utils;
import io.github.cdimascio.dotenv.Dotenv;
import lombok.extern.slf4j.Slf4j;
import org.apache.hc.client5.http.fluent.Request;
import org.yaml.snakeyaml.Yaml;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
@Slf4j
public class Bot {
private static final String HOOK_URL;
private static boolean isSend;
static {
// 加载环境变量
Dotenv dotenv = Dotenv.load();
HOOK_URL = dotenv.get("HOOK_URL");
// 加载 config.yaml 配置
try (FileInputStream fis = new FileInputStream("src/main/resources/config.yaml")) {
Yaml yaml = new Yaml();
Map<String, Object> config = yaml.load(fis);
log.info("YAML 配置内容: {}", config);
// 获取 bot 配置,使用安全的类型转换方法
Map<String, Object> botConfig = safeCast(config.get("bot"), Map.class);
if (botConfig != null && botConfig.get("is_send") != null) {
isSend = safeCast(botConfig.get("is_send"), Boolean.class);
} else {
log.warn("配置文件中缺少 'bot.is_send' 键或值为空,不发送消息。");
isSend = false;
}
} catch (IOException e) {
log.error("读取 config.yaml 异常:{}", e.getMessage());
isSend = false; // 如果读取配置文件失败,默认不发送消息
}
}
public static void sendWeChatMessage(String message) {
if (!isSend) {
log.info("消息推送已禁用。");
return;
}
// 格式化当前时间
String currentTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
String formattedMessage = String.format("%s %s", currentTime, message);
// 发送HTTP请求
try {
String response = Request.post(HOOK_URL)
.bodyString("{\"msgtype\": \"text\", \"text\": {\"content\": \"" + formattedMessage + "\"}}",
org.apache.hc.core5.http.ContentType.APPLICATION_JSON)
.execute()
.returnContent()
.asString();
log.info("消息发送成功: {}", response);
} catch (Exception e) {
log.error("消息发送失败: {}", e.getMessage());
}
}
public static void main(String[] args) {
// 示例调用
sendWeChatMessage("电脑正在关机,请查看原因");
}
/**
* 通用的安全类型转换方法,避免未检查的类型转换警告
* @param obj 要转换的对象
* @param clazz 目标类型的 Class 对象
* @param <T> 目标类型
* @return 如果对象类型匹配,则返回转换后的对象,否则返回 null
*/
@SuppressWarnings("unchecked")
public static <T> T safeCast(Object obj, Class<T> clazz) {
if (clazz.isInstance(obj)) {
return (T) obj;
} else {
return null;
}
}
}
3. 配置 .env
和 config.yaml
3.1 配置 .env
文件
在项目的根目录下创建 .env
文件,用于存放企业微信的 Webhook URL。
HOOK_URL=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_key_here
将 your_key_here
替换为您在企业微信上创建的自定义机器人所提供的密钥。
3.2 配置 config.yaml
文件
在 src/main/resources/
目录下创建 config.yaml
文件,配置是否启用消息推送。
bot:
is_send: true
4. 集成推送逻辑到您的业务代码
现在,您可以将 sendWeChatMessage
方法集成到您的业务逻辑中。例如,您可以在完成某个任务后调用此方法来推送结果。
private static void printResult() {
// 构建日志和消息内容
String message = String.format("投递完成,共投递 %d 个岗位!\n今日投递岗位:\n%s",
resultList.size(),
String.join("\n", resultList));
// 打印到日志
log.info(message);
// 发送微信消息
Bot.sendWeChatMessage(message);
}
5. 运行程序
确保您的 .env
文件和 config.yaml
文件已经正确配置,然后运行您的 Java 程序。当业务逻辑调用 printResult
方法时,结果将自动推送到您在企业微信中配置的群聊中。
6. 常见问题排查
- 无法发送消息:确保您的
HOOK_URL
正确配置,并且企业微信机器人没有被禁用。 - 消息发送失败:检查
config.yaml
中的is_send
是否设置为true
。 - 调试日志:您可以通过日志 (
log.info
,log.error
) 来查看程序的运行情况和错误信息。
结论
通过以上步骤,您可以轻松地将企业微信消息推送集成到您的 Java 应用中,并在完成任务后实时通知相关人员。这种集成方式适用于各种需要实时通知的场景,如任务完成通知、错误警告等。