【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

这篇具有很好参考价值的文章主要介绍了【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Java调用企业微信群机器人发送消息

2022/4/22更新:新增可发送文件消息。

发送文件消息需要先将文件上传到企业微信的临时素材,url为https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?type=file&key=**********,这个key就是群机器人Webhook地址的key参数,在代码里我已经处理好了,只要有Webhook地址就行。获取到media_id,再拿media_id和文件一起就可以调用群机器人的发送接口了。


2021/12/3 周五

主要参考 企业微信接口文档(但这里用的不是文档里的API) 和 企业微信机器人自动发送群消息 提供的方法,

将企业微信群机器人发送 文字、图片、MarkDown、文件消息 封装成了一个工具类

  • 用于自建的群,即不是使用企业微信api创建的群,不需要群id;
  • 主要使用 okhttp3 调用机器人api和上传文件到临时素材api;
  • 有含代理的构造方法和不含代理的构造方法,可根据需要选择调用;
  • 参数使用的是JSONObject,防止在用字符串拼接参数时出现各种特殊字符转义问题
  • 发送图片大小不超过2M(企业微信的规定)。

使用步骤:

1. 创建群机器人

在企业微信已经建好的群中,添加群机器人(怎么添加可以参考:企业微信机器人发送消息),获取群机器人的Webhook地址

需注意:

(1)因为不是用企业微信api创建的群,没有群id,无法指定群机器人只发送到某一个群,所以建议该机器人不要发布到公司或者添加到其他群

(2)还需注意群机器人Webhook地址的保密性,因为任何人拿到你的地址,就可以朝你的群里发消息了。

关于Webhook

Webhook是一个 API 概念,简单来说, 就是一个接收 HTTP POST(或GET,PUT,DELETE)的URL。

比如说我可以直接在postman测试工具里,带上需要的参数,向群机器人的Webhook地址发送请求,企业微信对应的群里就能收到这个机器人发送的消息。
【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)

2. 将工具类放到项目中,需要添加依赖

将工具类放到项目中,代码在最后。

需要在项目pom.xml文件中添加okhttp3图片操作的依赖:

<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.14.9</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>

(PS:如果图片过大,可能导致base64编码结果过长超过String的最大长度,导致图片发送失败。另外,企业微信也有规定图片不能超过2M.)

3. 调用

(1)直接 new 一个WeChatBotUtils,带上群机器人Webhook地址和代理服务器相关配置:

WeChatBotUtils robot = new WeChatBotUtils(url, hostname, port);

或者从配置中获取代理信息,就可以用第二个构造方法:

WeChatBotUtils robot = new WeChatBotUtils(url, true);

(如果不需要使用代理,改为false就可以了)

IDEA将代理信息配置在启动参数的方法如下图:
【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)
(2)带上对应消息内容参数,调用sendTextMsg(String msg)、sendImgMsg(String path)、sendMarKDownMsg(String msg)、sendFileMsg(String path)方法,即可发送请求:

robot.sendTextMsg(msg);
4. 返回参数

除了调用群机器人正常发送消息,还可能会有一些请求报错,比如图片大小无效、md5值不匹配等等,具体原因可以查看 企业微信全局错误码。

5. 代码

0积分下载资源:Java企业微信群机器人发送消息,可以直接放到项目里使用。

以下是代码:

package com.ruoyi.project.tool.robot;

import com.alibaba.fastjson.JSONObject;
import okhttp3.*;
import org.apache.commons.codec.digest.DigestUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Proxy;
import java.util.Base64;
import java.util.concurrent.TimeUnit;

/**
 * 微信群机器人
 */
public class WeChatBotUtils {

    private Logger log = LoggerFactory.getLogger(this.getClass());

    // 配置的群机器人Webhook地址
    private String botUrl;
    // 配置代理服务器
    private String hostname;
    private int port;

    // 需要使用代理时调用的构造函数
    public WeChatBotUtils(String botUrl, String hostname, int port) {
        this.botUrl = botUrl;
        this.hostname = hostname;
        this.port = port;
    }

    // 直接从配置中获取代理信息
    public WeChatBotUtils(String botUrl, boolean byProxy) {
        this.botUrl = botUrl;
        if (byProxy) {
            hostname = System.getProperty("proxyHost");
            port = Integer.valueOf(System.getProperty("proxyPort"));
        }
    }

    /**
     * 发送文字消息
     *
     * @param msg 需要发送的消息
     * @return
     * @throws Exception
     */
    public String sendTextMsg(String msg) throws Exception {
        JSONObject text = new JSONObject();
        text.put("content", msg);
        JSONObject reqBody = new JSONObject();
        reqBody.put("msgtype", "text");
        reqBody.put("text", text);
        reqBody.put("safe", 0);

        return callWeChatBot(reqBody.toString());
    }

    /**
     * 发送图片消息,需要对图片进行base64编码并计算图片的md5值
     *
     * @param path 需要发送的图片路径
     * @return
     * @throws Exception
     */
    public String sendImgMsg(String path) throws Exception {

        String base64 = "";
        String md5 = "";

        // 获取Base64编码
        try {
            FileInputStream inputStream = new FileInputStream(path);
            byte[] bs = new byte[inputStream.available()];
            inputStream.read(bs);
            base64 = Base64.getEncoder().encodeToString(bs);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 获取md5值
        try {
            FileInputStream inputStream = new FileInputStream(path);
            byte[] buf = new byte[inputStream.available()];
            inputStream.read(buf);
            md5 = DigestUtils.md5Hex(buf);
        } catch (IOException e) {
            e.printStackTrace();
        }

        JSONObject image = new JSONObject();
        image.put("base64", base64);
        image.put("md5", md5);
        JSONObject reqBody = new JSONObject();
        reqBody.put("msgtype", "image");
        reqBody.put("image", image);
        reqBody.put("safe", 0);

        return callWeChatBot(reqBody.toString());
    }

    /**
     * 发送MarKDown消息
     *
     * @param msg 需要发送的消息
     * @return
     * @throws Exception
     */
    public String sendMarKDownMsg(String msg) throws Exception {
        JSONObject markdown = new JSONObject();
        markdown.put("content", msg);
        JSONObject reqBody = new JSONObject();
        reqBody.put("msgtype", "markdown");
        reqBody.put("markdown", markdown);
        reqBody.put("safe", 0);

        return callWeChatBot(reqBody.toString());
    }

    /**
     * 发送文件消息,需要先将文件上传到企业微信临时素材,再根据获取的media_id调用群机器人
     *
     * @param path 需要发送的文件路径
     * @return
     * @throws Exception
     */
    public String sendFileMsg(String path) throws Exception {
        File file = new File(path);

        // 构造RequestBody对象,用来携带要提交的数据;需要指定MediaType,用于描述请求/响应 body 的内容类型
        MediaType contentType = MediaType.parse("application/form-data; boundary");
        RequestBody body = RequestBody.create(contentType, file);
        RequestBody requestBody = new MultipartBody.Builder()
                .setType(MultipartBody.FORM)
                .addFormDataPart("file", file.getName(), body)
                .build();

        // 上传到临时素材
        String key = botUrl.substring(botUrl.indexOf("key="));
        System.out.println(key);
        String mediaUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?type=file&"+key;
        log.info("将文件" + path+ "上传到临时素材:" + mediaUrl);
        String respMsg = okHttp(requestBody, mediaUrl);

        // 获取临时素材id
        JSONObject result = JSONObject.parseObject(respMsg);
        String media_id = result.getString("media_id");

        JSONObject fileJson = new JSONObject();
        fileJson.put("media_id", media_id);
        JSONObject reqBody = new JSONObject();
        reqBody.put("msgtype", "file");
        reqBody.put("file", fileJson);
        reqBody.put("safe", 0);

        // 调用群机器人发送消息
        return callWeChatBot(reqBody.toString());
    }

    /**
     * 调用群机器人
     *
     * @param reqBody 接口请求参数
     * @throws Exception 可能有IO异常
     */
    public String callWeChatBot(String reqBody) throws Exception {
        log.info("请求参数:" + reqBody);

        // 构造RequestBody对象,用来携带要提交的数据;需要指定MediaType,用于描述请求/响应 body 的内容类型
        MediaType contentType = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(contentType, reqBody);

        // 调用群机器人
        String respMsg = okHttp(body, botUrl);

        if ("0".equals(respMsg.substring(11, 12))) {
            log.info("向群发送消息成功!");
        } else {
            log.info("请求失败!");
            // 发送错误信息到群
            sendTextMsg("群机器人推送消息失败,错误信息:\n" + respMsg);
        }
        return respMsg;
    }

    /**
     *
     * @param body 携带需要提交的数据
     * @param url 请求地址
     * @return
     * @throws Exception
     */
    public String okHttp(RequestBody body, String url) throws Exception {
        // 构造和配置OkHttpClient
        OkHttpClient client;
        if(hostname != null && port != 0){
            client = new OkHttpClient.Builder()
                    .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostname, port))) // 内网使用代理,不需要可注释
                    .connectTimeout(10, TimeUnit.SECONDS) // 设置连接超时时间
                    .readTimeout(20, TimeUnit.SECONDS) // 设置读取超时时间
                    .build();
        } else{
            client = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS) // 设置连接超时时间
                    .readTimeout(20, TimeUnit.SECONDS) // 设置读取超时时间
                    .build();
        }

        // 构造Request对象
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .addHeader("cache-control", "no-cache") // 响应消息不缓存
                .build();

        // 构建Call对象,通过Call对象的execute()方法提交异步请求
        Response response = null;
        try {
            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 请求结果处理
        byte[] datas = response.body().bytes();
        String respMsg = new String(datas);
        log.info("返回结果:" + respMsg);

        return respMsg;
    }

}
6. 调用
public static void main(String[] args) throws Exception {

String botUrl = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=**********";
WeChatBotUtils weChatBot = new WeChatBotUtils(botUrl, true);

// 发送文本消息
weChatBot.sendTextMsg("测试消息\n" + "hello world!");

// 发送图片消息
weChatBot.sendImgMsg("C:/User/Desktop/test.jpg");

// 发送MarkDown消息
String markdownMsg =
        "测试:您的会议室已经预定,稍后会同步到`邮箱` \n" +
        "    >**事项详情** \n" +
        "    >事 项:<font color=\"info\">开会</font> \n" +
        "    >组织者:@admin \n" +
        "    >参与者:@admin \n" +
        "    >\n" +
        "    >会议室:<font color=\"info\">广州TIT 1楼 301</font>\n" +
        "    >日 期:<font color=\"warning\">2022年4月22日</font>\n" +
        "    >时 间:<font color=\"comment\">上午9:00-11:00</font>\n" +
        "    >\n" +
        "    >请准时参加会议。\n";
weChatBot.sendMarKDownMsg(markdownMsg);

// 发送文件消息
weChatBot.sendFileMsg("C:/User/Desktop/test.xlsx");

}

就介么简单~ ^_^文章来源地址https://www.toymoban.com/news/detail-401633.html

到了这里,关于【Java】企业微信群机器人发送消息(文字、图片、MarkDown、文件消息)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Jenkins 获取 Git 的提交记录(变更记录)通过机器人发送到企业微信群中

    如上,第一个就是文本,实测可以使用# 标题栏, 引用 其他的可以自己研究下. 下面这个是插件企业微信插件.  ##下面说明下. 缘起:通过企业微信插件已经能够实现较简单且有去的构建发布信息了. 但是过于简单的输出信息且插件不能直接自定义 ##需求:         在现有插件输出的

    2024年02月16日
    浏览(49)
  • 企业微信、飞书、钉钉机器人消息发送工具类

    其实你也可以使用RestTemplate,我这里主要是用到了webflux框架,所以需要实例化客户端请求对象

    2024年02月10日
    浏览(53)
  • 封装Python脚本:使用企业微信机器人发送消息至企业微信

    官方文档地址:https://developer.work.weixin.qq.com/document/path/91770#%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E7%BE%A4%E6%9C%BA%E5%99%A8%E4%BA%BA 可以通过如下步骤设置企业微信机器人: 首先建立或者进入某个群聊 进入群聊设置页面, 点击“群机器人添加”可添加一个机器人成功 添加成功后,复制并保

    2024年02月09日
    浏览(38)
  • Java实现钉钉企业内部应用机器和自定义机器人发送消息

     公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义

    2024年02月12日
    浏览(59)
  • 企业微信群:机器人实现定时提醒功能

    如果每天都需要,或者经常需要提醒企业微信群里面的人做某一件事情的话,靠人力去实现比较费力,而且偶尔忘记。 正好,企业微信群有一个机器人,正可以实现这一功能。 1、首先,在企业微信群,添加一个机器人。 2、根据企业微信机器人的配置说明,编写程序。这里

    2024年02月16日
    浏览(159)
  • C#使用企业微信群机器人推送生产数据

        在日常的工作生产中,经常会有将将生产数据或者一些信息主动推送给相关的管理人员,我们公司在开发WMS系统时,为了仓库的储存安全,需要在危废品库存达到一定的储量时,自动通知仓管员去处理危废品,所以就需要程序自动的通过企业微信告知仓管员,这个时候就

    2024年02月10日
    浏览(56)
  • Python实现企业微信群机器人自动化推送

    人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。 ——《百度百科》 实际工作中,有类似这样的场景, 需要将某些通知信息定期发送到企业微信群,需要将公司某些指标的异

    2024年02月09日
    浏览(64)
  • Zabbix 6.4 版本企业微信群机器人报警配置

    从Zabbix 5.4升级后配置企业微信报警发下原来的脚本代码报错,搜索一圈发下使因为新版本对里面的部分代码不支持,几经周折终于找到这段可用的代码。 告警-媒介-创建媒介类型 直接添加webhook类型脚本 Token是企业微信内建好的机器人webhook地址后面的参数 其他照填,很简单

    2024年02月15日
    浏览(41)
  • 企业微信群:机器人定时提醒功能数据库配置化

    目录 企微群机器人使用 APScheduler概要使用说明 cron方式设置 场景设置案例  表结构 代码 场景:对于周期性重复需要做的事情,每次都需要人工去提醒,容易忘记,而企业微信群可以添加群机器人,群机器人提供接口能力,按照接口格式说明把消息内容发到群里以及@相关人,

    2024年02月15日
    浏览(41)
  • mxxWechatBot微信机器人主动给机器人发送消息

    大家伙,我是雄雄,欢迎关注微信公众号:雄雄的小课堂。 注意: 免责声明:该工具仅供学习使用,禁止使用该工具从事违法活动,否则永久拉黑​封禁账号。 本工具我不会绝对保证对你的账号没有影响,尽量使用小号去研究学习, mxxWechatBot 不承担任何责任。 经过用户的

    2024年02月02日
    浏览(90)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包