企业微信API接口发消息实战:从0到1的技术突破之旅

摘要:本文详细介绍了通过企业微信官方API接口实现消息发送功能的完整实战流程。首先阐述了企业微信API在数字化办公中的重要性,重点讲解了消息发送接口的应用场景。实战部分分为前期准备、开发环境搭建和具体实现三个环节,包括创建企业微信应用、获取AccessToken、构建消息体和发送消息等关键步骤,并提供了完整的Java代码示例。针对常见问题如AccessToken过期、消息发送失败等,给出了具体解决方案和优化建议(如定时刷新、重试机制)。最后展望了该功能在客户关系管理、办公自动化等场景的应用潜力,为企业实现高效信息传递和业务流程自动化提供了实用指导。

1.企业微信 API 简介

在当今数字化办公的大环境下,企业微信已然成为众多企业进行内部沟通、协作以及客户管理的关键工具。它不仅具备即时通讯、会议、日程管理等基础办公功能,还凭借其强大的开放性,通过 API 接口与各类第三方系统实现深度集成,为企业构建一体化办公体系提供了有力支持。

企业微信 API 涵盖了丰富的功能接口,其中消息发送接口尤为重要。通过该接口,企业能够实现消息的自动化推送,无论是向员工发送通知、提醒,还是向客户传递营销信息、服务通知,都能高效完成。这一功能极大地提升了信息传递的效率和准确性,避免了人工逐一发送消息可能出现的疏漏和延误,同时也为企业实现业务流程自动化、智能化提供了可能。

本文将深入探讨如何利用企业微信官方 API 接口实现消息发送功能,从前期准备、接口调用流程到实际代码示例,以及常见问题的解决,为大家呈现一个完整的实战过程,助力开发者快速掌握这一实用技能。

2.实战前准备

2.1 注册企业微信并创建应用

若您还未注册企业微信,可前往企业微信官方网站(企业微信 ),点击 “立即注册” 按钮 ,按照页面提示填写企业信息,如企业名称、行业类型、人员规模等。提交信息后,使用绑定了实名银行卡的微信进行扫码验证,完成注册流程。

注册成功后,登录企业微信管理后台。在管理后台左侧导航栏中,选择 “应用管理”,点击 “自建应用” 选项,再点击 “创建应用”。在创建应用页面,填写应用名称、上传应用 Logo、撰写应用简介,并设置应用的可见范围,选择哪些部门或成员可以看到和使用这个应用。完成信息填写后,点击 “创建” 按钮,应用创建成功,此时您将获得该应用的 AgentId 和 Secret,这两个信息在后续调用 API 接口时至关重要,务必妥善保管。

2.2 了解 API 文档结构与规范

企业微信 API 文档是我们进行接口调用的重要依据,它详细阐述了各个接口的功能、使用方法、请求参数、响应格式以及错误码等关键信息。在开始实战前,深入研读 API 文档是必不可少的环节。

打开企业微信开发者文档页面(发送应用消息 - 文档 - 企业微信开发者中心 ),您会看到文档主要包含以下几个部分:

  • 接口列表:清晰罗列了企业微信提供的所有 API 接口,按照功能模块进行分类,如消息接口、用户管理接口、部门管理接口等,方便开发者快速定位所需接口。
  • 请求参数:对于每个接口,详细说明了其支持的请求参数,包括参数名称、类型、是否必填以及参数的具体含义和取值范围。准确理解和设置请求参数是确保接口调用成功的关键。
  • 响应格式:介绍了接口调用成功或失败后返回的数据格式,通常以 JSON 格式返回,包含了各种信息字段,如错误码(errcode)、错误信息(errmsg)以及接口返回的具体业务数据。
  • 错误码:列举了常见的错误码及其对应的错误原因,当接口调用出现问题时,通过错误码可以快速排查和定位问题所在。

2.3 开发环境搭建

本次实战我们选择 Java 作为开发语言,首先需要确保您的计算机上已安装 Java 开发环境。若未安装,可前往 Oracle 官方网站(Java Downloads | Oracle )下载适合您操作系统的 JDK 安装包。下载完成后,运行安装程序,按照提示完成安装过程。安装完成后,还需配置环境变量,在系统变量中添加 JAVA_HOME,值为 JDK 的安装路径,然后在 Path 变量中添加 % JAVA_HOME%\bin,确保系统能够正确找到 Java 命令。

接口调试工具我们选用 Postman,它是一款功能强大的 HTTP 客户端,方便我们进行 API 接口的测试和调试。您可以在 Postman 官方网站(https://www.postman.com/downloads/ )下载并安装 Postman,安装完成后打开 Postman,即可开始使用。

3.实战步骤详解

3.1 获取 Access Token

Access Token 是企业微信 API 的全局唯一接口调用凭据,在调用其他 API 接口时都需要使用它来进行身份验证,其有效期目前为 7200 秒(2 小时) 。在实际应用中,为了避免频繁获取 Access Token 导致的性能问题和频率限制,我们通常会将其缓存起来,在有效期内重复使用,当过期后再重新获取。

在 Java 中,我们可以通过以下代码来获取 Access Token:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import org.json.JSONObject;public class AccessTokenUtil {private static final String CORP_ID = "你的CorpID";private static final String SECRET = "你的Secret";public static String getAccessToken() {String accessToken = "";try {String url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + CORP_ID + "&corpsecret=" + SECRET;HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();conn.setRequestMethod("GET");BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String inputLine;StringBuilder responseBuilder = new StringBuilder();while ((inputLine = in.readLine()) != null) {responseBuilder.append(inputLine);}in.close();// 解析响应获取access_tokenJSONObject jsonResponse = new JSONObject(responseBuilder.toString());accessToken = jsonResponse.getString("access_token");} catch (Exception e) {e.printStackTrace();}return accessToken;}
}

上述代码中,首先构建了获取 Access Token 的请求 URL,将企业的 CorpID 和应用的 Secret 作为参数拼接在 URL 中。然后通过HttpURLConnection发起 GET 请求,获取企业微信返回的响应。最后,使用JSONObject解析响应内容,从中提取出access_token。

在获取 Access Token 时,可能会遇到网络异常、参数错误等问题。例如,网络不稳定可能导致请求超时,此时可以设置连接超时和读取超时时间,如conn.setConnectTimeout(5000); conn.setReadTimeout(5000);,单位为毫秒。如果返回的响应中包含错误码,如errcode不为 0,则表示获取失败,需要根据错误码和错误信息进行相应处理,常见错误码如 40013 表示不合法的 corpid,40001 表示不合法的 corpsecret,可参考企业微信 API 文档进行排查和解决。

3.2 构建消息内容

企业微信支持多种类型的消息,如文本、图片、视频、文件、图文等。这里我们以最常用的文本消息为例,展示如何构建消息体。

在 Java 中,可以通过以下代码构建文本消息:

import org.json.JSONObject;public class Message {private String touser;private String msgtype;private String content;public Message(String touser, String content) {this.touser = touser;this.msgtype = "text";this.content = content;}public String toJson() {JSONObject jsonObject = new JSONObject();jsonObject.put("touser", touser);jsonObject.put("msgtype", msgtype);jsonObject.put("text", new JSONObject().put("content", content));return jsonObject.toString();}
}

在上述代码中,Message类用于封装消息的相关信息。构造函数接收接收者touser和消息内容content,并设置消息类型msgtype为text。toJson方法将消息对象转换为 JSON 格式的字符串,以便在发送消息时作为请求体。其中,touser指定接收消息的用户 ID,如果要发送给多个用户,ID 之间用|分隔;msgtype表示消息类型,这里是文本类型;content则是具体的消息文本内容。

3.3 发送消息到指定用户

获取了 Access Token 并构建好消息内容后,就可以调用企业微信的消息发送接口,将消息发送给指定用户。

在 Java 中,发送消息的代码示例如下:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;public class WeChatMessageSender {public static void sendMessage(String accessToken, Message message) {try {String url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + accessToken;HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();conn.setRequestMethod("POST");conn.setRequestProperty("Content-Type", "application/json");conn.setDoOutput(true);// 将消息转化为JSON发送OutputStream os = conn.getOutputStream();os.write(message.toJson().getBytes("UTF-8"));os.flush();os.close();conn.connect();// 获取响应BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));String inputLine;StringBuilder responseBuilder = new StringBuilder();while ((inputLine = in.readLine()) != null) {responseBuilder.append(inputLine);}in.close();System.out.println("Response: " + responseBuilder.toString());} catch (Exception e) {e.printStackTrace();}}
}

上述代码中,首先构建了消息发送的请求 URL,将获取到的 Access Token 作为参数拼接在 URL 中。然后通过HttpURLConnection发起 POST 请求,设置请求头Content-Type为application/json,表示发送的是 JSON 格式的数据。接着,将构建好的消息对象转换为 JSON 字符串,并通过OutputStream写入请求体中。最后,获取企业微信返回的响应,读取响应内容并打印输出。

3.4 处理响应和错误

发送消息后,企业微信会返回一个响应,我们需要根据响应结果判断消息是否发送成功,并处理可能出现的错误。

响应结果通常以 JSON 格式返回,包含errcode和errmsg字段。errcode表示错误码,0表示成功,其他值表示失败;errmsg则是对应的错误信息。

在 Java 中,可以通过以下方式处理响应和错误:

import org.json.JSONObject;public class Main {public static void main(String[] args) {String accessToken = AccessTokenUtil.getAccessToken();Message message = new Message("USER_ID", "你好,这是来自Java的消息!");WeChatMessageSender.sendMessage(accessToken, message);// 假设已经获取到响应字符串responseStrString responseStr = "{"errcode":0,"errmsg":"ok"}";JSONObject jsonResponse = new JSONObject(responseStr);int errcode = jsonResponse.getInt("errcode");if (errcode == 0) {System.out.println("消息发送成功");} else {String errmsg = jsonResponse.getString("errmsg");System.out.println("消息发送失败,错误码:" + errcode + ",错误信息:" + errmsg);// 根据错误码进行不同的处理,例如40037表示无效的msgid,可能需要重新生成消息ID后重试switch (errcode) {case 40037:// 处理无效msgid的逻辑break;// 其他错误码的处理default:break;}}}
}

上述代码中,首先获取 Access Token 并构建消息,然后调用发送消息的方法。接着,假设已经获取到响应字符串,将其解析为JSONObject,从中获取errcode。如果errcode为 0,则表示消息发送成功;否则,表示发送失败,打印错误码和错误信息,并根据不同的错误码进行相应的处理。通过这种方式,可以及时发现和解决消息发送过程中出现的问题,确保消息能够准确、可靠地发送给目标用户。

4.实战中常见问题及解决方案

4.1 Access Token 过期问题

Access Token 的有效期为 7200 秒,过期后再使用该 Token 调用消息发送接口会返回错误。这是因为企业微信服务器会对每个请求中的 Access Token 进行验证,若 Token 过期,验证将不通过。

为解决此问题,可采用定时刷新策略,在系统启动时开启一个定时任务,每隔一段时间(如 60 分钟)调用获取 Access Token 的接口,更新 Token。例如,在 Java 中使用 Quartz 框架实现定时任务:

<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version>
</dependency>

import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;public class TokenRefreshJob implements Job {@Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {// 调用获取Access Token的方法String newToken = AccessTokenUtil.getAccessToken();// 存储新的Token,供后续使用}
}public class TokenScheduler {public static void main(String[] args) throws SchedulerException {Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();scheduler.start();JobDetail job = JobBuilder.newJob(TokenRefreshJob.class).withIdentity("tokenRefreshJob", "group1").build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("tokenRefreshTrigger", "group1").startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(60).repeatForever()).build();scheduler.scheduleJob(job, trigger);}
}
也可以在每次发送消息前检查 Token 的有效性,若已过期则重新获取。在WeChatMessageSender类的sendMessage方法中添加如下代码:
public class WeChatMessageSender {public static void sendMessage(String accessToken, Message message) {if (isTokenExpired(accessToken)) {accessToken = AccessTokenUtil.getAccessToken();}// 发送消息的原有代码}private static boolean isTokenExpired(String accessToken) {// 这里实现检查Token是否过期的逻辑,例如记录Token获取时间与有效期对比return true; // 示例返回值,实际需替换为真实逻辑}
}

4.2 消息发送失败

消息发送失败可能由多种原因导致。参数错误是常见原因之一,如touser字段填写了无效的用户 ID,或msgtype字段值错误。此时,需仔细检查消息体中的各个参数,对照企业微信 API 文档确认参数的正确性和格式。例如,确保touser是企业微信中已存在的用户 ID,msgtype为text、image、news等合法类型。

权限不足也会致使消息发送失败,若应用未被授权发送消息给指定用户或部门,就会出现此类问题。解决办法是登录企业微信管理后台,在 “应用管理” 中检查应用的权限配置,确保应用拥有发送消息到目标用户或部门的权限。

若出现网络波动、服务器繁忙等状况,也可能导致消息发送失败。此时可在代码中添加重试机制,如使用Retryable注解(需引入 Spring Retry 依赖):

<dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</artifactId><version>1.3.3</version>
</dependency>
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;@Service
public class WeChatMessageSender {@Retryable(value = Exception.class, maxAttempts = 3, backoff = @Backoff(delay = 2000))public void sendMessage(String accessToken, Message message) {// 发送消息的代码}
}

上述代码中,@Retryable注解表示当sendMessage方法抛出Exception异常时,会进行重试,最多重试 3 次,每次重试间隔 2000 毫秒。

4.3 其他问题

网络请求超时也是实战中可能遇到的问题,这通常是由于网络不稳定或服务器响应时间过长导致的。为解决此问题,可在发起 HTTP 请求时设置合理的超时时间。在HttpURLConnection中设置超时时间的代码如下:

HttpURLConnection conn = (HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(5000); // 设置连接超时时间为5秒
conn.setReadTimeout(5000);    // 设置读取超时时间为5秒

若企业微信返回的响应数据格式不符合预期,导致 JSON 解析错误,也会影响消息发送的处理。例如,网络传输过程中数据损坏、企业微信服务器返回错误格式数据等。此时,需要在代码中添加异常处理机制,捕获 JSON 解析异常,并进行相应的日志记录和错误处理。在处理响应的代码中添加如下异常处理:

try {JSONObject jsonResponse = new JSONObject(responseStr);int errcode = jsonResponse.getInt("errcode");// 处理响应
} catch (JSONException e) {e.printStackTrace();System.out.println("JSON解析错误,响应数据:" + responseStr);// 进行错误处理,如记录日志、通知管理员等
}

通过以上对常见问题及解决方案的探讨,希望能帮助开发者在使用企业微信官方 API 接口发送消息时,更加顺利地解决遇到的各种问题,确保消息发送功能的稳定运行。

5.总结与展望

5.1 回顾实战过程

在本次企业微信官方 API 接口发消息实战中,我们历经了多个关键环节。从前期准备开始,注册企业微信并创建应用,这是接入 API 的基础,获取应用的 AgentId 和 Secret 为后续操作提供了身份标识。深入研读 API 文档,熟悉其结构与规范,让我们清楚了解每个接口的功能、参数及响应格式,为实战提供了详细的指导。

搭建开发环境,安装 Java 开发环境和 Postman 调试工具,为代码编写和接口测试做好铺垫。实战步骤中,获取 Access Token 是关键的第一步,它作为接口调用的凭据,有效期内的正确使用是后续操作的前提。构建消息内容时,根据不同的消息类型,如文本消息,精心设置接收者、消息类型和具体内容,确保消息符合企业微信的要求。发送消息到指定用户时,通过正确的 URL 和请求方式,将 AccessToken 和构建好的消息体发送出去,并对返回的响应进行处理,根据错误码判断消息发送是否成功,若失败则依据不同错误原因进行排查和解决。

在实战过程中,我们也遇到了不少问题,如 AccessToken 过期、消息发送失败、网络请求超时以及响应数据解析错误等。针对这些问题,我们分别采取了定时刷新或发送前检查 Token 有效性、仔细检查参数和权限配置并添加重试机制、设置合理超时时间以及添加异常处理机制等解决方案,确保了消息发送功能的顺利实现。

5.2 未来应用拓展

企业微信 API 接口发消息功能在未来有着广阔的应用拓展空间。在客户关系管理方面,企业可以结合客户管理系统(CRM),当客户有新的咨询、订单状态更新或售后服务需求时,自动通过企业微信向客户发送消息通知,提供及时、个性化的服务,增强客户粘性和满意度。例如,电商企业在客户下单后,自动发送订单确认消息;在商品发货、运输途中及到达时,依次推送物流状态更新消息,让客户随时掌握订单动态。

在办公自动化流程中,与项目管理工具集成,当项目任务分配、截止日期临近或任务状态变更时,向相关负责人发送提醒消息,提高项目执行效率。比如,在一个软件开发项目中,当测试环节发现严重问题时,自动向开发人员发送消息,告知问题详情和紧急程度,促使开发人员及时处理,保障项目进度。

还可以利用该功能实现智能客服机器人与客户的交互,快速响应客户常见问题,提高客服工作效率,降低人力成本。未来,随着企业数字化转型的深入,企业微信 API 接口发消息功能有望在更多场景中发挥重要作用,为企业的高效运营和发展提供有力支持 。

5.3 企业微信API关键术语速查表

(含解释+官方链接,建议收藏备用)


1. AccessToken

解释:企业微信API的“通行证”,有效期2小时,所有接口调用前需先获取。
🔗 官方文档:获取AccessToken


2. CorpID

解释:企业微信的唯一标识,注册后在「管理后台-我的企业」查看。
🔗 如何查找CorpID


3. Secret

解释:应用的“密码”,在「管理后台-应用管理-自建应用」中生成,需保密。
🔗 创建应用获取Secret


4. AgentID

解释:应用的唯一编号(整数),用于指定消息由哪个应用发出。
🔗 查找AgentID


5. touser

解释:消息接收者,填写企业微信成员UserID(多人用|分隔,如zhangsan|lisi)。
📌 注意:UserID非微信号,需在「通讯录」中查看。


6. msgtype

解释:消息类型,常见值:text(文本)、image(图片)、news(图文)。
🔗 消息类型大全


7. errcode

解释:错误码,0表示成功,其他值需对照文档排查(如41001=缺少AccessToken)。
🔗 全局错误码查询


8. Postman

解释:API调试神器,可快速测试企业微信接口(文件1即其下载页)。
🔗 Postman下载


9. 消息发送接口

解释:核心API,用于向成员/部门发送消息,URL需带AccessToken。
🔗 接口文档


10. IP白名单

解释:企业微信要求服务器IP需加入「应用管理-设置API接收」白名单,否则报errcode=60020
🔗 配置白名单


快速验证工具

  • 在线调试:企业微信官方接口调试工具

  • 错误速查:输入errcode直接查原因(如文件2/3中的41004/41001)


一键直达实战

将以下URL中的YOUR_CORPIDYOUR_SECRET替换为实际值,浏览器访问即可获取AccessToken:

https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=YOUR_CORPID&corpsecret=YOUR_SECRET

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91221.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91221.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux的小程序——进度条

为了写出这个小程序我们先来了解几个知识点(一)回车和换行先以写作文为例子了解一下&#xff0c;当在一行中写了一半&#xff0c;由此处位置往下一行的操作叫做换行&#xff0c;回到该行的开头位置为回车。而在c语言中\n帮我们完成了换行和回车两个动作&#xff0c;那单纯回车是…

在macOS上使用VS Code和Clang配置C++开发环境

本文基于VS Code官方文档&#xff0c;详细介绍如何在macOS系统下配置Clang/LLVM编译器与VS Code的C开发环境。通过本文&#xff0c;你将学会如何搭建开发环境、创建并调试C程序&#xff0c;适合C初学者和需要在macOS上进行C开发的开发者。 前提条件 在开始配置前&#xff0c;…

Ganttable 基于工时的进度分析

时间进度分析是 Ganttable 提供的高级进度管理功能&#xff0c;它基于实际工作时长&#xff0c;结合计划预估工时&#xff0c;可精准计算项目及任务的完成度。开启进度分析开启进度分析功能的操作如下&#xff1a;在时间管理页面&#xff0c;点击右上角的 “设置” 按钮&#x…

duiLib 自定义资源目录

前面的demo&#xff0c;把布局文件放在默认目录了&#xff0c;想着应该也可以自定义资源路径。先debug看下默认目录是什么路径。设置调试选项&#xff0c;调试信息格式改为程序数据库&#xff08;/Zi&#xff09;再调试项目&#xff0c;选中监视1&#xff1a;在监护窗口中查看变…

YOLO-01目标检测基础

1、概念目标检测&#xff08;Object Detection&#xff09;是计算机视觉中的一个重要领域&#xff0c;它涉及到识别图片或视频某一帧中的物体是什么类别&#xff0c;并确定它们的位置。通常用于多个物体的识别&#xff0c;可以同时处理图像中的多个实例&#xff0c;并为每个实例…

Linux->动静态库

目录 引入&#xff1a; 一&#xff1a;动静态库的介绍 1&#xff1a;库的本质 2&#xff1a;库的类别及优缺点 3&#xff1a;动态链接 4&#xff1a;静态链接 二&#xff1a;头文件和库的查找 三&#xff1a;静态库的制作和使用 1&#xff1a;制作 2&#xff1a;指令打…

【LY88】双系统指南及避坑

一. Windows重装&#xff08;前提是Windows可正常使用&#xff0c;优点是无需U盘&#xff09; 1. PE工具和系统镜像 机械师只只提供的资源链接 完成微PE工具的安装并下载了系统镜像之后&#xff0c;&#xff08;如果要装ubuntu的话&#xff09;需确认磁盘分区格式和引导项。前…

Ubuntu22.04.1搭建php运行环境

步骤 1: 更新你的系统 首先&#xff0c;确保你的系统是最新的。打开终端并运行以下命令&#xff1a; sudo apt update sudo apt upgrade步骤 2: 安装Apache Web服务器 使用Apache作为你的Web服务器。运行以下命令&#xff1a; sudo apt install apache2安装完成后&#xff0c;你…

防止飞书重复回调通知分布式锁

## 场景销售订单下&#xff0c;明细25明细款&#xff0c;发起飞书审批&#xff0c;飞书设置自动审核通过&#xff0c;导致会收到两次审核通过通知加了分布式锁 &#xff0c;仍导致执行业务执行两遍了String lockKey "feihsu-approvalNotify:" instanceCode; RLock …

数据结构:下三角矩阵(Lower Triangular Matrix)

目录 什么是下三角矩阵&#xff1f; 我们要存哪些元素&#xff1f;一共几个&#xff1f; 推导索引映射公式 核心问题&#xff1a;给定 (i,j)&#xff0c;如何计算 k&#xff1f; 什么是下三角矩阵&#xff1f; 一个 n n 的矩阵&#xff0c;如果它在主对角线以上的所有元…

力扣209:长度最小的子数组

力扣209:长度最小的子数组题目思路代码题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回…

采购管理系统哪家性价比高?

在企业数字化转型进程中&#xff0c;采购管理系统已成为降本增效的核心工具。但面对市场上五花八门的产品&#xff0c;“性价比” 成为企业选型时的关键考量 —— 既要功能贴合业务需求&#xff0c;又要成本可控&#xff0c;还需兼顾实施效率与长期扩展性。以下从性价比维度解析…

轻松打造Unity小游戏AR体验

目录 AR会话初始化 平面追踪与相机定位 用户交互处理 实时渲染 Unity 小游戏宿主现已支持 AR 功能&#xff0c;本文介绍如何从零开始创建一个可以在Unity小游戏宿主上运行的AR小游戏&#xff0c;欢迎大家试用&#xff01; 想为你的小游戏注入虚实交融的魔力吗&#xff1f;…

IFCVF驱动+vhost-vfio提高虚拟机网络性能

​​IFCVF (Intel FPGA Virtual Function)​​ 是 Intel 为其基于 FPGA 的智能网卡开发的 ​​SR-IOV 虚拟功能驱动​​,属于 ​​PF4 (Physical Function 4)​​ 架构的一部分。它是专为高性能网络虚拟化场景设计的硬件加速解决方案。 云计算智能网卡(soc)或DPU场景下,IFC…

Hook捕获并拦截文件创建行为

需要用到minhook 先编译DLL #include <Windows.h> #include <string> #include <TlHelp32.h> #include <Shlwapi.h>#include "MinHook.h" // 自动选择正确的MinHook库 #pragma comment(lib, "Shlwapi.lib") #if defined(_M_X64) …

图像平滑处理

图像平滑处理四种常用方式1. 均值滤波 (cv2.blur())2. 高斯滤波 (cv2.GaussianBlur())3. 中值滤波 (cv2.medianBlur())4、双边滤波 (cv2.bilateralFilter())总结存图时遇到一个中文版乱码问题四种常用方式 平滑处理&#xff08;也称为模糊处理&#xff09;&#xff0c;用于减少…

fortigate的waf功能

在系统管理----可见功能----web应用防火墙打开waf功能Web 应用程序防火墙 &#xff08;WAF&#xff09; 配置文件可以检测和阻止已知的 Web 应用程序攻击。您可以将 WAF 配置文件配置为使用签名和约束来检查 Web 流量。您还可以强制实施 HTTP 方法策略&#xff0c;该策略控制与…

AI Compass前沿速览:可灵创意工坊、字节Coze StudioCoze Loop、通义万相2.2 、智谱GLM-4.5、腾讯混元3D世界模型开源

AI Compass前沿速览&#xff1a;可灵创意工坊、字节Coze Studio&Coze Loop、通义万相2.2 、智谱GLM-4.5、腾讯混元3D世界模型开源 AI-Compass 致力于构建最全面、最实用、最前沿的AI技术学习和实践生态&#xff0c;通过六大核心模块的系统化组织&#xff0c;为不同层次的学…

SpringCloud之Gateway

SpringCloud之Gateway 官网地址&#xff1a; https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories 1. 什么是gateway Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Net…

关于获取某目录及子目录下所有文件且不包含隐藏文件

最近比较忙&#xff0c;很少写blog了&#xff01;&#xff01;&#xff01;关于获取目录及子目录下所有文件是常遇到的功能&#xff0c;一般通过递归遍历实现。而生产场景中&#xff0c;一般是遍历nas上的目录&#xff0c;在nas上利用File.listFiles(),在linux系统上无法获取含…