从WhatsApp聊天记录重建并分析4年的Wordle统计数据

Hacker News Top 工具

摘要

作者描述了通过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

相似文章

WhatsApp关闭的那一天

Lobsters Hottest

一种思想实验,探索WhatsApp永久关闭的灾难性后果,突出其作为全球南方关键基础设施的作用。