最近入了一个 iPhone 7 来当备用机,结果被苹果 iOS 优秀的体验给吸引走了,手上的安卓机沦为了备用机(大雾)🤣。
但是这台 iPhone 当初购买时候只是为了应付跑微信和支付宝两个app的。
【对,就只要求跑这两个,因为安卓我经常搞机,现在养老真香】
所以根本就没考虑双卡等事情。
目前使用下来,最烦人的地方非短信接收莫属了。因为只要是室内环境,安卓手机基本就呆在书包、抽屉、插座附近,收个验证码还要找半天手机。
为了让我平时能少点麻烦 (能偷偷懒) ,所以最近花点时间解决掉了这个问题,在这里简单记录分享一下。
方案
这里列出了我目前在使用和备用的方案
跨设备短信接收发送方案:
安卓手机有两个 APP 可以轻松实现在电脑设备上实现短信 接收和发送,只需要安装相应 APP 配对即可,还有挺多附加的实用功能。
注意:手机要在设备旁边
- 微软《你的手机助手》【安卓 -> Windows】
- KDE Connect 【安卓 -> Linux GUI】
跨设备短信接收方案:
如果网络有问题可以试试 IFTTT 来联动,安卓可替代的方案非常多,
这里没有考虑接收是因为接收只能通过轮询等方式。不想这样自己弄所以安卓真的非常适合当备用机【不是
- Tasker(或其他自定义任务软体)使用 API 转发短信到即使通讯应用【安卓 -> 安卓/iOS】
- Tasker -> Telegram
- Takser -> QQ【机器人】
- Tasker -> Wechat【企业微信/Server 酱】
- Apple Message 【苹果通过 iCloud 转发到 iCloud】
Tasker 转发短信到 Telegram
Tasker 是安卓上一个非常强大的自动化软体,用它来实现转发短信至 telegram 有两种思路:
- 运行 Javascript 脚本
- 使用 Tasker 提供的纯动作
个人推荐写个脚本,DIY程度和操作都能更自由一些。但如果你只有手机不方便打代码可以使用 Tasker 提供的纯动作来实现,只需要手点几下稍微打点字。
准备工作
Telegram 提供了 bot(机器人)来实现更高可玩性。所以不管你想用哪种思路都需要先创建一个 bot。
创建 Telegram bot
创建 bot的方式非常简单,不需要备案审核等,直接在软件中找 @BotFather (机器人他爸) 创建一个 bot:
/newbot
创建新的 bot:
调用 bot 的 API
调用任何 bot API的格式都是 https://api.telegram.org/bot<token>/METHOD_NAME
,同时支持 POST/GET 方式。
我们转发短信需要用到的方法 METHOD_NAME
是 sendMessage,用到参数只有:
chat_id
:对话IDtext
:Bot Telegram 用户发送的内容parse_mode
:表示 text 中内容该如何解析(格式化)
其他具体如何使用可以参考官方文档:
获取用户 uid
获取用户 uid 简单的方法就是使用别人做好的现成的 bot: @get_id_bot
或者发条消息给刚刚创建的 bot,然后使用 getUpdates
方法获取最近 Bot 收到的信息。
普通方式实现短信转发
创建 Task
添加一个 HTTP Request
动作:
- Method 选 POST
- URL 一栏填写:
https://api.telegram.org/bot<你的TOKEN>/sendMessage
- Headers 一栏填写:
Content-Type:application/json
(可以点击放大镜快速选择) - Body内容填写如下(记得chat_id替换为你的uid):
{
"chat_id": <YOUR_CHAT_ID>,
"parse_mode": "HTML",
"text": "✉<b>%SMSRF(%SMSRN)</b> \n\n%SMSRB\n\n 时间:%SMSRD"
}
其中用到了几个 Tasker 自带的变量:
%SMSRF
:sender address 地址%SMSRN
:sender name 通讯录中的名称或号码%SMSRB
:主体(短信内容)%MMSRS
:主题(一般彩信才有)%SMSRD
:接收日期%SMSRT
:接收时间
创建 Profile 来调用 Tasker
切换到 Tasker 的 PROFILES 选项卡,添加一个 Event 类型的 Profile :Phone > Received Text
,按需求配置是否需要过滤类型,发送者和内容。
创建之后选择链接到刚刚创建的 Task就完成了。
编写 JavaScript 实现短信转发
非常推荐使用这个方式来实现,能写代码自由度和速度都会比上面快一点。
而且使用也非常简单, 因为不需要太难的,我就没学过 JavaScript,纯通过 MDN 找用法。
Tasker 中 JavaScript 获取 Tasker 变量的方法是 global('变量名')
操作只需要把上一部分 Task 中添加的 HTTP Request
动作改成添加 JavaScriptlet
动作
然后在 Code 一栏中填上脚本:
- gist 地址:使用 Tasker 实现安卓的短信转发
// 配置部分
let apiKey = "你的token";
let apiUrl = "api.telegram.org";
let chatID = "你的uid";
// 处理数字,方便在 telegram 中复制
let senderBody = global('SMSRB')
const digRe = /(\d+-\d+-\d+)|(\d+-\d+)|(\d+)/gm
senderBody = senderBody.replace(digRe, function (match) {
return `<code>${match}</code>`;
});
// 处理发件人姓名,可以弄到 Message 里一行,但是那样不好看。代码写不好是要下地狱的
let senderName = global('SMSRN');
const re = /\d*/g;
if (senderName.match(re)[0].length > 0) {
senderName = "";
}
const Message = `✉ <b>${global('SMSRF')} ${(senderName != "") ? "(#" + (senderName) + ")" : ""}</b>\n时间:${global('SMSRD')} ${global('SMSRT').replace('.', ':')}\n\n${senderBody}`;
let myHeaders = new Headers();
myHeaders.append("Content-Type", "application/x-www-form-urlencoded");
let urlencoded = new URLSearchParams();
urlencoded.append("chat_id", chatID);
urlencoded.append("text", Message);
urlencoded.append("parse_mode", "HTML");
let requestOptions = {
method: 'POST',
headers: myHeaders,
body: urlencoded,
redirect: 'follow'
};
fetch(`https://${apiUrl}/bot${apiKey}/sendMessage`, requestOptions)
.then(response => response.text())
.then(result => console.log(result))
.catch(error => console.log('error', error));
调试
如果想测试又没有短信,可以覆盖掉 Tasker 的 global
,直接在最顶行填上:
但是你想想你为啥会没短信呢【
打运营商电话查流量话费不就有短信了嘛
function global(param) {
if (param == "SMSRN") return "MorFans.cn";
if (param == "SMSRF") return "魔帆博客";
if (param == "SMSRD") return "9-16-21";
if (param == "SMSRT") return "14.45";
if (param == "SMSRB") return "【魔帆博客】您的登录验证码是 6666,请于-30分钟内填写。如非本人操作,请试试加入咱们的讨论群,加入咱们。群号:179020064 301661143";
}
其他
未接来电等一系列功能都可以通过这种方法去实现。
这里记录了对接 Telegram 的方法,如果遇到网络问题(毕竟Telegram这种国外的软件都很穷网络非常不稳定),可以试试自建 Telegram bot(找个中转) ,或者用微信等其他软体方法也是类似的。
发表回复