标签:复制 banner ext 文件处理 while imp 有关 使用 turn
前言:
最近找到一个有关python的游戏闯关,这是游戏中的思考及通关攻略
最开始位于:http://www.pythonchallenge.com/pc/def/0.html
提示hint告诉我们是要尝试更改URL地址,图中是2^38,猜测地址是该结果。
print(2**38)
输出:274877906944
下一关:http://www.pythonchallenge.com/pc/def/274877906944.html
注意到字母替换,且K、M、E都是从字母表往后移了2位。学过的就会知道这即是凯撒密码。
最开始我用的是在线破解网站。破解后,发现可以使用string.maketrans()解决,先用maketrans建立一个映射table,然后使用translate函数
当然也可以不用string,使用[chr(i) for i in range(97,122)]
来产生字母a-z。
import string
src = '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 i in range(1,26):
mapping = ''.maketrans(string.ascii_lowercase,string.ascii_lowercase[i:]+string.ascii_lowercase[:i])
print(src.translate(mapping))
输出: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.
这句话的意思即是将 map->ocr
下一关:http://www.pythonchallenge.com/pc/def/ocr.html
注意到,左下的信息就是告诉你如何查看上一关的官方答案。
根据红色提示文字,获得信息:识别字符,可能在书中,可能在page source(网页源码)中
F12查看源码,可以看到在 body > font > font中看到信息
find rare characters in the mess below,即是要做数据清洗
将需清洗内容复制放入文件‘src/ocr.txt’中,我这是相对路径,你可以随便设置,只要自己能打开即可
import re
with open('src/ocr.txt','r') as f:
s = f.read()
rs = re.findall(r'[a-zA-Z0-9]+',s)
print(''.join(rs))
输出:equality
下一关:http://www.pythonchallenge.com/pc/def/equality.html
F12查看源码,在body > font看到:
也可以使用request爬取网页源码。我保存在‘src/equality.txt’中
import re
with open('src/equality.txt','r') as f:
s = f.read()
rs = re.findall(r'[a-z][A-Z]{3}([a-z])[A-Z]{3}[a-z]',s,re.S)
print(''.join(rs))
输出:linkedlist
下一关:http://www.pythonchallenge.com/pc/def/linkedlist.html
网页中只有简单的文字,linkedlist.php,很自然将其输入url中跳转
F12网页title为:follow the chain,提示我们urllib可能还有帮助,且大概要循环400次,下面发现一个可疑的链接,打开链接:出现下一个数字,一环扣一环如chain,我采用requests爬取,应为网页简单只有一个数字,所以不用解析
import requests,re
def get_src(url):
respon = requests.get(url)
if respon.status_code == 200:
return re.findall(r'\d+',str(respon.content))[0]
url = 'http://www.pythonchallenge.com/pc/def/linkedlist.php?nothing='
add = '12345'
count = 0
for i in range(400):
count += 1
add = get_src(url+add)
print(f'{count}:{add}',end = ' ')
异常后,我自需要修改add便可。
输出:
16044处异常:Yes. Divide by two and keep going.
82683处异常:You‘ve been misleaded to here. Go to previous one and check.
82682处异常:There maybe misleading numbers in the text. One example is 82683. Look only for the next nothing and the next nothing is 63579
66831处异常:peak.html ,其实是进入下一关
下一关:http://www.pythonchallenge.com/pc/def/peak.html
banner.p可疑,打开
惊了乱码,经过学习百度,发现要使用pickle模块——python对象序列化
save file 后缀为.p
报错:TypeError: a bytes-like object is required, not ‘str‘
解释:由于当前操作的字符串是bytes类型的字符串对象,并对该bytes类型的字符串对象进行按照str类型的操作
解决:open(file,‘rb‘)
pickle.load(file)可以解码出一个二位列表
是真的鬼,最开始我都没想到这是字符图案。。。。。。
最后分析得出:列表中是元组,(字符,个数),分析数据,不难qwq得出解析后得到答案channel
import pickle
with open('src/banner.p','rb') as f:
data = pickle.load(f)
s = ''
for i in data:
for j in i:
s += j[0]*j[1]
s+='\n'
print(s)
输出:
下一关:http://www.pythonchallenge.com/pc/def/channel.html
F12查看源码发现
即是存在zip文件,下载文件。
我是经过了两个阶段首先没有使用zipfile。
需要收集压缩文件的注释 =_=# , 经过一波精彩的操作之后,我知道可以通过zipfile模块中的z.getinfo(‘90052.txt‘).comment得到注释
最后收集注释,注意编码问题,open 只能r/w,
import zipfile,re
z = zipfile.ZipFile('src/channel.zip')
val = '90052'
count = 0
s = []
try:
while True:
count += 1
print(f'{count}:{val}')
file = f'{val}.txt'
with z.open(file,'r') as f:
s.append(z.getinfo(file).comment)
text = str(f.read(), encoding='UTF-8')
val = re.findall(r'\d+',text)[-1]
except:
s.append(z.getinfo(f'{val}.txt').comment)
print(val)
d = ''
for i in s:
d += str(i,encoding = 'utf-8')
print(d)
输出:
下一关:http://www.pythonchallenge.com/pc/def/hockey.html
脑洞?鬼
输出:oxygen
下一关:http://www.pythonchallenge.com/pc/def/oxygen.html
后面还有很多关卡,后续更新。。。。。。
【Python challenge】通关代码及攻略(0-7)
标签:复制 banner ext 文件处理 while imp 有关 使用 turn
原文地址:https://www.cnblogs.com/yanshanbei/p/12470787.html