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

Идея

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

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

Кто виноват ?

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

Из данного скриншота понятно что товарищ которого я обошел с помощью бота, не сильно меньше набрал очков, к тому же он постоянно занимает призовые места. Если провести небольшое расследование и поиграться с ссылкой на игру /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

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