全部文章
2 分钟阅读glizzykingdreko

把 iCloud+ 订阅用到极致

iCloud+ 里我最喜欢的功能是"隐藏我的邮件地址"(HideMyEmail),它会在网站注册时给你生成一个别名,以避免暴露你的真实邮箱。

把 iCloud+ 订阅用到极致

iCloud+ 里我最喜欢的功能是"隐藏我的邮件地址"(HideMyEmail),它会在网站注册时给你生成一个别名,以避免暴露你的真实邮箱。

这挺好,但你知道什么会更棒吗?能够快速利用这个功能,生成一批指向我 iCloud 邮箱的别名,这样在抽奖、批量注册账号时就不用买邮件列表或 catchall,或者只是在需要时随手就有新鲜的一次性地址可用。

那就动手吧!

其他开源方案

这个想法源于我需要快速、方便地创建一些别名。我想到了 HideMyEmail 这个思路,在网上找到了几个项目,但它们共同的主要问题都出在登录上。

完全不支持。你得从浏览器会话里提取 cookie 才能让脚本跑起来。所以说到底,网上就只有一些"氛围编程"(vibe-coded)的模块,拿你给它们的 cookie 把一个请求重复发 X 次。

再考虑到 iCloud 每 30/40 分钟大约只让你生成 5 个邮箱……到头来,手动做甚至比跟过期会话较劲还要省事。

我们能做得好得多。(剧透:看这个项目的 github 仓库

理解整个流程

要做出真正能用的东西,我得搞懂登录 iCloud 时到底发生了什么。于是我打开浏览器,挂上一个 HTTP 代理,把从登录到生成邮箱的整个会话记录了下来。

显然 Apple 不会让这事容易。他们的身份验证用的是一套定制的安全远程密码(SRP)协议实现,外加一些 Apple 专有的改动,花了我太长时间才搞明白。

我来带你走一遍。

身份验证流程

**第 1 步:SRP 初始化
**首先,我们带上账户名向 /appleauth/auth/signin/init 发一个请求:

{
  "a": "<base64_encoded_A_value>",
  "accountName": "[email protected]",
  "protocols": ["s2k", "s2k_fo"]
}

a 这个值是我们的 SRP 公开临时值(public ephemeral)。Apple 会回复它们自己的一组值,包括:

  • b 服务器的公开临时值
  • salt 用于密码派生
  • iteration PBKDF2 的迭代次数
  • protocol 用哪个变体(通常是 s2k)

**第 2 步:s2k 协议
*这里就是 Apple 决定要当回Apple*的地方。标准 SRP 计算 x = H(s || H(I:p)),其中 I 是用户名,p 是密码。

但不行,Apple 的 s2k 协议做的不一样:

x = H(s || p)

其中 p 不是原始密码,而是:

password_hash = SHA256(password)
derived_key = PBKDF2(password_hash, salt, iterations, 32, SHA256)

在发现这一点之前,我花了好几个小时调试"Invalid credentials"错误。要大大感谢 icloudpy 项目帮我验证了逻辑,他们的实现帮我省了时间。

第 3 步:完成身份验证

算出正确的 SRP 证明(proof)之后,我们把它发到 /appleauth/auth/signin/complete:

{
  "accountName": "[email protected]",
  "m1": "<base64_srp_proof>",
  "m2": "<base64_server_proof>",
  "rememberMe": true
}

第 4 步:双因素认证

如果启用了 2FA(老实说,每个账户都该开),Apple 会返回一个 409 状态,要求验证。你会在你的受信任设备上收到一个验证码——iPhone、iPad、Mac,你手头有什么都行。

我们把那个验证码发到 /appleauth/auth/verify/trusteddevice/securitycode:

{
  "securityCode": {
    "code": "123456"
  }
}

然后我们通过 /appleauth/auth/2sv/trust 信任这个会话,这样就不用每次都走一遍 2FA。

第 5 步:账户登录

最后,我们请求 /setup/ws/1/accountLogin,拿到包含所有所需 webservice URL 的完整会话,其中就有我们要找的 HideMyEmail 端点。

到这一步,我们就有了一个完全通过身份验证的会话。最难的部分搞定了!

HideMyEmail API

现在是有意思的部分。一旦通过身份验证,跟 HideMyEmail 打交道,相比我们刚经历的那场身份验证噩梦,简单得出奇。(大概就是因为这个,所有的开源项目才都只做了这一部分)

生成一个邮箱

POST /v1/hme/reserve
{
  "hme": "[email protected]",
  "label": "My Shopping Account",
  "note": "Used for online shopping"
}

一旦预留(reserve),这个邮箱就会永久绑定到你的账户,并会永远把邮件转发到你的收件箱(除非你删掉它)。

列出所有邮箱

GET /v2/hme/list

返回你所有的 HideMyEmail 地址,附带创建日期、标签、是否处于激活状态等元数据。想导出你创建过的一切时很有用。

速率限制

Apple 当然不会让我们撒欢。下面是我通过……大量测试发现的:

  • 每 30 分钟:约 5 个邮箱 × 家庭成员数
  • 每个账户总计:约 700 个邮箱

"家庭成员"这个乘数很有意思——如果你的 Apple 家人共享里有 5 个人,理论上你每 30 分钟大约能拿到 25 个邮箱。对于一个 Apple 大概没打算让人这么用的功能来说,还不赖。

当你触及上限时,Apple 会返回:

{
  "success": false,
  "error": {
    "errorMessage": "You have reached the limit...",
    ...
  }
}

打造 CLI

有了这些知识,我做了 icloud-hme——一个正经的 CLI 工具,把一切都处理好:

  • 真正的 SRP 身份验证 —— 再也不用复制 cookie 那套噩梦
  • 2FA 支持 —— 配合你的受信任设备工作
  • 多账户 —— 在多个 iCloud 账户之间切换
  • 漂亮的输出 —— 由 Rich 驱动,凭什么 CLI 就得丑呢?
  • 导出 —— CSV 或 JSON,带筛选选项

看它实际运行

首先,用你的 iCloud 账户进行身份验证:

$ icloud-hme auth

 iCloud HME ─────────────────────────────────────────────────────

  ? iCloud email: your@icloud.com
  ? Password: ********

   Two-factor authentication required
  ? Enter 6-digit code: 123456

   Authenticated as Your Name

然后想生成多少邮箱就生成多少:

$ icloud-hme generate -n 5

  Generating 5 email(s) • PERMANENT

  ──────────────────────────────────────────────────────────────────

  ✓ punk_51_estofamos@icloud.com
  ✓ bicep_angora.32@icloud.com
  ✓ extinct.daze_7p@icloud.com
  ✓ minimos_orzo.06@icloud.com
  ✓ flak-din-1q@icloud.com

  ──────────────────────────────────────────────────────────────────

  ✓ Generated 5/5 permanent email(s)

需要把一切导出?很简单:

$ icloud-hme export --format csvFound 29 emails to export
  ? Save to (without extension): my_emails

  ✓ Exported to my_emails.csv

你可以通过下面这条命令安装这个模块

pip install icloud-hme

或者用源代码安装,一定去看看 github 仓库

与我联系

如果你喜欢这篇文章,在 GitHub 和 Medium 上关注我,每当我发帖或开源什么东西时你都会收到通知。

icloudapplepythonhide-my-emailgenerator

跳过逆向工程。

Takion 为每一道主流反机器人防护墙返回新鲜的 cookie、请求头和令牌。一次 POST,无需浏览器,一小时内完成首次调用。