Python实现微信接收消息(企业微信接口)

某种情况下,我们需要了解部署脚本的运行情况,以前使用QQ邮箱、Server酱来接收消息,这里以企业微信接口来实现微信接收消息

企业微信

首先到 https://work.weixin.qq.com/ 注册/登录企业微信,不需要真有企业
然后代码的话需要获取下面的信息

企业ID

依次点击 我的企业 > 企业信息 ,在最下边可以看到 企业ID ,然后点击 微信插件 ,在 邀请关注 使用微信扫码并关注

账号

依次点击 通讯录自己的名字 就可以看到 账号

AgentId和Secret

然后在 应用管理 找到 创建应用 ,创建后可以看到 AgentIdSecret

media_id

media_id 即图片id,用于图文消息封面

在上面创建的应用找到 功能 > 发送消息 ,依次点击 发消息素材库图片添加图片,添加完成后再点击该图片,然后右键 在新标签页中打开图像,复制新标签页中的链接,例如:

1
https://work.weixin.qq.com/wework_admin/material/getOpenMsgBuf?type=image&media_id=254JiRsokyDTkgxltiYcigvhon1DmpYyv5pqhfCQ2KbpHQ26571GV4Zx04FEHjEVU&file_name=%E9%BB%98%E8%AE%A4.jpg&download=1

media_id254JiRsokyDTkgxltiYcigvhon1DmpYyv5pqhfCQ2KbpHQ26571GV4Zx04FEHjEVU

完整代码

  • config.py:企业微信相关配置
  • weixi.py:主代码,目前只有 文本消息图文消息图片消息

config.py

1
2
3
4
5
6
7
8
# 企业微信
WEIXIN_PUSH = {
'touser': '账号', # 多个接收者用 | 分隔
'agentid': 'AgentId',
'secret': 'Secret',
'corpid': '企业ID',
'media_id': 'media_id',
}

weixin.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import json
import requests
import config

class WeChat():

def __init__(self):
self.wx = config.QIYEWEIXIN
self.touser = self.wx['touser']
self.agentid = self.wx['agentid']
self.secret = self.wx['secret']
self.corpid = self.wx['corpid']

def get_access_token(self):
'''
获取access_token
'''
response = requests.get(
f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.corpid}&corpsecret={self.secret}")
data = json.loads(response.text)
return data['access_token']

def get_media_id(self, path):
'''
获取图片媒体文件id
'''
if path != None:
access_token = self.get_access_token()
curl = f'https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={access_token}&type=image'
files = {'image': open(path, 'rb')}
response = requests.post(curl, files=files)
data = json.loads(response.text)
return data['media_id']

@staticmethod
def set_geshi(message_list):
digest = '\n'.join(message_list)
content = digest.replace('\n', '<br \>')
return content, digest

def send_text(self, message_list):
'''
推送文本消息
'''
messages = WeChat.set_geshi(message_list)[1]
text_dict = {
"touser": self.touser,
"msgtype": "text",
"agentid": self.agentid,
"text": {
"content": messages
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}

self.send(text_dict)

def send_image(self, path=None):
'''
推送图片
'''
media_id = self.get_media_id(path)
tupian_dict = {
"touser": self.touser,
"msgtype": "image",
"agentid": self.agentid,
"image": {
"media_id": media_id
},
"safe": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}

self.send(tupian_dict)

def send_tuwen(self, title, message_list):
'''
推送图文消息
'''
messages, digest = WeChat.set_geshi(message_list)
tuwen_dict = {
"touser": self.touser,
"msgtype": "mpnews",
"agentid": self.agentid,
"mpnews": {
"articles": [
{
"title": title,
"thumb_media_id": self.wx['media_id'],
"author": "雨园",
"content": messages,
"digest": digest,
}
]
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}

self.send(tuwen_dict)

def send(self, dict):
access_token = self.get_access_token()
json_str = json.dumps(dict)
res = requests.post(
f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={access_token}", data=json_str)

if json.loads(res.text)['errmsg'] == 'ok':
return 'ok'

调用方法

发送文本消息

1
2
3
4
# content_list 的每个元素只能是字符串
content_list = ['我是内容一', '我是内容二', '我是内容三']
# 接收一个参数
WeChat().send_text(content_list)

发送图文消息

1
2
3
4
# content_list 的每个元素只能是字符串
content_list = ['我是内容一', '我是内容二', '我是内容三']
# 接收两个参数:标题和内容
WeChat().send_tuwen('我是标题', content_list)

发送图片消息

1
2
3
# 图片的绝对或相对路径
path = r'测试\tupian.jpg'
WeChat().send_image(path)

效果图

python-yingyong-weixi

问题

如果微信接收不到消息,打开企业微信,在 > 设置 > 新消息通知 > 仅在企业微信中接受信息 中关闭 会话消息应用消息

相关文章

参考资料