V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
uzfg57666
V2EX  ›  程序员

企业微信机器人 sdk 实现发送消息的功能 api(文本消息,图片消息,图片+文字消息)

  •  
  •   uzfg57666 · 2022-11-12 16:28:21 +08:00 · 1138 次点击
    这是一个创建于 745 天前的主题,其中的信息可能已经有所发展或是发生改变。
    1.打开企业微信电脑版点击红框位置添加机器人
    2.复制地址
    3.代码环节 Controller
    @GetMapping(value = "testRobot")
    public void testRobot() throws IOException {
    //VO 这段可以写在业务逻辑层
    RobotVo vo = new RobotVo();
    //机器人地址
    vo.setWebhookAddress("刚才复制的地址");
    //1.第一种情况:发送文本消息
    // vo.setContent("我发送的消息是:文本消息");
    // List<String> memberList = new ArrayList<>();
    // memberList.add("@all");
    // vo.setMemberList(memberList);
    // vo.setMsgType("text");

    // 2.第二种情况,发送图片消息
    // vo.setMsgType("image");
    // vo.setSavePath("C:/Users/Administrator/Desktop/吴彦祖.jpg");

    //3.第三种情况,发送机器人消息
    vo.setMsgType("news");
    vo.setTitle("test");
    vo.setDescription("test");
    vo.setUrl("url");
    // vo.setImageUrl("url")括号中的 url 是上传 oss 返回的路径
    vo.setImageUrl("url");
    service.run(vo);
    }

    4.VO
    @Data
    public class RobotVo {
    /**
    * 机器人 id
    */
    private String robotId;
    /**
    * 机器人名字
    */
    private String robotName;
    /**
    * 当前机器人的 webhook 地址
    */
    private String webhookAddress;
    /**
    * 消息类型
    */
    private String msgType;
    /**
    * 富文本框里面的内容
    */
    private String content;
    /**
    * 涉及发送的人员
    */
    private List<String> memberList;
    /**
    * 电话
    */
    private String mobileList;
    /**
    * 图片地址
    */
    private String imageUrl;
    /**
    * base64 编码后的值
    */
    private String imageBase64Value;

    /**
    * 图片 md5 加密后的值
    */
    private String imageMd5Value;

    /**
    * 发送消息的标题
    */
    private String title;
    /**
    * 发送图文消息的描述信息
    */
    private String description;
    /**
    * 图片 url 地址集合
    */
    private List<String> imageUrlList;
    /**
    * 图片打开的地址
    */
    private String url;
    /**
    * 消息内容集合
    */
    private List<String> contentList;
    /**
    * 图片路径
    */
    private String savePath;
    }

    5.Service 接口
    /**
    * 机器人
    * @param vo
    * @throws IOException
    */
    void run(RobotVo vo) throws IOException;

    6.Service 业务逻辑
    @Override
    public void run(RobotVo vo) throws IOException {
    List<String> memberList = vo.getMemberList();
    String jsonData = "";
    String mobileList = "";
    String strMember = "";
    if (vo.getMsgType().equals("text")) {
    if (!Strings.isNullOrEmpty(vo.getMobileList())) {
    mobileList = vo.getMobileList();
    } else {
    mobileList = "";
    }
    for (int i = 0; i < memberList.size(); i++) {
    if (i == memberList.size() - 1) {
    strMember += "\"" + memberList.get(i) + "\"";
    } else {
    strMember += "\"" + memberList.get(i) + "\"" + ",";
    }
    }
    String[] members = new String[memberList.size()];
    for (int i = 0; i < memberList.size(); i++) {
    members[i] = memberList.get(i);
    }
    jsonData = "{\n" +
    "\t\"msgtype\": \"" + vo.getMsgType() + "\",\n" +
    " \"text\": {\n" +
    " \"content\": \"" + vo.getContent() + "\",\n" +
    " \"mentioned_list\":[" + strMember + "],\n" +
    " \"mentioned_mobile_list\":[\"" + mobileList + "\"]\n" +
    " }\n" +
    "}";

    } else if (vo.getMsgType().equals("image")) {
    //图片 base64 加密的值
    vo.setImageBase64Value(getImageStr(vo.getSavePath()));
    //图片 md5 加密的值
    vo.setImageMd5Value(DigestUtils.md5Hex(new FileInputStream(vo.getSavePath())));
    jsonData = "{\n" +
    " \"msgtype\": \"" + vo.getMsgType() + "\",\n" +
    " \"image\": {\n" +
    " \"base64\": \"" + vo.getImageBase64Value() + "\",\n" +
    " \"md5\": \"" + vo.getImageMd5Value() + "\"\n" +
    " }\n" +
    "}";
    } else if (vo.getMsgType().equals("news")) {
    //图片+文字消息
    vo.setTitle(!Strings.isNullOrEmpty(vo.getTitle()) ? vo.getTitle() : "");
    jsonData = "{\n" +
    " \"msgtype\": \"" + vo.getMsgType() + "\",\n" +
    " \"news\": {\n" +
    " \"articles\" : [\n" +
    " {\n" +
    " \"title\" : \"" + vo.getTitle() + "\",\n" +
    " \"description\" : \"" + vo.getDescription() + "\",\n" +
    " \"url\" : \"" + vo.getUrl() + "\",\n" +
    " \"picurl\" : \"" + vo.getImageUrl() + "\"\n" +
    " }\n" +
    " ]\n" +
    " }\n" +
    "}";
    }
    send(vo.getWebhookAddress(), jsonData);
    }
    7.send 方法
    public static JSONObject send(String url, String param) {
    PrintWriter out = null;
    BufferedReader in = null;
    JSONObject jsonObject = null;
    String result = "";
    try {
    URL realUrl = new URL(url);
    // 打开和 URL 之间的连接
    URLConnection conn = realUrl.openConnection();
    // 发送 POST 请求必须设置如下两行
    conn.setDoOutput(true);
    conn.setDoInput(true);
    // 获取 URLConnection 对象对应的输出流(设置请求编码为 UTF-8 )
    out = new PrintWriter(new OutputStreamWriter(conn.getOutputStream(), "UTF-8"));
    // 发送请求参数
    out.print(param);
    // flush 输出流的缓冲
    out.flush();
    // 获取请求返回数据(设置返回数据编码为 UTF-8 )
    in = new BufferedReader(
    new InputStreamReader(conn.getInputStream(), "UTF-8"));
    String line;
    while ((line = in.readLine()) != null) {
    result += line;
    }
    jsonObject = JSONObject.parseObject(result);
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    if (out != null) {
    out.close();
    }
    if (in != null) {
    in.close();
    }
    } catch (IOException ex) {
    ex.printStackTrace();
    }
    }
    return jsonObject;
    }

    这个是在调用官方 api 对接的接口。但是如果想更复杂的功能,比如:得到回调消息,外部群管理,发朋友圈等等。就需要 PC 版企微,c++底层开发了。欢迎技术交流。
    HWND Qq[]=“2645542961”;
    wchar_t mesbuff[0x180e];

    目前已经实现了大部分功能,运行稳定,比如:发各种消息,
    接收各种消息,外部群内部群管理,下载文件,加好友,发朋友圈等等功能,
    可提供接口,方便各种语言二次开发,
    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5545 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 07:57 · PVG 15:57 · LAX 23:57 · JFK 02:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.