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

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 csv
✓ Found 29 emails to export
? Save to (without extension): my_emails
✓ Exported to my_emails.csv
你可以通过下面这条命令安装这个模块
pip install icloud-hme
或者用源代码安装,一定去看看 github 仓库
与我联系
如果你喜欢这篇文章,在 GitHub 和 Medium 上关注我,每当我发帖或开源什么东西时你都会收到通知。