当前位置: 首页 > news >正文

企业微信推送消息的Java实现教程

在这篇教程中,我们将介绍如何使用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. 配置 .envconfig.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 应用中,并在完成任务后实时通知相关人员。这种集成方式适用于各种需要实时通知的场景,如任务完成通知、错误警告等。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 解决svn上传代码,遇到文件冲突的问题
  • Python必备——高效配置与使用Pip换源
  • C++ | Leetcode C++题解之第331题验证二叉树的前序序列化
  • 【从零开始一步步学习VSOA开发】发布订阅重连时同步
  • 代码随想录算法训练营Day26 | Leetcode 455 分发饼干 Leetcode 376 摆动序列 Leetcode 53 最大子序和
  • 【CSharp】简单定义一个异步方法
  • python连接MySQL数据库使用pymysql
  • 嵌入式day25
  • SAP与网易大数据系统集成案例
  • C++实现单例模式/工厂模式
  • 质量管理理论(至简)
  • Latex或者word里面mathtype类型的数学公式如何变成mathematica里面的形式
  • 学习笔记--算法(双指针)7
  • 控制反转(IOC)VS 依赖注入(DI)
  • Go 语言常量 6
  • 【mysql】环境安装、服务启动、密码设置
  • Angular数据绑定机制
  • Github访问慢解决办法
  • iOS 系统授权开发
  • JavaScript类型识别
  • Java读取Properties文件的六种方法
  • passportjs 源码分析
  • Puppeteer:浏览器控制器
  • python 装饰器(一)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 笨办法学C 练习34:动态数组
  • 猴子数据域名防封接口降低小说被封的风险
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 警报:线上事故之CountDownLatch的威力
  • 前端攻城师
  • 前端之React实战:创建跨平台的项目架构
  • 使用agvtool更改app version/build
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • # 安徽锐锋科技IDMS系统简介
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (独孤九剑)--文件系统
  • (二)windows配置JDK环境
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (转)mysql使用Navicat 导出和导入数据库
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)Linux 多线程条件变量同步
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .net core docker部署教程和细节问题
  • .net core 使用js,.net core 使用javascript,在.net core项目中怎么使用javascript
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • @Repository 注解
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [20170713] 无法访问SQL Server
  • [BJDCTF2020]The mystery of ip1
  • [C#] 基于 yield 语句的迭代器逻辑懒执行
  • [Cloud Networking] Layer 2
  • [CLR via C#]11. 事件
  • [EFI]Lenovo ThinkPad X280电脑 Hackintosh 黑苹果引导文件