[关闭]
@StarSky 2017-01-20T08:15:43.000000Z 字数 2847 阅读 1487

微信消息接口的正确食用方式

工作日记 API


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

演示demo如下

  1. #!/usr/bin/env python
  2. # coding: utf-8
  3. import json
  4. import sys
  5. import urllib2
  6. """
  7. corpid:组别id
  8. corpsecret:组别授权码
  9. <<<授权码如上图所示>>>
  10. touser:成员ID列表,多个接收者用‘|’分隔,toparty填写后可空
  11. toparty:部门ID列表,多个接收者用‘|’分隔,填写后默认发送全组
  12. totag:标签ID列表,多个接收者用‘|’分隔,toparty填写后可空
  13. agentid:企业应用id
  14. msgtype:消息类型,固定为:text
  15. content: 消息内容 (u'xxxxx'格式)
  16. safe:是否是保密消息,0>否,1>是,默认0
  17. """
  18. class WeChatMSG(object):
  19. def __init__(self, corpid, corpsecret, partyid, agentid):
  20. self.gettoken_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
  21. self.gettoken_content = {
  22. 'corpid': corpid,
  23. 'corpsecret': corpsecret,
  24. }
  25. self.main_content = {
  26. "touser": "",
  27. "toparty": partyid,
  28. "totag": "",
  29. "agentid": agentid,
  30. "msgtype": "text",
  31. "text": {
  32. "content": "",
  33. }
  34. }
  35. def get_access_token(self, string):
  36. token_result = json.loads(string.read())
  37. access_token = token_result['access_token']
  38. return access_token.encode('utf-8')
  39. def geturl(self, url, data):
  40. data = self.encodeurl(data)
  41. response = urllib2.urlopen('%s?%s' % (url, data))
  42. return response.read().decode('utf-8')
  43. def posturl(self, url, data, isjson=True):
  44. if isjson:
  45. data = json.dumps(data, ensure_ascii=False).encode('utf-8')
  46. response = urllib2.urlopen(url, data, timeout=10)
  47. return response.read().decode('utf-8')
  48. def encodeurl(self, dict):
  49. data = ''
  50. for k, v in dict.items():
  51. data += '%s=%s%s' % (k, v, '&')
  52. return data
  53. def send_weixin(self, content):
  54. reload(sys)
  55. sys.setdefaultencoding('utf8')
  56. self.main_content['text']['content'] = content
  57. access_token_response = self.geturl(self.gettoken_url, self.gettoken_content)
  58. access_token = json.loads(access_token_response)['access_token']
  59. sendmsg_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s' % access_token
  60. response = self.posturl(sendmsg_url, self.main_content)
  61. code = json.loads(response)['errcode']
  62. if code == 0:
  63. return True
  64. else:
  65. return False
  66. if __name__ == '__main__':
  67. id = '**********'
  68. secret = '**********'
  69. partyid = "*"
  70. agentid = "*"
  71. content = u'时光机器\n' \
  72. u'应用:时光机器测试\n' \
  73. u'报警时间:7777-07-07 00:00:00\n' \
  74. u'报警服务器:未来时间机器\n' \
  75. u'报警原因:老大哥在看着你 '
  76. msgsender = WeChatMSG(id, secret, partyid, agentid)
  77. msgsender.send_weixin(content)

大家可以用这个demo测试来玩玩。ps: \n 换行
其他未尽事宜请详见微信接口文档[1]及web调试工具[2]
效果图如下:
WechatIMG1.jpeg-102.7kB

大部分代码参考了博客 [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。无言以对,要怎么办才好啊啊啊啊,可还是不通啊啊啊啊。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注