Написание бота. Бот понимает слова, как обычный человек? Я делал бота, но запутался. Что мне делать

Внимание материал носит чисто ознакомительный характер, и автор не несет ответственности за закрытие аккаунтов покерными румами. По законам стран создание и использование ботов не запрещено, однако по правилам покерных румов они запрещены.

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

Немного истории.

Начал играть около 5 лет назад, за это время отыграно более 1 миллиона рук. В основном это No Limit Holdem (нелимитированный холдем) за короткими столами (от 2 до 6 человек за столом), есть опыт игры в Омаху, HU NL Holdem. Игра вроде как хобби и отдых. И вот как то с друзьями появилась идея написать бота, первая идея была написать под лимит холдем, и когда наполовину бот был написан, приняли закон запрещающий играть американцам в покер, в итоге с лимитом закинули бота. Первая версия была написано на нейронной сети с распознаванием образов, что это значит – обучили бота распознавать по снимкам с экрана карты, но это сами понимаете неточный метод, но при достаточно хорошем обучении распознавал с точностью 98-99%.Далее версии ботов уже работали на прямую с окнами румов, используя их ресурсы., а так же в тандеме с программами для анализа и сбора статистики игры.

Покер румы не спят.

Практически во всех покер румах есть та или иная защита и система обнаружения покерных ботов. Рассмотрим часть из них. Долгая игра – когда человек слишком долго играет, становится подозрительным, поэтому в некоторых румах могут появляться окошки с вопросами. Как защита не делать долгих сессий игры. Действия за столом – нажатие кнопок, выбор окон, действий не должно происходить не передвигая мышь, в свернутом окне. Траектории мыши лучше задать немного нелинейно, нажатия в разные места кнопок, скорость движения тоже не моментальная. Сканы запущенных процессов и скриншоты экрана – защита как говорил выше, не играть в свернутых окнах, процесс бота называть не покер-бот, и тому подобное, не оставлять окно бота развернутым на экране, имя процесса менять спустя какое то время (например через х минут перезапустить бота с новым именем процесса).

Схема покер бота.

Схему можно разделить на 3 части:

Блок 1 - блок взаимодействия с клиентом для игры в покер.
Блок 2 - блок принятия решения.
Блок 3 - блок сбора статистики, на мой взгляд лучше использовать сторонний софт, например PokerTracker3, отключив при этом вывод статистики на экран.
Далее рассмотрим каждый блок более подробно.

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

Этот блок служит для сбора информации на игровом столе и передачи в блок принятия решения, а так же получив ответ с решением выполнить то или иное действие как Fold, Raise, Call или All-In. Теперь рассмотрим этот блок. Часть этой части это взаимодействие с главным окном программы, это такие действия как выбор лимита, выбор стола за которым будем играть, это тоже большая часть, но на ней не будем останавливаться. Рассмотрим более подробно часть уже со столом. Сначала нам нужно найти хэндлы всех игровых открытых столов (окон), можно это сделать при помощи функции EnumWindows.
Функция EnumWindows перечисляет все окна верхнего уровня на экране, передавая дескриптор каждого окна, в свою очередь, в определяемую программой функцию повторного вызова. EnumWindows действует до тех пор, пока последнее окно верхнего уровня не будет перечислено, или пока функция повторного вызова не возвратит значение ЛОЖЬ (FALSE).

Синтаксис:
BOOL EnumWindows (WNDENUMPROC lpEnumFunc, // указатель на функцию обратного вызова LPARAM lParam // определяемое программой значение);
Параметры:
lpEnumFunc - указывает на определяемую программой функцию повторного вызова. Для получения дополнительной информации, см. функцию повторного вызова EnumWindowsProc.

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

Теперь когда мы имеем хэндл игрового окна мы можем вытягивать информацию о столе. Большая часть информации хранится в дилерском окне. Из него мы можем узнать все участников за столом, кто зашел, кто вышел со стола, кто сделал какое действие, карты на столе и свои карты. Для этого нам понадобится парсер текста, как его писать рассказывать не буду, это отдельная тема, главное что идея ясна J. Но перед парсером нам нужно сначала найти элементы окна, и среди них найти дилерское окошко. Очень часто дилерское окно это класс производный от Internet Explorer_Server, чтобы его найти воспользуемся функцией EnumChildWindows, а затем GetClassName.

EnumChildWindows перечисляет дочерние окна, которые принадлежат определенному родительскому окну, в свою очередь, передавая дескриптор каждого дочернего окна в функцию повторного вызова, определяемую программой. Функция EnumChildWindows работает до тех пор, пока не будет перечислено последнее дочернее окно или функция повторного вызова не возвратит значение ЛОЖЬ (FALSE).

Синтаксис

BOOL EnumChildWindows (HWND hWndParent, // дескриптор родительского окна WNDENUMPROC lpEnumFunc, // указатель на функцию обратного вызова LPARAM lParam // значение, определяемое программой);

Параметры:
hWndParent - идентифицирует родительское окно, чьи дочерние окна должны перечисляться.
lpEnumFunc - указывает на определяемую программой функцию повторного вызова. Для получения дополнительной информации относительно функции повторного вызова, см. функцию повторного вызова EnumChildProc.
lParam - устанавливает 32-разрядное, определяемое программой значение, которое будет передано в функцию повторного вызова.
Возвращаемые значения: если функция завершилась успешно, возвращается значение отличное от нуля. Если функция потерпела неудачу, возвращаемое значение - ноль.

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

Блок 2 - блок принятия решения

Этот блок, сердце всего бота, т.к. от него зависит насколько он успешен в игре, насколько правильные принимает решения. В журнале Хакер 137 от 06.2010 рассматривался пример полностью опирающийся на теорию вероятности и это хорошо, но чтобы получить достаточно достоверный результат надо провести достаточно много итераций. Чтобы играть достаточно уверенно против противника мы должны знать его диапазон и как он играет(это кусок привязан к статистике), так же есть определенные стратегии игры, зависящие от количества денег у вас, от количества игроков за столом, и самой стратегии игры. От всего этого зависит стартовый диапазон рук, и действия на последующих улицах, например человек играющий по стратегии коротких стеков (SSS) редко делает какие то ходы на ривере (когда выложена 5 карта на стол), т.к. к этому моменту он часто уже в Аллине (пошел в ва-банк). Оценка ситуаций так же идет в подсчете аутов, ауты это количество карт, которое улучшит наше положение на последующих улицах, отсюда вытекаю такие комбинации как стрит дро, стрит в дырку, флэшь дро и т.д. Дро это тоже комбинация и в зависимости от количества аутов имеет цену.И имея определенную комбинацию, даже в данный момент не победную, мы уже строим линию игры. Благодаря этим дополнительным данным мы уже можем принимать решения в зависимости от выбранной стратегии, если добавить поверх еще статистику игрока они будут еще точнее, а при добавлении полного просчета эту выборку еще можно дополнить. Надеюсь донес свою мысль о сокращении выборок и принятия решений, все это складывается на личном опыте игры и принятия решения, т.к. в несколько предложений не расскажешь теории игры в покер, которая издается во многих томах, о разных ситуациях, который бесчисленное множество, хотя можно и выделить по основным группам…

Сначала нам надо узнать ситуацию на столе, и узнать какая комбинация у нас имеется. Вот пример кода определения комбинации(переписал более понятно, но может не оптимально):

// функция для заполнения массива карт, вовращает порядковый номер карты int CardToNumber(char Card) { if ((Card>"1")&&(Card<="9"))return (Card-48); if (Card=="T")return 10; if (Card=="J")return 11; if (Card=="Q")return 12; if (Card=="K")return 13; if (Card=="A")return 14; return -1; } // функция для получения бита, соотвествующего масти карты int MastToNumber(char mast) { if (mast=="h")return 1; if (mast=="d")return 2; if (mast=="c")return 4; if (mast=="s")return 8; return 0; } // функции расчета комбинации int Hand(char *MyHand_,char *CardsTable_) { int flush_,flush; //0-ничего 1-флэшь 2-флэшь дро 3-бэедорфлэшьдро 4-флэшь на столе(nothing cards) int cards; //i-карты j1-кол-во карт j2-масти bits 1,2,3,4-h,d,c,s j3-0/1 - 1-наша карта 0-не наша(на столе) int straight; //0-ничего, 1-стрит, 2-открытый стрит(2-х сторонний) 3-гатшот 4-натс стрит на столе 5-стрит на столе int readyhand; //0-не готовая, 1-готовая комбинация int i,j, maxi,flag_,flag,flmax,top,pair_,pair,three,four,over,set_,treeps,quad,num,kicker; // заполнение массива с картами исходя из входящих данных for(i=1;i<=14;i++) for(j=1;j<=3;j++)cards[i][j]=0; cards++; cards=cards| 2*MastToNumber(MyHand_)); cards=cards|(32*MastToNumber(MyHand_)); cards=1; cards++; cards=cards|(2*MastToNumber(MyHand_)); cards=cards|(32*MastToNumber(MyHand_)); cards=cards+1; i=0; while(i0)&&(i>1)) { num++; if (cards[i]==1)flag=i; } else { if (maxi0) { num++; if (cards[i]==1)flag=i; } else { if (maxi=maxi) { while(i0)&&(flmax-i!=1))flag++; if((cards>0)&&((flmax-i)==1))flag++; i++; } } straight=0; if((maxi>=5)&&(flmax==14)&&(flag==0)) straight=4; if((maxi>=5)&&(flmax<14)&&(flag==0)) straight=5; if((maxi>=5)&&(flag>0)) straight=1; if((maxi==4)&&(flag>0)&&(flmax<14)) straight=2; if((maxi==4)&&(flag>0)&&(flmax==14)) straight=3; if((maxi==4)&&(flag>0)&&(flmax==4)) straight=3; // вычисление флэшей flush_=0; j=2; while(j<=16) { flush=0; flag=0; i=2; num=0; flmax=0; flag_=0; while(i<15){ if ((cards[i]& j)==j) { flmax=i;num++;} if ((cards[i]& (j*16))==j*16) { flag_++;flag=i;} i++; } if((num==5)&&(flag==0)) flush=4; if((num>=5)&&(flmax==14)&&(flag>=13)) flush=1; if((num>=5)&&(flmax==14)&&((cards& j)==j)&&(flag==12)) flush=1; if((num>=5)&&(flmax==14)&&((cards& j)==j)&&((cards& j)==j)&&(flag==11)) flush=1; if((num>=5)&&(flmax==14)&&((cards& j)==j)&&((cards& j)==j)&&((cards& j)==j)&&(flag==10)) flush=1; if((num>=5)&&(flmax==14)&&((cards& j)==j)&&((cards& j)==j)&&((cards& j)==j)&&((cards& j)==j)) flush=1; if((num==5)&&(flag_==2)) flush=1; if((num==4)&&(flag>0)) flush=2; if((num==3)&&(flag==2)) flush=3; if((flush>flush_)&&(flush!=0))flush_=flush; j*=2; } flush=flush_; // вычисление пары, овер пары, сета, трипса, квада, кикера pair=0;three=0;four=0; top=0;over=0;set_=0;treeps=0;quad=0;pair_=0; i=2; while(i<15) { if ((cards[i]>=1)&&(cards[i]==0)){ top=0;over=0;} if ((cards[i]==1)&&(cards[i]==0)){ top=0;over=0;} if ((cards[i]==2)&&(cards[i]==0)){ pair++;} if ((cards[i]==2)&&(cards[i]==1)){ pair_++;pair++;top=1;} if ((cards[i]==2)&&(cards[i]==2)){ pair_++;pair++;over=1;} if (cards[i]==3){ three++;} if (cards[i]==4){ four++;} if ((cards[i]==3)&&(cards[i]==1)) treeps=1; if ((cards[i]==3)&&(cards[i]==2)) set_=1; if ((cards[i]==4)&&(cards[i]>0)) quad=1; if ((cards[i]==4)&&(cards>0)) quad=1; i++; } kicker=0; if (top>0) for(i=2;i<=14;i++){ if ((cards[i]==1)&&(cards[i]==1)) kicker=i; } // "Стрит:и тип стрита "- straight // "Флеш:и тип флэша "- flush // "К-во пар: "- pair // "К-во пар у нас: "- pair_ // "Топ пара: "- top // "Кикер" - kicker // "Овер пара: "- over // "3 карты: "- three // "Трипс:(2 карты на столе 1 у нас) "- treeps // "Сет: (2 у нас 1 на столе)"- Set_ // "4 карты: "- four // "Каре: "- quad ……… }

В итоге в соответствующих переменных мы имеем данные о текущем положении дел. При чем заметьте понятия как фул хауз нету, это производная из пара и трипс или сет. Тут еще нужен кусок который определяет готовность руки, т.е. готовая, не готовая, полуготовая. Например такой код:

//готовность руки
readyhand=0; if ((pair==1)&&((top==1)||(over==1))) readyhand=1; if ((pair==1)&&(top==1)&&(kicker<11)&&(over==0)) readyhand=0; if ((pair>=2)&&((top==1)||(over==1))) readyhand=1; if ((pair==2)&&(top==1)&&(kicker<11)&&(over==0)) readyhand=0; if ((pair==2)&&((top==0)||(over==0))&&(pair_==2)) readyhand=1; if ((pair>2)&&((top==0)||(over==0))) readyhand=0; if ((three==1)&&(top==0)&&(over==0)&&(pair_==0)) readyhand=0; if (treeps==1) readyhand=1; if (set_==1) readyhand=1; if (straight==5) readyhand=0; if (straight==4) readyhand=1; if ((straight==2)&&(readyhand==0)) readyhand=2; if (straight==1) readyhand=1; if (flush==4) readyhand=0; if ((flush==2)&&(readyhand==0)) readyhand=2; if (flush==1) readyhand=1; if ((three==1)&&((top==1)||(over==1))) readyhand=1; if ((three==1)&&(top==0)&&(over==0)&&(pair_>0)) readyhand=1; if ((three==1)&&(top==0)&&(over==0)&&(pair_==0)&&(pair>0)) readyhand=0; //фулл на столе if ((treeps==1)&&(pair>0)) readyhand=1; if ((set_==1)&&(pair>0)) readyhand=1; if (quad==1) readyhand=1;

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

Блок 3 - блок сбора статистики

Это немаловажный блок, помогающий в принятии решений, вы можете как сами собирать статистику, как воспользоваться сторонними программами. Я опишу пример запроса к PokerTracker3, программа для сбора и анализа статистики игры, параметров в программе более 100, но нам хотя бы для примера достаточно и нескольких основных. В PokerTracker3 база хранится в Postges базе. Пример запроса:

SELECT sites.site_abbrev, p.player_name, COUNT(hhps.id_player) AS hands, AVG (CASE WHEN flg_vpip THEN 1 ELSE 0 END)*100 AS vpip, AVG (CASE WHEN cnt_p_raise >= 1 THEN 1 ELSE 0 END)*100 AS pfr, AVG (CASE WHEN flg_steal_att THEN 1 WHEN flg_steal_opp THEN 0 END)*100 AS ats, AVG (CASE WHEN flg_sb_steal_fold THEN 1 WHEN flg_blind_def_opp and flg_blind_s THEN 0 END)*100 AS fsbtos, AVG (CASE WHEN flg_bb_steal_fold THEN 1 WHEN flg_blind_def_opp and flg_blind_b THEN 0 END)*100 AS fbbtos, AVG (CASE WHEN enum_f_cbet_action="F" THEN 1 WHEN flg_f_cbet_def_opp THEN 0 END)*100 AS fcbetf FROM lookup_sites AS sites INNER JOIN (player AS p INNER JOIN holdem_hand_player_statistics AS hhps ON (p.player_name = "ник аппонента")and(p.id_player = hhps.id_player)) ON p.id_site = sites.id_site GROUP BY sites.site_abbrev,p.player_name ORDER BY sites.site_abbrev DESC;

На выходе получим по определенному игроку выборку, сайтов на которых такой ник имеется в базе, можно сократить по нашему сайту только, количество рук оппонента (нужна для точности показаний), VPIP(% рук с которыми заходит в игру), PFR (preflop raise –префлоп рейз), ATS (attemptto steel – сколько крадет блайндов на префлопе), CBET (c-bet on flop – ставка в продолжение на флопе),BBS (big blind steel –кража большого блайнда), SBS (small blind steel – кража малого блайнда). Эти параметры в основном используются при расширенной стратегии коротких стеков, для полных стеков этих параметров мало, но в качестве примера как их получить хватит. Для чего все эти параметры нужны и как их использовать советую почитать соответствующие ресурсы.

После того как мы получили дополнительную статистику переходим ко второму блоку и корректируем наше решение об игре.

В заключение.
Вот немного скриншотов с того что может получится у тебя:







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


Статья написана для новичков, чтобы показать, что ничего сложного в написании ботов на Python нет.

Авторизация

Нам понадобится библиотека vk_api . Авторизоваться в вк можно двумя способами:
- Как пользователь
- Как сообщество


В первом случае надо будет ввести логин и пароль. Во втором случае в группе надо включить "Сообщения сообщества" и создать ключ доступа к API:





import time import vk_api vk = vk_api.VkApi(login = "login", password = "password") #vk_api.VkApi(token = "a02d...e83fd") #Авторизоваться как сообщество vk.auth()

Отправка сообщений

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


P.S. Сообщество может отправлять сообщения только ранее писавшим пользователям.


def write_msg(user_id, s): vk.method("messages.send", {"user_id":user_id,"message":s})

В vk.method мы можем вызывать любой метод из VK API и передавать параметры в виде словаря.


В данном случае мы вызываем метод messages.send и в качестве параметров передаем id пользователя и текст сообщения.

Прием сообщений

Отлично! Отправлять сообщения мы научились, осталось научиться их принимать. Для этого нам нужен метод messages.get .


Несколько параметров, на которые стоит обратить внимание:


1) out - если этот параметр равен 1, сервер вернет исходящие сообщения.
2) count - количество сообщений, которое необходимо получить.
3) time_offset - максимальное время, прошедшее с момента отправки сообщения до текущего момента в секундах.
4) last_message_id - идентификатор сообщения, полученного перед тем, которое нужно вернуть последним (при условии, что после него было получено не более count сообщений)


values = {"out": 0,"count": 100,"time_offset": 60} vk.method("messages.get", values)

В нашем случае этот метод вернет все полученные сообщения за последние 60 сек, если их конечно было меньше 100, а если больше, то последние 100.


В итоге мы получаем список items:


{u"count": 3441, u"items": [{u"body": u"\u041f\u0438\u0448\u0435\u043c \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0432\u043a!", u"date": 1491934484, u"id": 7387, u"out": 0, u"read_state": 0, u"title": u" ... ", u"user_id": 23107592}, {u"body": u"\u041f\u0440\u0438\u0432\u0435\u0442 \u0425\u0430\u0431\u0440!", u"date": 1491934479, u"id": 7386, u"out": 0, u"read_state": 0, u"title": u" ... ", u"user_id": 23107592}]}

Если объяснять простыми словами, то items - это то, что можно выделить в диалоге.



Финальный аккорд, делаем вечный цикл, где на каждое сообщение будем отвечать "Привет, Хабр!".


while True: response = vk.method("messages.get", values) if response["items"]: values["last_message_id"] = response["items"]["id"] for item in response["items"]: write_msg(item,u"Привет, Хабр!") time.sleep(1)

Чат-бот готов.


P.S. Мы запоминаем параметр last_message_id, чтобы в следующий раз обрабатывать только новые сообщения.


Полный код

# -*- coding: utf-8 -*- import time import vk_api vk = vk_api.VkApi(login = "login", password = "password") #vk_api.VkApi(token = "a02d...e83fd") #Авторизоваться как сообщество vk.auth() values = {"out": 0,"count": 100,"time_offset": 60} def write_msg(user_id, s): vk.method("messages.send", {"user_id":user_id,"message":s}) while True: response = vk.method("messages.get", values) if response["items"]: values["last_message_id"] = response["items"]["id"] for item in response["items"]: write_msg(item,u"Привет, Хабр!") time.sleep(1)


Получилось 17 строк кода. Успехов!


UPD 17.09.18:
К сожалению в новой версии (5.80) VK API был убран метод "messages.get" и данная статья потеряла актуальность. Теперь для создания ботов используйте систему longpoll. Пример на модуле vk_api для Python вы можете найти .

Эта статья станет для вас экскурсом в мир чат-ботов. В ходе чтения вы узнаете о том, как чат-боты работают и как они создаются.

Чат-боты были популярной темой в течение определённого времени, и много людей сегодня увлечены ими. Некоторые даже верят, что за подобными ботами будущее и рано или поздно они заменят приложения. Однако находятся и те люди, которые считают, что боты как идея обречены на провал.

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

Что это?

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

Если вы помните о CleverBot , вы наверняка знаете о том, что они — далеко не новинка. Актуальными же их делает ряд вещей:

  1. Огромное количество времени, которое люди проводят, набирая текст в различных мессенджерах (будь то ВКонтакте , Facebook , Slack и т.д) делает эти самые мессенджеры быстро растущим сегментом на рынке приложений. Люди используют их не только для дружеских переписок, но и в интересах развития бизнеса.
  2. Быстрое развитие технологий искусственного интеллекта , машинного обучения позволяет современным чат-ботам вести себя максимально приближённо к тому, как ведут себя люди.

Современные чат-боты не опираются исключительно на текст, а ещё и умеют показывать всевозможные полезные карточки, картинки, ссылки, формы, создавая атмосферу использования приложения.

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

Как они работают?

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

Бэкенд: Чат-боты могут быть разработаны на любом языке программирования, с помощью которого можно создать web API. Для большинства это будут либо Node.js, либо PHP, однако существует множество библиотек для создания чат-ботов, написанных на Java или Python. Бэкенд получает сообщение, думает, что ответить, и возвращает пользователю ответ.

Фронтенд: Это может быть любой мессенджер: от популярных вроде Facebook Messenger , Slack , Telegram до простеньких Realtime Chat With Node.js. Вы не ограничены одной платформой: один и тот же бот может работать, по сути, везде.

Связывая первое и второе: Ваш веб-сервер установит так называемые вебхуки — основанные на URL соединения между вашим ботом и чат-платформой. Вебхуки позволят вам безопасно отправлять и получать сообщения через простые HTTP-запросы. Все известные мессенджеры предоставляют разработчикам детальные гайды о том, как связать своего бота с их платформой.

Тупые и умные боты

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

Работающие по командам боты работают, опираясь на заранее написанные ключевые слова, которые они понимают. Каждая из таких команд должна быть написана разработчиком отдельно с использованием регулярных выражений или других форм анализа строк. Если пользователь задал вопрос, не использовав ни одного ключевого слова, робот не может понять его и, как правило, отвечает сообщениями вроде «простите, я не понял».

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

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

Работа с обработкой естественного языка и машинным обучением — непростое задание, особенно для начинающих. К счастью, сегодня вам не нужно выполнять всю работу, так как существует большой выбор отличных библиотек (ConvNetJS , nlp_compromise , TextBlob) и сервисов (wit.ai , api.ai), которые могут помочь вам обучить ваших ботов некоторым разговорным навыкам.

Начало работы с чат-ботами

Если у нас получилось вдохновить вас на создание своего чат-бота, вот вам несколько советов, которые помогут вам начать. В зависимости от того, сколько работы вы хотите делать, вы можете сделать всё с нуля, или же использовать различные фреймворки:

  • BotKit — самый популярный набор инструментов для создания ботов. Он open-source и, к тому же, неплохо документирован.
  • Claudia — этакий конструктор чат-ботов, созданный для использования непосредственно в AWS Lambda.
  • Bottr — очень простой фреймворк, написанный на Node.js с готовым приложением для тестирования. Если вы хотите поиграться с ним минут 10, рекомендуем.

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

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

У активных пользователей Телеграмм, особенно у владельцев коммерческих страниц, возникает закономерный вопрос, как сделать бота для Телеграмм? Какие же навыки для этого потребуются?

Немного о ботах

Боты – это особые роботы, запрограммированные для выполнения определённых действий, преимущественно «механических» и однотипных манипуляций. Для социальной сети Телеграмм актуально программирование бота для: поиска и фильтрации определённых данных, организации рассылки для пользователей в каких-либо кругах, перевода информации между несколькими языками, формирования только интересных и актуальных новостных лент. Боты способны даже выполнять роль ИИ в играх. Список потенциальных функций робота многогранен.
Отдельные разновидности ботов способны к имитации настоящего, реального общения. Нельзя сказать, что такие роботы выходят сильно интеллектуальными, но шаг за шагом ведутся разработки. Возможно, в скором будущем отличить бота и реального человека будет не под силу.

Создание бота для Telegram

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



Написание робота не всегда требует знание веб-языков программирования, можно обойтись практически без данной информации. Единственный недостаток второго варианта – программу нельзя будет качественно оптимизировать и могут появляться некоторые косяки. Для создания бота потребуется робот - @BotFather . Изначально потребуется добавить бота в список контактов и инициировать его запуск.

Написание бота выполняется поэтапно:

  1. Ввод команды /newbot – сейчас происходит генерация собственного, нового бота. Робот системы, BotFather, запросит ввести имя для бота, оно должно быть уникальным и заканчиваться на 3 буквы – «bot» ;
  2. По желанию добавляется аватарка для программы и описание его действий или информация об авторе;
  3. На этом этапе BotFather пересылает ваш собственный токен API . В будущем код потребуется, поэтому нужно сохранить его куда-нибудь, чтобы не потерять, ведь запомнить вряд ли получится;
  4. Теперь бот создан, но его функционал приравнивается к 0. Для обучения программы хоть каким-нибудь действиям лучше использовать программирование, но подойдёт и Paquebot – ресурс для формирования роботов в социальные сети;
  5. Далее нужно добавить ещё одного бота - @Chatfuel и активировать его;
  6. Для запуска нужно ввести /addbot и после пробела вставить токен, который был ранее бережно сохранён;
  7. Сейчас бот уже сохранился на сервисе и пользоваться им можно прямо оттуда. Интерфейс программы интуитивно понятный, а команды для управления требуют начального уровня английского для понимания их предназначения. Функций огромное количество, поэтому перечислять нет смысла.
Используя услуги Paquebot теперь возможно управлять всем функционалом собственного бота, достаточно вводить базовые команды. К примеру, можно задать для бота права администратора канала, и он самостоятельно будет добавлять новости и обновлять ленту. Дополнительно здесь же возможно настраивать обновление в параллельных социальных сетях

Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: