[Из песочницы] Викторина для ботов на Twitch.tv
Как известно, на Twitch.tv есть боты. Я говорю не о «плохих» ботах для накрутки зрителей или чата, а о ботах, которые позволяют стримеру добавить тот или иной функционал на стрим или в чат при стриме. Среди наиболее известных из них: Moobot, Nightbot и MirRobot. О последнем как раз и пойдет речь. Mirrobot написан нашим соотечественником и заслуженно входит число самых популярных ботов. Одной из его возможностей, которая весьма востребована, является проведение викторины в чате.
Суть викторины MirRobot: с определенной периодичностью бот задает зрителям в чате вопрос. Если в течение определенного времени, никто не может правильно ответить, бот дает подсказки, обозначая количество букв в ответе и открывая некоторые буквы (по принципу «Виселицы» или «Поля чудес»).
Пример геймплея в викторине:
Как только кто-то отвечает правильно, то, во-первых, он — молодец, а, во-вторых, бот запоминает, что именно этот зритель ответил правильно. В чате по специальной команде также доступен список тех зрителей, кто дал больше всех правильных ответов на вопросы викторины. Для каждого канала этот список свой.
Задумка
Однажды, экспериментируя с тем, как можно было бы находить в интернете ответы на произвольные вопросы, я вспомнил про викторину на Твиче и решил попробовать сделать бота, который бы участвовал в викторине самостоятельно. Также мне стало интересно узнать, что произойдет, если в топе викторины на совершенно разных каналах будет один и тот же игрок. Вызовет ли это подозрение зрителей или разработчика? Какова будет реакция? А может быть, кто-то уже сделал бота до меня, и в топе уже нет настоящих людей?
Первый работающий вариант бота был написан за ночь в майские праздники. Бот умел подключаться к нужному каналу на Твиче, анализировать чат, распознавать, когда в чате появляется вопрос викторины, и искать ответ в интернете.
К сожалению, так и не удалось сходу найти нормальный сервис, который бы мог отвечать на произвольные вопросы на русском. Google и Яндекс для таких целей не подходят, так как они выдают не готовый ответ, а ссылки на страницы в интернете, которые надо, хотя бы, минимально проанализировать. Для человека подобный анализ не составляет проблем, но как заставить это сделать машину, это отдельная задача. В идеале, я искал что-то похожее на Wolfram Alpha, но с поддержкой русского языка. Кстати, если у кого есть на примете, подобный открытый сервис — пишите в комментариях.
Реализация
Для викторины на Твиче достаточно оказалось искать ответы на одном многочисленных сайтов, посвященных кроссвордам, сканвордам и другим подобным играм. В принципе, попробовав несколько подобных сайтов, я выбрал тот, на котором оказался наиболее простой формат страницы результатов поиска. Забегая вперед, скажу, что оказалось, что основную базу MirRobot составляют именно такие «вопросы из кроссвордов». Эффективность алгоритма для общеобразовательных вопросов оказалась достаточно высокой (70%), и, написав в самом начале этот функционал бота, больше к нему возвращаться не пришлось.
После серии доработок бот умел следующее:
- Успешно играть в викторину одновременно в нескольких чат-каналах.
- Самостоятельно находить новые каналы, на которых был включен MirRobot и было некоторые минимальное количество зрителей.
- Вести свою базу правильных ответов на вопросы для того, чтобы не полагаться на эффективность поиска в сети и иметь возможность отвечать на специфические вопросы по компьютерным играм.
- Вести учет топа участников викторины по каналам и учитывать свое положение в топе для принятие решения об ответе;
- Подключаться заново в случае разрыва соединения с интернетом.
- Проверять соответствие своего предполагаемого ответа и подсказок в викторине.
- Работать полностью автономно: хоститься в PaaS-облаке, выдавать в веб необходимую аналитику для мониторинга и вести базу данных в DBaaS.
- Имитировать общение в чате при персональном упоминании (этот функционал был реализовал значительно позже).
- Имитировать темп и манеру ответа человека.
Что не получилось или не было реализовано по различным причинам:
- Не реализовано обнаружение, забанен ли бот в чате на канале.
- Было два досадных бага, которые у меня не получалось исправить. В случае их детекции бот просто перезагружался.
Использованные технологии:
- Python 3 (примерно 1 тыс. строк кода).
- IRC (чат Твича — это на самом деле IRC-чат).
- Waitress/Flask для web-интерфейса.
- MongoDB (mlab.com).
- PaaS IBM Bluemix.
В итоге была достигнута полная самостоятельность бота. Глобальная задача была достигнута. Последние 2 месяца бот работал автономно.
Бот против человека
Умение не выделяться оказалось самым важным для успешной работы бота. Было достаточно легко научить бота отвечать на вопросы. Исходя из своих технических возможностей, бот в большинстве случаев способен ответить на вопрос викторины в первую же секунду, но это сразу вызывает подозрения: человек не то, что напечатать ответ, он даже прочитать полностью вопрос не успевает за это время. Другая особенность заключается в том, что человек не одинаково быстро отвечает на разные вопросы: на простые — быстро, на сложные не очень. Поэтому, если просто поставить какую-либо существенную задержку на ответ, то получится, что живые участники будут «щелкать» простые вопросы, а бот будет мастерски отвечать на все сложные. Такой «эрудит», который дает правильные ответы на абсолютно разные специализированные вопросы, сразу же привлечет внимание к себе. Реализовывать оценку «сложности» вопроса я так и не стал.
На скриншоте в группе одного из стримеров негодуют по поводу тех, кто ищет ответы викторины в Google:
В итоге, для того, чтобы не выделяться среди обычных зрителей, пришлось существенно понизить вероятность того, что бот будет в правильно отвечать:
- Ввести правило давать ответы не более чем в 30–40% случаев.
- Увеличить задержку до попытки ответить (случайная величина).
- В некоторых случаях давать правильные ответы, несмотря на то, что кто-то только что давал правильный ответ, создавая иллюзию, что в чат пишет человек.
Результатом подобных «оптимизаций» (странно называть «оптимизацией» понижение эффективности) стало то, что на одном из очень популярных каналов с несколькими тысячами живых зрителей и вопросами викторины с периодичностью в 1–2 минуты, бот выигрывал в викторине в среднем 5–7 раз в час. Для каналов, на которых активность живых зрителей была низкой, вероятность бота выиграть просто стремилась к базовой вероятности ответить (20–30%).
Параллельно такое занижение эффективности бота позволяло немного «очистить совесть». Получалось так, что бот отвечал мало и в основном в случаях, когда среди зрителей не находилось того, кто бы сам знал правильный ответ. Можно сказать, что бот конкурировал с «гуглерами», то есть с теми, кто сходу не зная ответа, пытался найти его в интернете, или мог догадаться только после нескольких подсказок.
Конечно, с такой эффективностью бот не мог тягаться на короткой дистанции с живыми участниками викторины, которые легко могли дать правильный ответ раньше бота. Просматривая в дальнейшем статистику бота на фоне изменения топа, было однозначно понятно, что активный живой игрок за ограниченный временной период дает больше правильных ответов, чем бот. Иногда на том самом активном канале боту могли не позволить дать правильный ответ в течение полутора-двух часов. Такое положение дел оказалось приемлемым: бот не давал много правильных ответов, никого в чате не раздражал своим участием и не вызывал подозрения, но стабильно двигался в топ викторины, за счет того, что, в отличие от человека, не отдыхал, не спал, не уставал, а стабильно участвовал в каждом стриме.
В какой-то момент я «прикрутил» к боту движок чат бота, чтобы он мог отвечать на личные сообщения и пытаться полностью мимикрировать под человека. Движок, судя по статьям в интернете, показывал себя очень неплохо в тестах Тьюринга. Конечно, на Твиче своя специфика общения в чате: например, надо отфильтровывать сообщения из одних смайликов. Но довольно часто удавалось поддерживать иллюзию, да и иногда диалоги получались достаточно забавными. Немного смущало, что иногда бот троллил собеседника и представлялся 10-летней девочкой, но в целом проблема общения была решена.
Замечали ли бота?
То, что бот был в топе одновременно почти 50 каналов, никто так и не заметил. Здесь, на мой взгляд, сказываются большая фрагментарность групп зрителей, а также то, что из примерно 2 тыс. каналов, где используется MirRobot, викторина включалась только на нескольких сотнях. Если же говорить о каналах, где была викторина, и где было хотя бы несколько десятков человек в чате, то таких каналов и вовсе было ~160, причем большая часть — либо нерегулярные редкие стримы, либо каналы с количеством зрителей менее 50 (такие исключались специально), либо каналы, на которых только краткосрочно экспериментировали с викториной. Активных каналов с «большим» топом, в который не удалось войти, было буквально пара, причем викторина на них уже долгое время была выключена, но оставался старый топ.
На графике ниже видно, что бот стабильно выходил в топ различных каналов:
С другой стороны, бота замечали на каналах, где очень малая активность в чате. Сюда относились как каналы, где просто мало зрителей, так и каналы, где зрителей накручивали при малом количестве «живых» людей. На нескольких каналах бота все же отправили в бан. Тем, что его выдало, как я понял, было:
- Не отвечал на произвольные обращения к нему в личных сообщениях и в общем чате. Использование движка чат-бота я реализовал заметно позже начала проекта.
- На круглосуточных каналах — круглосуточно присутствовал и периодически отвечал в чате.
А что у других?
Много кто просто ищет ответы в Google. Этих людей в чате недолюбливают, и даже против них активно борются.
Так, в какой-то момент автор бота просто начал заменять некоторые буквы вопроса на аналогично выглядящие английские, что действительно существенно усложнило поиск. Google и сайты с базами вопросов такую абракадабру обрабатывать не умеют. Яндекс же справляется с такими запросами, что оставило гуглерам хоть какие-то шансы. Что касается бота, то обновить алгоритм разбора вопросов не составило большого труда.
Это как извечное противостояние щита и меча. Получить преимущество можно только на коротком временном отрезке.
Удивительно, но оказалось, что существуют другие боты или автоматические скрипты для игры в викторину! Как минимум, один раз я видел в чате, что кто-то с абсолютно свежего аккаунта отвечал на викторину буквально в течение 1 секунды после появления вопроса.
Были и те, кого нельзя было безусловно идентифицировать как бота или скрипт. Тем не менее в отношении ряда ников, судя уже по нескольким факторам, я был уверен на 90%, что использовалась какая-то автоматизация. Вот пример лога всех сообщений от подозрительного участника в одном канале за 6 часов:
Что можно заметить по данному логу:
- Все сообщения очень короткие и не связанные. Это именно попытка дать ответы на викторину. Кроме попыток ответов в чате за несколько часов от данного участника ничего не было. То есть человек вообще ничего больше не пишет в чат.
- Все сообщения с маленькой буквы и нет опечаток.
- Почти нету сообщений с разницей по времени менее минуты, то есть на выбранный вопрос викторины делается только одна попытка ответа. В случае когда ответ должен быть в определенном виде (падеж, время глагола и так далее) не предпринимаются попытки угадать форму слова.
- Средняя разница между сообщениями в среднем 3–5 минут, при том что на данном конкретном канале между вопросами викторины проходит 1–1,5 минуты. Странно, что человек отвечает только на какие-то выборочные вопросы, при том что викторина идет почти постоянно.
Приведенный лог — очень нетипичен для живого человека. Все усугубляется тем, для данного участника такое поведение наблюдается не просто в один из вечеров, а уже 7 дней подряд. Плюс данный исследуемый зарегистрировался совсем недавно — в начале сентября, вероятно, только ради викторины.
Даже попробовал разговорить их в личке на эту тему, но внятного диалога так и не состоялось. Используют ли эти люди бота, какую-то частично автоматизированную помощь или просто сидят на стримах ночами напролет, чтобы поиграть в викторину — со 100% вероятностью определить нельзя. Этот вопрос все еще открыт.
Была ли выгода?
Можно было что-то получить, но — нет, выгоды не было. Во-первых, суть эксперимента была не в том, чтобы получить какие-либо призы. Во-вторых, призы того не стоили.
Например, на одном из каналов проводится еженедельный конкурс, в котором топ отвечающих награждается золотом в World of Tanks. Как оказалось, бот стабильно врывался в топ и мог получать призы. Выяснилось это потом просто поиском используемого ника в поисковике, который и указал на посты в соответствующем сообществе.
Немного статистики
- Время работы: 4 месяца
- Дано правильных ответов: ~8 тыс. (в среднем 60–70 в день)
- Собрано в собственной базе вопросов-ответов: ~83 тыс. (всего вопросов в викторине 110 тыс.)
- Находится в топе ~50 каналов (из 160 с викториной)
- Забанен как минимум в 3 каналах
Заключение и выводы
Было ли это интересно? — Да. Откровением было то, что кто-то также автоматизировал игру в викторину.
Было ли это полезно? — Да, но только, как освоение технологий и создание чего-то нового.
PS. Пока что бот продолжает работать в автоматическом режиме. Будем считать, что эксперимент еще не дошел своей финальной стадии. Так что, если вы, напрягая извилины, сражаетесь в интеллектуальной викторине, убедитесь, что против вас не выставили умный скрипт.