@StarSky
2017-01-20T08:15:43.000000Z
字数 2847
阅读 1487
工作日记
API
手头的service监控系统最初是用email的方式发邮件警报,后觉消息接收的不够及时,在网上查资料的过程中发现有人用微信接口推送警报,感觉是个很好的方法,既比邮件更及时,跟短信接口比起来又免费(调短信接口还要跟产品blabla一通才能给调,这点也麻烦)
我们需要先开通一个微信公众号[过程略
微信公众号后台
调Api需通过授权码获取token凭证,然后再凭token码调Api,授权码获取方式如图:
设置->权限管理->语音识别组(所在组)
toparty(部门ID):
通讯录->语音识别(所在部门)->修改
agentid(应用ID):
应用中心->语音识别(消息应用)
#!/usr/bin/env python
# coding: utf-8
import json
import sys
import urllib2
"""
corpid:组别id
corpsecret:组别授权码
<<<授权码如上图所示>>>
touser:成员ID列表,多个接收者用‘|’分隔,toparty填写后可空
toparty:部门ID列表,多个接收者用‘|’分隔,填写后默认发送全组
totag:标签ID列表,多个接收者用‘|’分隔,toparty填写后可空
agentid:企业应用id
msgtype:消息类型,固定为:text
content: 消息内容 (u'xxxxx'格式)
safe:是否是保密消息,0>否,1>是,默认0
"""
class WeChatMSG(object):
def __init__(self, corpid, corpsecret, partyid, agentid):
self.gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
self.gettoken_content = {
'corpid': corpid,
'corpsecret': corpsecret,
}
self.main_content = {
"touser": "",
"toparty": partyid,
"totag": "",
"agentid": agentid,
"msgtype": "text",
"text": {
"content": "",
}
}
def get_access_token(self, string):
token_result = json.loads(string.read())
access_token = token_result['access_token']
return access_token.encode('utf-8')
def geturl(self, url, data):
data = self.encodeurl(data)
response = urllib2.urlopen('%s?%s' % (url, data))
return response.read().decode('utf-8')
def posturl(self, url, data, isjson=True):
if isjson:
data = json.dumps(data, ensure_ascii=False).encode('utf-8')
response = urllib2.urlopen(url, data, timeout=10)
return response.read().decode('utf-8')
def encodeurl(self, dict):
data = ''
for k, v in dict.items():
data += '%s=%s%s' % (k, v, '&')
return data
def send_weixin(self, content):
reload(sys)
sys.setdefaultencoding('utf8')
self.main_content['text']['content'] = content
access_token_response = self.geturl(self.gettoken_url, self.gettoken_content)
access_token = json.loads(access_token_response)['access_token']
sendmsg_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
response = self.posturl(sendmsg_url, self.main_content)
code = json.loads(response)['errcode']
if code == 0:
return True
else:
return False
if __name__ == '__main__':
id = '**********'
secret = '**********'
partyid = "*"
agentid = "*"
content = u'时光机器\n' \
u'应用:时光机器测试\n' \
u'报警时间:7777-07-07 00:00:00\n' \
u'报警服务器:未来时间机器\n' \
u'报警原因:老大哥在看着你 '
msgsender = WeChatMSG(id, secret, partyid, agentid)
msgsender.send_weixin(content)
大家可以用这个demo测试来玩玩。ps: \n
换行
其他未尽事宜请详见微信接口文档[1]及web调试工具[2]
效果图如下:
大部分代码参考了博客 [3],同时修复了在推送中文消息时会遇到的
{"errcode":40033[4],"errmsg":"invalid charset. please check your request, if include \uxxxx will create fail!"} 错误。
错误原因分析:系统默认 charset 是 ascii 码(python3 不会遇到这个问题),在解码过程中过程中将 \uxxxx
转译为 \\uxxxx
后无法再通过 utf-8 将其编码为中文,是直接将乱码传入接口引发的错误。
为了避免频繁的解译码,此处将系统默认 charset 置为 utf-8 [5]
reload(sys)
sys.setdefaultencoding('utf8')
附:
因为公司防火墙的原因,线上系统需要开通对公网的防火墙权限,才能访问外网。
目标ip:140.207.127.79
端口:80/8080
协议:http
花絮:每天下午四点钟审工单并审批,以为这就高枕无忧了,发现自己搞错了协议类型啊啊啊啊啊啊,之前工单附件就传错了,简直不好意思再跟运维说话了啊啊啊啊。然后好不容易问了,发现运维直接开通的是TCP。无言以对,要怎么办才好啊啊啊啊,可还是不通啊啊啊啊。