Как я создал программное обеспечение для роботов, чтобы выиграть биткойн

Versione italiana dell’articolo disponibile Qui; Итальянская версия доступна здесь.

TL;ДР; Можно ли выиграть биткойн в биткойн-кнопочной игре Binance, создав программного робота, который будет играть за меня?

В этой статье рассказывается, как я пытался выиграть биткойн в The Bitcoin Button Game от @binance, стратегической игре, в которой побеждает последний игрок, нажимающий на кнопку.

Я создал программного робота (написанного на R с библиотеками Selenium), который просматривает страницу игры, готовую к участию в нужное время, и он интегрирован с ботом телеграммы для оповещения в реальном времени, когда он решает играть, нажав кнопку.

Неважно, удалось ли мне на самом деле выиграть, но идея и конструкция робота действительно интересны.

Вот подробности игры, модель, предсказывающая, как долго продлится игра, и код робота.

ИНДЕКС:

Игра #Bitcoinbutton от Binance

Bitcoin Button Game от Binance — это стратегическая игра, в которой последний человек, нажимающий кнопку, выигрывает 1 биткойн; игра связана с таймером с обратным отсчетом от 60.00 секунд до 00.00, когда таймер достигает нуля, игра заканчивается, но каждый раз, когда игрок нажимает кнопку, таймер перезапускает 60-секундный обратный отсчет.

Таким образом, для победы в игре достаточно, чтобы после того, как один игрок нажал кнопку, ни один другой игрок не нажимал кнопку в течение 60 секунд.

У каждого игрока есть только 1 попытка, поэтому они должны выбрать лучшее время, чтобы использовать свой шанс на победу.

Какова наилучшая тактика для попытки выиграть биткойн?

Единственный способ — это иметь возможность нажать кнопку, когда в игре мало активности, и скрестить пальцы в течение 60 секунд, надеясь, что небольшая активность означает, что все остальные игроки уже использовали свой шанс.

Таким образом, единственный способ — нажать кнопку, когда таймер очень близок к 00:00, надеясь, что это означает, что все игроки, которые хотели играть, уже сделали это, и никто из тех, кто еще может нажать кнопку, не присутствует и будет воспроизводиться в течение следующих 60 секунд.

Но вы не можете смотреть на страницу таймера в течение нескольких дней подряд, щелкая, когда он приближается к 00.00, а также в соответствии с законом Хика (Закон Хика из Википедии), который моделирует взаимодействие человека и машины, описывая время, которое требуется пользователь принимает решение на основе количества доступных вариантов, минимальное время реакции на визуальный стимул, когда объект сфокусирован, следует закону

что в случае с биткойн-кнопочной игрой минимальное время реакции сводится примерно к 2 десятым секунды, поэтому велик риск попытаться нажать кнопку, когда она близка к 0, и не среагировать вовремя и, следовательно, упустить возможность чтобы выиграть, заставив предыдущего игрока выиграть.

Нам нужен робот!

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

Я уже создал программы, взаимодействующие с веб-страницами «по-человечески», и поэтому подумал о повторном использовании этого опыта в этой области; Я написал его на R (в других языках, таких как Python, мало что изменилось бы, но из-за уверенности и скорости разработки, которые у меня есть в R, я решил реализовать его на этом языке, даже если это не является его конкретной сферой использования) .

Сколько продлится игра?

Первый вопрос, который я задал себе: «Хватит ли у меня времени, чтобы построить и протестировать робота? Как долго может длиться игра? “

Я помню, что игра заканчивается, когда таймер достигает 00.00, то есть когда ни один игрок не нажмет кнопку в течение 60 секунд, или если таймер еще не достиг 0 через 90 дней с начала игры.

Итак, давайте в первом приближении прикинем, сколько времени у нас может быть на создание нашего робота; для игры у вас должна быть учетная запись Binance или учетная запись Twitter, которая уже активна на момент запуска игры и следует за учетной записью Binance в Twitter; В настоящее время у Binance около 28,5 миллионов клиентов на платформе и 8 миллионов подписчиков в твиттере.

Игра началась 15 марта 2022 г. Я обнаружил игру 22 марта 2022 г., и количество игроков на тот момент составляло около 521 тыс. игроков, что означает в среднем 1,3 секунды на клик; Очевидно, что это значение имеет некоторый разброс, но даже в первые дни игры я никогда не видел, чтобы таймер работал меньше 56 секунд.

Я честно говоря не понимаю, почему игроки так нажимают на кнопку, может у них нет четких правил для выигрыша или они просто предпочитают сразу иметь NFT участия, кто его знает…

Какова бы ни была причина, подталкивающая игроков к нажатию кнопки, предполагается, что со временем игроков становится меньше и поэтому постепенно увеличивается время между одним нажатием и другим; мы можем предположить (без какой-либо претензии на формальное моделирование явления), что увеличение среднего времени между одним щелчком мыши и другим следует экспоненциальной функции, такой как:

где альфа = 1,3 сек и бета = 0,1

Построив временной тренд, мы можем сделать вывод, что, согласно этой модели, время между одним кликом и другим должно достичь роковых 60 секунд примерно на 46-й день от начала игры с общим количеством около 1 миллиона и 141 тысячи игроков. , равный 3,1% выкупа потенциальных игроков.

Очевидно, что эти параметры являются частично эмпирическими в первые дни игры и частично априорными (тип кривой роста и 10-процентный рост), но отсутствие временных рядов для анализа — лучший показатель, который мы можем сделать на данный момент; мы увидим в конце игры, насколько они реалистичны.

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

Давайте построим нашего робота!

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

Наш робот должен уметь делать следующее:

  • Откройте браузер и перейдите на страницу игры с биткойн-кнопкой.
  • Принять Конфиденциальность, файлы cookie, правила и т. д.
  • Войти на платформу
  • Слушайте, пока не придет время нажать
  • Нажмите кнопку в нужное время
  • Нажмите еще раз в случае ошибки
  • Отправить уведомление через Telegram
  • Следите за 60 секундами после клика, чтобы увидеть, был ли клик успешным.

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

Все будет развернуто на облачном хостинге, чтобы оставаться доступным на протяжении всего времени игры.

Мы будем использовать среду Linux Debian, R 3.6.1 и Rstudio 2022.02.1–46.

При установке Debian нам также понадобятся библиотеки ssl, curl, xml и т. д.

libssl1.0.2
libcurl4-openssl-dev
libxml2-dev

Также нам понадобятся geckodrivers, чтобы позволить Selenium взаимодействовать с браузером.

sudo wget https://github.com/mozilla/geckodriver/releases/download/v0.30.0/geckodriver-v0.30.0-linux64.tar.gz
sudo sh -c ‘tar -x geckodriver -zf geckodriver-v0.30.0-linux64.tar.gz -O > /usr/bin/geckodriver’
sudo chmod +x /usr/bin/geckodriver

Создание телеграмм бота для оповещений

Мы создаем нашего Telegram Bot, чтобы использовать его как канал связи; чтобы создать бота Telegram, вам нужно связаться с @BotFather и отправить сообщения \start, а затем \newbot

BotFather запросит имя пользователя и имя и создаст токен аутентификации, который мы сохраним в переменной R.

Бот Telegram готов, нам нужно узнать идентификатор чата, который мы будем использовать для отправки сообщений; мы используем метод getUpdates() для получения идентификатора чата.

bot = Bot(token = bot_token)
# The first time, you will need the chat id (which is the chat where you will get the notifications)
updates = bot$getUpdates()
# Sending text
message_to_bot=sprintf(‘Hi Bro’)
bot$sendMessage(chat_id = Chat_Id_num , text = message_to_bot)

Бот не будет прослушивать сообщения из чатов, пассивно будет отправлять информацию через робота, который будет играть на кнопке биткойн.

Давайте построим робота, чтобы играть

На этом этапе нам нужно будет загрузить (и установить, если они еще не присутствуют в среде R) библиотеки R для Selenium и Telegram.

library(rvest)
library(xml2)
library(RSelenium)
library(dplyr)
library(rlist)
library(telegram.bot)

Давайте начнем сейчас, чтобы открыть браузер и перейти на страницу игры с биткойн-кнопкой.

##++++++++++++++++++++++++++++ LOAD Selenium Drivers
rD <- rsDriver(browser = “firefox”, port = 6768L)
remDr <- rD[[“client”]]
## — — — — — — — — — — — — — — END LOAD Selenium Drivers
##++++++++++++++++++++++++++++ Navigate to URL
url <- “https://www.binance.com/en/activity/bitcoin-button-game"
remDr$navigate(url)
Sys.sleep(2)
## — — — — — — — — — — — — — — END Navigate to URL

Мы часто используем ожидания (sys.sleep) в коде, которые позволяют браузеру загружаться, обновляться и быть доступным для запуска селена.

Как видно из изображения, браузер теперь контролируется нашим роботом. Значок робота в адресной строке дает нам понять, что он взаимодействует с роботом, но ничто не мешает ему взаимодействовать одновременно с человеческим взаимодействием.

Чтобы идентифицировать различные компоненты страницы, с которыми нужно взаимодействовать, мы будем использовать несколько различных методов для удобства и простоты, идентифицируя отдельные элементы страницы или через xpath элемента, который позволяет указать на один элемент через html. путь к элементу либо через ссылку класса css, либо через идентификатор отдельного элемента.

Эти методы очень мощные и позволяют вам взаимодействовать с любым элементом страницы; чтобы найти элемент, необходимо будет проанализировать html-код страницы и выявить интересующие коды и пути на странице.

После того, как мы перешли на интересующую страницу, мы должны сначала принять отказ от файлов cookie, дайте браузеру нажать кнопку «Принять»:

##+++++++++++++++++++++++++++++++ ACCEPT COOKIE DISCLAIMER
#accettiamo i cookies
webEle <-remDr$findElements(using = ‘xpath’, “//*[@id=\”onetrust-accept-btn-handler\”]”)
webEle[[1]]$clickElement()
Sys.sleep(1)
## — — — — — — — — — — — — — — — END ACCEPT COOKIE DISCLAIMER

Определив элемент, нажмите кнопку (clickElement()) и подождите, пока сообщение не исчезнет.

Войти с учетной записью Twitter с помощью робота

Теперь у нас есть фундаментальный шаг, то есть войти в систему, чтобы иметь возможность играть с нашей учетной записью; в игре предусмотрена возможность использования двух типов аккаунтов, Twitter или Binance; имея активную двухфакторную аутентификацию в моей учетной записи Binance, которая требует внешнего взаимодействия с аутентификатором, я решил использовать социальный вход через Twitter, который требует только отправки пользователя и пароля через форму ввода; Однако Twitter проверяет, есть ли вход с нового устройства или местоположения, поэтому сначала необходимо будет вручную войти в систему с машины, на которой мы развернем нашего робота, и выполнить процедуру проверки и авторизации по электронной почте; как только наша учетная запись будет подтверждена, следующие несколько раз будет достаточно войти в систему с пользователем и паролем, что сделает нашего робота автономным.

#click on login link
webEle <-remDr$findElements(using = “css”,value = “.btn-sign-in”)
webEle[[1]]$clickElement()
Sys.sleep(2)

Мы попадаем на страницу выбора типа учетной записи для входа между твиттером и бинанс, нажимаем на твиттер и также ставим флажок на условиях.

# Accept term and conditions
webEle <-remDr$findElements(using = “css”,value = “.css-3kwgah”)
webEle[[1]]$clickElement()
# Click Sign In
webEle <-remDr$findElements(using = “css”,value = “.btn-sign-in-twitter > div:nth-child(4)”)
webEle[[1]]$clickElement()
Sys.sleep(2)

Затем мы оказываемся на странице входа в социальную сеть Twitter, вставляем имя пользователя и пароль, ранее сохраненные в специальных переменных, в поля формы (с помощью функции sendKeysToElement) и отправляем форму для доступа.

#send username
username <- remDr$findElement(using = “id”, value = “username_or_email”)
username$sendKeysToElement(list(twitter_user))
#send password and Enter
passwd <- remDr$findElement(using = “id”, value = “password”)
passwd$sendKeysToElement(list(twitter_pass, “\uE007”))
Sys.sleep(3)

Давайте заставим робота слушать, готового нажать на Кнопку

Затем мы вошли в систему, и мы готовы поставить робота на прослушивание, чтобы дождаться подходящего момента, чтобы нажать на кнопку.

Сначала мы слегка проанализируем, сколько минимальное время реакции нашего робота; поэтому мы имитируем операцию щелчка без реального щелчка, чтобы увидеть, сколько времени проходит с момента, когда робот увидит нужный момент на таймере, и сколько времени потребуется, чтобы отреагировать и нажать кнопку; из проведенных тестов (установка 55 секунд, как если бы это был нулевой отсчет) мы видим, что время выполнения различных шагов до щелчка варьируется от 0 до 4 сотых секунды; в целях безопасности и для минимального запаса настроим робота на нажатие кнопки, когда он увидит 00 секунд, при этом у него еще есть несколько десятых секунды, чтобы завершить нажатие.

Другой момент, который следует учитывать, — это конфликт кликов; если два игрока нажимают кнопку одновременно, игра блокирует их, предлагая попробовать еще раз:

Для управления этим случаем мы устанавливаем определенное количество повторных попыток (без особой логики, робот попытается щелкнуть еще раз, если снова увидит 00), чтобы не пропустить случай, в котором вы щелкнули с другим игроком, но будьте готовы щелкнуть снова в следующий раз.

Теперь нам нужно получить указатели на два основных объекта страницы, а именно на таймер и кнопку биткойн, затем мы указываем на эти два элемента с помощью метода поиска элементов и слушаем:

#Total Partecipants
partecipants <-remDr$findElements(using = ‘xpath’, “*//div[contains(@class,\”th68ec\”)]”)
print(paste(“Already Clicked at Start: “, partecipants[[2]]$getElementText()))
## Point to the Bitcoin Timer
BitcoinTimer <-remDr$findElements(using = ‘xpath’, “*//div[contains(@class,\”w39bvu\”)]”)
#Point To The Bitcoin Button
BitcoinButton <-remDr$findElements(using = “css”,value = “.bitcoin-btn-core > path:nth-child(5)”) #BITCOIN BUTTON
print(“Listening…”)

Таймер представляет собой список из 4 объектов, в котором каждый объект указывает номер таймера, который составляет десятки секунд, секунды, десятые доли секунды, сотые доли секунды.

Чтобы имитировать человека, который постоянно смотрит на таймер, мы помещаем себя в бесконечный цикл, в каждом цикле мы считываем значение таймера и ждем, пока десятки секунд и секунды не станут равными 00, после чего мы продолжаем нажимать на кнопку. .

while (Click_Try < max_Try){
Sec1 <- as.numeric(BitcoinTimer[[1]]$getElementText())
Sec2 <- as.numeric(BitcoinTimer[[2]]$getElementText())
Sec3 <- as.numeric(BitcoinTimer[[3]]$getElementText())
Sec4 <- as.numeric(BitcoinTimer[[4]]$getElementText())
if (Sec1==0 & Sec2 == 0) {
BitcoinButton[[1]]$clickElement()
print (“NOW Click!”)
print(paste(BitcoinTimer[[1]]$getElementText(),BitcoinTimer[[2]]$getElementText(),BitcoinTimer[[3]]$getElementText(),BitcoinTimer[[4]]$getElementText()))
print(paste(“partecipants at Click: “, partecipants[[2]]$getElementText()))
Click_Try <- Click_Try + 1
# ######### Screenshot log
remDr$screenshot(file = paste0(root_dir,’RSchreenshot/Screenshot_At_1_Click_try’,Click_Try,’.png’))
# ########### Send screenshot through telegram Botbot$sendPhoto(chat_id = Chat_Id_num, photo = paste0(root_dir,’RSchreenshot/Screenshot_At_1_Click_try’,Click_Try,’.png’))
Sys.sleep(4)
  }
}

Поэтому в процедуру мы вставили журналы количества участников на момент клика и скриншот момента клика.

Затем скриншот отправляется нашим телеграмм-ботом в созданный нами чат.

Мы закрываем скрипт, выйдя из системы и закрыв браузер.

#logout from Twitter
webEle <-remDr$findElements(using = “css”,value = “.btn-log-out-twitter”)
webEle[[1]]$clickElement()
Sys.sleep(1)
remDr$close()
rD$server$stop()

Давай робот! Играй и выигрывай!

Так как же все прошло с нашим роботом? Были ли проблемы?

Я запустил робота 6 апреля на 22-й день после запуска игры, когда около 700 тысяч игроков уже нажали на кнопку, в соответствии с нашей моделью мы должны пройти примерно половину игры, а ждать осталось около 24 дней, поэтому мы ожидаем, что бот свяжется с нами примерно через двадцать дней в нашем телеграмме.

19 апреля первый сюрприз, просыпаюсь утром и нахожу сообщение от своего бота в чате, проверив полученный скриншот вижу, что у бота была ошибка:

Что-то пошло не так, я тут же проверил игру онлайн, а счетчик до сих пор там отсчитывает.

Я сразу открываю свой сервер, опасаясь, что бот нажал кнопку не в то время, но я замечаю, что браузер завис, поэтому не настоящий клик, а «фальшивый» клик, потому что, вероятно, в браузере были какие-то проблемы, и наш бот увидел таймер 0, что не соответствует действительности.

Хорошо, к счастью, мы все еще в игре, давайте очистим окружающую среду и перезапустим нашего бота.

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

Мы также проводим 46-й день, а бот не дает о себе знать…

Через несколько дней я получил уведомление о моем клике! На этот раз без ошибок, мой бот действительно кликнул…

Выиграю ли я?

Игра закончилась 7 мая 2022 года, через 7 дней после дня, предсказанного моделью, с 1 142 779 игроками, что очень близко к значению, предсказанному исходной моделью.

Станет ли мой робот победителем в игре с биткойн-кнопками?

Здесь не место это раскрывать, но игра и постройка бота были очень веселыми и конструктивными, и кто знает, не пригодится ли он и в других соревнованиях!