通用技术 调用微信接口实现测试监控

snake · August 04, 2016 · 3252 hits
本帖已被设为精华帖!

最近写了些东东,来监控各种异常。传统的发邮件时效性不太好,更何况每天那么多邮件。
想到用微信的企业号来发消息。最重要一点,它是免费的。

首先要注册一个账号:
here

选择企业号

要填手机号,(微信需要绑定银行卡),扫描一下。

填写完公众号信息,就差不多看到曙光了。

创建一个应用,本人选择的是消息型。

设置管理员
指定应用的管理员。点击设置-> 权限管理 -> 管理 -> 新建管理组 --> 添加管理员和权限。然后就会获得 corpid 和 sceret。记录下来,这个很重要。后面代码中用得到。

然后就是敲代码了。

#!/usr/bin/python
# coding=utf-8
import sys
import urllib2
import time
import json
import requests

__author__ = 'anderson'

reload(sys)
sys.setdefaultencoding('utf-8')

CORPID = "XXXX"
CORPSECRET = "XXXX"
BASEURL = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={0}&corpsecret={1}'.format(CORPID, CORPSECRET)
URL = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s"


class Token(object):
    # get token
    def __init__(self):

        self.expire_time = sys.maxint

    def get_token(self):
        if self.expire_time > time.time():
            request = urllib2.Request(BASEURL)
            response = urllib2.urlopen(request)
            result_string = response.read().strip()
            result_json = json.loads(result_string)
            if 'errcode' in result_json.keys():
                print >> result_json['errmsg'], sys.stderr
                sys.exit(1)
            self.expire_time = time.time() + result_json['expires_in']
            self.access_token = result_json['access_token']
        return self.access_token


def send_message(title, content):
    team_token = Token().get_token()
    print team_token
    url = URL % (team_token)
    wechat_json = {
        "toparty": "1",
        "msgtype": "text",
        "agentid": "1",
        "text": {
            "content": "title:{0}\n content:{1}".format(title, content)
        },
        "safe": "0"
    }
    response = requests.post(url, data=json.dumps(wechat_json, ensure_ascii=False, encoding='utf8'))
    print response.json()


if __name__ == '__main__':
    send_message("test", "just test")

运行一下,就可以收到消息了:

点开,显示正确:

可以设置各种群组,接收消息的人。
结合 Jenkins, 灵活运用到测试中来。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 35 条回复 时间 点赞
思寒_seveniruby 将本帖设为了精华贴 04 Aug 13:28

加精理由: 提供了一个不错的报警思路. 有用.

其他的微信公众号通过接口应该也能发. 你的这个脚本可以试试再精简为两三行 bash 脚本.

微信报警的效率要会高一些,请问楼主一下是否有字数限制以及每日条数限制?@snake

snake #4 · August 04, 2016 Author

每次最多发 2W 个字符; 条数限制,我记得在哪里看到是每月 200 条,还是每分钟最多发 200 条。认证需要费用。不认证的企业号,可以支持 200 人用,一般小企业并且需求不高的话,可以不认证。

我擦,正好用得上!先去试试看

如果公司用钉钉的话,其实钉钉更合适,一天 1000 次调用,支持富文本消息,我们的监控就是通过钉钉推送消息的

很棒啊,又多了一个思路了

上次有弄过一个监控异常通知的小脚本,也考虑过使用公众号,可是因为多种原因放弃了,后来使用了 selenium 加 WEB 版的微信解决了。。。你这个比我的要好太多了!

#6 楼 @u1470305603 钉钉是直接短信发到手机吗? 有 api 吗?

这个思路不错,试试看!

发的消息是在订阅号里面,还是消息列表里的?

个人订阅号是否有限制,同问下

接口返回{'errcode': 0, 'errmsg': 'ok'}

这个思路不错,试试看!

试试看

onealert 免费版基本也是够用的。通知途径还是很多的

报错,搞不定啊
TypeError: the JSON object must be str, not 'bytes'

匿名 #19 · August 31, 2016

手动可以发送消息,但是 python 发就报错{u'errcode': 82001, u'errmsg': u'All touser & toparty & totag invalid'},是不是发送的 json 内容有错误啊,比如 toparty 或 agentid 不对,按照你代码写的,传的都是 1

匿名 #20 · August 31, 2016

#14 楼 @wuyuleba {u'errcode': 0, u'errmsg': u'ok'} 这种情况我也遇到了,我发送给@all,响应值就是这样,但是微信没收到,手动发就收到了,你解决了没?

匿名 #21 · August 31, 2016

我已经解决了报错和收不到消息的问题了,现在有一个新的问题,就是这个发送消息的 py 脚本,怎么在 jenkins 中使用?构建完成后,没有找到对应的插件去执行 python 文件,请问你们这里是怎么解决的?

#21 楼 @Tank007 插件名忘了

匿名 #23 · September 08, 2016

#22 楼 @wuyuleba 这样不能根据构建的结果发送通知,一般这种情况都是构建失败或者用例报错然后发送的通知,而且通知的内容最好还有相关的构建状态信息等,直接 shell 好像不能满足需求

#23 楼 @Tank007 win %ERRORLEVEL% linux $? 通过 error code 判断是否 success

匿名 #25 · September 08, 2016

jenkins 有一个环境变量是 BUILD_STATUS ,构建状态,我想要的是这个值,可是直接取的时候,是 None,你说的%ERRORLEVEL%,我用 python 取出来是 None

#25 楼 @Tank007 BUILD_STATUS 也是 jenkins 判断 errorcode 来的

值得收藏,微信现在越来越有用了!

有大神遇到过
我是直接在 jenkins 中开个脚本运行的
有详细的解决步骤吗?小白一杖~

#28 楼 @xl051008
CORPID = "XXXX"
CORPSECRET = "XXXX" 是不是这里填错了

#30 楼 @wuyuleba 有可能是 CORPSECRET 这一项填错了。xxx 这是填 Secret 的内容吗?还是填别的内容。

挺好的想法~!

@xl051008 你这个脚本是干什么用的啊~

codeskyblue 调用钉钉接口实现消息通知 中提及了此贴 14 Dec 13:10

请问您这个问题是怎么解决的,我现在也遇到了,烦请提供一下思路

匿名 #37 · April 10, 2018
littletiger7 回复

什么问题,描述清楚

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up