Седьмая загадка очень проста, если сразу правильно начать. Открываем исходный код страницы и видим комментарий ‘<-- zip -->‘, больше ничего примечательного нет. Пробуем в адресной строке браузера изменить адрес: меняем ‘channel.html’ на ‘channel.zip’. По ссылке скачиваем zip-архив и распаковываем. В файле readme.txt содержатся дальнейшие инструкции для нашего маленького расследования.
welcome to my zipped list. hint1: start from 90052 hint2: answer is inside the zip
Пробуем открыть файл 90052.txt и видим в нём ссылку на другой файл. Очевидно, что в текстовых файлах зашифрован список, т.е. один файл ссылается на другой и т.д. Автоматизируем процесс считывания списка:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from zipfile import ZipFile from urllib.request import urlopen from io import BytesIO f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read() arc = ZipFile(BytesIO(f), 'r') file_name = '90052.txt' comments = [] while True: try: file_content = arc.open(file_name).readline().decode() file_name = file_content.split(' ')[-1] + '.txt' except Exception as err: print(file_content) break |
from zipfile import ZipFile from urllib.request import urlopen from io import BytesIO f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read() arc = ZipFile(BytesIO(f), 'r') file_name = '90052.txt' comments = [] while True: try: file_content = arc.open(file_name).readline().decode() file_name = file_content.split(' ')[-1] + '.txt' except Exception as err: print(file_content) break
Мы считываем одну строку из файла, если в ней есть ссылка на текстовый файл, то переходим к нему, если нет то прерывем выполнение и выводим на экран содержимое последнего файла.
Содержание последнего файла — это ещё одна подсказка к расшифровке:
Collect the comments.
Сложив её со второй подсказкой из файла 90052.txt, становится ясно, что нужно собрать комментарии к файлам внутри zip-архива. В Python 3 для работы с zip-архивами есть отдельный модуль ‘zipfile’. Дальше всё просто: считываем комментарии и выводим на экран. Вот полный текст моего решения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | from zipfile import ZipFile from urllib.request import urlopen from io import BytesIO f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read() arc = ZipFile(BytesIO(f), 'r') file_name = '90052.txt' comments = [] while True: try: file_content = arc.open(file_name).readline().decode() file_name = file_content.split(' ')[-1] + '.txt' comments.append(arc.getinfo(file_name).comment.decode()) except Exception as err: print(file_content) break for item in comments: print(item, end = '') |
from zipfile import ZipFile from urllib.request import urlopen from io import BytesIO f = urlopen('http://www.pythonchallenge.com/pc/def/channel.zip').read() arc = ZipFile(BytesIO(f), 'r') file_name = '90052.txt' comments = [] while True: try: file_content = arc.open(file_name).readline().decode() file_name = file_content.split(' ')[-1] + '.txt' comments.append(arc.getinfo(file_name).comment.decode()) except Exception as err: print(file_content) break for item in comments: print(item, end = '')