利用企业微信群机器人可以推送三种类型的消息,文本信息、markdown格式、图文消息。
前面写过文本消息、markdown格式文本消息的推送,公司小伙伴觉得如果能把最近的业绩数据生成曲线图发送到群里,就更直观了。这当然也难不到phthon,要知道python在科学计算和图表生成方面可是很强的。
企业微信群机器人发送图片消息的格式如下:企业微信群机器人接口说明
图片消息是以base64编码方式发送的,需要生成图片的base64编码和文件的md5值,所以这个功能中需要用到python的几个库:
import time # 用于取当前时间,生成图片文件名用的
import pymssql # 连接数据库的操作
import requests # 请求接口
import matplotlib.pyplot as plt # 生成图表
import hashlib # 生成图片文件的md5
import os # 文件操作
import base64 # 生成图片文件的base64编码
看上去并不复杂的功能,需要用到以上7个库,涉及的知识内容还是有点多的,具体实现的程序流程如下:程序流程
最后实现的效果如下(我只做了一个简单的折线图,要生成其它图形也是可以的,原理一样,举一反三吧):生成折线图并自动发送到群的效果
下面是奉上完整代码:
# -*- coding: utf-8 -*-
# s = '中文' # 注意这里的 str 是 str 类型的,而不是 unicode
# s.encode('gb2312')
import time
import pymssql
import requests
import matplotlib.pyplot as plt
import hashlib
import os
import base64
# 获取文件的Base64编码
def get_file_base64(filepath):
if not os.path.isfile(filepath):
return
with open(filepath, "rb") as f:
image = f.read()
image_base64 = str(base64.b64encode(image), encoding='utf-8') # 这里要说明编码,否则不成功
return image_base64
# 获取文件md5函数
def get_file_md5(filepath):
# 获取文件的md5
if not os.path.isfile(filepath):
return
myhash = hashlib.md5()
f = open(filepath, "rb")
while True:
b = f.read(8096)
if not b:
break
myhash.update(b)
f.close
# print(myhash.hexdigest())
return myhash.hexdigest()
# 发送消息函数, msgtype定义:text 发送字符串消息,markdown 发送图片消息,image 发送图片消息, news 发送图文消息
def postmsg(url, post_data, msgtype):
# sss = "这是一条用python发送的测试信息,请忽略!"
post_data = '{"msgtype" : "%s", "%s" : %s}' % (msgtype, msgtype, post_data)
# post_data = '{"msgtype": "markdown","markdown": {"content": "%s"}}' % sss
# print(post_data)
if url == '':
print('URL地址为空!')
else:
r = requests.post(url, data=post_data.encode())
rstr = r.json()
if r.status_code == 200 and 'error' not in rstr:
result = '发送成功'
return result
else:
return 'Error'
def querySQL():
# 数据库连接配置
config_dict = {
'user': '***',
'password': '******',
'host': '******',
'database': '******'
}
def conn():
connect = pymssql.connect(**config_dict)
if connect:
print("connect success!!!")
return connect
else:
print("连接失败!请检查配置信息!")
conn = conn()
cursor = conn.cursor()
sql = "select * from [TableName] order by [Fields]" # 编写SQL查询字符串
cursor.execute(sql)
col = cursor.description
resultdata = cursor.fetchall()
return resultdata, col
cursor.close()
conn.close()
if __name__ == '__main__':
url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*******-****-****-****-******" # 群机器人地址
resultdata, col = querySQL()
# print(resultdata)
# print(col) 查询到的表的列名
datelist = []
for i in range(len(resultdata)):
datelist.append(resultdata[i][0])
# print(datelist)
saleslist = []
for j in range(len(resultdata)):
saleslist.append(int(resultdata[j][1]))
# print(saleslist) # 销售数据清单
# 刻度和序列值
x_data = datelist
y_data = saleslist
# plt.plot(x_data, y_data)
# 设置画布大小
plt.figure(figsize=(16, 8))
plt.title("The Recent 7 Days Sales")
plt.plot(x_data, y_data, label='金额', linewidth=3, color='black', marker='o', markerfacecolor='r',
markersize=10) # 标记点
# 设置数字标签
for a, b in zip(x_data, y_data):
plt.text(a, b, b, ha='center', va='bottom', fontsize=14)
# 取当前时间为文件名
pic_full_name = './' + time.strftime("%Y%m%d%H%M%S", time.localtime()) + '.jpg'
plt.savefig(pic_full_name)
pic_md5 = get_file_md5(pic_full_name)
pic_base64s = get_file_base64(pic_full_name)
# print(pic_md5)
# print(pic_base64s)
# plt.show() # 显示图表
out_mk_msg = "### 最近七天市场业绩:\n"
for i in range(len(resultdata)):
out_mk_msg = out_mk_msg + r">日期:%s , 业绩:%d , 店数:%s , 新会员:%s , 老会员:%s " % (
resultdata[i][0], resultdata[i][1], resultdata[i][2], resultdata[i][3], resultdata[i][4]) + "\n"
out_mk_msg = '{"content": "%s"}' % out_mk_msg
# print(out_mk_msg)
# 调用postmsg向接口提交数据,分别提并markdwon格式及图片格式消息
result = postmsg(url, out_mk_msg, "markdown")
# print(result)
out_pic_msg = '{"base64":"%s", "md5":"%s"}' % (pic_base64s, pic_md5)
result = postmsg(url, out_pic_msg, "image")
print(result)
代码运行环境为phthon3.8,如果把以上代码设定为windows任务计划,就可以实现定时自动推送了。至此,企业微信群机器人的几种调用方式,还差一种图文消息没有写了:)
赠人玫瑰、手留余香,如果本文对你有用,顺手点个赞吧,谢谢!