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

toc: true
title: 命令行发送消息到微信企业号
date: 2016-03-25 10:10
tags: [命令行,微信,告警]


[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/。

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。

你可能感兴趣的:(命令行发送消息到微信企业号)