假如你是一个物联网平台系统架构师,现在有一个需求是:当设备发生预警事件时,通过企业微信向拥有该设备管理权限的用户或角色发送一条提示消息,请给出技术方案。

2023-04-05by@dlb1986-QtEhh&@ChatGPT.Model: gpt-3.5
dlb1986-QtEhh

假如你是一个物联网平台系统架构师,现在有一个需求是:当设备发生预警事件时,通过企业微信向拥有该设备管理权限的用户或角色发送一条提示消息,请给出技术方案。

Avatar
Avatar

技术方案如下:

1.设备预警事件触发后,平台系统通过接口获取该设备的管理权限用户或角色列表。

2.平台系统调用企业微信API,向列表中的用户或角色发送预警提示消息。可以使用企业微信提供的发送文本消息API,消息内容包括设备编号、预警类型、发生时间等信息。

3.为了实现消息的实时性和可靠性,可以在平台系统中设置消息重试机制,确保消息能够及时送达并被接收到。

4.为了方便用户对设备预警事件进行处理,可以在企业微信中创建一个专门的预警事件处理群组,将接收到预警消息的用户或角色加入该群组,方便用户之间协同处理问题。

5.为了保障系统的安全性,可以在平台系统中设置消息发送授权机制,只有具备发送权限的用户才能向企业微信发送消息。可以通过接口调用企业微信API时进行身份验证,确保消息只能被授权用户发送。

6.为了方便用户了解设备预警事件的处理情况,可以在平台系统中记录消息发送状态和处理情况,提供可视化的消息发送和处理日志查询界面,方便用户了解设备预警事件的处理进展情况。

dlb1986-QtEhh

请给出调用企业微信发送预警消息的Java代码

Avatar
Avatar

以下是调用企业微信发送预警消息的Java代码示例:

import com.alibaba.fastjson.JSONObject;
import okhttp3.*;

import java.io.IOException;

public class WeChatRobot {

    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private static final String WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY_HERE";

    public static void sendWarningMessage(String deviceNo, String warningType, String warningTime, String user) throws IOException {
        OkHttpClient client = new OkHttpClient();
        JSONObject message = new JSONObject();
        message.put("msgtype", "text");
        JSONObject content = new JSONObject();
        content.put("content", String.format("设备 %s 发生了 %s 预警事件,预警时间为 %s,需要您及时处理。", deviceNo, warningType, warningTime));
        message.put("text", content);
        JSONObject mentionedList = new JSONObject();
        mentionedList.put("user", user);
        JSONObject mentioned = new JSONObject();
        mentioned.put("mentioned_list", mentionedList);
        message.put("mentioned_list", mentionedList);
        RequestBody body = RequestBody.create(JSON, message.toJSONString());
        Request request = new Request.Builder()
                .url(WEBHOOK_URL)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            System.out.println("Failed to send warning message: " + response.code() + " " + response.body().string());
        }
    }
}

其中,WEBHOOK_URL为企业微信机器人的Webhook地址,sendWarningMessage方法实现了发送预警消息的逻辑,需要传入设备编号、预警类型、预警时间和接收消息的用户ID。在方法中,首先使用OkHttpClient发送POST请求,并将消息内容格式化为JSON字符串。然后,通过RequestBody.createRequest.Builder构造请求体和请求对象,并使用client.newCall发送请求。最后,判断响应是否成功,如果不成功,输出错误信息。

dlb1986-QtEhh

我给出企业微信向指定用户发送消息的Java代码

Avatar
Avatar

以下是企业微信向指定用户发送消息的Java代码示例:

import com.alibaba.fastjson.JSONObject;
import okhttp3.*;

import java.io.IOException;

public class WeChatRobot {

    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private static final String WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY_HERE";

    public static void sendMessageToUser(String userId, String messageContent) throws IOException {
        OkHttpClient client = new OkHttpClient();
        JSONObject message = new JSONObject();
        message.put("msgtype", "text");
        JSONObject content = new JSONObject();
        content.put("content", messageContent);
        message.put("text", content);
        JSONObject mentionedList = new JSONObject();
        mentionedList.put("user", userId);
        JSONObject mentioned = new JSONObject();
        mentioned.put("mentioned_list", mentionedList);
        message.put("mentioned_list", mentionedList);
        RequestBody body = RequestBody.create(JSON, message.toJSONString());
        Request request = new Request.Builder()
                .url(WEBHOOK_URL)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            System.out.println("Failed to send message: " + response.code() + " " + response.body().string());
        }
    }
}

其中,WEBHOOK_URL为企业微信机器人的Webhook地址,sendMessageToUser方法实现了向指定用户发送消息的逻辑,需要传入接收消息的用户ID和消息内容。在方法中,首先使用OkHttpClient发送POST请求,并将消息内容格式化为JSON字符串。然后,通过RequestBody.createRequest.Builder构造请求体和请求对象,并使用client.newCall发送请求。最后,判断响应是否成功,如果不成功,输出错误信息。

dlb1986-QtEhh

如果是同时向多个用户发送消息呢

Avatar
Avatar

如果需要同时向多个用户发送消息,可以将sendMessageToUser方法中的userId参数改为一个字符串数组,用于存储多个接收消息的用户ID。修改后的代码如下:

import com.alibaba.fastjson.JSONObject;
import okhttp3.*;

import java.io.IOException;

public class WeChatRobot {

    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");
    private static final String WEBHOOK_URL = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY_HERE";

    public static void sendMessageToUsers(String[] userIds, String messageContent) throws IOException {
        OkHttpClient client = new OkHttpClient();
        JSONObject message = new JSONObject();
        message.put("msgtype", "text");
        JSONObject content = new JSONObject();
        content.put("content", messageContent);
        message.put("text", content);
        JSONObject mentionedList = new JSONObject();
        mentionedList.put("user", userIds);
        JSONObject mentioned = new JSONObject();
        mentioned.put("mentioned_list", mentionedList);
        message.put("mentioned_list", mentionedList);
        RequestBody body = RequestBody.create(JSON, message.toJSONString());
        Request request = new Request.Builder()
                .url(WEBHOOK_URL)
                .post(body)
                .build();
        Response response = client.newCall(request).execute();
        if (!response.isSuccessful()) {
            System.out.println("Failed to send message: " + response.code() + " " + response.body().string());
        }
    }
}

修改后的代码中,sendMessageToUsers方法中的userIds参数为一个字符串数组,用于存储多个接收消息的用户ID。在方法中,将userIds转换为JSON对象,并使用RequestBody.createRequest.Builder构造请求体和请求对象,并使用client.newCall发送请求。

dlb1986-QtEhh

通过企业微信向用户发送消息,需要在微信官方进行何种操作

Avatar
Avatar

在企业微信中向用户发送消息,需要进行以下操作:

1.创建企业微信应用

在企业微信管理后台中,创建一个企业应用,并获取相应的CorpID、AgentID和Secret等信息,用于后续的消息发送操作。

2.获取接收消息的用户UserID

在企业微信管理后台中,创建相应的用户,并获取其UserID,用于后续的消息发送操作。

3.配置企业微信机器人Webhook URL

在企业微信管理后台中,配置企业微信机器人的Webhook URL,用于接收并处理通过API发来的消息。

4.调用企业微信API发送消息

在程序中,调用企业微信API,向指定的用户或群组发送消息。可以使用企业微信提供的发送文本消息API,消息内容包括接收消息的用户或群组ID、消息内容等信息。

需要注意的是,发送消息API的调用需要在企业微信管理后台中进行配置,例如开启API接口权限、配置IP白名单等操作。

dlb1986-QtEhh

发送消息有何种限制

Avatar
Avatar

企业微信向用户发送消息有以下限制:

1.每个机器人每分钟最多发送20条消息。

2.每个机器人每小时最多发送1000条消息。

3.每个机器人每天最多发送5000条消息。

4.每个应用每秒最多发送2条消息。

5.每个应用每分钟最多发送40条消息。

6.每个应用每小时最多发送800条消息。

7.每个应用每天最多发送4000条消息。

8.每个应用每天最多向同一个用户发送100条消息。

9.每个应用每天最多向同一个群组发送200条消息。

需要注意的是,如果发送的消息过于频繁或超过限制,可能会导致企业微信的API被限制或封禁,因此在发送消息时需要遵守限制并控制发送频率。

dlb1986-QtEhh

通过付费可以不受限制影响么

Avatar
Avatar

付费可以增加企业微信发送消息的额度,但并不能完全消除限制。根据官方文档,企业微信付费版和高级版可以享受更高的发送消息额度,但依然需要遵守每个机器人和每个应用的发送消息限制。同时,企业微信也会对异常发送行为进行监控和限制,例如频繁发送相同或相似内容的消息、恶意发送垃圾信息等行为。因此,即使付费,也需要遵守企业微信的使用规范,合理使用企业微信的发送消息功能。