Python调用企业微信API发送图文消息及防阻塞方案
本文详解如何使用Python调用企业微信API发送包含图片链接的消息。针对图片上传导致主线程阻塞的问题,提供基于多线程的封装方案,并结合OpenCV处理图像,实现高效稳定的消息推送。
企业微信API调用难点与URL方案
企业微信的API文档可读性较差,这给开发者带来了一定困扰。
虽然企业微信原生支持在正文中直接显示图片,但尝试调用相关API时一直报错,经过多次调试仍未解决。最终决定采用拼接图片URL的方式嵌入文字消息。这种方式的优势在于解耦了图片存储与企业微信的限制,未来可灵活更换图床。需要注意的是,企业微信免费版每日上传图片数量有限制(约200张),若需求量大,建议采用第三方图床服务。
为避免图片上传过程阻塞主线程,我将上传逻辑封装在一个使用新线程执行的方法中。经实际测试,若不采用此方式,程序确实会出现卡顿现象。
核心代码实现与多线程封装
import requests
import json
from threading import Thread
import cv2
import os
class Wechat_Info():
def __init__(self):
self.partyID = ''
self.corpID = ''
self.secret = ''
self.agentID = ''
self.token = None
self.pic = None
def __get_token(self, corpid, secret):
Url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken"
Data = {
"corpid": corpid,
"corpsecret": secret
}
r = requests.get(url=Url, params=Data)
token = r.json()['access_token']
return token
def send_message(self, message):
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(
self.__get_token(self.corpID, self.secret))
data = {
"toparty": self.partyID,
"msgtype": "text",
"agentid": self.agentID,
"text": {
"content": message
},
"safe": "0"
}
result = requests.post(url=url, data=json.dumps(data))
return result.text
def get_media_url(self, path): ##上传到图片素材 图片url
Gtoken = self.__get_token(self.corpID, self.secret)
img_url = "https://qyapi.weixin.qq.com/cgi-bin/media/uploadimg?access_token={}".format(Gtoken)
files = {'media': open(path, 'rb')}
r = requests.post(img_url, files=files)
re = json.loads(r.text)
# print("media_id: " + re['media_id'])
return re['url']
def send_pic(self, pic_path):
img_url = self.get_media_url(pic_path)
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(
self.__get_token(self.corpID, self.secret))
data = {
"toparty": self.partyID,
"msgtype": "text",
"agentid": self.agentID,
"text": {
"content": img_url
},
"safe": "0"
}
result = requests.post(url=url, data=json.dumps(data))
return result.text
def send_violence_warning(self, pic_path):
img_url = self.get_media_url(pic_path)
url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(
self.__get_token(self.corpID, self.secret))
data = {
"toparty": self.partyID,
"msgtype": "text",
"agentid": self.agentID,
"text": {
"content": '【管理员注意】,有校园暴力行为发生,请及时处理!监控图片>>' + img_url
},
"safe": "0"
}
result = requests.post(url=url, data=json.dumps(data))
return result.text
def send_violence_warning_read_path_from_class(self):
pic_path = 'temp.jpg'
cv2.imwrite(pic_path, self.pic)
self.send_violence_warning(pic_path)
os.remove(pic_path)
def send_violence_warning_in_new_thread(self, pic):
self.pic = pic
thread = Thread(target=self.send_violence_warning_read_path_from_class)
thread.start()
if __name__ == '__main__':
wechat_info = Wechat_Info()
# result = wechat_info.send_message('微信测试_2020')
# result = wechat_info.send_pic('C:\\Users\\JiaDing\\Desktop\\pic.jpg')
result = wechat_info.send_violence_warning('C:\\Users\\JiaDing\\Desktop\\pic.jpg')
print(result)
调用方法与效果展示
在主线程中调用封装好的 方法,并将OpenCV处理的图片传入即可。
具体效果如下:

尽管使用的是URL链接,但显示效果良好。用户点击即可查看图片,即使使用第三方图床也未出现任何提示或异常,且加载速度较快,运行稳定。
以上即为Python向企业微信发送文字和图片消息的完整示例,更多相关技术细节可参考本站其他文章。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













