記錄解謎 Python 運動

在記錄益智練習中,您需要使用 Python 程式碼來解開兩個謎題。此練習使用 urllib 模組,如「Python 公用程式」一節所示。本練習的檔案位於 google-python-exercises 的「logpuzzle」目錄中 (如果您尚未下載 google-python-exercises.zip,請參閱「設定」一文瞭解詳情)。將程式碼新增至「logpuzzle.py」檔案。

動物的圖片已細分為許多狹窄的垂直條紋圖片。條紋圖片位於網際網路上,每處都有各自的網址。網址不會顯示在網路伺服器記錄檔中。你的任務是找出網址並下載所有圖片列,重新建立原始圖片。

配量網址會隱藏在 apache 記錄檔中 (開放原始碼 apache 網路伺服器是網際網路上最廣泛使用的伺服器)。每個記錄檔皆來自某部伺服器,因此記錄檔中不會顯示所需的配量網址。而記錄檔會對原始伺服器進行編碼,如下所示:記錄檔 enk_code.google.com 是來自 code.google.com 伺服器 (在正式情況下,我們將伺服器名稱放在第一個長條後面的內容)。Zoo_code.google.com 記錄檔含有「動物」益智遊戲圖片的資料。雖然記錄檔中的資料使用真正的惡作劇網路伺服器語法,但除了謎題所需的資料之外,系統也會從真實的記錄檔中隨機採納資料,以完成謎題。

以下是記錄檔中的單行內容 (實際外觀範例):

10.254.254.28 - - [06/Aug/2007:00:14:08 -0700] "GET /foo/talks/ HTTP/1.1"
200 5910 "-" "Mozilla/5.0 (X11; U; Linux i686 (x86_64); en-US; rv:1.8.1.4) Gecko/20070515 Firefox/2.0.0.4"

前幾個數字是提出要求的瀏覽器位址。最有趣的部分是「GET path HTTP」,用於顯示伺服器接收的網路要求路徑。路徑本身不會包含空格,且以空格分隔 GET 和 HTTP (規則運算式建議:\S (大寫的 S) 會與任何非空格字元)。找出記錄中包含「puzzle」字串的行,並忽略記錄中其他許多行。

A 部分 - 將檔案記錄到網址

完成 read_urls(filename) 函式,這樣就能從記錄檔中擷取謎題網址。在記錄檔中尋找所有「puzzle」路徑網址。結合每個網址的路徑與檔案名稱中的伺服器名稱,即可形成完整的網址,例如「http://www.example.com/path/puzzle/from/inside/file」。過濾重複出現的網址。Read_urls() 函式應傳回完整網址清單,並按照字母順序排序,而且不含重複網址。按字母順序排列網址,即可從左到右排序正確的圖片區塊,重建動物原始的動物圖片。以最簡單的情況來說,main() 應只列印網址,每行一個。

$ ./logpuzzle.py animal_code.google.com
http://code.google.com/something/puzzle-animal-baaa.jpg
http://code.google.com/something/puzzle-animal-baab.jpg
...

B 部分 - 下載圖片拼圖

完成 Download_images() 函式,取得已排序的網址和目錄清單。將各個網址的圖片下載至指定的目錄,並視需要先建立目錄 (請參閱「os」模組建立目錄,以及使用「urllib.urlretrieve()」來下載網址)。用簡單的配置命名本機圖片檔,例如「img0」、「img1」、「img2」等。下載每張圖片時,您可能會想要列印一些小的「擷取中...」狀態輸出行,因為這可能比較緩慢,並且表示程式正在運作。每張圖片都會與原圖略為垂直的切片。如何結合切片來重建原始相片?只要少許 HTML 程式碼就能輕鬆解決 (不需具備 HTML 知識)。

Download_images() 函式也應該在目錄中建立 index.html 檔案,並加上 *img* 標記,藉此顯示各個本機圖片檔。img 標記應放在同一行,且不要相隔。如此一來,瀏覽器就能順暢顯示所有切片。您無須瞭解 HTML 也能進行這項作業,只需建立如下所示的 index.html 檔案即可:

<html>
<body>
<img src="img0"><img src="img1"><img src="img2">...
</body>
</html>

下載動物謎題後,看起來會像這樣:

$ ./logpuzzle.py --todir animaldir animal_code.google.com
$ ls animaldir
img0  img1  img2  img3  img4  img5  img6  img7  img8  img9  index.html

如果可以正常運作,請在瀏覽器中開啟 index.html 並看到動物原始圖片。圖片中的動物是什麼?

C 部分 - 圖片剪刀

第二張謎題包含一張知名地點的圖片,但這取決於自訂排序。第一題是,網址可以按字母順序排序,將圖片排序。排序時,會使用完整網址。不過,如果網址結尾的格式為「-wordchars-wordchars.jpg」,例如「http://example.com/foo/puzzle/bar-abab-baaa.jpg」,則網址必須以 second 字詞表示 (例如「baaa」)。因此,如果將每個網址清單的結尾都以 word-word.jpg 模式排序,網址清單就會依照第二個字詞的順序。

擴充程式碼以正確排序這類網址,接著應該就能解碼第二個顯示知名地點的 place_code.google.com 謎題。顯示位置

CC 出處資訊:此謎題使用的圖片皆由擁有者依據《創用 CC 姓名標示 2.5》授權提供,該圖片力求鼓勵他人重混類似內容。動物圖片取自使用者 Zappowbang 畫面,且地點圖片取自使用者在撥動時獲得的布林值。