Fork me on GitHub

pythonChallenge攻略

http://www.pythonchallenge.com/是一个非常棒的练习python的网站,以过关解密的形式来帮助你学习python,现将我的解密过程记录如下。

第0关:warming up

这关就一张图片,显示2的38次方,下方提示:try to change the URL address OK,那我们就计算一下2的38次方,在python中输入:

2**38

在python中两个*号表示次方运算,得出答案:

>>> 2**38
274877906944L

根据提示修改url,将0替换成上面这串数字,然后网页提示L不需要,我们去掉L再替换, 过关!

第1关:what about making trans

图中显示将字母k换成m,o换成q,e换成g,即每个字母往后推移两位,看来得将下面那一 大段字符转换一下,这里使用两个函数chr(),和ord().

string = "g fmnc wms bgblr rpylqjyrc gr zw fylb. rfyrq ufyr amknsrcpq ypc dmp. bmgle gr gl zw fylb gq glcddgagclr ylb rfyr'q ufw rfgq rcvr gq qm jmle. sqgle qrpgle.kyicrpylq() gq pcamkkclbcb. lmu ynnjw ml rfc spj. "
for x in string:
 if ord(x)<=122 and ord(x)>=97:
     if (ord(x)+2)>122:
             print chr(ord(x)+2-26),
     else:
             print chr(ord(x)+2),
 else:
     print x,

得到的结果是:

    i   h o p e   y o u   d i d n t   t r a n s l a t e   i t   b y   h a n d .   t h a t s   w h a t   c o m p u t e r s   a r e   f o r .   d o i n g   i t   i n   b y   h a n d   i s   i n e f f i c i e n t   a n d   t h a t ' s   w h y   t h i s   t e x t   i s   s o   l o n g .   u s i n g   s t r i n g . m a k e t r a n s ( )   i s   r e c o m m e n d e d .   n o w   a p p l y   o n   t h e   u r l .

结果告诉我们将url也转换一下,即将map换成ocr,过关!

第2关:ocr

按照提示看网页源代码,发现网页下方有一大串字符串注释,开头告诉我们 find rare characters in the mess below: 那我们就找出出现次数最少的字母。 这么一大串字符,我们选择将它保存在一个文件中,通过文件来读取内容,保存为ocr.html

>>>file = open('ocr.html','r')
>>>text = file.read()
>>>dict = {}
>>>for x in text:
    if x in dict:
        dict[x] += 1
    else:
        dict[x] = 1
>>>dict

这样之后我们便可以看到dict中的内容了,看看都是些什么玩意

    {'\n': 1220, '!': 6080, '#': 6115, '%': 6104, '$': 6046, '&': 6043, ')': 6186, '(': 6154, '+': 6066, '*': 6034, '-': 4, '<': 1, '>': 1, '@': 6157, '[': 6108, ']': 6152, '_': 6112, '^': 6030, 'a': 1, 'e': 1, 'i': 1, 'l': 1, 'q': 1, 'u': 1, 't': 1, 'y': 1, '{': 6046, '}': 6105}

里面的字母出现次数至少为1,好,那我们就找出出现次数为1的几个字母。

>>>for y in dict:
    if dict[y] == 1:
        print y,
    else:
        pass
a e i l q u t y

组合一下就是equality,过关!

第3关:re

看标题便知道这关要靠正则表达式,先看提示:One small letter, surrounded by EXACTLY three big bodyguards on each of its sides. 意思是一个小写字母两边都被三 个大写字母包围着,EXACTLY提醒我们正好是三个大写字母。那么匹配字符串在哪里呢? 按照上一题的思路,看网页源码,果然,又是一大串字符,照例保存在文件中,re.html。

>>>file = open('re.html','r')
>>>text = file.open()
>>>re.findall(r'[a-z][A-Z]{3}[a-z][A-Z]{3}[a-z]',text)

一下是筛选出来的字符串:

['qIQNlQSLi', 'eOEKiVEYj', 'aZADnMCZq', 'bZUTkLYNg', 'uCNDeHSBj', 'kOIXdKBFh', 'dXJVlGZVm', 'gZAGiLQZx', 'vCJAsACFl', 'qKWGtIDCj']

取最中间的小写字母组成‘linkedlist’,改url,根据提示再改成php页面,过关!

第4关

只有一张图,什么也没说,国际惯例,看源码,果然:

urllib may help. DON'T TRY ALL NOTHINGS, since it will never end. 400 times is more than enough.

看来是要用urlib模块了,但是具体应该做什么呢?我们再看看图片,点击图片链接,发现 页面上面说:

and the next nothing is 44827

这又是什么意思?我们再看看地址栏,发现刚刚点击链接之后我们给网页发送了一个值:

nothing=12345

那接下来的nothing值就是44827了,但是肯定不能手工做,这就是考点了。

import urllib
import urllib2
import re
url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
keyvalue = '12345'
fullurl = url + keyvalue
for i in range(0,400):
text = urllib2.urlopen(fullurl).read()
keyvalue = re.findall(r'and the next nothing is (\d*)',text)
try:
    fullurl = url + keyvalue[0]
except Exception,e:
    print str(e)
    print fullurl

最后我们得到的url是:

http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=16044

进入这个网页,网页提示:

Yes. Divide by two and keep going.

OK,除以2就除以2,nothing=8022,进入网页:

and the next nothing is 25357

我去!还来?!! 好吧,再来一次...最后得到的nothing=66831,进入网页:

peak.html

这次就对了,过关!

第5关:peak hell

一座山,下面提示是:

pronounce it

不明觉厉,好吧,国际惯例看源码,最下面的注释说:

peak hell sounds familiar ?

peak hell,peak hell,pickle?试试,将url改成pickle.html,进去:

yes! pickle!

看来是pickle模块了,pickle模块是用于序列化对象,永久存储对象的,那么我们要 操作的对象在哪呢?返回peak.html去看源码,我们发现有一行是这样的:

我们将url改成banner.p,发现可以下载一个叫banner.p的文件,看来这就是我们要 操作的对象了,上代码:

import pickle
peakhell = pickle.loads(open("banner.p","r").read())
print peakhell

我们看一下这里面到底是个什么玩意?

[[(' ', 95)], [(' ', 14), ('#', 5), (' ', 70), ('#', 5), (' ', 1)],.....]

这是一个大list,大list由一个个小list组成,小list里面是一个或多个tuple,每个 tuple中有两个元素,第一个元素是一个字符,要么是' ',要么是'#',第二个元素是一 个整数,观察一下,发现每个小list中的整数元素加起来都是95,那应该是打印95个对 应的字符了,上代码:

for smalllist in peakhell:
string = ''
for meta in smalllist:
        string += meta[0]*meta[1]
print string
          #####                                                                      ##### 
           ####                                                                       #### 
           ####                                                                       #### 
           ####                                                                       #### 
           ####                                                                       #### 
           ####                                                                       #### 
           ####                                                                       #### 
           ####                                                                       #### 
  ###      ####   ###         ###       #####   ###    #####   ###          ###       ####

### ## #### ####### ## ### #### ####### #### ####### ### ### #### ### ### ##### #### ### #### ##### #### ##### #### ### ### #### ### #### #### ### ### #### #### #### #### ### #### #### ### #### #### ### #### #### #### #### ### ### ####

#### #### ## ### #### #### #### #### #### ### ####

#### #### ########## #### #### #### #### ############## ####

#### #### ### #### #### #### #### #### #### ####

#### #### #### ### #### #### #### #### #### ####

### #### #### #### ### #### #### #### #### ### #### ### ## #### #### ### #### #### #### #### #### ### ## #### ### ## #### #### ########### #### #### #### #### ### ## #### ### ###### ##### ## #### ###### ########### ##### ### ######

channel.html,过关!

转载请注明出处:BackNode

My zhiFuBao

Buy me a cup of coffee

blogroll

social