PythonChallenge题解

一个好玩儿的网站 pythonchallenge 感觉挺好玩儿

先挖坑 后续慢慢填


其实这个是今年年初就在玩的了,但是后面没有动力去做了…
个人博客
欢迎来踩

闯关攻略及代码


第零题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXcKl00A-1589990046434)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge00.png)]

尝试之后即明白 下一题的url就是2^38

2**38

第一关URLhttp://www.pythonchallenge.com/pc/def/274877906944.html

第一题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cVNmaBhL-1589990046437)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge01.png)]

图片上显示 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

​ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MT773e3V-1589990046442)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%851.gif)]

解决第一题

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

第二题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uY6HMONM-1589990046445)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge02.png)]

这个 动动脚趾头就知道线索不会在书中 而是在网页源码中

然后开心的打开网页源码 心贼凉!!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-33IEjvow-1589990046447)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge02.1.png)]

直接代码解决

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XNkXarP-1589990046450)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E5%BC%80%E5%BF%83.jpg)]

第三题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4le6wsSA-1589990046451)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge03.png)]

这个提示有点儿不知道什么情况 按照提示来说 图片里面应该没有答案

还是直接网页源码吧 嗯~~~ 这个可以的可以的 和第二题差不多 老样子 检查网页源码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vf7CdmGa-1589990046453)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge03.1.png)]

源码:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I14ghD9Y-1589990046455)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85_%E9%85%B7.gif)]

第四题URLhttp://www.pythonchallenge.com/pc/def/linkedlist.php

提示要进入.php

第四题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07AkJ80s-1589990046456)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge04.png)]

这个就尴尬了 连个提示都没有 所以还是直接审查网页源码吧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5jS20BO-1589990046458)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge04.1.png)]

然后点击图片 有提示 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BeqJA345-1589990046460)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E6%9C%BA%E6%99%BA.jpg)]

第五题URL http://www.pythonchallenge.com/pc/def/peak.html

第五题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KkETHLJK-1589990046461)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge05.png)]

读它 ??? ? ? [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dv0PK74p-1589990046462)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E7%96%91%E6%83%91.jpg)]什么玩意儿????

还是审查源码吧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YYAb00z6-1589990046464)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge05.1.png)]

然后读一下 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'))

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynC9UiNm-1589990046465)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge05.2.png)]

可以发现每一个子列表中数字相加都为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()

输出结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9v1XDSAI-1589990046467)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge05.3.png)]

嗯 还挺漂亮 不得不说 出题的人还是很厉害的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x3qEhrhF-1589990046469)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E4%BD%A9%E6%9C%8D.jpg)]

第六题URL http://www.pythonchallenge.com/pc/def/channel.html

第六题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W45XB0Y2-1589990046471)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge06.png)]

嗯~~~ 可以的 可以的 可以的 donate …

还是老样子 审查网页源码吧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zvLwDrFL-1589990046472)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge06.1.png)]

第一行有提示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)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-edLygtik-1589990046474)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge06.2.png)]

第七题URLhttp://www.pythonchallenge.com/pc/def/hockey.html

打开之后发下这么个提示

it's in the air. look at the letters.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-soLQWpVJ-1589990046475)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E6%97%A0%E8%AF%AD.jpeg)]

空气中的字母 然后试了air.html 失败 后面又试了n2.html o2.html co2.html he.html 都是假的 最后想到了oxygen这么个玩意儿 诶嘿 对了!!!

第七题URLhttp://www.pythonchallenge.com/pc/def/oxygen.html

先停更吧 脑袋疼[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q7JafnhG-1589990046477)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E8%84%91%E8%A2%8B%E7%96%BC.png)]

第七题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wNNiPtBS-1589990046478)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge07.png)]

老样子 先审查一下网页源码 然后没有任何提示 看来答案就在图片中添加马赛克的那条类条形码的东西里面了 通过图片处理获取马赛克区域图片的位置范围

直接用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

第八题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8RmzXywF-1589990046479)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge08.png)]

迷惘的眼神(什么玩意儿)然后机智的发现这个蜜蜂是一个链接 然后有一个登录窗口 老样子审查源码 然后发现有有账号密码 不过要解码

<!--
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'
-->

解码(注意编码方式)

>>> 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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0RypB4mW-1589990046482)(http://p39exghmi.bkt.clouddn.com/%E8%A1%A8%E6%83%85%E5%8C%85-%E9%AA%84%E5%82%B21.gif)]

第九题URLhttp://www.pythonchallenge.com/pc/return/good.html

第九题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uouS85Ab-1589990046484)(http://p39e7cgx2.bkt.clouddn.com/pythonchallenge09.png)]

待更

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值