企業微信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
英文地址,請注明出處:http://en.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系統上無法獲取含…