企业微信内部消息推送——Python
我有一些自动化任务,这些自动化任务的执行结果,是成功和失败都是通过邮件发送的。但是邮件这个工具,有点正式,毕竟我只想一个通知。那有没有方法可以用微信接受通知呢?
微信我记得有个Server酱,不过好像收费(免费的限制比较多)
于是乎,退而其次,用企业微信。其实,个人也可以注册一个企业微信,不需要营业执照认证之类的。不过有一些更高级的功能就得用真实的企业资料进行认证了,但那些功能目前用不到。
准备工作:
到企业微信官网,注册一个企业;登录企业微信后台,创建一个“自建”应用, 获取企业ID、agentid、secret这3个必要的参数;在企业微信的通讯录中,创建多个测试账号;在手机端安装“企业微信”APP,使用测试账号登录到企业微信,准备接收消息。
程序代码:
企业微信提供API开发接口,通过HTTPS的GET、POST方法与企业微信后台进行交互,完成获取令牌、发送数据、获取数据的操作。
Python代码主要使用requests库,将企业微信API进行简单封装,模拟https的GET、POST操作,向指定的用户发送企业微信消息。
在学习开发企业微信内部应用的时候碰到很多问题,比如调用api、发送POST请求、POST请求上传文件等诸多问题 。
如何注册企业微信?
创建企业微信应用
点进去查看信息,并记录几个关键的id
- AgentId(每个应用都有唯一的agentid)
- Secret(secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏)
access_token的获取
在使用企业微信的api时候首先要知道自己所开发的应用的access_token的值。我们可以通过GET请求来得到access_token的值。
access_token是一个比较特殊的id,得通过接口调用之后获得。ta有时效性,失效之后还得重新获取。参见:https://developer.work.weixin.qq.com/document/path/91039
#需要注意的是,在Python中发送POST、GET等请求需要在前面加上requests库,
#还有就是处理字符串的时候需要使用到json库。
import requests
import json
corpid="XXXXXXXXX" #企业id值
corpsecret="XXXXXXXXXXXX" #应用secret值
#获取access_token
def get_access_token():
get_act_url="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={}&corpsecret={}".format(corpid,corpsecret)
act_res=requests.get(url=get_act_url).json()
access_token=act_res["access_token"]
return access_token
其中,corpid为企业id,可以在企业微信网页后台的“我的企业”——>“企业信息”——>“企业ID”中看到。
代码如下:
1、新建config.py文件,主要用于一些比较固定的参数的存放。比如:我要发给谁、他的部门是什么、使用哪个应用去发送等等。
access_token='XXXXXXXXXXXXXXXXXXXXXXX'
touser="XXXXXXXXXXXXXXX"# 多个用户用|隔开
toparty="1"# 多个部门用|隔开
totag="1"# 多个标签用|隔开
agentid_ceshi1=1000002# 应用id,可以在应用的设置页面查看,一个应用对应一个agentid
type_image = "image"# 媒体文件类型,分别有图片(image)、语音(voice)、视频(video),普通文件(file)
2、新建access_token.py文件
import requests
import config
url = f'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={config.cropid}&corpsecret={config.secretid}'
r = requests.get(url)
print(r.json())
3、新建send_text.py文件
import requests
import json
import faker
from work_wechat import config # 我在work_wechat这个文件夹下面新建的文件
fk = faker.Faker()
url = f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={config.access_token}&random=69152"
# python的json可以编码解码
# json.loads():json格式的字符串------------>字典
# json.dumps():字典转---------------------->json格式的字符串
payload = json.dumps({
"touser": config.touser,
"toparty": config.toparty,
"totag": config.totag,
"msgtype": "text",
"agentid": config.agentid_ceshi1,
"text": {
"content": "已备份成功2,请查收!"
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0
})
headers = {
'User-Agent': fk.user_agent(),
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
说明:
touser:是发送给谁
toparty:哪个部门
totag:标签(企业微信对员工进行管理的时候,定义的标签)
agentid:就是上边让记到小本本上的AgentId,
各个参数的含义,见:https://developer.work.weixin.qq.com/document/path/90665
4、运行send_text.py文件,
然后打开手机上的企业微信(我是发个我寄几的,所以在我自己手机上就收到了)
发送文本消息的实现
#发送文本消息
def send_text_message(message):
send_text_url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(get_access_token())
data={
"touser" : "@all", #接收消息的用户
"msgtype" : "text", #消息类型
"agentid" : 1000002, #应用id
"text" : {
"content" : message #消息内容
},
"safe":0, #0为公开信息,1为保密信息
}
text_message_res=requests.post(url=send_text_url,data=json.dumps(data)).json()
return text_message_res
示例:
send_text_message("你好,开发者") #在括号中填入你要发送的消息,一定要加上单引号或双引号,因为这是字符串
#这里是支持使用转义符的
如果返回值中的errcode为0,则代表消息发送成功。如果发送失败,可以打开返回值中的网站,网站会根据你的错误码告诉你发送失败可能的原因。
agentid为应用id,可以在应用的详情界面找到。
字典data中的“touser”指的是接收消息的用户id,填写“@all”则代表这个应用的所有用户都能收到消息。如果想给指定的用户发送消息,则需要填写用户id,通过“|”分隔。
示例:
"touser" : "xiaozhang|xiaowang|xiaoli|xiaoming"
用户id查看方法:
点击通讯录中用户右侧的三个点,选择编辑
在编辑页面可以看到用户的账号,也就是用户id,管理员也可以修改用户id
除了使用用户id之外,还可以通过部门id、标签两种方式进行定向推送,使用方法同上,在这里就不再赘述。
附上参数表,即字典data的内容,可以根据实际需要来进行使用。
发送图片消息的实现
在使用应用消息推送的api时候,发送图片消息需要我们提供图片的media_id值,以此来获取我们要发送的图片。发送的图片是作为临时素材的,所以我们需要先把图片作为临时素材上传,上传完成后,api会给我们返回图片对应的media_id值。
上传临时素材并获取media_id:
def get_media_id(filetype,path):
upload_file_url = "https://qyapi.weixin.qq.com/cgi-bin/media/upload?access_token={}&type={}".format(get_access_token(),filetype)
files = {filetype: open(path, 'rb')}
file_upload_result = requests.post(upload_file_url, files=files).json()
return file_upload_result["media_id"]
函数的参数中,“filetype”为文件类型,在这里我们填“image”即可(image一定要加单引号或者双引号!)。path为文件路径,填写绝对路径和相对路径都可以。函数返回值为我们需要的media_id值。
示例:
get_media_id("image","a.jpg") #相对路径
get_media_id("image","C:/users/desktop/a.jpg") #绝对路径
得到media_id后,我们就可以发送图片消息了。
#发送图片消息
def send_picture_message(media_id):
send_picture_url="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={}".format(get_access_token())
data={
"touser" : "@all",
"msgtype" : "image",
"agentid" : 1000002,
"image" : {
"media_id" : media_id
},
"safe" : 0,
}
picture_message_res=requests.post(url=send_picture_url,data=json.dumps(data)).json()
return picture_message_res
示例:
send_picture_message(get_media_id("image","a.jpg"))
可能出现的错误
如果在发送消息之后出现了48002的错误代码,那么极有可能是你的通讯录没有同步api。
解决办法:
在管理工具中找到“通讯录同步”
然后编辑权限,设置为API编辑通讯录即可。
————————————————
使用Python发送企业微信消息
准备工作:
到企业微信官网,注册一个企业;登录企业微信后台,创建一个“自建”应用, 获取企业ID、agentid、secret这3个必要的参数;在企业微信的通讯录中,创建多个测试账号;在手机端安装“企业微信”APP,使用测试账号登录到企业微信,准备接收消息。
程序代码:
企业微信提供API开发接口,通过HTTPS的GET、POST方法与企业微信后台进行交互,完成获取令牌、发送数据、获取数据的操作。
Python代码主要使用requests库,将企业微信API进行简单封装,模拟https的GET、POST操作,向指定的用户发送企业微信消息。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
import requests
import json
class WeChat:
def __init__(self):
self.CORPID = 'ww2e1234567895498f5498f' #企业ID,在管理后台获取
self.CORPSECRET = 'xy11234567898hk_ecJ123456789DhKy4_1y12345OI'#自建应用的Secret,每个自建应用里都有单独的secret
self.AGENTID = '1000002' #应用ID,在后台应用中获取
self.TOUSER = "maomao|dingding" # 接收者用户名,多个用户用|分割
def _get_access_token(self):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
values = {'corpid': self.CORPID,
'corpsecret': self.CORPSECRET,
}
req = requests.post(url, params=values)
data = json.loads(req.text)
return data["access_token"]
def get_access_token(self):
try:
with open('./tmp/access_token.conf', 'r') as f:
t, access_token = f.read().split()
except:
with open('./tmp/access_token.conf', 'w') as f:
access_token = self._get_access_token()
cur_time = time.time()
f.write(' '.join([str(cur_time), access_token]))
return access_token
else:
cur_time = time.time()
if 0 < cur_time - float(t) < 7260:
return access_token
else:
with open('./tmp/access_token.conf', 'w') as f:
access_token = self._get_access_token()
f.write(' '.join([str(cur_time), access_token]))
return access_token
def send_data(self, message):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
send_values = {
"touser": self.TOUSER,
"msgtype": "text",
"agentid": self.AGENTID,
"text": {
"content": message
},
"safe": "0"
}
send_msges=(bytes(json.dumps(send_values), 'utf-8'))
respone = requests.post(send_url, send_msges)
respone = respone.json() #当返回的数据是json串的时候直接用.json即可将respone转换成字典
return respone["errmsg"]
if __name__ == '__main__':
wx = WeChat()
wx.send_data("这是程序发送的第1条消息!
Python程序调用企业微信API,从自建应用“告警测试应用”发送给管理员的消息!")
wx.send_data("这是程序发送的第2条消息!")
运行截图:
python实现通过企业微信发送消息
实现了通过企业微信发送消息,平时用于运维的告警还是不错的,相对于邮件来说,实时性更高,不过就是企业微信比较麻烦,此处不做过多解释。
企业微信api的详细请看:http://work.weixin.qq.com/api/doc#10167
话不多说,直接代码
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/4/25 17:06
# @Author : zms
# @Site :
# @File : WeChat.py
# @Software: PyCharm Community Edition
# !/usr/bin/env python
# coding:utf-8
# file wechat.py
import time
import requests
import json
import sys
reload(sys)
sys.setdefaultencoding('utf8')
class WeChat:
def __init__(self):
self.CORPID = '***********'
self.CORPSECRET = '*********************************'
self.AGENTID = '**************'
self.TOUSER = "**********" # 接收者用户名
def _get_access_token(self):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
values = {'corpid': self.CORPID,
'corpsecret': self.CORPSECRET,
}
req = requests.post(url, params=values)
data = json.loads(req.text)
# print data
return data["access_token"]
def get_access_token(self):
try:
with open('./tmp/access_token.conf', 'r') as f:
t, access_token = f.read().split()
except:
with open('./tmp/access_token.conf', 'w') as f:
access_token = self._get_access_token()
cur_time = time.time()
f.write('\t'.join([str(cur_time), access_token]))
return access_token
else:
cur_time = time.time()
if 0 < cur_time - float(t) < 7260:
return access_token
else:
with open('./access_token.conf', 'w') as f:
access_token = self._get_access_token()
f.write('\t'.join([str(cur_time), access_token]))
return access_token
def send_data(self, message):
msg = message.encode('utf-8')
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
send_values = {
"touser": self.TOUSER,
"msgtype": "text",
"agentid": self.AGENTID,
"text": {
"content": msg
},
"safe": "0"
}
send_data = '{"msgtype": "text", "safe": "0", "agentid": %s, "touser": "%s", "text": {"content": "%s"}}' % (
self.AGENTID, self.TOUSER, msg)
r = requests.post(send_url, send_data)
# print r.content
return r.content
if __name__ == '__main__':
wx = WeChat()
wx.send_data("test")
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time
import requests
import json,os
class WeChat_SMS:
def __init__(self):
self.CORPID = 'XXXX'#企业ID, 登陆企业微信,在我的企业-->企业信息里查看
self.CORPSECRET = 'XXXXX'#自建应用,每个自建应用里都有单独的secret
self.AGENTID = 'XXXX' #应用代码
self.TOUSER = "XXX"# 接收者用户名,@all 全体成员
self.TOPARY = "2" #部门ID
def _get_access_token(self):
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
values = {'corpid': self.CORPID,'corpsecret': self.CORPSECRET,}
req = requests.post(url, params=values)
data = json.loads(req.text)
#print (data)
return data["access_token"]
def get_access_token(self):
try:
with open('access_token.conf', 'r') as f:
t, access_token = f.read().split()
except:
with open('access_token.conf', 'w') as f:
access_token = self._get_access_token()
cur_time = time.time()
f.write('\t'.join([str(cur_time), access_token]))
return access_token
else:
cur_time = time.time()
if 0 < cur_time - float(t) < 7200:#token的有效时间7200s
return access_token
else:
with open('access_token.conf', 'w') as f:
access_token = self._get_access_token()
f.write('\t'.join([str(cur_time), access_token]))
return access_token
def send_data(self, msg):
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
send_values = {
"touser": self.TOUSER,
#"toparty": self.TOPARY, #设置给部门发送
"msgtype": "text",
"agentid": self.AGENTID,
"text": {
"content": msg
},
"safe": "0"
}
send_msges=(bytes(json.dumps(send_values), 'utf-8'))
respone = requests.post(send_url, send_msges)
respone = respone.json()#当返回的数据是json串的时候直接用.json即可将respone转换成字典
#print (respone["errmsg"])
return respone["errmsg"]
if __name__ == '__main__':
wx = WeChat_SMS()
wx.send_data(msg="服务崩了,你还在这里吟诗作对?")
#以下是添加对日志的监控
# srcfile = u"G:/123.txt"
# file = open(srcfile)
# file.seek(0, os.SEEK_END)
# while 1:
# where = file.tell()
# line = file.readline()
# if not line:
# time.sleep(1)
# file.seek(where)
# else:
# print(line)
# wx.send_data(msg=line)
python使用微信进行消息推送_我的口袋有三十三的博客-CSDN博客_python发送微信消息
https://blog.csdn.net/qq_37939940/article/details/125630492