Заговор или Паранойя
Кто виноват ?
Может показаться что мои обвинения в адрес сайта безосновательны и поспешны, что быть может кто-то действительно обладает Выдающимися навыками во всех областях и целыми днями что и делает так это играет на рекорды в их мини-игры. Но давайте взглянем вот на эту таблицу лидеров.
Из данного скриншота понятно что товарищ которого я обошел с помощью бота, не сильно меньше набрал очков, к тому же он постоянно занимает призовые места. Если провести небольшое расследование и поиграться с ссылкой на игру /challenge/3734/play | Числа отвечают за номер события, и если просто менять их можно увидеть результаты прошлых игр, почти в каждой второй можно найти нашего подозреваемого и его свиту (чиетров/ботов). Уж не знаю насколько Физически возможно набирать такие рекорды, потому что мой бот например принимал решение раз в 1 секунду, при этом когда я ставил боту задержку в 4 секунды, данный товарищ всё равно лидировал. А задание действительно сложное, что бы понять нужно попробовать самому.
Трудности
Прежде всего хочется сказать что этот проект был реализован опять с помощью selenium фрэймворка, поскольку он отлично умеет работать с браузером, вот только я тогда не знал что игра то работает в фрэйме, а работать с ним как оказалось нужно отдельно. Суть проблемы заключалась в том что я вообще в начале не мог понять почему силениум не может найти нужные мне кнопки, прибегал я к помощью плагина для браузера который помогает найти нужный элемент, и всё в пустую.. В какой-то момент я решил проинспектировать страницу средствами стандартного обработчика браузера гугл хром, и обнаружил собственно что это объект айфрэйма, и тогда возник вопрос как же заставить силенум с ним работать ?! На помощь мне пришла вот такой метод driver.switch_to.frame(‘id фрэйма’) . Но тут возникла другая проблема, где же взять тот самый id фрэйма что бы на него переключился силениум. В исходном коде странице я нашел только это:
<iframe
src=""
data-src="/games_build/number-one-numbers.html?challenge=3750&nopause=1&gameKey=number-one-numbers&apiVersion=1&rand=1522603160"
frameborder="0"
scrolling="no"
class="game_iframe_container"
style="width:632px; height: 528px; overflow: hidden; border:0;"
></iframe>
Как понятно из фрагмента кода, он Не содержит id самого фрэйма.. И тут возникает проблема как же мне сказать силенуму что бы он переключился на фрэйм, если я даже не знаю как он называется. Пришлось изобретать некий костыль который бы зацепился за класс фрэйма и передал его в вбедрайвер. Реализовал это вот таким образом driver.switch_to.frame(driver.find_element_by_class_name(‘game_iframe_container’)) , теперь силениум отлично понимает что мы от него хотим, и делает активным окном нужный фрэйм.
Алгоритм действий
Суть игры
Задача абсолютно простая, есть число – его нужно найти на таблице с другими числами и нажать, выглядит это вот так:
В качестве усложнения некоторые числа двигаются, исчезают, прыгают и всячески сбивают с толку внимание. В целом псевдокод расписывать смысла не вижу потому что задача элементарна, найти определить число, найти его и нажать. Реализация выглядит вот так:
# Фокусируем веб драйвер на фрэйме. driver.switch_to.frame(driver.find_element_by_class_name('game_iframe_container')) # Нажимем на кнопку "Начать управжениен". a = driver.find_element_by_xpath(u"(//a[contains(text(),'Начать упражнение')])[2]").click() # Ожидаем загрузки подсказки time.sleep(2) # Кликаем на окно что бы начать игру. b = driver.find_element_by_xpath("//div[@class='game-screen__inner']").click() time.sleep(5) # Ждём таймер 3 секунды для загрузки задания. # Запускаем цикл решения задачи. for set in range(1, 50): # Определяем какое число от нас хочет игра. num = driver.find_element_by_xpath \ ("//span[@class='number-one-numbers__task-reference ng-binding ng-scope']").text # Получаем таблицу с числами в которых будем искать. setter = driver.find_elements_by_xpath\ ("//span[@class='number-one-numbers__item-inner ng-binding']") # Итерируемся по списку найденных чисел. for i in setter: try: if i.text == num: # Приводим каждое полученное значение к text и сравниваем с искомым. i.click() # Если условие равно то кликаем по найденному объекту. else: continue except: continue time.sleep(1)
Собственно на этом пожалуй и всё, суть задачи я выполнил, на первое место попал, заговор раскрыл )
Конечно можно было бы запариться и спарсить все результаты прошлых игр, и составить собственный топ… нооо я ленив да и вообще тут на лицо наёбка, и не вижу смысла ковыряться в дерьме, буду и дальше себе тренироваться и не участвовать в этой фальсификации.
По традиции оставляю себе message что бы данный опыт не прошел бесследно и не был забыт.
message