消息发送媒介-bark
Posted on September 3, 2023 (Last modified on June 19, 2024) • 2 min read • 899 words关于 bark 的一些基础通识
某日在业务上,想要持续观测一个环境 nmap 的扫描结果。如果触发条件就告警,最好能通知到自己。通知终端的选择上,感觉用邮件不太好,短信也不现实。当时想到了 ServerChan 无奈免费版本已经不能满足自己了。希望通知的形式,最好是能通过 app 。
检索了下,发现众多 v2ex 的小伙伴,推荐 bark 。想着就尝鲜去体验下。简单了解发现,bark 主要针对的是 ios 端相关的 push 通知服务,他并没有安卓客户端。如果想实现多客户端的话,或许要另寻解决方案。
既然是个人性质的 toolkit 工具,已经满足自己使用了。
直接查看 bark 文档, 主要测试了下 APNS 直接推送和加密推送的部分,要说两个 curl post 各自直接使用的区别。APNS 通知后,bark app 的右上角会显示消息的数字和弹窗消息。加密直接推送的话,只有弹框消息,没有数字角标提示的。
为了快速实现当前功能,测试完毕后,直接选择了加密 curl post 的方式。贴出自己的关键功能实现的部分如下:
key 及相关的隐私部分,已经打码。
#!/bin/bash
# function: bark 直接使用 curl 推送加密, 从服务端使用 shell 脚本给 ios bark app 发送消息
# author: yh
# last update: 2023.8.30
## https://bark.day.app/#/tutorial
function encrypt_msg() {
# bark key
deviceKey='AYXhqtRXXXXXXXXXXXX'
# push payload
json='{"body": "'${body1}'", "title": "'${title1}'", "group": "work", "sound": "birdsong"}'
# 必须16位
key='VS3Nxxxxxxxxxx77'
# IV可以是随机生成的,但如果是随机的就需要放在 iv 参数里传递。
iv='aizJxxxxxxxxxx7x'
# OpenSSL 要求输入的 Key 和 IV 需使用十六进制编码。
key=$(printf $key | xxd -ps -c 200)
iv=$(printf $iv | xxd -ps -c 200)
## vscode下编辑的json在转换为ciphertext的过程中回出现 Decryption Failed 的问题
## 参考出处:https://github.com/Finb/Bark/issues/192 添加 tr -d '\n'
ciphertext=$(echo -n $json | openssl enc -aes-128-cbc -K $key -iv $iv | base64|tr -d '\n')
# echo $ciphertext
# 密文可能有特殊字符,所以记得 URL 编码一下。
curl --data-urlencode "ciphertext=$ciphertext" https://api.day.app/$deviceKey
}
function check_info () {
openport_lines=`/usr/bin/nmap -p 1-65535 -Pn --open 21.XXXXX 21.XXXXX --host-timeout 60 -vvv|grep 'open\|PORT'|wc -l`
if [ $openport_lines -gt 0 ]; then
body1='XXnmap问题'
title1='告警'
encrypt_msg
else
echo "fine" > /dev/null 2>&1
fi
}
check_info
唯独要单独提到的部分是 json 内容的加密转码部分:
ciphertext=$(echo -n $json | openssl enc -aes-128-cbc -K $key -iv $iv | base64|tr -d '\n')
在 vscode 上编辑代码,Linux 端测试可以发送消息成功出现 msg 200 的返回码,但是手机端总是会出现 Decryption Failed 失败的问题。起初以为是自己的 body 内容过长,还是官方对于这里的字段限制。比对测试了很久,发现实际是自己的问题。
综合 APNS 以及相关的推送加密教程,后续可以优化的更好一些。