随着我在服务器上部署的软件越来越多,我也需要一个方便的通知推送来让我知道我的服务器发生了什么事.

前言

最早接触到的自定义推送方式当然是邮件推送, 但是在国内的大环境下邮件推送并不流行. 一是手机推送环境并不统一, 就算邮件到达了用户的邮箱, 用户也接收不到邮件服务商下发的通知. 二是大多数(小白)用户并没有查看邮箱的习惯, 邮箱只是用来注册和找回账号用的.

直到我接触到一些服务器自动化脚本时我才知道还有依赖微信(公众号)的推送软件, 最有名的莫过于 Server酱.

iOS平台因其优秀且统一的推送也出现了推送软件 Bark, 是iOS平台解决自定义推送的不二之选.

Bark

Bark的推送流程:

自动化脚本 -[POST/GET]-> Bark提供的API –> Apple推送服务器 –> iPhone

Bark APP在AppStore已上架

Bark后端 是开源的并且支持Docker部署.

看样子应该是直接拿到了对应iPhone的类似于openID的东西, 直接给Apple推送服务器发消息即可. 因为是开源的所以没啥可担心的.

WxPusher

这是最近两天才接触到的基于微信公众号的推送接口, 类似于 Server酱 但功能更加强大.

WxPusher微信推送服务 (貌似证书出了点问题, 无碍)

特点:

  • 实现了openID机制, 可获取用户信息和单独/多人推送.

  • 实现了关注消息应用(单发/多发), 订阅消息应用(仅群发).

  • 关注回调接口(带参数), 上行消息回调(向公众号发送内容开发者可获取).

  • 更详细的内容请访问文档来获取.

普通用户关注它的微信公众号, 开发者就可以拿到UID, 就可以做推送了. 如果走 Server酱 的话还需要用户去注册, 门槛大幅降低. 还支持上行消息, 做一些额外的骚操作.

下面记录一些常用的接口.

发送消息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http://wxpusher.zjiecode.com/api/send/message
//GET
http://wxpusher.zjiecode.com/api/send/message/?appToken=AT_xxxxM&content=123&uid=c1BcpqxEbD8irqlGUh9BhOqR2BvH8yWZ&url=http%3a%2f%2fwxpusher.zjiecode.com
//POST
{
"appToken":"AT_xxx",
"content":"Wxpusher祝你中秋节快乐!",
"summary":"消息摘要",//消息摘要,显示在微信聊天页面或者模版消息卡片上,限制长度100,可以不传,不传默认截取content前面的内容。
"contentType":1,//内容类型 1表示文字 2表示html(只发送body标签内部的数据即可,不包括body标签) 3表示markdown
"topicIds":[ //发送目标的topicId,是一个数组!!!,也就是群发,使用uids单发的时候, 可以不传。
123
],
"uids":[//发送目标的UID,是一个数组。注意uids和topicIds可以同时填写,也可以只填写一个。
"UID_xxxx"
],
"url":"http://wxpusher.zjiecode.com" //原文链接,可选参数
}

关注回调

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
"action":"app_subscribe",//动作,app_subscribe 表示用户关注应用回调,后期可能会添加其他动作,请做好兼容。
"data":{
"appId":123,//创建的应用ID
"appKey":"AK_xxxxxx", //关注应用的appKey,请不要再使用,将来可能会被删除
"appName":"应用名字",
"source":"scan", //用户关注渠道,scan表示扫码关注,link表示链接关注,command表示通过消息关注应用,后期可能还会添加其他渠道。
"userName":"wxpusher",
"userHeadImg":"http://xxxxx/132",//最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
"time":1569416451573, //消息发生时间
"uid":"UID_xxxxxx", //用户uid
"extra":"xxx" //用户扫描带参数的二维码,二维码携带的参数。扫描默认二维码为空
}
}

上行消息回调

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"action":"send_up_cmd",//动作,send_up_cmd 表示上行消息回调,后期可能会添加其他动作,请做好兼容。
"data":{
"uid":"UID_xxx",//用户uid
"appId":97, //应用id
"appKey":null,//废弃字段
"appName":"WxPusher演示",//应用名称
"userName":"小明",//用户昵称
"userHeadImg":"http://thirdwx.qlogo.cn/mmopen/xxx/132",//最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
"time":1603002697386,//发生时间
"content":"内容" //用户发送的内容
}
}

模板消息和内信

微信官方限制微信公众号发送内信(聊天消息)的数量. 文档

所以有模版消息的出现, 代替内信实现非用户交互时段下的消息下发.