@StarSky
2017-01-20T08:15:43.000000Z
字数 2847
阅读 1699
工作日记 API
手头的service监控系统最初是用email的方式发邮件警报,后觉消息接收的不够及时,在网上查资料的过程中发现有人用微信接口推送警报,感觉是个很好的方法,既比邮件更及时,跟短信接口比起来又免费(调短信接口还要跟产品blabla一通才能给调,这点也麻烦)
我们需要先开通一个微信公众号[过程略
微信公众号后台
调Api需通过授权码获取token凭证,然后再凭token码调Api,授权码获取方式如图:
设置->权限管理->语音识别组(所在组)
toparty(部门ID):
通讯录->语音识别(所在部门)->修改
agentid(应用ID):
应用中心->语音识别(消息应用)

#!/usr/bin/env python# coding: utf-8import jsonimport sysimport urllib2"""corpid:组别idcorpsecret:组别授权码<<<授权码如上图所示>>>touser:成员ID列表,多个接收者用‘|’分隔,toparty填写后可空toparty:部门ID列表,多个接收者用‘|’分隔,填写后默认发送全组totag:标签ID列表,多个接收者用‘|’分隔,toparty填写后可空agentid:企业应用idmsgtype:消息类型,固定为:textcontent: 消息内容 (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 datadef send_weixin(self, content):reload(sys)sys.setdefaultencoding('utf8')self.main_content['text']['content'] = contentaccess_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_tokenresponse = self.posturl(sendmsg_url, self.main_content)code = json.loads(response)['errcode']if code == 0:return Trueelse:return Falseif __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。无言以对,要怎么办才好啊啊啊啊,可还是不通啊啊啊啊。