国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Java】企業(yè)微信群機(jī)器人發(fā)送消息(文字、圖片、MarkDown、文件消息)

這篇具有很好參考價(jià)值的文章主要介紹了【Java】企業(yè)微信群機(jī)器人發(fā)送消息(文字、圖片、MarkDown、文件消息)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

Java調(diào)用企業(yè)微信群機(jī)器人發(fā)送消息

2022/4/22更新:新增可發(fā)送文件消息。

發(fā)送文件消息需要先將文件上傳到企業(yè)微信的臨時(shí)素材,url為https://qyapi.weixin.qq.com/cgi-bin/webhook/upload_media?type=file&key=**********,這個(gè)key就是群機(jī)器人Webhook地址的key參數(shù),在代碼里我已經(jīng)處理好了,只要有Webhook地址就行。獲取到media_id,再拿media_id和文件一起就可以調(diào)用群機(jī)器人的發(fā)送接口了。


2021/12/3 周五

主要參考 企業(yè)微信接口文檔(但這里用的不是文檔里的API) 和 企業(yè)微信機(jī)器人自動(dòng)發(fā)送群消息 提供的方法,

將企業(yè)微信群機(jī)器人發(fā)送 文字、圖片、MarkDown、文件消息 封裝成了一個(gè)工具類。

  • 用于自建的群,即不是使用企業(yè)微信api創(chuàng)建的群,不需要群id;
  • 主要使用 okhttp3 調(diào)用機(jī)器人api和上傳文件到臨時(shí)素材api;
  • 有含代理的構(gòu)造方法和不含代理的構(gòu)造方法,可根據(jù)需要選擇調(diào)用;
  • 參數(shù)使用的是JSONObject,防止在用字符串拼接參數(shù)時(shí)出現(xiàn)各種特殊字符轉(zhuǎn)義問(wèn)題;
  • 發(fā)送圖片大小不超過(guò)2M(企業(yè)微信的規(guī)定)。

使用步驟:

1. 創(chuàng)建群機(jī)器人

在企業(yè)微信已經(jīng)建好的群中,添加群機(jī)器人(怎么添加可以參考:企業(yè)微信機(jī)器人發(fā)送消息),獲取群機(jī)器人的Webhook地址。

需注意:

(1)因?yàn)椴皇怯闷髽I(yè)微信api創(chuàng)建的群,沒(méi)有群id,無(wú)法指定群機(jī)器人只發(fā)送到某一個(gè)群,所以建議該機(jī)器人不要發(fā)布到公司或者添加到其他群。

(2)還需注意群機(jī)器人Webhook地址的保密性,因?yàn)槿魏稳四玫侥愕牡刂?,就可以朝你的群里發(fā)消息了。

關(guān)于Webhook

Webhook是一個(gè) API 概念,簡(jiǎn)單來(lái)說(shuō), 就是一個(gè)接收 HTTP POST(或GET,PUT,DELETE)的URL。

比如說(shuō)我可以直接在postman測(cè)試工具里,帶上需要的參數(shù),向群機(jī)器人的Webhook地址發(fā)送請(qǐng)求,企業(yè)微信對(duì)應(yīng)的群里就能收到這個(gè)機(jī)器人發(fā)送的消息。
【Java】企業(yè)微信群機(jī)器人發(fā)送消息(文字、圖片、MarkDown、文件消息)

2. 將工具類放到項(xiàng)目中,需要添加依賴

將工具類放到項(xiàng)目中,代碼在最后。

需要在項(xiàng)目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:如果圖片過(guò)大,可能導(dǎo)致base64編碼結(jié)果過(guò)長(zhǎng)超過(guò)String的最大長(zhǎng)度,導(dǎo)致圖片發(fā)送失敗。另外,企業(yè)微信也有規(guī)定圖片不能超過(guò)2M.)

3. 調(diào)用

(1)直接 new 一個(gè)WeChatBotUtils,帶上群機(jī)器人Webhook地址和代理服務(wù)器相關(guān)配置:

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

或者從配置中獲取代理信息,就可以用第二個(gè)構(gòu)造方法:

WeChatBotUtils robot = new WeChatBotUtils(url, true);

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

IDEA將代理信息配置在啟動(dòng)參數(shù)的方法如下圖:
【Java】企業(yè)微信群機(jī)器人發(fā)送消息(文字、圖片、MarkDown、文件消息)
(2)帶上對(duì)應(yīng)消息內(nèi)容參數(shù),調(diào)用sendTextMsg(String msg)、sendImgMsg(String path)、sendMarKDownMsg(String msg)、sendFileMsg(String path)方法,即可發(fā)送請(qǐng)求:

robot.sendTextMsg(msg);
4. 返回參數(shù)

除了調(diào)用群機(jī)器人正常發(fā)送消息,還可能會(huì)有一些請(qǐng)求報(bào)錯(cuò),比如圖片大小無(wú)效、md5值不匹配等等,具體原因可以查看 企業(yè)微信全局錯(cuò)誤碼。

5. 代碼

0積分下載資源:Java企業(yè)微信群機(jī)器人發(fā)送消息,可以直接放到項(xiàng)目里使用。

以下是代碼:

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;

/**
 * 微信群機(jī)器人
 */
public class WeChatBotUtils {

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

    // 配置的群機(jī)器人Webhook地址
    private String botUrl;
    // 配置代理服務(wù)器
    private String hostname;
    private int port;

    // 需要使用代理時(shí)調(diào)用的構(gòu)造函數(shù)
    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"));
        }
    }

    /**
     * 發(fā)送文字消息
     *
     * @param msg 需要發(fā)送的消息
     * @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());
    }

    /**
     * 發(fā)送圖片消息,需要對(duì)圖片進(jìn)行base64編碼并計(jì)算圖片的md5值
     *
     * @param path 需要發(fā)送的圖片路徑
     * @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());
    }

    /**
     * 發(fā)送MarKDown消息
     *
     * @param msg 需要發(fā)送的消息
     * @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());
    }

    /**
     * 發(fā)送文件消息,需要先將文件上傳到企業(yè)微信臨時(shí)素材,再根據(jù)獲取的media_id調(diào)用群機(jī)器人
     *
     * @param path 需要發(fā)送的文件路徑
     * @return
     * @throws Exception
     */
    public String sendFileMsg(String path) throws Exception {
        File file = new File(path);

        // 構(gòu)造RequestBody對(duì)象,用來(lái)攜帶要提交的數(shù)據(jù);需要指定MediaType,用于描述請(qǐng)求/響應(yīng) body 的內(nèi)容類型
        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();

        // 上傳到臨時(shí)素材
        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+ "上傳到臨時(shí)素材:" + mediaUrl);
        String respMsg = okHttp(requestBody, mediaUrl);

        // 獲取臨時(shí)素材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);

        // 調(diào)用群機(jī)器人發(fā)送消息
        return callWeChatBot(reqBody.toString());
    }

    /**
     * 調(diào)用群機(jī)器人
     *
     * @param reqBody 接口請(qǐng)求參數(shù)
     * @throws Exception 可能有IO異常
     */
    public String callWeChatBot(String reqBody) throws Exception {
        log.info("請(qǐng)求參數(shù):" + reqBody);

        // 構(gòu)造RequestBody對(duì)象,用來(lái)攜帶要提交的數(shù)據(jù);需要指定MediaType,用于描述請(qǐng)求/響應(yīng) body 的內(nèi)容類型
        MediaType contentType = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(contentType, reqBody);

        // 調(diào)用群機(jī)器人
        String respMsg = okHttp(body, botUrl);

        if ("0".equals(respMsg.substring(11, 12))) {
            log.info("向群發(fā)送消息成功!");
        } else {
            log.info("請(qǐng)求失??!");
            // 發(fā)送錯(cuò)誤信息到群
            sendTextMsg("群機(jī)器人推送消息失敗,錯(cuò)誤信息:\n" + respMsg);
        }
        return respMsg;
    }

    /**
     *
     * @param body 攜帶需要提交的數(shù)據(jù)
     * @param url 請(qǐng)求地址
     * @return
     * @throws Exception
     */
    public String okHttp(RequestBody body, String url) throws Exception {
        // 構(gòu)造和配置OkHttpClient
        OkHttpClient client;
        if(hostname != null && port != 0){
            client = new OkHttpClient.Builder()
                    .proxy(new Proxy(Proxy.Type.HTTP, new InetSocketAddress(hostname, port))) // 內(nèi)網(wǎng)使用代理,不需要可注釋
                    .connectTimeout(10, TimeUnit.SECONDS) // 設(shè)置連接超時(shí)時(shí)間
                    .readTimeout(20, TimeUnit.SECONDS) // 設(shè)置讀取超時(shí)時(shí)間
                    .build();
        } else{
            client = new OkHttpClient.Builder()
                    .connectTimeout(10, TimeUnit.SECONDS) // 設(shè)置連接超時(shí)時(shí)間
                    .readTimeout(20, TimeUnit.SECONDS) // 設(shè)置讀取超時(shí)時(shí)間
                    .build();
        }

        // 構(gòu)造Request對(duì)象
        Request request = new Request.Builder()
                .url(url)
                .post(body)
                .addHeader("cache-control", "no-cache") // 響應(yīng)消息不緩存
                .build();

        // 構(gòu)建Call對(duì)象,通過(guò)Call對(duì)象的execute()方法提交異步請(qǐng)求
        Response response = null;
        try {
            response = client.newCall(request).execute();
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 請(qǐng)求結(jié)果處理
        byte[] datas = response.body().bytes();
        String respMsg = new String(datas);
        log.info("返回結(jié)果:" + respMsg);

        return respMsg;
    }

}
6. 調(diào)用
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);

// 發(fā)送文本消息
weChatBot.sendTextMsg("測(cè)試消息\n" + "hello world!");

// 發(fā)送圖片消息
weChatBot.sendImgMsg("C:/User/Desktop/test.jpg");

// 發(fā)送MarkDown消息
String markdownMsg =
        "測(cè)試:您的會(huì)議室已經(jīng)預(yù)定,稍后會(huì)同步到`郵箱` \n" +
        "    >**事項(xiàng)詳情** \n" +
        "    >事 項(xiàng):<font color=\"info\">開(kāi)會(huì)</font> \n" +
        "    >組織者:@admin \n" +
        "    >參與者:@admin \n" +
        "    >\n" +
        "    >會(huì)議室:<font color=\"info\">廣州TIT 1樓 301</font>\n" +
        "    >日 期:<font color=\"warning\">2022年4月22日</font>\n" +
        "    >時(shí) 間:<font color=\"comment\">上午9:00-11:00</font>\n" +
        "    >\n" +
        "    >請(qǐng)準(zhǔn)時(shí)參加會(huì)議。\n";
weChatBot.sendMarKDownMsg(markdownMsg);

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

}

就介么簡(jiǎn)單~ ^_^文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-401633.html

到了這里,關(guān)于【Java】企業(yè)微信群機(jī)器人發(fā)送消息(文字、圖片、MarkDown、文件消息)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Jenkins 獲取 Git 的提交記錄(變更記錄)通過(guò)機(jī)器人發(fā)送到企業(yè)微信群中

    Jenkins 獲取 Git 的提交記錄(變更記錄)通過(guò)機(jī)器人發(fā)送到企業(yè)微信群中

    如上,第一個(gè)就是文本,實(shí)測(cè)可以使用# 標(biāo)題欄, 引用 其他的可以自己研究下. 下面這個(gè)是插件企業(yè)微信插件.? ##下面說(shuō)明下. 緣起:通過(guò)企業(yè)微信插件已經(jīng)能夠?qū)崿F(xiàn)較簡(jiǎn)單且有去的構(gòu)建發(fā)布信息了. 但是過(guò)于簡(jiǎn)單的輸出信息且插件不能直接自定義 ##需求: ? ? ? ? 在現(xiàn)有插件輸出的

    2024年02月16日
    瀏覽(21)
  • 企業(yè)微信、飛書(shū)、釘釘機(jī)器人消息發(fā)送工具類

    其實(shí)你也可以使用RestTemplate,我這里主要是用到了webflux框架,所以需要實(shí)例化客戶端請(qǐng)求對(duì)象

    2024年02月10日
    瀏覽(25)
  • 封裝Python腳本:使用企業(yè)微信機(jī)器人發(fā)送消息至企業(yè)微信

    官方文檔地址: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 可以通過(guò)如下步驟設(shè)置企業(yè)微信機(jī)器人: 首先建立或者進(jìn)入某個(gè)群聊 進(jìn)入群聊設(shè)置頁(yè)面, 點(diǎn)擊“群機(jī)器人添加”可添加一個(gè)機(jī)器人成功 添加成功后,復(fù)制并保

    2024年02月09日
    瀏覽(26)
  • Java實(shí)現(xiàn)釘釘企業(yè)內(nèi)部應(yīng)用機(jī)器和自定義機(jī)器人發(fā)送消息

    Java實(shí)現(xiàn)釘釘企業(yè)內(nèi)部應(yīng)用機(jī)器和自定義機(jī)器人發(fā)送消息

    ?公司讓寫(xiě)一個(gè)服務(wù)監(jiān)控的功能,當(dāng)監(jiān)測(cè)到服務(wù)停止時(shí),向釘釘群里推送報(bào)警信息。之前大概看到釘釘?shù)拈_(kāi)放平臺(tái)的API文檔,好像能群發(fā)消息的只有機(jī)器人。 釘釘開(kāi)放平臺(tái)目前提供三種機(jī)器人: 企業(yè)內(nèi)部應(yīng)用機(jī)器人 群模板機(jī)器人 自定義機(jī)器人 本來(lái)向用自己比較熟悉的自定義

    2024年02月12日
    瀏覽(26)
  • 企業(yè)微信群:機(jī)器人實(shí)現(xiàn)定時(shí)提醒功能

    企業(yè)微信群:機(jī)器人實(shí)現(xiàn)定時(shí)提醒功能

    如果每天都需要,或者經(jīng)常需要提醒企業(yè)微信群里面的人做某一件事情的話,靠人力去實(shí)現(xiàn)比較費(fèi)力,而且偶爾忘記。 正好,企業(yè)微信群有一個(gè)機(jī)器人,正可以實(shí)現(xiàn)這一功能。 1、首先,在企業(yè)微信群,添加一個(gè)機(jī)器人。 2、根據(jù)企業(yè)微信機(jī)器人的配置說(shuō)明,編寫(xiě)程序。這里

    2024年02月16日
    瀏覽(36)
  • C#使用企業(yè)微信群機(jī)器人推送生產(chǎn)數(shù)據(jù)

    C#使用企業(yè)微信群機(jī)器人推送生產(chǎn)數(shù)據(jù)

    ? ? 在日常的工作生產(chǎn)中,經(jīng)常會(huì)有將將生產(chǎn)數(shù)據(jù)或者一些信息主動(dòng)推送給相關(guān)的管理人員,我們公司在開(kāi)發(fā)WMS系統(tǒng)時(shí),為了倉(cāng)庫(kù)的儲(chǔ)存安全,需要在危廢品庫(kù)存達(dá)到一定的儲(chǔ)量時(shí),自動(dòng)通知倉(cāng)管員去處理危廢品,所以就需要程序自動(dòng)的通過(guò)企業(yè)微信告知倉(cāng)管員,這個(gè)時(shí)候就

    2024年02月10日
    瀏覽(35)
  • Zabbix 6.4 版本企業(yè)微信群機(jī)器人報(bào)警配置

    Zabbix 6.4 版本企業(yè)微信群機(jī)器人報(bào)警配置

    從Zabbix 5.4升級(jí)后配置企業(yè)微信報(bào)警發(fā)下原來(lái)的腳本代碼報(bào)錯(cuò),搜索一圈發(fā)下使因?yàn)樾掳姹緦?duì)里面的部分代碼不支持,幾經(jīng)周折終于找到這段可用的代碼。 告警-媒介-創(chuàng)建媒介類型 直接添加webhook類型腳本 Token是企業(yè)微信內(nèi)建好的機(jī)器人webhook地址后面的參數(shù) 其他照填,很簡(jiǎn)單

    2024年02月15日
    瀏覽(22)
  • 企業(yè)微信群:機(jī)器人定時(shí)提醒功能數(shù)據(jù)庫(kù)配置化

    企業(yè)微信群:機(jī)器人定時(shí)提醒功能數(shù)據(jù)庫(kù)配置化

    目錄 企微群機(jī)器人使用 APScheduler概要使用說(shuō)明 cron方式設(shè)置 場(chǎng)景設(shè)置案例? 表結(jié)構(gòu) 代碼 場(chǎng)景:對(duì)于周期性重復(fù)需要做的事情,每次都需要人工去提醒,容易忘記,而企業(yè)微信群可以添加群機(jī)器人,群機(jī)器人提供接口能力,按照接口格式說(shuō)明把消息內(nèi)容發(fā)到群里以及@相關(guān)人,

    2024年02月15日
    瀏覽(23)
  • Python實(shí)現(xiàn)企業(yè)微信群機(jī)器人自動(dòng)化推送

    Python實(shí)現(xiàn)企業(yè)微信群機(jī)器人自動(dòng)化推送

    人工智能(Artificial Intelligence),英文縮寫(xiě)為AI。它是研究、開(kāi)發(fā)用于模擬、延伸和擴(kuò)展人的智能的理論、方法、技術(shù)及應(yīng)用系統(tǒng)的一門新的技術(shù)科學(xué)。 ——《百度百科》 實(shí)際工作中,有類似這樣的場(chǎng)景, 需要將某些通知信息定期發(fā)送到企業(yè)微信群,需要將公司某些指標(biāo)的異

    2024年02月09日
    瀏覽(25)
  • mxxWechatBot微信機(jī)器人主動(dòng)給機(jī)器人發(fā)送消息

    mxxWechatBot微信機(jī)器人主動(dòng)給機(jī)器人發(fā)送消息

    大家伙,我是雄雄,歡迎關(guān)注微信公眾號(hào):雄雄的小課堂。 注意: 免責(zé)聲明:該工具僅供學(xué)習(xí)使用,禁止使用該工具從事違法活動(dòng),否則永久拉黑?封禁賬號(hào)。 本工具我不會(huì)絕對(duì)保證對(duì)你的賬號(hào)沒(méi)有影響,盡量使用小號(hào)去研究學(xué)習(xí), mxxWechatBot 不承擔(dān)任何責(zé)任。 經(jīng)過(guò)用戶的

    2024年02月02日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包