如何优雅地将Android上的QQ和微信通知转发到iPhone?

如何优雅地将Android上的QQ和微信通知转发到iPhone?

最近从华为P40 Pro更换到了iPhone 15 Pro,本来应该将旧手机上的微信和QQ以及其他资料迁移到新手机上。但这次我决定不这么做,基于两点考虑:

  • 糟糕的代码实现使得微信和QQ占用资源极其严重,QQ甚至内置了虚幻4引擎让人不明所以,而微信曾经出现过将文件发送给n个人,会在手机内生成n份拷贝的特性bug;
  • 资料在转移过程中可能丢失,而微信不能两个设备同时登陆,导致为了翻阅旧资料时还得保留旧手机,然后切换登陆。

起初,我两个手机一起使用,但是后面发现太过麻烦。我随后查阅了将微信通过Telegram机器人集成到TG上的方法,这个好处在于既可以发也可以收,但依赖于微信开放第三方API,随时可能关闭。

如果将旧的手机连接网络的话,由于Android系统特性,也可以考虑通过一些第三方App直接转发通知。最后根据iOS特性,我选择了SmsForwarder来发送通知,Bark来接收通知。虽然不能立马回复消息,但对于防止消息遗漏也是不错的选择。

Bark接收端的设置(iPhone)

Bark是一个轻量的推送接收平台,大小仅为36.8M,支持将通知通过iCloud同步首先需要在iOS上下载Bark,打开后允许通知权限,然后注册设备。

服务器搭建

默认情况下Bark使用官方服务器,也可以选择自己搭建的服务器。我这里选择自己搭建,可以参考官方项目地址:https://github.com/Finb/bark-server。首先需要购买一个域名和一个服务器,通过acme.sh申请一个SSL证书,然后用docker运行服务器,nginx加载SSL证书进行反向代理即可。

注册设备完成后Bark会显示一些常用的样例,注意到Body Text下在域名后(绿色条部分)的第一个斜杠之后(马赛克部分)为设备的ID,任何拥有这个ID的人都可以向设备推送通知,因而应该将其保密。

推送端到端加密

无论你使用官方推送服务器还是自建服务器,数据在传输过程中都会经过HTTPS加密,他人无法截取到内容,但是在Bark服务器和Apple APNs推送服务器上通知数据是明文处理的,尤其是Bark服务器安全性未知,即使是自建服务器也存在被植入木马的可能性,这会带来隐私和安全性问题,尤其是当你想要转发一些验证码等短信通知时。

好在Bark提供了基于AES的端到端加密,而SmsForwarder也支持使用Bark时应用该加密方式。在Bark的Service页面下拉,可以找到Push Encryption Notification,点击下面小字中的Encryption Settings进行设置

这里我们使用AES-256-CBC方式进行加密,按照下图中进行设置

随后需要填写密钥Key和初始向量IV,可以通过随机密码生成器来填写,例如1Password提供的随机密码生成器:https://1password.com/zh-cn/password-generator/,勾选符号,长度选择32位(256 bits)来生成Key,再选择16位(128 bits)来生成IV,然后填入Bark中。

注:如果你想自己实现推送程序,可以点下方的Copy Send Script Example来得到Linux下的sh脚本,也可以关注我的仓库https://github.com/dishangti/PyBark来获得Python脚本

至此Bark设置就结束了。

SmsForwarder推送端设置(Android)

SmsForwarder可以推送Android端的电话、短信和应用通知到其他许多平台的轻量级应用,大小为15.9M,可以在Google Play进行下载,或者是官方项目地址:https://github.com/pppscn/SmsForwarder找到最新的release进行下载

通用设置

首先在通用设置中勾选需要转发的通知类型,这里我勾选了短信、未接来电和App通知,并且自动消除已转发的App通知。

然后启用保活措施,重启自动运行以及防止后台被手机系统kill,如果设置后还是会被杀的话可以启用增强。

最后将设备名称修改以进行辨识,建议将语言设置为中文,编写规则时候较为方便(没找到英文规则的文档)。

发送通道

接下来在建立发送通道,在发送通道页面点加号然后选择Bark,随意设置一个通道名称,然后填入Bark中Body Text的链接。分组名称可以自定义,以便iOS对通知分类。消息图标填入一个你想显示的图标链接,最好是方形的。然后声音、角标、链接和级别等可以自定义,标题模板可以用设备名称,加密算法选择Bark对应的AES256/CBC/PKCS7Padding,填入之前生成的Key和IV分别到加密密钥和偏移向量中即可。可以点击测试看看能不能正常收到通知。

转发规则

然后编写转发规则,转发规则的目的是对转发的信息进行筛选和格式化,以过滤不需要的通知并且便于阅读。

短信转发规则可以按下图设置和自定义修改,模板选择自定义并且填入

[短信] {{FROM}}: {{SMS}}
{{RECEIVE_TIME}}

最后选中启用该条规则

电话转发规则类似,因为我只启用了未接来电,所以我的自定义模板可以设置为

[电话] 未接来电: {{FROM}}
{{RECEIVE_TIME}

最后选中启用该条规则

App转发规则较为复杂,这里我转发了微信,并且过滤了撤回、语音通话中、视频通话中、发送失败,然后转发了QQ和支付宝。

在匹配字段中选择多重匹配然后填入

或者 是 APP包名 相等 com.tencent.mm
 并且 不是 通知内容 包含 recalled a message
 并且 不是 通知内容 包含 Tap to continue as voice call in progress
 并且 不是 通知内容 包含 Tap to continue as video call in progress
 并且 不是 通知内容 包含 Voice call in use
 并且 不是 通知内容 包含 unsent message
 并且 不是 通知内容 包含 Video call in use
或者 是 APP包名 相等 com.tencent.mobileqq
或者 是 APP包名 相等 com.eg.android.AlipayGphone

自定义模板填入

[{{PACKAGE_NAME}}] {{TITLE}}: {{MSG}}
{{RECEIVE_TIME}}

此时微信会将{TITLE}填入发件人或群聊名,但未读计数超过一次时会出现发件人: [未读计数]发件人的重复情况,因此我们通过正则表达式进行替换,QQ也类似,同时我们也替换了包名为具体应用名以便阅读。

com.tencent.mm===微信
com.tencent.mobileqq===QQ
com.eg.android.AlipayGphone===支付宝
\[QQ\] ([^()]+)\((\d+)条新消息\):===[QQ] $1($2): 
\[微信\] ([^:]+): \[(\d+)\]\1:===[微信] $1($2):
\[微信\] ([^:]+): \[(\d+)\]((?!\1)[^:]+):===[微信] $1($2): $3:

最后别忘了选中启用该条规则

测试

使用另一个微信号等给该手机上的微信发消息即可进行测试

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注