从WhatsApp聊天记录重建并分析4年的Wordle统计数据
摘要
作者描述了通过Python脚本解析WhatsApp聊天记录,重建个人四年Wordle统计数据的过程,因为Wordle自身的统计功能有限且仅在服务器端。
暂无内容
查看缓存全文
缓存时间: 2026/08/04 16:46
# 从 WhatsApp 聊天记录重建并分析四年的 Wordle 数据
来源:https://blog.omgmog.net/post/rebuilding-wordle-stats-from-whatsapp/
是的,我在 2026 年仍然在玩 Wordle。根据 [Wordle](https://www.nytimes.com/games/wordle/index.html) 的数据,我已经玩了 1,559 局,胜率 99%,当前连胜 107 天,最长连胜 278 天。四个数字,而且它们大体正确。但我无法得到这些数字背后的任何东西。没有逐局历史。无法比较周二和周日。无法知道我是否在这四年里真的进步了。我每天玩完都会把结果分享到 WhatsApp。这只是一个习惯,不是数据策略,但事实证明,这个习惯悄悄建立了一份比 Wordle 自身保存的详细得多的记录。一份我终于可以自己提问的记录。于是我开始研究如何重建自己的数据副本。
## Wordle 自带统计的问题
自 2025 年 6 月 30 日起,这些数据大多不再存在手机本地。它改而存在于我的 NYT 账户中,存储在服务器端,这正是为什么今天的数字能够在换设备、清缓存、重装应用后依然存活。我之所以知道确切日期,是因为手机本地存储里还留着一块“化石”:一个名为 `wordle\-legacy\-stats\-228392857` 的键,`currentStreak` 和 `maxStreak` 都冻结在 234,其中嵌入的时间戳解码后正是那一天。
```
{
"wordle-legacy-stats-228392857": {
"gamesPlayed": 1170,
"gamesWon": 1162,
"guesses": {
"1": 4,
"2": 65,
"3": 323,
"4": 440,
"5": 263,
"6": 67,
"fail": 8
},
"currentStreak": 234,
"maxStreak": 234,
"lastWonDayOffset": 1472,
"hasPlayed": true,
"autoOptInTimestamp": 1706429323127,
"hasMadeStatsChoice": false,
"timestamp": 1751262931
},
// ...
}
```
就在它旁边是 `wordle\-stats\-cutover\-tooltip`,只是一个布尔值,设为 `true`,几乎可以肯定是这次迁移的一次性提示标记。旧键从未被重置,只是在运行中被抛弃了,而与基于账户的数字之间的交接非常干净,以至于今天 278 天的纪录被完整地带了过来。在那道安全网存在之前,这一切都无法保证。我在 2024 年 8 月从 Pixel 5a 换到了 Pixel 7a,比这些数据迁移到服务器端早了将近一年:新设备、新的浏览器存储、没有警告,旧手机跟踪的任何连胜都消失了。这种事情还发生过更大规模的一次。当《纽约时报》在 2022 年 2 月将 Wordle 从 [Josh Wardle](https://en.wikipedia.org/wiki/Josh_Wardle) 的原始网站迁移到 nytimes.com 时,[不少玩家报告说他们的连胜在迁移中被重置了](https://www.forbes.com/sites/erikkain/2022/02/11/why-are-my-wordle-stats-and-streak-reset-and-is-there-a-fix/),而我自己现存最早的分享(谜题 #214)比那早了三个星期,所以我在 Wordle 最初几周积累的东西几乎肯定也没能幸存下来。
## 把 WhatsApp 导出变成数据
WhatsApp 可以[将聊天记录导出](https://faq.whatsapp.com/1180414079177245)为纯 `\.txt` 文件,每一行带时间戳,每个条目一条消息(或者每个连续块一条,用于像 Wordle 分享这样的多行内容)。每条消息看起来像这样:
```
//, : - :
```
这给了我所需的一切:谜题编号、日期、猜测次数、胜负,以及如果要进一步分析而不是只看汇总统计时所需的逐次猜测方格。我写了一个小型 Python 脚本解析导出文件,只保留我自己的消息,并通过正则表达式提取谜题编号、日期和结果。
```
19/01/2022, 22:10 - Max Glenister: Wordle 214 3/6
⬛⬛⬛⬛🟩
⬛⬛⬛⬛🟩
🟩🟩🟩🟩🟩
20/01/2022, 08:11 - Max Glenister: Wordle 215 5/6
⬛⬛⬛⬛⬛
⬛⬛⬛🟨⬛
🟨🟨⬛⬛⬛
🟩🟩🟨🟩⬛
🟩🟩🟩🟩🟩
21/01/2022, 08:17 - Max Glenister: Wordle 216 3/6
🟨⬛⬛⬛🟩
⬛🟩🟩🟩🟩
🟩🟩🟩🟩🟩
```
实际的提取是对得分行做一次正则匹配,再加上一点逻辑把 `X/6` 转换为真正的胜负:
```
WORDLE_RE = re.compile(r"Wordle\s+([\d,]+)\s+([1-6X])/6", re.IGNORECASE)
match = WORDLE_RE.search(message)
puzzle_number = int(match.group(1).replace(",", ""))
guess_raw = match.group(2).upper()
won = guess_raw != "X"
guesses = int(guess_raw) if won else None
result = {
"date": "2022-01-19",
"puzzle_number": puzzle_number,
"guesses": guesses,
"won": won,
}
```
我对上面三条消息运行了这段代码,输出如下:
```
[
{"date": "2022-01-19", "puzzle_number": 214, "guesses": 3, "won": True},
{"date": "2022-01-20", "puzzle_number": 215, "guesses": 5, "won": True},
{"date": "2022-01-21", "puzzle_number": 216, "guesses": 3, "won": True},
]
```
随后按谜题编号去重(以防我重复分享过同一个谜题),并将所有内容压缩为每局一行纯 CSV:
```
date,puzzle_number,guesses,won
2022-01-19,214,3,True
2022-01-20,215,5,True
2022-01-21,216,3,True
```
这足以计算连胜和间隔,之后也可以按任何我喜欢的方式切片数据。
## 方块说明了什么
导出覆盖了 1,552 局,可追溯到 2022 年 1 月中旬的谜题 #214——那是 Wordle 公开发布约三个月后,比 Wordle 声称的 1,559 局少 7 局,大概是那些我玩了但没来得及分享的日子。所有这些局中,我的胜率是 99.42%,和 Wordle 四舍五入的 99% 非常接近,整个过程中只有 9 次失败。猜测次数分布强烈偏向 4 次猜测(590 局),长尾一直延伸到 4 次幸运的首猜即中:`unite`、`mouse`、`style` 和 `audio`。最后那个与其说是运气不如说是习惯,`audio` 是我常用的两个开局词之一,另一个是 `adieu`。所有四次首猜即中都落在 2022 年 11 月到 2023 年 8 月这十个月里,之后一次也没有过——到现在已经将近三年——很可能是因为简单、常见的答案在逐渐减少。再说说连胜。我的最长连胜是 278 天,从 2024 年 11 月 9 日一直持续到 2025 年 8 月 13 日,这一次和 Wordle 完全一致:当前连胜 107,最长连胜 278,两者都是独立确认的,而不是仅仅听信它的一面之词。最令人满足的不是 Wordle 错了,而是我不再需要听它说了算。它终结于某一天没玩,而不是输了一局。大概只是夏天里忙碌的一天,和孩子们在一起,我甚至过了两天才发现。这是 2025 年全年唯一的断档,但仍然足以终结它,然后第二天新的连胜就接上了,又跑出 204 天。其他大多数间隔都更短,3 到 7 天,集中在 2022 年和 2023 年初。最长的一次是 2022 年 11 月下旬的 9 天,正好在我生日前后,所以我允许自己这一次。从 2023 年末开始,断档基本消失,连胜变得又长又深绿,热力图一眼就能看出来。
因为我保存了实际的方格而不只是猜测次数,所以我可以检查开局词上幸运的绿色方块是否真的有帮助。方格行本身只是五个 emoji 一行,所以从消息中提取它们只需另一个正则表达式,而检查是否有绿色方块则只是对第一行做一次字符串搜索:
```
GRID_ROW_RE = re.compile(r"[⬛⬜🟨🟩]{5}")
grid = [line for line in message.splitlines() if GRID_ROW_RE.fullmatch(line)]
had_green_opener = "🟩" in grid[0]
```
之前的谜题 #216,`🟨⬛⬛⬛🟩`,返回 `True`。这确实有帮助:至少有一个绿色方块的首猜平均需要 3.79 次猜测完成,而开局词完全空白时为 4.11 次,仅仅因为一个幸运的字母落在正确的位置就省下了三分之一猜。
## 按星期和时间段的习惯
但这些数据没有任何逐日的细节,所以我按星期拆分了猜测次数,想看看那些独自送孩子上学的早晨(周二和周四)是否真的让我付出了代价。其实并没有。一周内各局的分布几乎完全均匀,平均猜测次数也几乎不动,周日是 3.94 次,周三是 4.07 次。胜率在周五和周日略有下降(98.2–98.6%,而其他四天是 100%),但和我预期更糟的那些早晨没有任何对应关系。失败比平均值更能说明问题。我的 9 次失败中,有 4 次落在周日,3 次在周五,2 次在周二,而周一、周三、周四和周六一次都没有。我的猜测次数在周末并不滑落,但失败背后的原因显然偏爱周末。星期几没有影响,但时间点有影响。WhatsApp 只知道我按下发送的时间,而不是我真正解出来的时间,但即便作为一个代理指标,它也明显集中在前面:早上 6 点到 8 点占了全部 1,552 次分享的大约 79%,在早上 7 点达到高峰,午饭后几乎降到零。这与现实生活相符:大多数早上孩子们在 5:30 或 6 点把我弄醒,到 8:30 我已经喝完了第二杯咖啡,所以 Wordle 就发生在这个窗口期里,在一天真正开始之前。不过,分开看工作日和周末,形状就变了。工作日高峰又早又强,光是早上 7 点就占了所有工作日分享的 36%,然后迅速下降。周末则更平缓,而且时间推后,早上 8 点和 9 点所佔的比例都比工作日更大,这是一个微小但明显的睡懒觉迹象。
## 随时间的趋势
月度平均值在稳步爬升,从 2022 年初紧实的 3.7–3.8 次猜测,到 2025 年已经达到 4.0–4.5——这远早于 2026 年 2 月开始的单词复用期。这不像是我玩 Wordle
相似文章
使用 Twilio + Claude API 构建了一个支持人工接管的 WhatsApp AI 代理,一些关键要点
使用 Twilio 和 Claude API 构建支持人工接管的 WhatsApp AI 代理的关键要点,重点关注用于 Webhook 安全的 Twilio 签名验证以及用于人工/代理切换的模态路由逻辑。
@jinchenma_ai: 卧槽!刚发现一个能读取微信聊天记录的工具,私域运营神器啊! wx-cli,让 AI 可以自由读取微信消息。 1. 消息随便翻:不用点开微信那个难用的搜索框,直接输入关键词就能搜全库聊天记录,速度快到飞起。 2. 朋友圈挖掘机:能直接看朋友…
wx-cli is a local tool for extracting and analyzing WeChat chat history and moments, enabling AI integration without cloud data transmission.
@QCXINT_: 有人刚刚开源了一个可自行托管的 WhatsApp API,你可以免费在自己的服务器上运行。它叫 OpenWA。……
OpenWA 是一个免费、开源、自托管的 WhatsApp API 网关,提供可插拔架构,支持发送/接收消息、管理会话、Webhook,以及与 n8n、Home Assistant 和自定义应用等工具集成,所有功能均由开发者掌控。
我们开发了一个AI代理,通过WhatsApp为转租匹配用户
我们构建了一个运行在WhatsApp上的AI代理,通过从对话中提取结构化档案并评分兼容性,为转租匹配用户。
WhatsApp关闭的那一天
一种思想实验,探索WhatsApp永久关闭的灾难性后果,突出其作为全球南方关键基础设施的作用。