一个好玩儿的网站 pythonchallenge 感觉挺好玩儿
先挖坑 后续慢慢填
其实这个是今年年初就在玩的了,但是后面没有动力去做了……
个人博客
欢迎来踩
尝试之后即明白 下一题的url就是2^38
2**38
第一关URLhttp://www.pythonchallenge.com/pc/def/274877906944.html
图片上显示 k–>m o–>q e–>g
刚开始觉得用str.replace替换 但是发现信息还是乱的
所以接下来想到的是对下面的提示信息每个字母都要在ascii码加2
intab = "abcdefghijklmnopqrstuvwxyz"
outtab = "cdefghijklmnopqrstuvwxyzab"
str_trantab = str.maketrans(intab, outtab)
test_str = "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."
print(test_str.translate(str_trantab))
输出结果:
i hope you didnt translate it by hand. thats what computers are for. doing it in by hand is inefficient and that's why this text is so long. using string.maketrans() is recommended. now apply on the url.
机智的我 幸好没有用手动查找ascii
解决第一题
m ,a ,p = ord('m'),ord('a'),ord('p')
print(chr(m+2),chr(a+2),chr(p+2))
#输出 ocr
第二题URL http://www.pythonchallenge.com/pc/def/ocr.html
这个 动动脚趾头就知道线索不会在书中 而是在网页源码中
然后开心的打开网页源码 心贼凉!!!
直接代码解决
import requests
import re
content = requests.get('http://www.pythonchallenge.com/pc/def/ocr.html').text
anwser = re.sub('\n|\t|\r','',content) #去除多余的空格空行 防止扰乱后续判断是否为字母
anwser = re.findall("find.*?",anwser) #匹配给出答案的内容
anwser = list(str(anwser)) #转化为列表
key = []
for x in anwser:
if x.isalpha():
key.append(x)
print("".join(key))
#结果 equality
第三题URL http://www.pythonchallenge.com/pc/def/equality.html
这个提示有点儿不知道什么情况 按照提示来说 图片里面应该没有答案
还是直接网页源码吧 嗯~~~ 这个可以的可以的 和第二题差不多 老样子 检查网页源码:
源码:
import re
import requests
content = requests.get('http://www.pythonchallenge.com/pc/def/equality.html').text
anwser = re.sub('\n','',content)
pattern = re.compile('',re.S)
anwser = re.findall(pattern,str(anwser))
key = re.findall('[a-z]+[A-Z]{3}([a-z])[A-Z]{3}[a-z]+',str(anwser))
print("".join(key))
#答案 linkedlist
第四题URLhttp://www.pythonchallenge.com/pc/def/linkedlist.php
提示要进入.php
这个就尴尬了 连个提示都没有 所以还是直接审查网页源码吧
然后点击图片 有提示 and the next nothing is 44827 URL变成了http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing=12345
意思就是 第一点击图片之后把获得数字写入nothing=后面 然后获取数字之后在写入持续400次?那么简单?先试试
import requests,re
number = re.compile("\d+")
rs = "12345"
def anwser():
global rs
for i in range(401):
source = requests.get("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="+rs).text
rs = re.findall(number,source)
if rs:
print(rs[-1])
rs = rs[-1]
else:
print(i,source)
break
if __name__ == '__main__':
anwser()
果然没有那么简单 到第85个的时候 报错
85 Yes. Divide by two and keep going.
可以的 可以的 可以的 还有这操作 那就再改一下代码
import requests,re
number = re.compile("(\d+)")
rs = "12345"
def anwser():
global rs
for i in range(401):
source = requests.get("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="+rs).text
if source.find("and the next nothing is") != -1:
rs = re.search(number,source).group(1)
print(rs)
else:
if re.findall('Divide by two and keep going.',source):
# if source.find("Divide by two and keep going.") != -1: 没有该字符串返回为-1
print(source)
rs = str(int(rs)/2)
else:
print(i,source)
break
if __name__ == '__main__':
anwser()
然后就会发现还有一个问题在等你!!!
There maybe misleading numbers in the text. One example is 82683. Look only for the next nothing and the next nothing is 63579
让你自己判断是哪一数字是有效的 可以的 可以的 可以的 继续代码 添加各种嵌套的循环判断
import requests,re
number = re.compile("(\d+)")
rs = "12345"
def anwser():
global rs
for i in range(401):
source = requests.get("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="+rs).text
if re.findall(number,source):
if len(re.findall(number,source)) == 2:
rs = re.findall(number, source)
content = requests.get("http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing="+rs[0]).text
if content.find("You've been misleaded to here.") != -1:
print("不是数字{}是数字{}".format(rs[0],rs[1]))
rs = rs[1]
else:
rs = re.search(number,source).group(1)
print("数字是{} 为第{}个".format(rs,i))
else:
if re.findall("Divide by two and keep going.",source):
# if source.find("Divide by two and keep going.") != -1: 没有该字符串返回为-1
print(source)
rs = str(int(rs)/2)
else:
print(i,source)
break
if __name__ == '__main__':
anwser()
#结果 peak.html
第五题URL http://www.pythonchallenge.com/pc/def/peak.html
读它 ??? ? ? 什么玩意儿????
还是审查源码吧
然后读一下 peakhell [pi:k hel] 没有发现异样 然后点击peakhell src文件 看着像python的序列化 之前看到过廖雪峰写的文章 接下来就好办了 直接调用pickle这个库 看了example直接就了解banner.p是什么东西了
>>> f = open('cstate.p', 'rb')
>>> pickle.load(f)
countdown.Countdown object at 0x10069e2d0>
T-minus 19
T-minus 18
...
感觉和json很像
import pickle
print pickle.load(open('./data/banner.p','rb'))
可以发现每一个子列表中数字相加都为95 答案尝试之后不是95 接下来发现最小单元的列表第一个值有的是#有的’ ‘ 那么会不会是这两个东西的次数
import pickle
path = './data/banner.p'
# print(pickle.load(open("./data/banner.p","rb")))
def five():
f = open(path, "rb")
reader = pickle.load(f)
f.close()
for list in reader:
# print(list)
# for x in list:
# print(x)
print(''.join(x[0]*x[1] for x in list))
five()
输出结果
嗯 还挺漂亮 不得不说 出题的人还是很厉害的
第六题URL http://www.pythonchallenge.com/pc/def/channel.html
嗯~~~ 可以的 可以的 可以的 donate ……
还是老样子 审查网页源码吧
第一行有提示zip 不是很懂什么意思 其他地方也没有什么特殊的地方放 提示也说 只是想简单的让你捐赠点儿money 然后想到把URL中的.html换成.zip会是个啥玩意儿 结果发现可以下载一个压缩包 下载之后查看里面的README
welcome to my zipped list.
hint1: start from 90052
hint2: answer is inside the zip
嗯 那就按照提示来吧 然后就会发现和第四题一毛一样!!!(气到变胖的字体)
import re
import glob as gb
import os
nextNothing ='90052'
basepath = './data/channel/*'
toalpath = gb.glob(basepath)#获取所有文件路径
##此函数并无太多意义 只是回顾一下之前的知识
i =0
def getName():
global i
fileNumber = []
for path in toalpath:
i += 1
_, filename = os.path.split(path)
number = re.search("\d+",filename).group(0)
fileNumber.append(number)
return fileNumber,i
def anwser():
global nextNothing
number = re.compile("\d+")
for i in range(0,909):
with open('./data/channel/'+nextNothing+'.txt') as f:
reader = f.readlines()
number = re.search('\d+',str(reader)).group(0)
if number:
print(number)
nextNothing = number
else:
print(reader)
if __name__ == '__main__':
# print(getName())
anwser()
然后和预期一样 中间有bug(46145)显示
Collect the comments.
好吧 换个方式实现
import zipfile
file = zipfile.ZipFile('./data/channel.zip','r')
print(file)
for name in file.namelist():
global nextNothing
line = str(file.read("%s.txt" %nextNothing))
m = re.search('Next nothing is ([0-9]+)', line)
print (file.getinfo("%s.txt" % nextNothing).comment.decode("utf-8"), end=" ")
nextNothing = m.group(1)
第七题URLhttp://www.pythonchallenge.com/pc/def/hockey.html
打开之后发下这么个提示
it's in the air. look at the letters.
空气中的字母 然后试了air.html 失败 后面又试了n2.html o2.html co2.html he.html 都是假的 最后想到了oxygen这么个玩意儿 诶嘿 对了!!!
第七题URLhttp://www.pythonchallenge.com/pc/def/oxygen.html
先停更吧 脑袋疼
老样子 先审查一下网页源码 然后没有任何提示 看来答案就在图片中添加马赛克的那条类条形码的东西里面了 通过图片处理获取马赛克区域图片的位置范围
直接用PIL处理图片(中间的分析过程就不写了)
from PIL import Image
im = Image.open('data/oxygen.png')
print(''.join([chr(i[0]) for i in [im.getpixel((j, im.size[1] / 2)) for j in range(0, im.size[0], 7)]]))
key = [105, 110, 116, 101, 103, 114, 105, 116, 121]
print(''.join(chr(i) for i in key))
结果
smart guy, you made it. the next level is [105, 110, 116, 101, 103, 114, 105, 116, 121]pe_
integrity
第八题URLhttp://www.pythonchallenge.com/pc/def/integrity.html
迷惘的眼神(什么玩意儿)然后机智的发现这个蜜蜂是一个链接 然后有一个登录窗口 老样子审查源码 然后发现有有账号密码 不过要解码
解码(注意编码方式)
>>> un = b'BZh91AY&SYA\xaf\x82\r\x00\x00\x01\x01\x80\x02\xc0\x02\x00 \x00!\x9ah3M\x07<]\xc9\x14\xe1BA\x06\xbe\x084'
>>> pw = b'BZh91AY&SY\x94$|\x0e\x00\x00\x00\x81\x00\x03$ \x00!\x9ah3M\x13<]\xc9\x14\xe1BBP\x91\xf08'
>>> import bz2
>>> bz2.BZ2Decompressor().decompress(un)
>>> b'huge'
>>> bz2.BZ2Decompressor().decompress(pw)
>>> b'file'
想到是bz2的原因是两个信息都有BZ
第九题URLhttp://www.pythonchallenge.com/pc/return/good.html
待更