惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

有赞技术团队
有赞技术团队
V
V2EX
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
宝玉的分享
宝玉的分享
S
SegmentFault 最新的问题
量子位
Engineering at Meta
Engineering at Meta
Forbes - Security
Forbes - Security
H
Hackread – Cybersecurity News, Data Breaches, AI and More
B
Blog
I
Intezer
V
Vulnerabilities – Threatpost
NISL@THU
NISL@THU
P
Proofpoint News Feed
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
人人都是产品经理
人人都是产品经理
The Cloudflare Blog
博客园 - 三生石上(FineUI控件)
Google DeepMind News
Google DeepMind News
T
Tenable Blog
Know Your Adversary
Know Your Adversary
Cisco Talos Blog
Cisco Talos Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Scott Helme
Scott Helme
Stack Overflow Blog
Stack Overflow Blog
博客园 - 【当耐特】
S
Securelist
T
Tailwind CSS Blog
Simon Willison's Weblog
Simon Willison's Weblog
Microsoft Security Blog
Microsoft Security Blog
博客园_首页
P
Privacy International News Feed
K
Kaspersky official blog
T
Tor Project blog
L
LINUX DO - 热门话题
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cybersecurity and Infrastructure Security Agency CISA
T
Threat Research - Cisco Blogs
G
GRAHAM CLULEY
Last Week in AI
Last Week in AI
L
LangChain Blog
C
Cisco Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
Netflix TechBlog - Medium
博客园 - 叶小钗
I
InfoQ

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派 万字剖析:千问App深度体验报告(2026) - 少数派 在2026年,如何真正防止别人抄袭你的作品 - 少数派 怎么用 50 块搭个 AI 语音助手?我踩了 3 天坑 - 少数派 YeeroAI:让 AI 对话真正成为知识管理的一部分 - 少数派 爬泰山 - 少数派 「旅图显影」 App 更新:这次,我们补上了一点「手感」 - 少数派 假期出门太折磨?我的 23 条经验帮你规划惬意旅行 - 少数派 工作流会变吗 - 少数派 Claude Opus 4.6 怎么用最省钱?我测了 5 种方案 - 少数派 GPT Image 2 让图文并茂不再稀罕 - 少数派 用户侧出发——什么是AI,我要不要学习? - 少数派 找片、转存、整理、播放一条龙!让你的付费网盘值回票价 - 少数派 欢迎试用!日课一问2.0插件 - 少数派 自己做的MDeditor,原本想购买 Typora 试了两次支付不成功,干脆自己做一个 - 少数派 vibe coding了一个 3MB 的小工具,让 ~/Downloads 彻底告别混乱 - 少数派 因为受不了 Mac 的风扇策略,我做了一个风扇控制工具 - 少数派 别只怪模型 - 少数派 Warp 终端的 AI 功能怎么用?我测了一周的体验 - 少数派 AI 写代码老是出 bug?这 5 个配置我后悔没早知道 - 少数派 「新玩意」苹果出相机可能就这样:Sigma BF + 45mm F2.8 DG Contemporary - 少数派 一个面向2030年的AI操作系统是什么样子的:浅谈cola这款有灵魂的Agent - 少数派 别只看写代码 - 少数派 每天解决10个问题,还是一口气攻坚解决400个? - 少数派 AI 交易机器人怎么搭?我用 Claude 跑了一周实盘 - 少数派 Maptoposter Online:把你爱的城市画成艺术海报 - 少数派 Function Calling 怎么用?我测了 3 个模型发现差距真大 - 少数派 Legend Talk:我做了个 AI 圆桌,让 160 位思想家围着你的问题转 - 少数派 如何找到自己的蓝方?在小县城寻找压力测试 - 少数派 语音输入与软件接口|2026年聊AI时,我们都聊些什么(上) - 少数派 混动已经卖爆,纯电又来补刀——钛7闪充版简直“不讲武德” - 少数派 本月玩什么|朋友收藏、识质存在、沙罗周期 - 少数派 为什么要每天坚持输出? - 少数派 Claude API 挂了好几个小时,你的项目有备用方案吗? - 少数派 Function Calling 没你想的复杂——我用它做了个有点用的工具 - 少数派 登录系统立即播放视频或者图片音乐的软件 - 少数派 我为什么创建 FlipHTML5 下载工具 - 少数派 残局没电?多品牌外设电量统一管理软件EasyBluetooth已支持RTSS游戏内显示以及AIDA64 - 少数派 前往通义路的路 - 少数派 太好看了,媲美Sun的个人导航页,NAS部署星云门户 - 少数派 乌黑嘴唇“一键检测”上线了 - 少数派 派早报:Claude AI 接入多个创意软件生态、FILCO 生产方接手品牌等 - 少数派 【更新】BearCLI、Claude 连接器与 MCP 服务器 - 少数派 记了上千条流水,还是看不懂财务?我做了一个让 AI 读懂账本的工作台 - 少数派 MINI R56 升级原厂 Sport 模式 - 少数派 新玩意 | 一棵柠檬树(仿真版) - 少数派 Momenta的“物理AI”野望,需迈过“含摩量”这道关 - 少数派 网页直接投屏控制手机!NAS一键部署PandaScrcpy,流畅丝滑可远程。 - 少数派 众测|邀你一同探索随身 AI 硬件入口 YoooClaw C·ONE - 少数派 2050大会:分享时间是真诚 参会记 - 少数派 iPad 赋能电影创作:国内首部宣纸手绘长片《燃比娃》的幕后故事 - 少数派 AI的审美:我用 8 个大模型给 100 张旅行照片打分 - 少数派 普通人如何破圈?去参加一个本地协会 - 少数派 把极空间的图标全换了,主题DIY全攻略打造你的专属NAS桌面 - 少数派 电子便签墙,帮你实现便签自由 - 少数派 我如何用三个 CLI 工具取代文档创建需求 - 少数派 原来真的有人可以玩一辈子 - 少数派 社区速递 139 | 派友热议三月买了啥、复古单反尼康 Df 体验 - 少数派 06 作品的赏析与评价 - 少数派 TDS REVIEW|索尼 WF-1000XM6 降噪真无线耳机体验 - 少数派 35.98万起售的第二代腾势D9,我看重的不是堆料,而是不凑合 - 少数派 鼠须管 Squirrel 皮肤配置指北 - 少数派 从watch ultra2换到redmi watch6 - 少数派 派早报:阿里巴巴发布视频生成模型 HappyHorse 1.0 等 - 少数派 别迷信1M - 少数派 家人们天塌了!网盘“大封杀”,多个渠道多条路,NAS部署PanHub - 少数派 AI与人勾心斗角!NAS一键部署AI狼人杀,假日休闲必备。 - 少数派 电商必备!Comfyui工作流批量生图插件,一次生成12张!支持Nano banana pro模型 - 少数派 Comfyui工作流配置Gpt-image-2模型教程,0.03/张 - 少数派 OpenClaw第三方APi怎么配置?可使用Gpt-image-2模型 - 少数派 会员社区话题精选 Ep. 103 - 少数派
跨平台短信同步可视化解决方案 - 少数派
2025-04-09 · via 少数派

背景

手上持有多张电话卡,包括大学注册的电话卡、工作之后办的工作卡、宽带送的亲情号、还有专门对付快递的小号,满打满算已经 4 张卡了。虽然双持手机,每个手机插两张卡,但是实际使用的时候,不同账号登录使用不同的手机号,依然需要在两个手机上来回查看验证码,非常的不优雅,于是考虑通过短信转发的方式将多个手机号的短信都统一转发至一个手机号上,在实现这个方案的路上遇到了两个问题:

  • 有两张卡是保号卡,顾名思义,除了 8 元套餐送的流量以外没有免费的短信额度,转发成本太高
  • 可爱的运营商有短信拦截,涉及敏感信息的短信无法转发

一开始采用的方法是卡号互相搭配,一张有免费短信的卡+一张保号套餐,通过短信 base64 编码之后进行转发,可以完美解决上述两个问题,同时带来了另一个问题:接受到的 base64 编码的短信如果需要再次查看,需要手动解码,而且短信内容一多之后完全不知道每条短信是谁发送的,如果遇到多个号码同时转发的情况,需要逐条排查。


考虑到未来的使用成本和可靠性,最终决定采用 XOR 加密 + 云端服务器的方式实现短信加密和短信转发,具体工作流程如下:
 

短信转发流程

准备工作

  • 短信发送侧:安卓手机+tasker
  • 短信接受侧:苹果手机+scriptable
  • 云服务器:阿里云(也可以使用 cloudflare 的无状态服务直接白嫖)
    点击对应软件可以跳转至官方网站

执行步骤

  1. 设置配置,当接受到短信时执行任务
     
设置配置

2. 创建任务
 

创建任务

3. 配置全局环境变量
 


其中 token 用于存储生成的密钥,xortext 用于存储 xor 加密后的短信内容

4. 编写 tasker 加密代码

// 步骤1:从Tasker全局变量获取加密token
var token = global('TOKEN');
if (!token) {
    flash("错误:未找到token全局变量(变量名:token,当前值:" + token + ")");
    exit();
}
// 步骤2:获取短信内容(Tasker 中使用 %SMSRB 获取短信内容)
var smsContent = global('SMSRB');
if (!smsContent) {
    flash("错误:未获取短信内容");
    exit();
}

// XOR加密函数(兼容Unicode)
function xorEncrypt(text, key) {
    var result = [];
    var keyIndex = 0;
    
    // 将字符串转为UTF-8字节数组
    var encoder = new TextEncoder();
    var data = encoder.encode(text);
    var keyData = encoder.encode(key);
    
    // 执行XOR加密
    for (var i = 0; i < data.length; i++) {
        var encryptedByte = data[i] ^ keyData[keyIndex];
        result.push(encryptedByte);
        keyIndex = (keyIndex + 1) % keyData.length;
    }
     // 将字节数组转为16进制字符串
     var hexString = '';
     for (var j = 0; j < result.length; j++) {
         var hex = result[j].toString(16);
         // 确保每个字节是两位的十六进制表示
         hexString += (hex.length === 1 ? '0' + hex : hex);
     }
     return hexString;
}

try {
    // 执行加密和编码
    var encryptedData = xorEncrypt(smsContent, token);
    // 将加密后的数据保存至 XORTEXT 全局变量中
    setGlobal("XORTEXT", encryptedData)
    // 测试加密结果
    flash("加密结果" + encryptedData)
} catch (e) {
    flash("发生异常:" + e.message);
    exit();
}

完成安卓侧的短信发送以后,现在开始编写 IOS 侧的小组件用于获取短信内容

// 小组件配置
const widget = new ListWidget();
widget.spacing = 8;

// 主函数
async function main() {
  try {
    // 1. 发起GET请求获取数据
    const apiUrl = "https://api.example.com";
    const request = new Request(apiUrl);
    request.method = "GET";
    request.headers = { "Content-Type": "application/json" };
    const response = await request.loadJSON();
    
    // 2. 提取 results 中的 content 数据
    const contents = response.results.map(item => item.content);
    
    // 3. 对每个 content 应用算法A(示例:XOR解码算法)
    const parsedContents = contents.map(content => xorDecrypt(content));
    
    // 3. 展示数据到小组件
    displayData(parsedContents);
    
    // 4. 添加刷新按钮
    addRefreshButton();
    
  } catch (error) {
    widget.addText("⚠️ 数据加载失败");
    widget.addText(error.message);
  }
  
  // 最终渲染小组件
  Script.setWidget(widget);
}

// XOR 解密算法
function xorDecrypt(message) {
    // 修改你的 token
    token = "this is a example token"
    // 1. 将 Hex 字符串转为字节数组
    const bytes = [];
    for (let i = 0; i < message.length; i += 2) {
        const byte = parseInt(message.substr(i, 2), 16);
        bytes.push(byte);
    }

    // 2. 将密钥转为字节数组(手动 UTF-8 编码)
    const keyBytes = [];
    for (let i = 0; i < token.length; i++) {
        const charCode = token.charCodeAt(i);
        if (charCode < 128) {
            keyBytes.push(charCode); // ASCII 字符(1字节)
        } else if (charCode < 2048) {
            keyBytes.push(0xC0 | (charCode >> 6)); // 2字节 UTF-8
            keyBytes.push(0x80 | (charCode & 0x3F));
        } else {
            keyBytes.push(0xE0 | (charCode >> 12)); // 3字节 UTF-8
            keyBytes.push(0x80 | ((charCode >> 6) & 0x3F));
            keyBytes.push(0x80 | (charCode & 0x3F));
        }
    }
    // 3. 执行 XOR 解密(逐字节异或,循环使用密钥)
    const result = [];
    let keyIndex = 0;
    for (const byte of bytes) {
        const decryptedByte = byte ^ keyBytes[keyIndex];
        result.push(decryptedByte);
        keyIndex = (keyIndex + 1) % keyBytes.length;
    }

     // 4. 将解密后的字节数组转为字符串(手动 UTF-8 解码)
     let str = "";
     let i = 0;
     while (i < result.length) {
         const byte1 = result[i++];
         if (byte1 < 128) {
             str += String.fromCharCode(byte1); // ASCII
         } else if (byte1 >= 192 && byte1 < 224) {
             const byte2 = result[i++];
             str += String.fromCharCode(((byte1 & 0x1F) << 6) | (byte2 & 0x3F));
         } else {
             const byte2 = result[i++];
             const byte3 = result[i++];
             str += String.fromCharCode(((byte1 & 0x0F) << 12) | ((byte2 & 0x3F) << 6) | (byte3 & 0x3F));
         }
     }
     return str;  // 返回解码后的字符串而不是字节数组
}

// 展示数据到小组件
function displayData(contents) {
  const title = widget.addText("📊 解析结果");
  title.font = Font.boldSystemFont(16);
  
  contents.forEach(content => {
    const item = widget.addText(content);
    item.font = Font.systemFont(12);
    item.textColor = Color.gray();
  });
}

// 添加刷新按钮
function addRefreshButton() {
    widget.addSpacer();
    const refreshButton = widget.addText("🔄 刷新数据");
    refreshButton.font = Font.mediumSystemFont(14);
    refreshButton.textColor = Color.blue();
    
    // 修改后的刷新按钮URL,无需二次确认
    refreshButton.url = "scriptable:///run?scriptName=" + encodeURIComponent(Script.name());
  }

// 执行主函数
await main();
Script.complete();

实现效果

短信发送内容
展示效果
服务器加密


可以看到,安卓手机自行通过 token 加密了对应的短信,并将加密后的数据上传至服务器,服务器没有 token 无法解密对应的数据,IOS 通过组件定时或手动拉取对应的数据进行展示,实现了短信的聚合和转发。

后记

这里集中解释一下几个问题:

  1. 为什么使用 16 进制输出而不是 base64 编解码?
    IOS 自带的捷径是有 bug 的,不能解码非标准的 base64 编码。XOR 加密很容易出现无法打印的字符,即使通过 base64 编码,在捷径上依然无法正常解码,不得已只能采用 16 进制输出的方式,代价是加密后的字符长度变为原来的 4 倍。
  2. 不具备可复制性,没有服务器怎么办?
    有两种办法:第一,采用比较简单的 base64 加密直接进行短信转发,可以绕过运营商的监控,缺点就是费短信钱。第二,采用 cloudflare 的免费接口实现无服务转发,这需要一定的开发能力。未来可能会出一版使用 cloudflare 实现的短信转发接口。
  3. 想要改功能但不会写代码怎么办?
    本文中涉及的所有代码均由 deepseek 模型生成,本人仅进行复制及测试工作,包括文章的头图都是 AI 生成的。AI 元年请学会与 AI 一同工作,如果很想实现某个功能又不想用 AI 的,本人也提供有偿服务。