WechatWork企业微信的webhook使用

我真的是,给自己挖坑,挖的好想吐了……
我简直就是个二傻子……

WechatWork的群机器人

可以通过向机器人的webhook地址推送数据,达到群消息发送的目的。
参考:如何配置群机器人?-帮助中心-企业微信

用途呢,可以自己做些监控啊,发送点感兴趣的消息呀。还是比较有意思的。

目前按照官方的说法,支持发送的类型:

  • 消息 - TEXT
  • markdown
  • 图片 - Image
  • 图文 - news

调用方法基本上按照说明,就可以调出来。但是由于图片(image)类型,涉及到了编码转换,所以调用的时候,对于我这种外围玩家,有些难度。

下面用我的代码详细列一下。

消息(TEXT)类型

这种比较简单,所以我没用

Markdown类型

官方说明格式

我的补充

目前支持的字体颜色应该是4个(包括默认黑色),所以不能做的五颜六色。
尽量还是简洁为主吧。

我的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def msg_markdown():
addr = 'https://v1.jinrishici.com/all.json' # 今日诗词的开放api
http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
response = http.request('GET', addr)
data = json.loads(response.data.decode('utf-8'))

hook_addr = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*********"
time = datetime.datetime.now()
today = time.strftime('%Y-%m-%d')

data = {
"msgtype": "markdown",
"markdown": {
"content": "每日诗词 %s\n\
>诗词: <font color=\"info\">%s</font>\n\
>出自: <font color=\"comment\">%s</font>"
%(today, data['content'], data['author']+'-'+data['origin'])
}
}
data = json.dumps(data).encode()
response_hook = http.request('POST', hook_addr, body=data)

图文(news)类型

官方说明格式

我的补充

支持多个消息多文章发送,articles的值传输的是个list。
多文章发送,则无法在消息界面看到文章的description,只能看到title。

我的代码

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
def msg_news():
addr = 'https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1' # bing每日图片url
http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
response = http.request('GET', addr)
data = json.loads(response.data.decode('utf-8'))

pic_addr = 'https://cn.bing.com' + data['images'][0]['url']
copyrightlink = data['images'][0]['copyrightlink']
copyright = data['images'][0]['copyright']
hook_addr = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*********"
# 传输webhook图文消息
data_copyright = {
"msgtype": "news",
"news": {
"articles": [
{
"title": "每日图片(from bing)",
"description": "%s\n\n(点击搜索)" %(copyright),
"url": "%s" %(copyrightlink),
"picurl": "%s" %(pic_addr),
}
]
}
}
data_copyright = json.dumps(data_copyright).encode()
response_hook = http.request('POST', hook_addr, body=data_copyright)

图片(Image)类型

官方说明格式

我的补充

图片类型的难处在于,要把你的图片转码,base64&MD5。
实话讲,我这个转码都要做吐了。各种查资料,各种测试,最后落下的代码很简单,但是真的一步步验证了好久。
实际传输的json里,编码的字串要转换成str类型,一定要注意下。我开始就是转化编码后,一直没有decode成str类型。
所以json构造就各种报错。
另外,读取图片文件,在一个with open()里转换base64和md5,md5转换前不知道为什么始终会抓到空数据,而不是图片的数据,导致md5码是错的。
所以我不得不分两次打开图片文件读取数据,然后分开两次转换编码。

我的代码

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
def msg_image():
hook_addr = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=*********"
picfile_name = '/Users/alalala/bing.cn/20200429.jpg'
with open(picfile_name, "rb") as f: # 构造BASE64的编码
b64 = f.read()
b64 = base64.b64encode(b64)
s_b64 = bytes.decode(b64)
f.close()
with open(picfile_name, "rb") as f: # 构造MD5的编码
digistSrc = f.read()
m5 = hashlib.md5()
m5.update(digistSrc)
digest = m5.hexdigest()
s_md5 = digest
f.close()
# 传输webhook图片
data_pic = {
"msgtype": "image",
"image": {
"base64": s_b64,
"md5": s_md5,
}
}
data_pic = json.dumps(data_pic).encode()
respone_hook = http.request('POST', hook_addr, body=data_pic)

最终效果