pythonchallenge(三)

PythonChallenge_3html

 1、實驗說明前端

1. 環境登陸python

無需密碼自動登陸,系統用戶名shiyanlou,密碼shiyanlou正則表達式

2. 環境介紹算法

本實驗環境採用帶桌面的Ubuntu Linux環境,實驗中會用到桌面上的程序:瀏覽器

1. LX終端(LXTerminal): Linux命令行終端,打開後會進入Bash環境,可使用Linux命令
2. Firefox:瀏覽器,能夠用在須要前端界面的課程裏,只須要打開環境裏寫的HTML/JS頁面便可
3. GVim:很是好用的編輯器,最簡單的用法能夠參考課程[Vim編輯器]app

 3. 環境使用編輯器

使用GVim編輯器輸入實驗所需的代碼及文件,使用LX終端(LXTerminal)運行所需命令進行操做。函數

完成實驗後能夠點擊桌面上方的「實驗截圖」保存並分享實驗結果到微博,向好友展現本身的學習進度。實驗樓提供後臺系統截圖,能夠真實有效證實您已經完成了實驗。工具

實驗記錄頁面能夠在「個人主頁」中查看,其中含有每次實驗的截圖及筆記,以及每次實驗的有效學習時間(指的是在實驗桌面內操做的時間,若是沒有操做,系統會記錄爲發呆時間)。這些都是您學習的真實性證實。

2、課程介紹

本次`PythonChallenge`系列一共有11個項目,持續更新中~~~,每一個項目課程裏面會詳細講解3個`pythonchallenge`通關題目以及不一樣解決方案,課後習題裏面佈置一個任務題,該題目會在下一個項目中被揭開面紗。

本系列題目屬於在線闖關題,因爲實驗樓暫時不提供訪問外網,所以請各位驗證答案的時候煩勞點擊本身的瀏覽器訪問網頁以驗證答案。

全部題目和參考的解決方案版權歸[PythonChallenge官網],課程編寫屬於實驗樓原創,歡迎在問答區積極提問,小編會積極解答,也歡迎在評論區吐槽~


 3、實驗回顧

在上一個[項目課]中,咱們學到了不少知識,好比:`re`模塊中的一些函數,`urllib`模塊的使用以及函數`reduce`。記性不算太差的大家估計還記得在上一次的課程中小編有留給你們一個課後做業,不知道大家完成的怎樣呢?

不論是否獲得答案,讓小編帶着你一塊兒解決這個問題吧!

4、做業題解析

### 問題:請訪問[挑戰題連接]查看源代碼,找到通往下一個網址的連接。(提示:與`zip`有關)

**小編腦洞:**

首先查看源代碼:

通過這幾回題目的摸索,咱們知道通常答案都是隱藏在註釋裏面的(`<!-- -->`的內容)。首先第一個註釋是單詞`zip`,第二個註釋稍微比較長,大體的意思是:下面的內容與謎語自己無關,只但願你們可以給`pythonchallenge`這個項目提供一點資助。那麼,第二個註釋就沒有什麼做用。再看第一個註釋,只有一個單詞`zip`,那麼答案就是`zip`了,所以修改連接爲:[http://www.pythonchallenge.com/pc/def/zip.html]。獲得這樣的結果:

意思是:找到了`zip`,那麼`zip`應該就隱藏在源代碼中:

源碼中並無給予什麼信息,那麼是否是`zip`指的是`zip`壓縮包呢?再次返回修改原連接,將`html`換成`zip`,結果然是一個壓縮包,關於這個壓縮包,已經上傳至實驗樓環境,所以輸入如下命令下載文件並查看壓縮包內容:

1 $ wget http://labfile.oss.aliyuncs.com/courses/411/channel.zip
2 $ unzip -l channel.zip

文件內容以下:

一共有910個文件,大多數文件的命名都是數字型,解壓並查看說明文檔`readme.txt`

1 $ unzip channel.zip 
2 $ vi readme.txt

根據上面的提示,咱們瞭解到兩個信息:

  1. 循環是從`90052.txt`這個文件開始;
  2. 答案就隱藏在zip壓縮包文件夾的內容中。

查看`90052.txt`這個文檔內容以下:

看到這句話的時候,你是否是以爲似曾相識?是的,在上一個挑戰項目中也出現過這麼一句話,區別在於上一次的題目是使用`urllib`模塊在網頁上尋找關鍵字,這一次是在壓縮包內尋找答案。

算法以下:

  • 1. 設置初識起點,進入循環,使用正則表達式匹配文件內容中的數字;
  • 2. 將文件內容中的數字做爲下一個被打開的文件名;
  • 3. 循環條件是找到不是以數字結尾的文件並打印結果
 1 import re
 2 
 3 findnothing = re.compile(r'Next nothing is (\d+)').match
 4 
 5 while True:
 6     fname = seed + 'txt'
 7     text = open(fname, 'r').read()
 8     m = findnothing(text)
 9     if m:
10         seed = m.group(1)
11     else:
12         print text
13         break

 

打印結果以下:

意思是讓咱們收集註釋。

關於註釋,每個文件都有它的描述信息,能夠經過輸入命令查看壓縮包內的文件的描述信息:

1 unzip -l channel.zip

上圖給出每一個文件的四個信息,好比`reame.txt`文件,它的註釋信息就是`*`,該文件的大小爲`84`字節,該文件的最後修改時間是`2005-04-28`,文件名爲`readme.txt`。將這些註釋信息鏈接起來就能夠看看結果能不能告訴咱們信息。

`Python`中有一個關於收集壓縮包信息的模塊`zipfile`,該模塊的詳細說明文檔見[官方文檔](https://docs.python.org/2/library/zipfile.html)。
該模塊中有一個類須要咱們瞭解——`zipfile.ZipFile`。該模塊主要用於讀寫`zip`類型的文件。該類裏面有一個函數`getinfo(name)`用於返回壓縮文件中命名爲`name`的文件信息,因爲本次示例裏面須要用到文件信息裏面的解釋部分,所以直接調用`zipfile.ZipFile.getinfo(name).comment`就能夠返回`name`文件的註釋。

所以修改代碼以下:

 1 import zipfile, re
 2 
 3 findnothing = re.compile(r"Next nothing is (\d+)").match
 4 comments = [] # 收集註釋信息的列表
 5 z = zipfile.ZipFile("channel.zip", "r") # 讀取壓縮包文件
 6 seed = "90052"
 7 
 8 while True:
 9     fname = seed + ".txt"
10     comments.append(z.getinfo(fname).comment)
11     guts = z.read(fname)
12     m = findnothing(guts)
13     if m:
14         seed = m.group(1)
15     else:
16         break
17     print "".join(comments) # 打印全部註釋信息    

那麼答案應該就是`hockey`了,轉到該連接:

而後提示讓咱們看一下字母,而且提示該單詞指的是存在於空氣中。上面組成`HOCKEY`的圖中剛好是由字母`O C Y G E N`組成,也就是單詞空氣——`oxygen`。

所以來到[下一題]

 

5、第七個挑戰題

問題:根據這副圖片找到通往下一個連接的單詞。

**小編腦洞:**

然而這一次源代碼中並無提供額外的信息,那麼只能看圖,仔細觀察上圖,發現這個圖並不完整,圖的中間被一條不一樣深度的灰度長條給掩蓋,那麼信息極可能就隱藏在這裏面。那麼圖像處理中咱們知道每個圖片都是由無數個像素值組成,實際上就是一個[像素]構成的矩陣,那麼答案極可能與這些像素值有關。關於這個問題的具體思路,有興趣的朋友能夠看一下個人[博客]

首先下載用於處理圖像的`Image`模塊,而後下載本題所須要處理到的圖片`oxygen.png`。

1 $ sudo apt-get install python-imaging
2 $ wget http://labfile.oss.aliyuncs.com/courses/411/oxygen.png


輸入如下代碼觀察圖片的大小:

1 import Image
2 img = Image.open('oxygen.png') 
3 img.size

由`img.size`的返回結果可知,該圖片的水平方向和垂直方向上每英寸長度上的像素分別爲`629`和`95`;利用畫圖工具可將這段馬賽克區域的座標提取出來:

橫座標的範圍是:`0-609`,縱座標的範圍是:`43-53`。

而後利用`Image`模塊裏面的函數`getpixel`得到這一區域的像素數據:

1 # 列表表達式
2 data = [img.getpixel((i, j)) for i in range(0, 609) for j in range(43, 53)]
3 print data

 

觀察打印的結果,你會發現輸出的像素列表是一個`4`元組,其中元組的前三個元素分別對應相應的`RGB`份量:`r`、`g`、`b`,而且因爲灰色知足條件是`r=g=b`,且觀察到元組每重複7次變化一次,那麼如何將這些輸出結果與答案聯繫?

通常狀況下,答案的連接都是英文字母,那麼能夠嘗試把這些數值轉化爲通過函數`chr`將這些`ASCII碼`轉換爲相應的英文字母。

1 # 先選取印第45行的全部像素信息
2 row = [chr(img.getpixel((i, 43))[0]) for i in range(0, 609, 7)]
3 "".join(row)

上圖給的那句話的意思是下一關的答案是`[105,110,116,101,103,114,,105,116,121]`。好說,將這些`ASCII碼`轉爲字母,並鏈接成字符串:

通往下一關的單詞是`integrity`,所以轉到下一關[連接]

 7、第八個挑戰題

 問題:找到消失的連接

**小編腦洞:**

找到消失的連接?那麼通關口應該不是簡單的單詞替換而是一個超連接,看看源代碼是否有咱們須要的信息:

 

咱們注意到在`center/img`中有一個屬性`usemap`爲`notisect`,關於`notisect`的描述在`\map\area`下面有描述,也就是說這是`interity`這個圖裏面的連接,關於`coords`的內容是圖片的某一區域,該區域指向一個連接`@href='../return/good/html'`點擊圖片彈出以下對話框(更多關於`img`標籤的`usemap`屬性介紹請查看[文檔]):

也就是說咱們須要在原網頁中找到用戶名和密碼才能登錄該身份驗證。

再次觀察源代碼中的註釋部分,發現:

若是把`un`(username)後面的字符串解釋爲用戶名,那麼`pw`(password)裏面的字符串就是密碼。

那麼這些字符串應該如何解碼呢?仔細觀察字符串的組成形式,不管是用戶名仍是密碼都是`BZ`開頭的字符串,後來瞭解到`BZ`開始的字符串其實是被`bz2`壓縮後的一種格式,那麼如何解壓呢?首先導入該模塊,而後輸入`dir(bz2)`查看`bz2`模塊的函數:

`compress`是`壓縮`函數,那麼`decompress`就是解壓函數,繼續查看函數用法:

因爲咱們的字符串比較少,所以可使用函數`decompress(data)`解壓數據:

1 import bz2
2 un = ''BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
3 pw = 'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
4 bz2.decompress(un)
5 bz2.decompress(pw)

獲得用戶名爲`huge`,密碼爲`file`,其實這個問題很簡單,只要瞭解到`BZ`這種格式的字符串是一種壓縮形式,而後進行相應的解壓就能夠解決問題。

 8、任務

問題:請把點鏈接起來,[題目連接](提示:源代碼,源代碼!)。

相關文章
相關標籤/搜索