Данный материал отражение лишь моего субъективного мнения, я никого не призываю обманывать систему или побеждать таким путем.

Идея

По традиции начинаем с идеи. Вообще викум очень хороший сайт, я каждый день на нем тренируюсь и прохожу тесты. Он дает понять какие у меня слабые стороны и в чем я слаб.. Зайдя сегодня на страницу с соревнованиями я обнаружил свою любимую мини игру суть которой заключалась в поиске числа среди таблицы других чисел. Задание усложнялось тем что с каждым новым уровнем количество числе увеличивалось, и среди этой каши четырёхзначных чисел нужно было найти своё. Я могу набрать копейки по сравнению с людьми из турнирной таблицы, и мне стало любопытно – “это какой же нужно обладать концентраций что бы столько очков набрать”, тогда то мне и пришла идея сделать бота и набрать Максимально возможное количество баллов.

Заговор или Паранойя

Кто виноват ?

Может показаться что мои обвинения в адрес сайта безосновательны и поспешны, что быть может кто-то действительно обладает Выдающимися навыками во всех областях и целыми днями что и делает так это играет на рекорды в их мини-игры. Но давайте взглянем вот на эту таблицу лидеров.

Из данного скриншота понятно что товарищ которого я обошел с помощью бота, не сильно меньше набрал очков, к тому же он постоянно занимает призовые места. Если провести небольшое расследование и поиграться с ссылкой на игру /challenge/3734/play | Числа отвечают за номер события, и если просто менять их можно увидеть результаты прошлых игр, почти в каждой второй можно найти нашего подозреваемого и его свиту (чиетров/ботов). Уж не знаю насколько Физически возможно набирать такие рекорды, потому что мой бот например принимал решение раз в 1 секунду, при этом когда я ставил боту задержку в 4 секунды, данный товарищ всё равно лидировал. А задание действительно сложное, что бы понять нужно попробовать самому.

Трудности

Прежде всего хочется сказать что этот проект был реализован опять с помощью selenium фрэймворка, поскольку он отлично умеет работать с браузером, вот только я тогда не знал что игра то работает в фрэйме, а работать с ним как оказалось нужно отдельно. Суть проблемы заключалась в том что я вообще в начале не мог понять почему силениум не может найти нужные мне кнопки, прибегал я к помощью плагина для браузера который помогает найти нужный элемент, и всё в пустую.. В какой-то момент я решил проинспектировать страницу средствами стандартного обработчика браузера гугл хром, и обнаружил собственно что это объект айфрэйма, и тогда возник вопрос как же заставить силенум с ним работать ?! На помощь мне пришла вот такой метод driver.switch_to.frame(‘id фрэйма’) . Но тут возникла другая проблема, где же взять тот самый id фрэйма что бы на него переключился силениум. В исходном коде странице я нашел только это:

<iframe
    src=""
    data-src="/games_build/number-one-numbers.html?challenge=3750&amp;nopause=1&amp;gameKey=number-one-numbers&amp;apiVersion=1&amp;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’))  , теперь силениум отлично понимает что мы от него хотим, и делает активным окном нужный фрэйм.

Алгоритм действий

Суть игры

Задача абсолютно простая, есть число – его нужно найти на таблице с другими числами и нажать, выглядит это вот так:

game

В качестве усложнения некоторые числа двигаются, исчезают, прыгают и всячески сбивают с толку внимание. В целом псевдокод расписывать смысла не вижу потому что задача элементарна, найти определить число, найти его и нажать. Реализация выглядит вот так:

# Фокусируем веб драйвер на фрэйме. 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

Если ситуация даёт тебе возможность получить опыт, всегда используй эту возможность !