不知道各位有没有遇到下面这种场景:在PC端浏览网站,遇到要手机号注册,于是填写了手机号,下发了验证码。接着拿起手机解锁,点开短信通知,查看验证码,然后放下手机,在浏览器上填写验证码(手持苹果全家福的估计完全没有这种问题)。突然有一天,我觉得这协同的过程得优化一下,于是开启了尝试各种解决方案。
当前我的手机是安卓Mix4,PC是Mac,一个大致的思想就是手机端安装App,可以监控手机收到的短信、通知(数据最好不要经过第三方服务器),然后转发到指定的服务,之后PC端监听到服务的消息后,显示出来。接下来找到了这么几种解决方案。
方案一:AirDroid
AirDroid支持多平台客户端,是一家台湾公司出品的,算是比较有名的。它可以使用局域网的方式,也可以登录账号后,通过远程服务器的方式,转发消息。手机下载打开后,刚开始就弹出了各种权限获取,另外 + 广告。首先试用功能,免不了的各种授权:获取短信、联系人、完全获取手机文件等等关键权限。之后开启了必要的消息转发、短信转发功能。Mac端同样下载应用后开启服务,我通过登录账号的方式进入了应用,并可以看到当前同时登录的手机在线。
接着我尝试了一下用我老婆的手机给我手机发送短信。几秒过后,哎,PC端该应用收到了转发过来的通知!居然没想到这么顺利,虽然有广告,但是不影响使用对吧。
于是我后面随便找了一个网站,来模拟一下下发验证码的场景。结果,这次点了发送之后,手机在收到消息之后,PC端一直没有收到消息。我又检查了各种配置,还有官方提供的FAQ去排查,还是无解(这里我怀疑是因为MIUI这里启用了验证码类型的短信特殊权限,而该服务没有获取到权限)。中途给对方反馈了问题,得到的也是没什么作用的回复。
方案二:KDE Connect
这个我是在V2ex上找到的,然后中途还看到了一篇少数派的介绍文章。见这里官网,它也是跨平台的。Mac的安装包要去对应的Jenkins构建包去下载。该应用提供的功能不仅仅是消息转发,还支持各种消息推送,比如短信通知、应用通知、远程命令、多媒体控制等等,功能十分强大。这里提一点,它是要求局域网的,否则发现不了设备(当然你也可以用VPN)。
随后在两端安装完应用后,同一WIFI下,我在Mac端点击Refresh,始终发现不了的我手机设备。然后手机端点击刷新,也同样发现不了我的PC。通过官网的FAQ,没有办法,我只能将PC设置了固定的IP地址,并在手机端的添加了该IP。刚开始双方刷新还是都发现不了设备,后面过了一会儿,发现PC端扫描到了。
在各端的应用点击设备,会出现设备的配置插件。随即设置好开启的功能,授予必要的权限,找了个网站发送验证码短信测试,结果居然没有收到(这里前面已经测试PC端可以接收到手机端的通知了)。我再次点开了手机端该应用的权限列表,这次找到了”读取通知类短信”,授予允许。然后再次测试,终于行了!
我以为到这里就可以了,虽然有些小缺点(局域网、要添加IP才能发现设备),但是还是不影响使用。结果就在当天下午四五点的时候,我明显的感觉到了手机的震动,但是PC端没有收到任何通知,我点开PC端的应用查看,发现在连接的设备里有手机,但是我尝试点开读取短信列表,发现一直load不出来。然后手机端开了应用之后,这下PC端才读取到了短信列表。我怀疑是手机端应用无法保活,一段时间后该应用退出了。于是我授予了自启动、省电策略为无限制,后面测试一天,这个问题还是存在。。。
方案N:PushBullet+Join+Snapdrop+各种
折腾了比较久了,已经忘了上述几种有什么问题了。。。反正就是有问题
方案N+1:SMSForwarder
我也不记得我是在哪儿发现这个神奇的应用了,推一下GIthub地址。它的第一个介绍就让我眼前一亮:这些不就是我一路踩的坑吗🤣
以下是它支持的功能及转发方式(图片摘自Github):
根据它介绍的转发通道,我依次仔细看了Gotify、ServerChan、Bark、PushPlus,都不是特别符合我的要求。Bark:它是推送到IPhone客户端的,不属于我的场景;Gotify:没有合适的桌面端来做消息收取;ServerChan:依赖微信公众号等这种方式推到微信(有些场景下,当然不期望打开微信)。至于企业微信、钉钉等开始没有尝试,因为明白这类是肯定可以的。但是它们又与工作沟通软件挂钩,也还是不太好。
刚开始为了试验功能性问题,还是使用了钉钉消息机器人的方式,都是ok的,包括验证码类短信、推广类短信、应用通知等,都可以触达。并且我试验了开启自启动和省点策略为无之后,应用保活正常,没有被杀死的情况。
接下来就是依靠webhook的方式,寻找一个合适的PC端接收通知的方案。后面折腾来去,想到了一个合适的方式,为什么不找一个类似于钉钉这种的聊天软件,可以通过机器人等API的方式发送消息就可以咯。这个之前就捣腾Nas的时候,接触过一款开源的聊天软件:Mattermoster。于是查了一下文档,是支持通过API创建消息的,并且也有机器人功能。想到这里,感觉终于可以有一个完美的实现的方式了。
Mattermost的机器人文档发消息示例为:
curl -i -X POST -H 'Content-Type: application/json' -d '{"channel_id":"3juogthdo7g9bpbmaaah9w1pbh", "message":"This is a message from a bot", "props":{"attachments": [{"pretext": "Look some text","text": "This is text"}]}}' -H 'Authorization: Bearer fjc4t4wsufy18nya5w53uui3fw' https://***/api/v4/posts
参数通过POST方式,另外头部设置Auth。而看了SMSForwarder的webhook方式,当前不支持自定义头部,于是在Github上提交了一个issue(作者回复的很快,后面第二天我就看到了已经着手开发了该功能),同时想到了额外的解决方式:在自己的服务应用上开发一个接口,用来兼容该webhook支持的方式,作为转发,然后将消息由我自己的服务请求到Mattermost接口。
接下来在我自己的服务器上,通过docker的方式安装了Mattermost,配置了域名。紧接着在已有的服务上开了一个接口,用来做转发。一切准备就绪,效果如下
当前SMSForwarder主体功能都有了,只是还有一些操作交互上还待进一步优化,希望能够越做越好!
前前后后折腾一周,总算有比较合适的解决方案了。如果你有更好的解决方式,欢迎留言交流~~
Where there is a will, there is a way.
疫情还在影响生活!唉!