2014年10月2日 星期四 晴

Level 6: http://www.pythonchallenge.com/pc/def/channel.html

题目肯定在Html Source的注释里,一大堆注释是给他捐款的文字,不起眼处有一段<– zip –>的注释,这应该是暗示吧。尝试http://www.pythonchallenge.com/pc/def/channel.zip ,果然能下载。

解压后直接看readme.txt,跟之前做过的一题有点类似。 [code]welcome to my zipped list. hint1: start from 90052 hint2: answer is inside the zip[/code]

明白了,写代码: [code]def Challenge6(): index = 90052 answer_obj = re.compile(‘‘’nothing is (\d+)’’’) while True: print index with open(".\channel\%s.txt" % str(index)) as f: text = f.read() if text: objs = answer_obj.findall(text) if objs: index = objs[0] else: break with open(".\channel\%s.txt" % str(index)) as f: print f.read()[/code]

打印出来结果: [code]Collect the comments.[/code]

comments,应该是指zipfile里的comment,即如用winrar解压时看到文件的注释。按照上述文件的顺序,把各文件的comment打印出来应该就能看到答案了。

最终代码如下: [code]def Challenge6(): import zipfile index = 90052 answer_obj = re.compile(‘‘’nothing is (\d+)’’’) filelist = [] while True: print index filelist.append(index) with open(".\channel\%s.txt" % str(index)) as f: text = f.read() if text: objs = answer_obj.findall(text) if objs: index = objs[0] else: break with open(".\channel\%s.txt" % str(index)) as f: print f.read()

with zipfile.ZipFile(’.\channel.zip’, ‘r’) as f: print(’’.join([f.getinfo("%s.txt" % str(i)).comment.decode(“utf-8”) for i in filelist]))[/code]

访问http://www.pythonchallenge.com/pc/def/hockey.html 网页提示:it’s in the air. look at the letters . 咦?怎么改变风格了?连张图片都没有?看HTML Source,也是只有这句话。 回头再去看看,look at the letters,不要看letters组成的图形,答案应该是oxygen。有时候,我们第一眼看到的不一定是真相,要看第二眼才行。

So,Next Level is http://www.pythonchallenge.com/pc/def/oxygen.html

Level 7: http://www.pythonchallenge.com/pc/def/oxygen.html

网页代码也没有提示,我看页面Title是smarty,尝试了一下http://www.pythonchallenge.com/pc/def/smarty.html ,发现是404,此路不通。

看图片,图片中间一行是灰色的。颜色的值,程序员和美工都应该知道,8位的图片颜色的RGB应该介于0–255之间。考虑到之前的题目,0-255只能让我想起Ascii码。

图像处理,要上PIL了。 [code]import Image #StringIO #url = ‘http://www.pythonchallenge.com/pc/def/oxygen.png' #im = Image.open(StringIO.StringIO(get_url_data(url))) im = Image.open(‘oxygen.png’) #w,h = im.size #获取width和height #im.getpixel((0,h/2)) #结果是一个四维元组,取哪个点都不好[/code]

可以考虑用L模式,只有一个点: 代码如下: [code]def Challenge7(): import Image #StringIO #url = ‘http://www.pythonchallenge.com/pc/def/oxygen.png' #im = Image.open(StringIO.StringIO(get_url_data(url))) im = Image.open(’./oxygen.png’) w,h = im.size

data = im.convert(‘L’).getdata() for y in xrange(8):#由于打印第h/2行,发现相邻的元素是相同的,这应该有个间隔的规律,我都打印出来 print ‘’.join([chr(data[(h/2) * w + x]) for x in range(0,w,y + 1)])[/code]

打印结果有一行是结果的: smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]iZR

看到这个数组,接下来转换一下就可以了 [code]mylist = [105, 110, 116, 101, 103, 114, 105, 116, 121] print ‘’.join([chr(x) for x in mylist])[/code]

最后结果是integrity,So,Next Level is http://www.pythonchallenge.com/pc/def/integrity.html

Level8: http://www.pythonchallenge.com/pc/def/integrity.html

第一眼就看到注释:

这一个是username,一个是password。

再点http://www.pythonchallenge.com/pc/return/good.html,发现果然弹出一个对话框要求输入用户名和密码。这要我们去解密得到un和pw了。

最后一点的提示是: coords=“179,284,214,311,255,320,281,226,319,224,363,309,339,222,371,225,411,229,404,242,415,252,428,233,428,214,394,207,383,205,390,195,423,192,439,193,442,209,440,215,450,221,457,226,469,202,475,187,494,188,494,169,498,147,491,121,477,136,481,96,471,94,458,98,444,91,420,87,405,92,391,88,376,82,350,79,330,82,314,85,305,90,299,96,290,103,276,110,262,114,225,123,212,125,185,133,138,144,118,160,97,168,87,176,110,180,145,176,153,176,150,182,137,190,126,194,121,198,126,203,151,205,160,195,168,217,169,234,170,260,174,282”

我一开始以为是提示,这一段肯定不是用简单的chr就能搞定了,因为很多数都大于了255。但很快发现,回到页面看图片,随便点点,发现点击密封会有个框,才明白coords是密封的坐标,呵呵。

又到http://www.pythonchallenge.com/pc/return/good.html观察,对话框服务器提示“inflate",google一下“inflate python”,搜到的是与压缩相关的内容。看un和pw开头都有相同的字段“BZh91AY&SY”,应该是header,再Google一下"BZh91AY&SY"得知bz2这个压缩模块,再搜索“python bz2”获悉bz2的用法,https://docs.python.org/2/library/bz2.html。

写代码如下: [code]def Challenge8(): import bz2 un = ‘BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084’ pw = ‘BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08’ print bz2.decompress(un) print bz2.decompress(pw)[/code]

打印结果如下: huge file

在http://www.pythonchallenge.com/pc/return/good.html中分别填入un和pw,网页显示出Level9的图片,通关。

代码不难,最主要是中间推理和搜索的过程。今天耗费了很多时间,只能做这3题了,其余时间做别的事情。