折腾手记

运维!!运维!!

0%

命令行发送消息到微信企业号

[TOC]

日常有几个URL需要监控是否可达,由于比较简单,自己写了个脚本,使用curl查询URL是否可用。如果不可用,需要发送邮件、短信、微信等方式通知。

发送邮件方式很多,现在的手机APP和邮箱也都能做到有了邮件实时提醒。比如163和邮箱大师,发送邮件给163,邮箱大师可以做到实时提醒,做为通知的首选方式。

发送短信需要短信网关,也要收费,不可行。

发送微信,查了很多资料,公众号和订阅号发送条数为个位数,不够用。微信企业号有人数限制,每天发送的信息为人数*30条/天,可以试一下。

申请微信企业号

微信企业号官网 申请,注意一个账号只能申请公众号、订阅号、企业号其中一种,并且申请好了,就不能更改,这里一定要申请企业号。

申请的时候,要你提供组织代码证明,个人的应用,没有,选择最后一项,民间组织,只要提供身份证号以及手机验证就可以了。

新建一个应用、配置以及必须的参数

申请好企业号以后,看起来企业号的应用模型是这样的:

  • 一个企业号对应多个应用

  • 一个企业号对应一个组织(通信录),一个组织下可以有部门,每个部门里面有个人,每个个人可以有标签(TAG)

  • 一个应用可以指定管理员,可以指定部门或者标签下的个人访问

    在应用中心新建一个应用,选择消息型应用,可以接受微信消息,填好应用名称等必要的参数,指定可以访问的部门或者标签,应用就建好了。

    设置 - 权限管理新建管理组,管理刚才应用的权限。命令行发消息的时候,也是使用这个权限进行发送的。最低的权限是对通信录有查看的权限,对应用有发消息的权限。

必要的参数:

  • 在权限管理界面,记录下corpidsecret

  • 在应用中心点击刚建好的应用,记录下应用ID

  • 如果发消息给指定的人员(部门或者标签),在通信录中,记下标签的ID或者部门的ID

    接口

    接口文档地址http://qydev.weixin.qq.com/wiki/index.php?title=%E9%A6%96%E9%A1%B5

    使用建立连接和发送消息两个功能。

    建立连接采用主动调用模式,发送消息为发送文本消息。

    大致流程为:

  1. 通过corpid和secret,建立连接,取得access token。JSON格式,GET方法

  2. 通过access token,POST一个JSON数据,JSON数据包括发送对象、发送内容、应用ID,返回也为一个JSON包,包含errcode和errmsg,返回也为一个JSON包,包含errcode和errmsg

    实现

    使用SHELL编写脚本,用到两个工具curljq
    jq用来处理JSON格式的数据,官方网站为https://stedolan.github.io/jq/。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    URL_GET_TOKEN="https://qyapi.weixin.qq.com/cgi-bin/gettoken"
    URL_SEND_MSG="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token="
    CORP_ID="XXXXXXXXXXXXXX"
    SECRET="XXXXXXXXXXXXXXX"
    TOTAG=1
    AGENTID=2

    MSG='{'
    MSG=$MSG'"totag":"'$TOTAG'",'
    MSG=$MSG'"text":{"content":"'$1'"},'
    MSG=$MSG'"safe":"0",'
    MSG=$MSG'"agentid":'$AGENTID','
    MSG=$MSG'"msgtype":"text"'
    MSG=$MSG'}'

    TOKEN=$(curl -s "$URL_GET_TOKEN?corpid=$CORP_ID&corpsecret=$SECRET" | jq -r .access_token)

    if [ -z $TOKEN ]; then
    echo Get token error, maybe network issue
    exit 100
    fi

    return=$(curl -s -X POST -d "$MSG" $URL_SEND_MSG$TOKEN)

    if [ -z "$return" ]; then
    echo Send msg error, maybe network issue
    exit 101
    else
    errcode=$(echo $return | jq -r .errcode)
    if [[ $errcode -ne 0 ]]; then
    errmsg=$(echo $return | jq -r .errmsg)
    echo Send msg error, with error $errcode: $errmsg
    exit 102
    else
    echo ok
    fi
    fi

    第一个curl使用GET方法取得TOKEN,直接在URL中拼装corpid和corpsecret,返回JSON格式,用jq取得access_token。
    第二个curl使用POST发送消息,在URL中拼装token,在-d参数中发送JSON数据。
    MSG为发送消息的JSON包,包括了发送对象totag,发送消息text,应用IDagentidsafemsgtype为固定值。
    发送好以后,校验返回值,如果为空,说明URL没有访问到,如果不为空,jq取得errcode,errcode为0,说明发送成功,errcode不为0,说明发送不成功,打印errcode和errmsg。