企业微信最大的好处是提供了很多免费的可供使用的接口,在这里为TX点一波大赞,也终于给我们提供了一个免费薅羊毛的机会,通过企业微信提供的开放API,可以做很多跟监控相关的事情,比如最常用的预警消息,比如集成到APP中去,发送用户购买的消息提醒等等。
企业微信的API地址
https://work.weixin.qq.com/api/doc/90000/90135/90236
可以看到,在企业微信中,TX是真的非常细心的,第一次感觉微信团队也能写出如此让人看的懂的开发文档,确定不易。此篇首先介绍用PYTHON3实现消息发送接口,后续后利用此接口,来进行更多有用的集成。
python 集成企业微信发送消息
1. 去企业微信管理员后台创建应用
- 登录企业微信
点击应用管理-》应用-》自建-》创建应用

- 创建应用后,agentid和secret后面会用到,corpid有的是wx开头,有的以ww开头。
这些基础的东西,请自行百度,网上一堆的,另外也可以参考上面的文档地址,毕竟难得TX把文档第一次写的如此的仔细,请细细品。
2. python 集成企业微信消息发送 weixin363.py
#!/usr/bin/python # -*- coding:utf-8 -*- import urllib import urllib.parse import urllib.request import urllib.error import requests import json import sys import time # 应用的id agentid = "10000xxx" # 企业微信的id 在企业微信管理员后台查询 corpid = "wwf859245xxxxxxx" # 企业微信的 密码 也是需要企业微信管理员才能看到 secret = "i_Trm5aS-mDjye21axxxxxxxxxxxx"class WeChat(object): __token_id = '' headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.96 Safari/537.36', 'Content-Type': 'application/json', 'cache-control': 'no-cache', }
</span><span style="color: #008000;">#</span><span style="color: #008000;"> ctor</span> <span style="color: #0000ff;">def</span> <span style="color: #800080;">__init__</span>(self, agentid=agentid, secret=<span style="color: #000000;">secret): self.</span><span style="color: #800080;">__url</span> = <span style="color: #800000;">'</span><span style="color: #800000;">https://qyapi.weixin.qq.com/cgi-bin</span><span style="color: #800000;">'</span>.rstrip(<span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">) self.</span><span style="color: #800080;">__corpid</span> =<span style="color: #000000;"> corpid self.</span><span style="color: #800080;">__secret</span> =<span style="color: #000000;"> secret self.</span><span style="color: #800080;">__agentid</span> =<span style="color: #000000;"> agentid </span><span style="color: #008000;">#</span><span style="color: #008000;"> Get TokenID</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> authID(self): params </span>= {<span style="color: #800000;">'</span><span style="color: #800000;">corpid</span><span style="color: #800000;">'</span>: self.<span style="color: #800080;">__corpid</span>, <span style="color: #800000;">'</span><span style="color: #800000;">corpsecret</span><span style="color: #800000;">'</span>: self.<span style="color: #800080;">__secret</span><span style="color: #000000;">} data </span>=<span style="color: #000000;"> urllib.parse.urlencode(params) </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(data) content </span>=<span style="color: #000000;"> self.getToken(data) </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">content is {}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(content)) </span><span style="color: #0000ff;">try</span><span style="color: #000000;">: self.</span><span style="color: #800080;">__token_id</span> = content[<span style="color: #800000;">'</span><span style="color: #800000;">access_token</span><span style="color: #800000;">'</span><span style="color: #000000;">] </span><span style="color: #008000;">#</span><span style="color: #008000;"> print content['access_token']</span> <span style="color: #008000;">#</span><span style="color: #008000;"> print(self.__token_id)</span> <span style="color: #0000ff;">except</span><span style="color: #000000;"> KeyError: </span><span style="color: #0000ff;">raise</span><span style="color: #000000;"> KeyError </span><span style="color: #008000;">#</span><span style="color: #008000;"> Establish a connection</span> <span style="color: #0000ff;">def</span> getToken(self, data, url_prefix=<span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">): url </span>= self.<span style="color: #800080;">__url</span> + url_prefix + <span style="color: #800000;">'</span><span style="color: #800000;">gettoken?</span><span style="color: #800000;">'</span> <span style="color: #0000ff;">try</span><span style="color: #000000;">: response </span>= urllib.request.Request(url +<span style="color: #000000;"> data) </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> KeyError: </span><span style="color: #0000ff;">raise</span><span style="color: #000000;"> KeyError result </span>=<span style="color: #000000;"> urllib.request.urlopen(response) content </span>=<span style="color: #000000;"> json.loads(result.read()) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> content </span><span style="color: #008000;">#</span><span style="color: #008000;"> Get sendmessage url</span> <span style="color: #0000ff;">def</span> postData(self, data, url_prefix=<span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">): url </span>= self.<span style="color: #800080;">__url</span> + url_prefix + <span style="color: #800000;">'</span><span style="color: #800000;">message/send?access_token=%s</span><span style="color: #800000;">'</span> % self.<span style="color: #800080;">__token_id</span> <span style="color: #008000;">#</span><span style="color: #008000;"> data = urllib.parse.urlencode(data).encode('utf-8')</span> data =<span style="color: #000000;"> json.dumps(data) data </span>= bytes(data, <span style="color: #800000;">'</span><span style="color: #800000;">utf8</span><span style="color: #800000;">'</span><span style="color: #000000;">) request </span>= urllib.request.Request(url, data=data, headers=<span style="color: #000000;">self.headers) </span><span style="color: #0000ff;">try</span><span style="color: #000000;">: result </span>=<span style="color: #000000;"> urllib.request.urlopen(request) </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(result.read()) </span><span style="color: #0000ff;">except</span><span style="color: #000000;"> urllib.error.HTTPError as e: </span><span style="color: #0000ff;">if</span> hasattr(e, <span style="color: #800000;">'</span><span style="color: #800000;">reason</span><span style="color: #800000;">'</span><span style="color: #000000;">): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">reason</span><span style="color: #800000;">'</span><span style="color: #000000;">, e.reason) </span><span style="color: #0000ff;">elif</span> hasattr(e, <span style="color: #800000;">'</span><span style="color: #800000;">code</span><span style="color: #800000;">'</span><span style="color: #000000;">): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">code</span><span style="color: #800000;">'</span><span style="color: #000000;">, e.code) </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> 0 </span><span style="color: #0000ff;">else</span><span style="color: #000000;">: content </span>=<span style="color: #000000;"> json.loads(result.read()) </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">"</span><span style="color: #800000;">content is :{}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(content)) result.close() </span><span style="color: #0000ff;">return</span><span style="color: #000000;"> content </span><span style="color: #008000;">#</span><span style="color: #008000;"> send message 文本</span> <span style="color: #0000ff;">def</span><span style="color: #000000;"> sendMessage(self, touser, message): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">touser:{} and message:{}</span><span style="color: #800000;">'</span><span style="color: #000000;">.format(touser, message)) self.authID() </span><span style="color: #008000;">#</span><span style="color: #008000;"> data = json.dumps({'touser': '{}'.format(touser),</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'toparty': "2",</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'msgtype': "text",</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'agentid': "1000002",</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'text': {</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'content': message</span> <span style="color: #008000;">#</span><span style="color: #008000;"> }</span> <span style="color: #008000;">#</span><span style="color: #008000;"> }, ensure_ascii=False)</span> data =<span style="color: #000000;"> { </span><span style="color: #800000;">"</span><span style="color: #800000;">touser</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">{}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(touser), </span><span style="color: #800000;">"</span><span style="color: #800000;">toparty</span><span style="color: #800000;">"</span>: <span style="color: #800000;">""</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">totag</span><span style="color: #800000;">"</span>: <span style="color: #800000;">""</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">msgtype</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">text</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">agentid</span><span style="color: #800000;">"</span>: self.<span style="color: #800080;">__agentid</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">text</span><span style="color: #800000;">"</span><span style="color: #000000;">: { </span><span style="color: #800000;">"</span><span style="color: #800000;">content</span><span style="color: #800000;">"</span><span style="color: #000000;">: message} } response </span>=<span style="color: #000000;"> self.postData(data) </span><span style="color: #0000ff;">print</span><span style="color: #000000;">(response) </span><span style="color: #008000;">#</span><span style="color: #008000;"> 发送卡片消息</span> <span style="color: #0000ff;">def</span> sendMessage_textcard(self, title, severity, message, detail, touser=<span style="color: #800000;">'</span><span style="color: #800000;">@all</span><span style="color: #800000;">'</span><span style="color: #000000;">): </span><span style="color: #0000ff;">print</span>(<span style="color: #800000;">'</span><span style="color: #800000;">touser:{} and message:{}</span><span style="color: #800000;">'</span><span style="color: #000000;">.format(touser, message)) self.authID() </span><span style="color: #008000;">#</span><span style="color: #008000;"> data = json.dumps({'touser': '{}'.format(touser),</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'toparty': "2",</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'msgtype': "text",</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'agentid': "1000002",</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'text': {</span> <span style="color: #008000;">#</span><span style="color: #008000;"> 'content': message</span> <span style="color: #008000;">#</span><span style="color: #008000;"> }</span> <span style="color: #008000;">#</span><span style="color: #008000;"> }, ensure_ascii=False)</span> data =<span style="color: #000000;"> { </span><span style="color: #800000;">"</span><span style="color: #800000;">touser</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">{}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(touser), </span><span style="color: #800000;">"</span><span style="color: #800000;">toparty</span><span style="color: #800000;">"</span>: <span style="color: #800000;">""</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">totag</span><span style="color: #800000;">"</span>: <span style="color: #800000;">""</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">msgtype</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">text</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">agentid</span><span style="color: #800000;">"</span>: self.<span style="color: #800080;">__agentid</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">text</span><span style="color: #800000;">"</span><span style="color: #000000;">: { </span><span style="color: #800000;">"</span><span style="color: #800000;">content</span><span style="color: #800000;">"</span><span style="color: #000000;">: message} } data </span>=<span style="color: #000000;"> { </span><span style="color: #800000;">"</span><span style="color: #800000;">touser</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">{}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(touser), </span><span style="color: #800000;">"</span><span style="color: #800000;">toparty</span><span style="color: #800000;">"</span>: <span style="color: #800000;">""</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">totag</span><span style="color: #800000;">"</span>: <span style="color: #800000;">""</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">msgtype</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">textcard</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">agentid</span><span style="color: #800000;">"</span>: self.<span style="color: #800080;">__agentid</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">textcard</span><span style="color: #800000;">"</span><span style="color: #000000;">: { </span><span style="color: #800000;">"</span><span style="color: #800000;">title</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">事件:{}</span><span style="color: #800000;">"</span><span style="color: #000000;">.format(title), </span><span style="color: #800000;">"</span><span style="color: #800000;">description</span><span style="color: #800000;">"</span>: <span style="color: #800000;">'''</span><span style="color: #800000;"><div class=\"highlight\">时间:{} 事件级别:{}</div> <div class=\"normal\">事件描述:{}</div> <div class=\"normal\">事件详情:{}</div> </span><span style="color: #800000;">'''</span><span style="color: #000000;">.format( time.strftime(</span><span style="color: #800000;">"</span><span style="color: #800000;">%Y-%m-%d %H:%M:%S</span><span style="color: #800000;">"</span><span style="color: #000000;">, time.localtime()), severity, message, detail), </span><span style="color: #800000;">"</span><span style="color: #800000;">url</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">http://#</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">btntxt</span><span style="color: #800000;">"</span>: <span style="color: #800000;">"</span><span style="color: #800000;">点击查看详细</span><span style="color: #800000;">"</span><span style="color: #000000;"> }, </span><span style="color: #800000;">"</span><span style="color: #800000;">enable_id_trans</span><span style="color: #800000;">"</span><span style="color: #000000;">: 0, </span><span style="color: #800000;">"</span><span style="color: #800000;">enable_duplicate_check</span><span style="color: #800000;">"</span><span style="color: #000000;">: 0, </span><span style="color: #800000;">"</span><span style="color: #800000;">duplicate_check_interval</span><span style="color: #800000;">"</span>: 1800<span style="color: #000000;"> } response </span>=<span style="color: #000000;"> self.postData(data) </span><span style="color: #0000ff;">print</span>(response)<br /><br />测试发送消息:<br /><br /></pre>if __name__ == '__main__':
a = WeChat()
# 通过console指定参数测试发送情况
# a.sendMessage(sys.argv[1], sys.argv[3])
# 直接调用接口发送
a.sendMessage('@all', '交通码应用监控测试消息,收到请忽略')
在Termial中直接调用测试# weixin363.py --corpid=ww021ewwwwww --corpsecret=HITayl-0uNxGQ3rxxxxxxxxx --msg="您好</br>告警测试" --user=@all --agentid=1000002
3. 通过测试,我们可以在企业的应用中收到发送的消息提醒,例如:

这里由于没有配置 回调接口,所以我们点击查看的时候,是没有详细内容的,具体可以再结合文档进行功能扩展。

