破解 Wordle 完全手冊
Wordle 是什麼
Wordle 是一種字謎遊戲,每天都會有一個五個字母的英文單字做為答案,每一輪可以猜一個英文單字,系統會告訴你猜中哪幾個字,以及哪幾個字位置是錯的,以及哪些沒猜中,然後作為線索繼續往下猜,共有六次機會。
前言
老實說當初只是想把 Wordle 的字庫拉出來做個幫助猜字的工具而已,沒想到會意外的發現 Wordle 網站的秘密。
說了一堆遊戲規則這邊沒打算教你要怎麼正確的玩這個遊戲,~~因此想研究玩遊戲方法的可以關閉分頁離開了~~,這篇的目的是解析 Wordle 網頁背後的秘密。
如何破解
首先打開 Wordle 網頁,把原始碼拿出來看之後會發現他有載入一個 JS 檔案:
// https://www.nytimes.com/games/wordle/main.4d41d2be.js
...
var Ma=["cigar","rebut","sissy","humph","awake","blush",...]
var Oa=["aahed","aalii","aargh","aarti","abaca","abaci","abacs","abaft","abaka","abamp","aband",...]
...
當中可以看到兩個 list,一個照著字母排列,另一個沒有。這邊可以稍微猜一下,沒事幹嘛拆成兩個 list,其中一個 list 是照字母順序排列,另一個則沒有。
於是把前幾次的答案拿進去搜,結果發現答案都在 Ma 裡面,而且 index 位置還是跟 Wordle 的第 N 個題目一樣。那結果很明顯了,每天答案就會是 Ma[題目編號]。
後來 Wordle 出了許多的變種,同樣的做法可以套用到所有的 Wordle 系列的遊戲。
然後我就再也不玩 Wordle 了 QQ
延伸——如何玩 Passwordle
這也是 Wordle 的其中一個變種,但有趣的是他的答案是 random 的,每次進入網站答案都不一樣,所以大家一起玩是不會有共同答案的。
而且他也是輸入一個字串,他會回傳 SHA-256 的結果並告訴你 hash 的哪邊不符合。想當然,這種方法用玩 Wordle 的方式會猜到天花地老,於是我又去看人家原始碼了 XDD
// https://rsk0315.github.io/playground/js/passwordle.js
function randomPassword() {
let letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
let digits = '0123456789';
let punctuation = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~';
let s = letters.repeat(7) + digits.repeat(4) + punctuation.repeat(3);
let length = 14;
let res = Array.from({length}, (() => s[randomInt(s.length)])).join('');
debugger; // どうぞ
return res;
}
一進來就先看 randomPassword 是如何產生的,而注意到了他其實有塞了一段 debugger; // どうぞ,看起來就是要請我用。
當然我也毫不客氣打開了 Chrome 檢查工具,然後重新整理網頁。由於他在 function 內有塞斷點的關係,在網頁載入的時候程式執行會停在那個位置,因此就可以先檢視 res 的變數內容,最後就得到我們要的答案了。