为备用手机实现短信转发

背景

  很久很久以前,我买了第一台智能手机——至尊宝:phone:,后来我买了人生中第一台红米手机——红米note增强版。不知什么时候,我有了两张手机卡,一张专门用来接收信息。为了不多带手机,我使用了绿芽短信转发:leaves:(当时应该root了)。虽然可以免费使用,但渐渐的就不符合我的要求了。后来接触到Tasker这款软件,这款软件能力强大。我用它实现短信转发,甚至还能进行一定的交互。后来,在xp框架时代,有一款插件Xposed edge pro,它也可以自动化,但我一般都是放在主力机上用。后来,我遇到一款更优秀的自动软件MacroDroid,我用它也实现了,但手机刷机忘记保存了。最近我又把它实现了。

无root方案

  免root玩机,我了解比较少,我还是喜欢root后做手机的主人。因此简单提一下思路。

  • 实现短信应用,将默认短信应用替换为你实现的短信
  • 短信转发软件,比如绿芽。(不知现在还能不能免费使用)
  • 读取短信内容应该用不到root,因此一些自动化软件也可以实现。

root方案

  显然,我要使用MacroDroid这款软件。当然“免费”使用这款软件会有一丝丝不稳定,以及一小部分功能不能正常使用。

门槛

  显然,你要让你的手机有root权限。当然如果没有,也可以试试,毕竟还有无障碍在那摆着。为了更好的使用MacroDroid,你还要达成以下要求:

  • 保活:保证MacroDroid能后台运行,不被省电优化,能自动重启
  • 权限给足
  • 开机自启
  • 无障碍不能掉(MacroDroid自身能保持,但有时侯呢)

第一步:下载

  MacroDroid这个软件肯定要下载,然后我们初步计划是将短信转发到邮箱,因此还要下载一个邮件插件mailtask。虽然MacroDroid这个软件本身有发邮件的功能,但是你是“免费”使用的,所以用不了。

  很明显,你没有看到下载链接。因此你需要自己去下载。

第二步:可去步骤:屏幕解锁

  屏幕解锁这个功能主要是为了能够实现更多需要屏幕点击或读取的功能。虽然这类自动化软件或插件有屏幕解锁的功能,但一般不一定能成功执行,而且要么要求没有密码或者要求密码只能是文本密码,所以我们自行实现一个。为了实现屏幕解锁,我对屏幕解锁的过程进行分析:

  1. 屏幕点亮
  2. 上滑或其他进入到密码输入界面的步骤
  3. 密码输入:文本密码可以尝试使用input命令,图案密码可以使用swipe 命令或者使用手势

  以我的手机为例,我没有设置密码。我们对我的手机解锁屏幕的流程进行分析:

graph TD
a[start]-->b("屏幕点亮")-->c{"是否锁屏"}--yes-->d("解锁屏幕")-->e
c--no-->e[end]

  对屏幕是否已经亮屏,我们不用考虑。因为我们最终都是要亮屏的,因此第一步是点亮屏幕。第二步是判断是否锁屏。第三步是解锁屏幕。

解锁屏幕

  屏幕开是自带的,用来点亮屏幕。等待是因为我后面借助的模拟滑动进行解锁的,当然你可以借助auto类插件来解锁无密码锁屏,自带的不是很好用。条件判断是因为有时候没有锁屏。设备锁定条件是自带的。其中的动作块是我单独抽取出来复用的,这个上滑半屏是动作块的名称,内部是用的界面交互-手势【250毫秒:540,1920->540,1020】,你自己设置就行了,坐标可以打开手机设置里的开发者选项的指针位置获得,当然你也可以使用shell命令swipe 。

第三步:可去步骤:字符串匹配

  我计划的功能中有对短信内容的判断,所以要有这个功能。关于字符串匹配的算法有许多,比如著名的KMP算法,也可以使用正则表达式。我比较喜欢正则表达式。

字符串匹配

  这个比较简单就没有流程图了。当然,有经验的人看到这张图片时,会脑淤血,因为看起来像是脱裤子放屁。其实是这样的,它没有单个动作是用来判断并赋值的。这个源串是用来被匹配的,长度比较长。子串相当于关键字,是用来匹配的。可以看到,图中字串的默认值有竖线,这是用来分割的,方便多匹配。条件是用的变量-包括,启用正则表达式匹配和不区分大小写。记得将结果返回。

第四步:可去步骤:一维数组包含

  我设想的功能里需对短信的发送者号码进行判断。我的电话号码不是有序的,所以采用遍历所有的方式。

一维数组包含

  如果用其他循环涉及次数或条件判断,不太方便。使用迭代比较方便,不过不清楚对数组的修改会不会出问题。不管,我们现在只是读。同样,用关键字和迭代值进行比较,然后根据分支设置输出结果。

第五步:可去步骤:附加信息

  我的手机我要尽可能了解,所以要将手机的信息进行更新。

定时更新

  这是一个宏,名称是定时更新。触发器使用固定时间间隔,间隔时间的2小时9分。动作目前就一个,是对一个全局变量全局_附加内容进行设置。内容如下:是个html表格

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<table border="1">
<caption><strong>附加信息</strong></caption>
<tr>
<th>更新时间: </th>
<td>{year}年{month_digit}月{dayofmonth}日 {hour}:{minute}:{second}</td>
<th>当前应用:</th>
<td>名称:{fg_app_name} <br />包名:{fg_app_package}</td>
<th>当前亮度:</th>
<td>{current_brightness}</td>
<th>当前音量:</th>
<td>{vol_music}</td>
</tr>
<tr>
<th>当前电量: </th>
<td>{battery}</td>
<th>当前温度:</th>
<td>{battery_temp}</td>
<th>是否充电:</th>
<td>{power}</td>
<th>连接类型:</th>
<td>{cell_connection_type}</td>
</tr>
<tr>
<th> 基站信号强度:</th>
<td>{cell_signal_strength}</td>
<th>ip、ipv6</th>
<td>{ip}<br />{ip6}</td>
<th>WiFi:</th>
<td>{ssid}</td>
<th>WiFi强度:</th>
<td>{wifi_strength}</td>
</tr>
<tr>
<th>位置:</th>
<td>{last_loc_latlong}<br />{last_loc_link}</td>
<th>设备运行时间:</th>
<td>{uptime}</td>
<th>可用运存:</th>
<td>{ram_available}</td>
<th>可用内存:</th>
<td>{storage_internal_free}</td>
</tr>
</table>

第六步:必要步骤:邮件发送

  MacroDroid本身就有邮件发送功能,一个是gmail,另一个是SMTP。但是,我们是免费使用的,所以要借助插件MailTask。安卓低版本还可以使用SendsilentMail。

  我们使用MailTask,当然,下载、权限设置和保活交给你。

  要进行邮件发送,需要一个邮箱,我使用QQ邮箱。进入网页版QQ邮箱-设置-账号-开启POP3/IMAP/SMTP/-获取授权码,然后在Mailtask里配置SMTP。

MailTask配置

  其实到这里,简单的邮件转发就已经可以轻轻松松实现了。

短信转发宏
邮件发送
邮件转发配置

第七步:功能设计

  单单一个短信转发,对我来说是不够的。

  • 短信转发
    • 重要转发
      • 转发到邮件
      • (暂未实现)转发到qq、微信、钉钉等社交软件
      • (不打算,有点多花钱)转发到短信
    • 不重要转发
      • 转发到邮件
      • (暂未实现)转发到qq、微信、钉钉等社交软件
      • (不打算,有点多花钱)转发到短信
  • 短信指令
    • 中文指令
    • 非中文指令:默认shell
  • 短信已读

第八步:流程设计

graph LR
start(start) --> a{是否是短信命令} --yes-->cc{号码判断} --可执行--> c[指令取出] --> d[指令识别] --> e[指令执行]-->eed[短信已读]-->en(end)
cc --不可执行-->eed
a --no-->f{短信重要性判断} --yes-->g[邮件发送]-->eed
f --no-->h{短信数量} --=10-->gg[邮件发送]-->ii[相关变量重置]-->eed
h --!=10--> i[短信追加] --> j[计数增加]-->h

第九步:变量设计

  本来想一边讲搭建一边讲需要的变量,但我害怕你搞混。

  • 全局变量设计

    变量名 类型 默认值or建议值 说明
    全局_附加内容 字符串 无 每次发送时附加的内容,值为第五步的html代码
    全局_可执行号码 字符串 无 可以执行短信命令的号码集合
    全局_重要号码 字符串 无 重要短信号码集合
    全局_重要号码关键字 字符串 验证码|校验码|授权码|密码|账单|余额|随机码|取件码|出库码|取货码|提货码|代码|激活码|姓名|姓先生|身份证号|考生|考试|电力|退款|还款|菜鸟驿站|取件|快递 当短信内容里有这些关键字时,该短信为重要短信
    全局_主人号码 字符串 无 主人的号码,未使用留以后扩展

    注意,全局变量尽量不修改。你可以将短信转发宏看作是一个个进程,而这些全局变量相当于临界资源。当然你要修改也可以,不过要使得每次宏运行修改变量的概率非常低。

  • 局部变量设计

    变量名 类型 默认值 是否保持不变 说明
    不重要短信串 字符串 无 否 不重要短信的集合
    不重要短信计数 整数 0 否 对不重要短信进行计数
    短信分割线 字符串 <br/><hr/><br/> 是 不重要短信追加时添加分割线
    短信内容是否包含关键字 布尔 False 否 判断短信重要性的一部分
    发送者号码是否重要 布尔 False 否 判断短信重要性的一部分
    附加发送者短信 字符串 无 否 给短信添加发送者信息
    是否是可执行号码 布尔 False 否 判断指令短信的一部分
    是否为指令短信 布尔 False 否 判断指令短信的一部分
    是否为中文指令 布尔 False 否 用来指令短信分类
    输入指令头 字符串 execm 是 指令有输入参数标记
    无输入指令头 字符串 execs 是 指令没有输入参数标记
    邮件接收者 字符串 邮箱 是 接收转发的邮箱
    指令标记 字符串 exec 是 有该标记的短信为指令短信
    指令分隔符 字符串 \ 是 用分割指令和参数
    指令条数组 数组 无 否 指令短信中的每行指令
    指令条 数组 无 否 每行指令用分割符分割后得到的数组
    中文指令级 数组 无 是 你有说明中文指令就追加什么

    这个保持不变的意思是宏不能修改它,只有你可以修改,或者是发送命令让它修改。每个变量有什么用,什么类型都列清楚了,你可以仔细观看。

第十步:成品:看图

  附加发送者短信变量设置为:发送者名称:{sms_name}<br/>发送者号码:{sms_number}<br/>时间:{year}-{month_digit}-{dayofmonth} {hour}:{minute}:{second}<br/>内容:{sms_message},文件没写时间,自己添加。重要短信邮件转发内容设置为:{lv=附加发送者短信}<br/><br/>{v=全局_附加内容},非重要短信邮件转发内容设置为:{lv=不重要短信串}{lv=短信分割线}({lv=不重要短信计数}){lv=附加发送者短信}。

  短信已读功能在各个手机表现一样,看自己手机情况设置。这里的原理是短信到来时显示通知,通知有标记已读的按钮,可以点击实现已读。但是MacroDroid似乎读不到通知按钮的文字。

  实现短信已读的最好方式就是修改短信数据库,用sqllite就行。但是我手机版本高,修改不成功。

  我这里的屏幕解锁涉及屏幕分辨率,大家根据自己的手机自己调整。

短信转发宏截屏

1判断指令短信
2判读执行号码
3指令短信条件
4指令条数组
5指令拆分
6指令中文判断
7shell脚本
8命令短信转发
9判断重要号码
11判断重要关键字
12重要短信条件
13重要短信转发
14非重要短信转发
15短信已读

导出

  我用的宏导出来了,但是有可能需要补充动作块,补充全局变量,修改部分值。复制后粘贴到文件里,命名后缀.macro