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)
|
最终效果

Author:
Konta
Discuss:
吐槽及留言
Permalink:
http://tech.hahaalot.com/2020/04/29/WechatWork企业微信的webhook使用/
License:
Copyright (c) 2020 CC-BY-NC-4.0 LICENSE
Slogan:
YOLO!