上文介绍了Python Challenge第11至15关的通关攻略及代码,本文继续介绍第16至19关的通关攻略及代码。
url:http://www.pythonchallenge.com/pc/return/mozart.html
界面中的图片有很多粉色的短横线,而图片下方以及源代码中都未找到隐藏的提示,因此应该需要处理的就是界面中的这一张图片。结合关卡名“let me get this straight”猜测是将每行的短横线移动拼接在一起,果然拼接后的图片显示出答案“romance”,因此修改url为http://www.pythonchallenge.com/pc/return/romance.html进入第17关。
from PIL import Image
img = Image.open('mozart.gif')
width, height = img.size
new_img = Image.new('RGB', (width, height))
for j in range(height):
row = [img.getpixel((i, j)) for i in range(width)]
start = row.index(195)
new_row = row[start:] + row[:start]
for k in range(width):
new_img.putpixel((k, j), new_row[k])
new_img.show()
输出:
url:http://www.pythonchallenge.com/pc/return/romance.html
import requests
import bz2
url = "http://www.pythonchallenge.com/pc/def/linkedlist.php?busynothing="
suffix = "12345"
info = ""
for i in range(400):
response = requests.get(url + suffix)
for cookie in response.cookies:
info += cookie.value
if response.text.split()[-1].isdigit():
suffix = response.text.split()[-1]
else:
break
print(info)
# Output:
# BZh91AY%26SY%94%3A%E2I%00%00%21%19%80P%81%11%00%AFg%9E%A0%20%00hE%3DM%B5%23%D0%D4%D1%E2%8D%06%A9%FA%26S%D4%D3%21%A1%EAi7h%9B%9A%2B%BF%60%22%C5WX%E1%ADL%80%E8V%3C%C6%A8%DBH%2632%18%A8x%01%08%21%8DS%0B%C8%AF%96KO%CA2%B0%F1%BD%1Du%A0%86%05%92s%B0%92%C4Bc%F1w%24S%85%09%09C%AE%24%90
import urllib.parse
print(bz2.decompress(urllib.parse.unquote_to_bytes(info)).decode('ascii'))
# Output:
# is it the 26th already? call his father and inform him that "the flowers are on their way". he'll understand.
import xmlrpc.client
proxy = xmlrpc.client.ServerProxy("http://www.pythonchallenge.com/pc/phonebook.php")
print(proxy.phone("Leopold"))
# Output:
# 555-VIOLIN
import requests
url = "http://www.pythonchallenge.com/pc/stuff/violin.php"
cookies = {"info": "the flowers are on their way"}
response = requests.get(url, cookies=cookies)
print(response.text)
# Output:
"""
<html>
<head>
<title>it's me. what do you want?</title>
<link rel="stylesheet" type="text/css" href="../style.css">
</head>
<body>
<br><br>
<center><font color="gold">
<img src="leopold.jpg" border="0"/>
<br><br>
oh well, don't you dare to forget the balloons.</font>
</body>
</html>
"""
url:http://www.pythonchallenge.com/pc/return/balloons.html
import gzip
import difflib
import binascii
from PIL import Image
import io
left = [] #左半边数据
right = [] #右半边数据
with gzip.open('deltas.gz', 'rt', encoding='utf-8') as file:
content = file.read()
rows = content.split('\n')
for row in rows:
left.append(row[:53])
right.append(row[56:])
diff = difflib.Differ().compare(left, right) #比较差异
rightonly_list = [] #只在右边的
leftonly_list = [] #只在左边的
same_list = [] #相同的
for line in diff:
flag = line[0]
if flag == '+':
rightonly_list.append(line[1:].replace(" ", ""))
elif flag == '-':
leftonly_list.append(line[1:].replace(" ", ""))
else:
same_list.append(line[1:].replace(" ", ""))
data = binascii.unhexlify(''.join(rightonly_list))
img = Image.open(io.BytesIO(data))
img.show()
data = binascii.unhexlify(''.join(leftonly_list))
img = Image.open(io.BytesIO(data))
img.show()
data = binascii.unhexlify(''.join(same_list))
img = Image.open(io.BytesIO(data))
img.show()
输出:
url:http://www.pythonchallenge.com/pc/hex/bin.html
import base64
import speech_recognition as sr
with open('attachment.txt') as f:
s = f.read()
with open('india.wav', 'wb') as result:
result.write(base64.b64decode(s))
r = sr.Recognizer()
with sr.AudioFile('india.wav') as source:
audio_text = r.record(source)
print(r.recognize_sphinx(audio_text, language='en-US'))
# Output:
# sorry
import wave
with wave.open('india.wav', 'rb') as audio:
with wave.open('india_reverse.wav', 'wb') as result:
params = audio.getparams()
result.setparams(params)
for i in range(audio.getnframes()):
result.writeframes(audio.readframes(1)[::-1])
# 逐帧翻转后的音频带有背景音乐,语音识别效果不好,此处未进行语音识别
完整代码及运行结果详见: