對接企業微信API自建應用配置企業可信IP

前言

? ? ? ? 為了實現系統調用團隊會議功能,組織發起企業微信會議,于是需要和企業微信做API對接。對接過程很難受,文檔不清晰、沒有SDK、沒有技術支持甚至文檔報文和實際接口報文都不匹配,只能說企業微信的API是從業以來見過的最難用的API,僅個人觀點。

? ? ? ? 在配置自建應用后,訪問API接口竟然需要設置可信IP,不論是出于安全還是別的商業目的,該手段都太古老,怎奈人在屋檐下不得不低頭。可是在配置時又需要域名驗證等雜七雜八的問題,特此記錄解決過程分享給大家。

正文

1、自信滿滿配置IP

????????本以為打開這個頁面直接輸入外網IP即可,未曾想是個只讀框,需要處理藍色背景的提示信息,設置可信域名或解析加密URL

? ? ? ? 可信域名自然沒有,申請證書申請域名費時費力,測試階段根本沒必要

? ? ??

? ? ? ? 于是選擇第二個選項,文字描述很抽象,筆者也是查閱各方資料才總結出來。

????????大體意思就是要在能外網訪問的機器上部署一個服務,當企業微信的測試請求訪問過去時,按照一定的加解密規則以及入參,返回對應的響應信息。這樣企業微信才認為你這臺機器是“自己人”,允許你繼續配置可信IP,簡直就是!@#*¥&()@!!。

2、罵罵咧咧獲取信任

? ? ? ? 一回頭看自己還在屋檐下,繼續低頭想辦法唄。首先把后兩項全部選擇隨機獲取,記錄好生成的字符串,一會發布服務需要使用。接下來表演開始:

2.1、準備外網服務器

????????找一臺可以外網訪問的機器,當然還需要一個打通的端口,在這臺機器上安裝Python3

2.2、獲取Python項目

? ? ? ? 按照這個GitHub地址,下載一個python項目,解壓后重命名為?weworkapi_python

????????https://github.com/sbzhu/weworkapi_python/archive/refs/heads/master.zip

? ? ? ? 也可以使用指令處理:

wget https://github.com/sbzhu/weworkapi_python/archive/refs/heads/master.zip
unzip master.zip
mv weworkapi_python-master weworkapi_python

2.3、執行監聽服務腳本

與上述項目同級開啟命令窗,使用下述腳本觸發執行,其中執行前需要替換三個參數,前兩個為剛剛隨機生成的,最后一個在企業信息中可以看到的企業ID。

qy_api = [WXBizMsgCrypt("XXXXXXX", "XXXXXXX", "XXXXXXX"), 
] #對應接受消息回調模式中的token,EncodingAESKey 和 企業信息中的企業id
#-*- encoding:utf-8 -*-
from flask import abort, request
from flask import Flask
from xml.dom.minidom import parseString
import _thread
import time
import os
import sys
sys.path.append("weworkapi_python/callback")  # 正確的模塊導入路徑
from WXBizMsgCrypt3 import WXBizMsgCrypt   # https://github.com/sbzhu/weworkapi_python 項目地址
app = Flask(__name__)# 對應步驟4中接受消息回調模式中的URL,如域名是'www.example.com' 那么在步驟4中填入的url就為"http://www.example.com/hook_path"
@app.route('/hook_path', methods=['GET','POST']) 
def douban():if request.method == 'GET':echo_str = signature(request, 0)return(echo_str)elif request.method == 'POST':echo_str = signature2(request, 0)return(echo_str)qy_api = [WXBizMsgCrypt("qCV0ro7W4CJQtn3RHbVwgYU5GAZ29AK", "PQzmYlT4vGP3ItW9OmvreGkkLpDS3A9jH2GsyfDtP3q", "ww7b1bc3d6d"), 
] #對應接受消息回調模式中的token,EncodingAESKey 和 企業信息中的企業id# 開啟消息接受模式時驗證接口連通性
def signature(request, i): msg_signature = request.args.get('msg_signature', '')timestamp = request.args.get('timestamp', '')nonce = request.args.get('nonce', '')echo_str = request.args.get('echostr', '')ret,sEchoStr=qy_api[i].VerifyURL(msg_signature, timestamp,nonce,echo_str)if (ret != 0):print("ERR: VerifyURL ret: " + str(ret))return("failed")else:return(sEchoStr)# 實際接受消息
def signature2(request, i):msg_signature = request.args.get('msg_signature', '')timestamp = request.args.get('timestamp', '')nonce = request.args.get('nonce', '')data = request.data.decode('utf-8')ret,sMsg=qy_api[i].DecryptMsg(data,msg_signature, timestamp,nonce)if (ret != 0):print("ERR: DecryptMsg ret: " + str(ret))return("failed")else:with open ("/var/log/qywx.log", 'a+') as f: # 消息接收日志doc = parseString(sMsg)collection = doc.documentElementname_xml = collection.getElementsByTagName("FromUserName")msg_xml = collection.getElementsByTagName("Content")type_xml = collection.getElementsByTagName("MsgType")pic_xml = collection.getElementsByTagName("PicUrl")msg = ""name = ""msg_type = type_xml[0].childNodes[0].dataif msg_type == "text": #文本消息name = name_xml[0].childNodes[0].data        #發送者idmsg = msg_xml[0].childNodes[0].data          #發送的消息內容f.write(time.strftime('[%Y-%m-%d %H:%M:%S]') + "[ch%d] %s:%s\n" % (i, name, msg))_thread.start_new_thread(os.system, ("python3 command.py '%s' '%s' '%d' '%d'" % (name, msg, i, 0), )) #此處將消息進行外部業務處理elif msg_type == "image": #圖片消息name = name_xml[0].childNodes[0].datapic_url = pic_xml[0].childNodes[0].dataf.write(time.strftime('[%Y-%m-%d %H:%M:%S]') + "[ch%d] %s:圖片消息\n" % (i, name))_thread.start_new_thread(os.system, ("python3 command.py '%s' '%s' '%d' '%d'" % (name, pic_url, i, 1), ))  #此處將消息進行外部業務處理f.close()return("ok")if __name__=='__main__':app.run("0.0.0.0", 8066)  #本地監聽端口,可自定義
#執行腳本
python wechat.py

若執行報錯提示缺失依賴,按照pip3進行安裝即可。

2.4、最終結果獲取

執行成功后會根據token和secret生成監聽服務,命令窗提示 ip:port ,其中端口可以在上述腳本中配置。

3、配置可驗證的URL

將生成的信息配置到對應目錄

http://公網IP地址:8066/hook_path

點擊保存后即可正常配置可信IP,至此整個荒誕的信任危機解除,只能三個字形容:真無聊。

總結

? ? ? ? 整個配置過程網上資料甚少,企業微信方也沒有在線支持,只依靠社區實現網友之間的相濡以沫,如果能再給我一次機會,我一定選別的app進行對接,慎重慎重。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44495.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44495.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44495.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[Spring] Spring Web MVC基礎理論

🌸個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵?熱門專欄: 🧊 Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 🍕 Collection與…

n3.平滑升級和回滾

平滑升級和回滾 1. 平滑升級流程2. 平滑升級和回滾案例 有時候我們需要對Nginx版本進行升級以滿足對其功能的需求,例如添加新模塊,需要新功能,而此時 Nginx又在跑著業務無法停掉,這時我們就可能選擇平滑升級 1. 平滑升級流程 平…

使用ChatGPT來撰寫和潤色學術論文的教程(含最新升級開桶ChatGpt4教程)

現在有了ChatGPT4o更加方便了, 但次數太少了 想要增加次數可以考慮升級開桶ChatGpt4 一、引言 在學術研究中,撰寫高質量的論文是一項重要的技能。本教程將介紹如何利用ChatGPT來輔助完成從論文構思到潤色的全過程。 二、使用ChatGPT寫論文 1. 寫標題 Title/Topic…

【TB作品】51單片機,MSP430單片機,STM32單片機,簡易波形發生器

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2二、 簡易波形發生器 (限MSP430、STM32單片機) 任務要求: 制作一個簡易波形發生器,具有如下功能: 1、能夠產生方波、正弦波,并可通過示波器觀察到&…

QT 多線程 QThread

繼承QThread的線程 繼承 QThread 是創建線程的一個普通方法。其中創建的線程只有 run() 方法在線程里的。其他類內定義的方法都在主線程內。 通過上面的圖我們可以看到,主線程內有很多方法在主線程內,但是子線程,只有 run() 方法是在子線…

基于STM32設計的藥品柜溫濕度監測系統(華為云IOT)(184)

基于STM32設計的藥品柜溫濕度監測系統(華為云IOT)(184) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】整體需求總結【3】項目硬件模塊組成1.2 設計思路【1】整體設計思路【2】ESP8266工作模式配置【3】華為云IOT手機APP界面開發思路1.3 項目開發背景【1】選題的意義【2…

R語言學習筆記6-數據框

R語言學習筆記6-數據框 數據框(DataFrame)介紹數據框用途創建數據框從矩陣創建數據框索引和切片添加和修改列數據框的預處理數據框的排序數據框的合并與拆分數據框的計算與匯總數據框的篩選處理缺失值應用函數處理數據重塑數據框使用 dplyr 進行數據框的管道操作數據框的時間序…

使用 WebSocket 進行實時數據傳輸

以下是使用 WebSocket 進行實時數據傳輸的一般步驟: 一、前端部分 (一)創建 WebSocket 連接 const socket new WebSocket(ws://your-server-url); 在上述代碼中,將 ws://your-server-url 替換為您實際的服務器 WebSocket 地…

SvANet:微小醫學目標分割網絡,增強早期疾病檢測

SvANet:微小醫學目標分割網絡,增強早期疾病檢測 提出背景前人工作醫學對象分割微小醫學對象分割注意力機制 SvANet 結構圖SvANet 解法拆解解法邏輯鏈 論文:SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

【JAVA poi-tl-ext 富文本轉word】

富文本轉word 環境使用poi-tl-ext的原因富文本轉word代碼 環境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已經包…

可靈重大升級!新增Web端上線、首尾幀控制、單次生成視頻時長增加至10s!

快手視頻生成大模型“可靈”&#xff08;Kling&#xff09;&#xff0c;作為全球首個真正用戶可用的視頻生成大模型&#xff0c;自面世以來&#xff0c;憑借其無與倫比的視頻生成效果&#xff0c;在全球范圍內贏得了用戶的熱烈追捧與高度評價。截至目前&#xff0c;申請體驗其內…

修正版頭像上傳組件

修正版頭像上傳組件 文章說明核心源碼展示運行效果展示源碼下載 文章說明 在頭像剪切上傳一文中&#xff0c;我采用div做裁剪效果&#xff0c;感覺會有一些小問題&#xff0c;在昨天基于canvas繪制的功能中改進了一版&#xff0c;讓代碼變得更簡潔&#xff0c;而且通用性相對高…

永恒之藍:一場網絡風暴的啟示

引言 在網絡安全的漫長歷史中&#xff0c;“永恒之藍”&#xff08;EternalBlue&#xff09;是一個不可忽視的里程碑事件。它不僅揭示了網絡世界的脆弱性&#xff0c;還促使全球范圍內對網絡安全的重視達到了前所未有的高度。本文將深入探討“永恒之藍”漏洞的起源、影響及其對…

【WebGIS】從設計層面設計系統

本項目在通過現代信息技術手段&#xff0c;對古村古鎮進行多方位、多角度的數字化記錄、展示與傳播&#xff0c;實現文化遺產的數字化保護、活化利用與共享。項目內容主要包括&#xff1a;1&#xff09;古村古鎮數據庫的建立&#xff1a;通過多種渠道收集古村古鎮的各類信息&am…

期貨量化交易客戶端開源教學第八節——TCP通信服務類

private FReciveStr: AnsiString; {接收到的數據} IsConErr: Boolean; {網絡連接是否失敗} FSocket_LB: Integer; {TCP連接類別,0為交易,1為行情,2為查詢} FRetryCount: Integer; {網絡連接重試次數} FLoginErrEvent: TLoginErrEvent; {…

如何從 PDF 中刪除背景

您是否曾經收到過充滿分散注意力背景的掃描 PDF 文檔&#xff1f;也許是帶有繁忙水印的舊收據或背景光線不均勻的掃描文檔。雖然這些背景可能看起來沒什么大不了的&#xff0c;但它們會使您的工作空間變得混亂&#xff0c;并使您難以專注于重要信息。輕松刪除這些不需要的元素并…

短視頻SEO矩陣系統:源碼開發與部署全攻略

在數字化時代&#xff0c;短視頻已成為人們獲取信息、娛樂休閑的重要方式。隨著短視頻平臺的興起&#xff0c;如何讓自己的內容在眾多視頻中脫穎而出&#xff0c;成為每個創作者和內容運營者關注的焦點。本文將為您深入解析短視頻SEO矩陣系統的源碼開發與部署&#xff0c;助您在…

MT6825磁編碼IC在智能雙旋機器人中的應用

MT6825磁編碼IC在智能雙旋機器人中的應用&#xff0c;無疑為這一領域的創新和發展注入了新的活力。作為一款高性能的磁性位置傳感器&#xff0c;MT6825以其獨特的優勢&#xff0c;在智能雙旋機器人的運動控制、定位精度以及系統穩定性等方面發揮了關鍵作用。 www.abitions.com …

django ninja get not allowed 能用 put delete

遇到一個奇怪的問題&#xff0c;django-ninja 編寫的 get post 方法不能使用 # 獲取Material router.get(/material, responseList[MaterialSchemaOut]) paginate(MyPagination) def list_material(request, filters: Filters Query(...)):qs retrieve(request, Material, f…

Midjourney v6.5 可能會在“7月底”發布,并改進了真實感和皮膚紋理

Midjourney v6.5即將發布&#xff0c;這一更新將大幅提升圖像的真實感和皮膚紋理&#xff0c;為用戶帶來更逼真的視覺體驗。首席執行官David Holz在電話會議中宣布&#xff0c;新版本將提高圖像清晰度&#xff0c;特別是在手部和皮膚細節上&#xff0c;同時改進Web應用程序和個…