企业微信最大的好处是提供了很多免费的可供使用的接口,在这里为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;">&lt;div  class=\"highlight\"&gt;时间:{}    事件级别:{}&lt;/div&gt;
                              &lt;div class=\"normal\"&gt;事件描述:{}&lt;/div&gt;
                              &lt;div class=\"normal\"&gt;事件详情:{}&lt;/div&gt;
                           </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. 通过测试,我们可以在企业的应用中收到发送的消息提醒,例如:

 

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