【Java】企业微信机器人自动发送群消息

1.先在群里添加机器人,然后获取机器人的webhook地址:

2.有多种方式发送群消息,可以采用curl,也可以采用发送https请求的方式,我这里采用okhttp发送http请求,pom如下:

<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
        <dependency>
            <groupId>com.squareup.okhttp3</groupId>
            <artifactId>okhttp</artifactId>
            <version>4.9.0</version>
        </dependency>

调用okhttp核心代码如下:

/**
*	@content:要发送的消息
*	WECHAT_GROUP:机器人的webhook
*/
public static String callWeChatBot(String content) {
          
   
        OkHttpClient client = new OkHttpClient()
                .newBuilder()
                .build();
        MediaType mediaType = MediaType.parse("application/json");
        RequestBody body = RequestBody.create(content,mediaType);
        Request request = new Request.Builder()
                .url(WECHAT_GROUP)
                .method("POST", body)
                .addHeader("Content-Type", "application/json")
                .build();
        Response response = null;
        try {
          
   
            response = client.newCall(request).execute();
        } catch (IOException e) {
          
   
            e.printStackTrace();
        }
        return response.message();
    }

3.生成核心方法的参数,如果发送markdown格式的消息:

public static String generalBotBodyInfo(File f1, File f2, String cusenv, String myenv) {
          
   
        String content = "**信息摘要:** 
" +
                ">文件1:<font color=\"info\">" + f1.getName() + "</font>
 " +
                ">服务器路径:<font color=\"info\">" + f1.getAbsolutePath() + "</font>
" +
                ">文件传输环境:<font color=\"info\">" + myenv + "</font>
 " +
                ">客户接受环境:<font color=\"info\">" + cusenv + "</font>
" +
                ">时间:<font color=\"info\">" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + "</font>";

        String textTemplate = "{
" +
                "    "msgtype": "markdown",
" +
                "    "markdown": {
" +
                "        "content": "" + content + "",
" +
                "    }
" +
                "}";
        return textTemplate;
    }

如果发送text格式的消息:

public static String generalBotBodyAT() {
          
   
        String textTemplate = "{
" +
                "    "msgtype": "text",
" +
                "    "text": {
" +
                "        "content": "今天下午大暴雨",
" +
                "        "mentioned_list":["@all"],
" +
                "    }
" +
                "}";
        return textTemplate;
    }

如果发送图片,不能超过2M,支持的格式为JPG,PNG格式:

发送图片需要对图片进行base64编码并计算图片的md5值,把计算的方法也一并献上,需要注意图片不要过大,不然base64编码的结果会超级长,甚至超过String的最大长度,java.util.Base64这个工具类有现成的,直接用就行

public static String getFileBase64(String path){
          
   
        try {
          
   
            FileInputStream inputStream = new FileInputStream(new File(path));
            byte [] bs = new byte[inputStream.available()];
            inputStream.read(bs);
            return Base64.getEncoder().encodeToString(bs);
        } catch (FileNotFoundException e) {
          
   
            e.printStackTrace();
        }catch (IOException e){
          
   
            e.printStackTrace();
        }
        return null;
    }

计算md5值方法多种多样,如果你发送的图片是固定的,建议算好后直接用常量保存就行,比如我发送的是个表情包,就提前算好了。如果你是windows系统可以用好压之类的工具直接查看文件的md5,如果你是mac os系统,可以这样: 如果图片是动态的,可以用java现成的工具类直接计算它的md5,pom如下:

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>

代码:

public static String getFileMD5(String path) {
          
   
        try {
          
   
            FileInputStream inputStream = new FileInputStream(new File(path));
            byte[] buf = new byte[inputStream.available()];
            inputStream.read(buf);
            return DigestUtils.md5Hex(buf);
        } catch (IOException e) {
          
   
            e.printStackTrace();
        }
        return null;
    }

以上。

经验分享 程序员 微信小程序 职场和发展