原帖: https://v2ex.xtra.eu.org/t/832597
因为正文排版, 以及宏的变动比较大, 所以不会在原帖 append 了.
之前没能很好地处理断网期间的转发策略, 所以整个宏又被拆分为 2 个部分.
此处修改原帖的宏, 使其成为第 1 部分:
-
--
c) 动作 2-1: 添加 toast 用于提示短信自动转发失败后执行 Shell 命令, 将待发的短信暂存;
d) 动作 2-2: 添加 Shell 脚本:# 需要 root 权限 # 挂载根目录为可读写 mount -o rw,remount / # 在末尾追加写入一条命令到 /sms_forward_queue.sh # 同样需要账号的 token 及房间 ID echo -E "curl -H \"Content-Type: application/json\" -H \"Authorization: Bearer <access_token>\" -s -X POST -k -d '{\"msgtype\": \"m.text\", \"body\": \"短信转发 (从队列). 发送者: [sms_number]\u000a\u000a[sms_message]\"}' \"https://example.com[:port]/_matrix/client/r0/rooms/%21room_id:example.com/send/m.room.message\"" >> /sms_forward_queue.sh # 在末尾追加写入一个换行符到 /sms_forward_queue.sh echo "\n" >> /sms_forward_queue.sh # 赋予 /sms_forward_queue.sh 可执行权限 chmod 0766 /sms_forward_queue.sh # 因为 /sms_forward_queue.sh 的本质是一个 Shell 脚本, 所以选择保存到根目录直到时机成熟时执行
第 2 部分:
- 新建一个宏, 触发器选择 "固定时间间隔", 间隔推荐的取值范围 30 秒 ~ 5 分钟;
- 添加 2 个局部变量 (全部为字符串类型);
-
添加动作:
a) 动作 1: 添加 Shell 脚本, 发送一个 GET 请求到 Synapse 服务器:
b) 动作 2: 添加 "如果条件", 在其中添加条件: "MacroDroid 特定" -> "MacroDroid 变量", 选择步骤 2 新建的变量的其中一个. 运算符选择 "包括", 值填写curl -s https://example.com[:port]/_matrix/federation/v1/version # 不提交任何信息, 仅用于尝试连接服务器 # 需要选择 "将输出保存为字符串变量, 选择步骤 2 新建的变量的其中一个" # 建议设置超时{"server":{"name":"Synapse","version":"
c) 动作 2-1: 添加 Shell 脚本:// 用于判断服务器是否返回了 json, 因为 json 的格式固定就没用正则表达式, 反正无脑判断前几个字符就足够了.
d) 动作 2-2: 在其中添加 "如果条件", 在其中添加条件: "MacroDroid 特定" -> "MacroDroid 变量", 选择步骤 2 新建的变量的另一个. 运算符选择 "=", 值填写# 判断 /sms_forward_queue.sh 是否存在, 存在返回 true, 不存在返回 false if [ -e /sms_forward_queue.sh ] then print true else print false fi
e) 动作 2-2-1: 添加 toast 用于提示本条短信已暂存并进入待发队列;true
f) 动作 2-2-2: 添加 Shell 脚本:
g) 动作 2-2-3 (可选): 此处可以添加一个通知 (或 toast) 用于提示短信自动补发成功.# 需要 root 权限 # 挂载根目录为可读写 mount -o rw,remount / # 执行 /sms_forward_queue.sh /sms_forward_queue.sh # 脚本执行完成后删除, 避免重复补发 rm /sms_forward_queue.sh
以上动作的排列顺序:
https://imgur.com/a/4C6y1pv
https://imgur.com/a/F1rHMIq
效果:
现在即使断网也不用担心短信漏发, 一旦恢复联网, 因为触发器的关系会自动执行 /sms_forward_queue.sh 中的命令.
脚本执行完成后自动删除. 下一个断网周期会重新生成.
如果长时间断网, 脚本中的命令会累积直到恢复联网.