Содержание
- 1 Что такое Telegram-бот?
- 2 Функции и возможности ботов Телеграм
- 3 Как создать бота в Телеграм? Пошаговая инструкция
- 4 Как проверить функциональность бота?
- 5 Как самому сделать бота в Телеграме: добавляем команды
- 6 Бот и автоматический постинг
- 7 Как запланировать пост в чат-боте?
- 8 Бот-телеграм: инструкция по созданию дополнительных кнопок
- 9 Полезные примеры Телеграм-ботов
Из-за такой востребованности Телеграмма среди интернет-читателей его запросто можно использовать для продвижения собственного бренда. Так что сегодня мы разберемся, как создать бота в телеграмме, для чего его можно использовать и поделимся лучшими примерами.
Что такое Telegram-бот?
Бот, или по-другому чат-бот, является специальным алгоритмом, системой определенных компьютерных действий, которые формируют автоматическую переписку с настоящим собеседником. Работа осуществляется не при помощи искусственного интеллекта, а благодаря анализу поступившего сообщения и генерированию подходящего ответа из готовой базы.
Качественно и детально проработанные боты для Telegram могут не только реагировать на поступающие сообщения от потенциальных клиентов, но также отвечать на вопросы и даже консультировать.
Функции и возможности ботов Телеграм
Прежде чем мы попробуем рассказать, как сделать бота в Телеграме, давайте выясним, для чего он вообще может понадобиться и какую помощь можно получить от телеграм-робота?
Основные причины создания бота:
- работа в одно время сразу со многими клиентами;
- проведение консультации по основным вопросам для потенциального клиента;
- сокращение загруженности консультантов горячей линии;
- сокращение затрат на дополнительных консультантов;
- отбор и направление клиентов со сложными вопросами напрямую операторам и консультантам.
Как создать бота в Телеграм? Пошаговая инструкция
Есть многочисленные сервисы для создания ботов, платные и бесплатные, встроенные в сам Телеграм и сторонние. Базовый способ разработки через Телеграм мы рассмотрим в этой статье, а если вам хочется большего – используйте Manychat. Это сторонний сервис, который упрощает процесс создания, предлагает готовые наработки и дополненный функционал.
Удобнее делать чат-бот на компьютере, потому что придется воспользоваться многочисленными дополнительными файлами. Но если сильно захотеть и хорошо постараться, можно сделать это и с телефона. Итак, техникой запаслись, теперь приступаем к операции под названием «Как создать бота в Telegram».
- Для начала необходимо загрузить и установить сам Телеграм на компьютер или телефон.
- Как только мессенджер установлен, заходим в приложение и вводим слово «Manybot» в поисковой строке (как всегда, оно обозначена картинкой лупы).
- Когда увидите результаты поиска, кликните на кнопку «Start» снизу в правом углу.
- Далее нажимаем на «Добавить нового бота».
- В ответ на эти действия всплывет окошко с сообщением от службы Телеграмм, в котором они подробно объяснят, как добавить бота в канал Telegram. Далее действуем по предложенной инструкции.
- По условиям мессенджера, затем нужно перейти в профиль BotFather. Если что, в инструкции есть ссылка, выделенная синим цветом.
- Теперь кликаем на «Send Message», чтобы перейти к диалогу с этим «собеседником».
- Вводим команду «start», чтобы увидеть перечень команд, которые будут доступны при добавлении бота.
- Выбираем команду «newbot» и ждет ответного сообщения.
- Теперь самое время придумать уникальное название для своего бота (имейте в виду, что оно должно быть на английском языке и с окончанием «bot»). Введите и отправьте его, когда придет ответ. Обязательно сохраните API-токен, который будет ключом для доступа к вашему боту.
- Опять переходим к Manybot. Сюда вставляем сохраненный API-токен и ждем ответной реакции.
- Затем нужно отослать цели создания бота (для чего он понадобился и как будет функционировать). Если не хотите морочить с этим голову, пропустите этот шаг с помощью кнопки «Skip». В ответ вы должны получить отчет о завершении создания бота.
- Как только уведомление пришло, нашу операцию «Как добавить бота в Telegram» можно считать завершенной. Последнее сообщение должно включать ссылку, по которой вы сможете пригласить людей из своих контактов. Там же можно найти перечень универсальных команд для постинга в соц. сетях.
Как проверить функциональность бота?
Чтобы убедиться, что созданный нами робот действительно «на ходу», нужно его самостоятельно проверить. Для этого просто воспользуйтесь строкой поиска в мессенджере. Только вводите не технический ник, то, которое будут использовать ваши подписчики.
Если на этапе программирования и создания все было сделано верно, то ваш бот отобразится в строке поиска и отреагирует на сообщение.
Как самому сделать бота в Телеграме: добавляем команды
Если работает наше творение исправно, то можно задать определенные команды, чтобы при поступлении запроса от клиента бот подбирал подходящий по смыслу ответ. Вот пошаговая инструкция:
- Введите слово «Commands» и далее название самой команды.
- Теперь наберите ответную реакцию бота на эту команду. Она может включать одно или несколько сообщений с картинками видео- и аудиоматериалами. Сохраняем и ждем отчета о создании команды.
Таким же образом можно добавлять множество других команд. Их количество в мессенджере неограниченно.
Чтобы отредактировать уже созданную команду, нужно сделать следующее:
- Печатаем «Commands» и название самой команды.
- Кликаем на «Показать команду», после чего ждем ответ от Телеграм.
- В ответе высветится кнопка, которая предложит скорректировать ответ бота. К чему мы и приступаем.
Бот и автоматический постинг
Теперь мы в теме, как создать чат-бота в Телеграме, самое время освоить еще одну полезную функцию мессенджера. Она позволяет автоматически публиковать разные записи из других социальных сетей в вашем канале. Так они будут отображаться в новостях у подписчиков. Такой автопостинг работает с Твиттером, Ютубом и ВКонтакте. Чтобы настроить эту функцию, нужно сделать несколько простых шагов:
- Вводим в боте «Autoposting».
- Внизу должны появиться кнопки с социальными сетями. Нужно выбрать ту, записи которой мы хотим «копировать» и в чат-бот.
- Теперь необходимо ввести ссылку на вашу страницу, откуда боту нужно будет транслировать публикации. Совсем необязательно проходить авторизацию, можно даже оставить ссылку на чужую страницу.
Как запланировать пост в чат-боте?
Не секрет, что охват аудитории находится в прямой зависимости от времени публикации. Чаще всего опытный человек, который занимается контентом и его планированием, умеет определить оптимальный момент для постинга. Это время, когда запись увидит максимум подписчиков и потенциальных клиентов.
Но бывают ситуации, когда нет возможности подготовить и опубликовать пост. Тогда можно сделать это заранее. Для этого и существует отложенный постинг. Суть его заключается в следующем: создать публикацию можно, когда угодно, а отправить – когда необходимо. Здесь вы неограниченны. Можно поставить на постинг через 10 минут, а можно и через несколько дней.
Чтобы подготовить отложенную запись, нужно сделать следующее:
- В своем боте и введите «Newpost».
- Теперь пишем сам пост со всеми необходимыми вложениями.
- В нижней части экрана будут 4 кнопки. Предпоследней вы найдете как раз ту, что отвечает за отложенную публикацию. Кликайте на нее.
- Далее необходимо указать время, соответствующее вашему часовому поясу на данный момент.
- Затем вводим то время, когда нам нужно, чтобы в боте появилась подготовленная запись.
- Сохраняем пост.
Кстати, выполнять эти действия по «настройке» часов с вашим поясом нужно лишь единожды, во время первого планирования записи. Дальше это будет автоматически, бот запомнит ваше время. Нужно будет вводить только время для публикации.
Бот-телеграм: инструкция по созданию дополнительных кнопок
Чтобы свести свои действия к минимуму, можно создать особые кнопки команд. В результате, чтобы не набирать вручную каждое задание, можно просто выбрать в меню ту кнопку, которая отвечает за нужное нам «задание». Команда автоматически отправится. Итак, что же нужно сделать для этого:
- Вводим уже знакомое нам слово «Commands».
- В нижней части должна высветиться кнопка для настройки главного меню (обычно первый ряд с правой стороны). Кликайте!
- Нужно кликнуть на «Добавить пункт в меню».
- Из перечня выбираем нужную команду.
- Придумайте и напечатайте «имя» для созданной кнопки.
Все, теперь вам не нужно будет вводить полностью название команды. Достаточно просто кликнуть на кнопку.
Полезные примеры Телеграм-ботов
Делимся с вами списком чат-ботов в Телеграмме, которые будут вас вдохновлять на создание собственного и приносить пользу в повседневной жизни.
- @music – для истинных ценителей классической музыки: можно послушать и скачать любимые композиции прямо в Телеграмме.
- @misis_sch_bot – вот так удобно в форме чат-бота выполнено расписание МИСиС.
- @FastAid_bot – ну и для тех, кто внезапно оказался в экстремальной ситуации и не хочет гуглить, есть бот по оказанию первой помощи.
- @EcoideaBot – поможет вам правильно сортировать мусор.
Сам процесс создания чат-бота в Телеграмм может сначала показаться долгим и нудным. На самом деле это очень интересно, а результат – во много раз упрощенная работа – будет наградой за ваши старания.
24 июня разработчики Telegram открыли платформу для создания ботов. Новость кого-то обошла стороной Хабр, однако многие уже начали разрабатывать викторины. При этом мало где указаны хоть какие-то примеры работающих ботов. Прежде всего, бот для Telegram — это по-прежнему приложение, запущенное на вашей стороне и осуществляющее запросы к Telegram Bot API. Причем API довольное простое — бот обращается на определенный URL с параметрами, а Telegram отвечает JSON объектом. Рассмотрим API на примере создания тривиального бота:
1. Регистрация
Прежде чем начинать разработку, бота необходимо зарегистрировать и получить его уникальный id, являющийся одновременно и токеном. Для этого в Telegram существует специальный бот — @BotFather. Пишем ему /start и получаем список всех его команд. Первая и главная — /newbot — отправляем ему и бот просит придумать имя нашему новому боту. Единственное ограничение на имя — оно должно оканчиваться на «bot». В случае успеха BotFather возвращает токен бота и ссылку для быстрого добавления бота в контакты, иначе придется поломать голову над именем. Для начала работы этого уже достаточно. Особо педантичные могут уже здесь присвоить боту аватар, описание и приветственное сообщение. Не забудьте проверить полученный токен с помощью ссылки /getMe”>api.telegram.org/bot/getMe, говорят, не всегда работает с первого раза.
2. Программирование
Создавать бота буду на Python3, однако благодаря адекватности этого языка алгоритмы легко переносятся на любой другой. Telegram позволяет не делать выгрузку сообщений вручную, а поставить webHook, и тогда они сами будут присылать каждое сообщение. Для Python, чтобы не заморачиваться с cgi и потоками, удобно использовать какой-нибудь реактор, поэтому я для реализации выбрал tornado.web. (для GAE удобно использовать связку Python2+Flask) Каркас бота:
URL = "https://api.telegram.org/bot%s/" % BOT_TOKEN MyURL = "https://example.com/hook" api = requests.Session() application = tornado.web.Application([ (r"/", Handler), ]) if __name__ == '__main__': signal.signal(signal.SIGTERM, signal_term_handler) try: set_hook = api.get(URL + "setWebhook?url=%s" % MyURL) if set_hook.status_code != 200: logging.error("Can't set hook: %s. Quit." % set_hook.text) exit(1) application.listen(8888) tornado.ioloop.IOLoop.current().start() except KeyboardInterrupt: signal_term_handler(signal.SIGTERM, None)
Здесь мы при запуске бота устанавливаем вебхук на наш адрес и отлавливаем сигнал выхода, чтобы вернуть поведение с ручной выгрузкой событий. Приложение торнадо для обработки запросов принимает класс tornado.web.RequestHandler, в котором и будет логика бота.
class Handler(tornado.web.RequestHandler): def post(self): try: logging.debug("Got request: %s" % self.request.body) update = tornado.escape.json_decode(self.request.body) message = update['message'] text = message.get('text') if text: logging.info("MESSAGEt%st%s" % (message['chat']['id'], text)) if text[0] == '/': command, *arguments = text.split(" ", 1) response = CMD.get(command, not_found)(arguments, message) logging.info("REPLYt%st%s" % (message['chat']['id'], response)) send_reply(response) except Exception as e: logging.warning(str(e))
Здесь CMD — словарь доступных команд, а send_reply — функция отправки ответа, которая на вход принимает уже сформированный объект Message. Собственно, её код довольно прост:
def send_reply(response): if 'text' in response: api.post(URL + "sendMessage", data=response)
Теперь, когда вся логика бота описана можно начать придумывать ему команды.
3. Команды
Перво-наперво, необходимо соблюсти соглашение Telegram и научить бота двум командам: /start и /help:
def help_message(arguments, message): response = {'chat_id': message['chat']['id']} result = ["Hey, %s!" % message["from"].get("first_name"), "rI can accept only these commands:"] for command in CMD: result.append(command) response['text'] = "nt".join(result) return response
Структура message[‘from’] — это объект типа User, она предоставляет боту информацию как id пользователя, так и его имя. Для ответов же полезнее использовать message[‘chat’][‘id’] — в случае личного общения там будет User, а в случае чата — id чата. В противном случае можно получить ситуацию, когда пользователь пишет в чат, а бот отвечает в личку. Команда /start без параметров предназначена для вывода информации о боте, а с параметрами — для идентификации. Полезно её использовать для действий, требующих авторизации. После этого можно добавить какую-нибудь свою команду, например, /base64:
def base64_decode(arguments, message): response = {'chat_id': message['chat']['id']} try: response['text'] = b64decode(" ".join(arguments).encode("utf8")) except: response['text'] = "Can't decode it" finally: return response
Для пользователей мобильного Telegram, будет полезно сказать @BotFather, какие команды принимает наш бот: I: /setcommands BotFather : Choose a bot to change the list of commands. I: @******_bot BotFather: OK. Send me a list of commands for your bot. Please use this format: command1 - Description command2 - Another description I: whoisyourdaddy - Information about author base64 - Base64 decode BotFather: Success! Command list updated. /help
C таким описанием, если пользователь наберет /, Telegram услужливо покажет список всех доступных команд.
4. Свобода
Как можно было заметить, Telegram присылает сообщение целиком, а не разбитое, и ограничение на то, что команды начинаются со слеша — только для удобства мобильных пользователей. Благодаря этому можно научить бота немного говорить по-человечески.UPD: Как верно подсказали, такое пройдет только при личном общении. В чатах боту доставляются только сообщения, начинающиеся с команды (/<commans:>
- All messages that start with a slash ‘/’ (see Commands above)
- Messages that the bot by username
- Replies to the bot’s own messages
- Service messages (people added or removed from the group, etc.)
Чтобы бот получал все сообщения в группах пишем @BotFather команду /setprivacy и выключаем приватность. Для начала в Handler добавляем обработчик:
if text[0] == '/': ... else: response = CMD["<speech>"](messalogging.info("REPLYt%st%s" % (message['chat']['id'], response)) send_reply(response) </speech>
А потом в список команд добавляем псевдо-речь:
RESPONSES = { "Hello": ["Hi there!", "Hi!", "Welcome!", "Hello, {name}!"], "Hi there": ["Hello!", "Hello, {name}!", "Hi!", "Welcome!"], "Hi!": ["Hi there!", "Hello, {name}!", "Welcome!", "Hello!"], "Welcome": ["Hi there!", "Hi!", "Hello!", "Hello, {name}!",], } def human_response(message): leven = fuzzywuzzy.process.extract(message.get("text", ""), RESPONSES.keys(), limit=1)[0] response = {'chat_id': message['chat']['id']} if leven[1] < 75: response['text'] = "I can not understand you" else: response['text'] = random.choice(RESPONSES.get(leven[0])).format_map( {'name': message["from"].get("first_name", "")} ) return response
Здесь эмпирическая константа 75 относительно неплохо отражает вероятность того, что пользователь всё-таки хотел сказать. А format_map — удобна для одинакового описания строк как требующих подстановки, так и без нее. Теперь бот будет отвечать на приветствия и иногда даже обращаться по имени.
5. Не текст.
Боты, как и любой нормальный пользователь Telegram, могут не только писать сообщения, но и делиться картинками, музыкой, стикерами. Для примера расширим словарь RESPONSES:
RESPONSES["What time is it?"] = ["<at>", "{date} UTC"] </at>
И будем отлавливать текст <at>:
if respo'text'] == "<at>": response[cker'] = "BQADAgADeAcAAlOx9wOjY2jpAAHq9DUC" del response['text'] </at>
Видно, что теперь структура Message уже не содержит текст, поэтому необходимо модифицировать send_reply:
def send_reply(response): if 'sticker' in response: api.post(URL + "sendSticker", data=response) elif 'text' in response: api.post(URL + "sendMessage", data=response)
И все, теперь бот будет время от времени присылать стикер вместо времени:
6. Возможности
Благодаря удобству API и быстрому старту боты Telegram могут стать хорошей платформой для автоматизации своих действий, настройки уведомлений, создания викторин и task-based соревнований (CTF, DozoR и прочие). Вспоминая статью про умный дом, могу сказать, что теперь извращений меньше, а работа прозрачнее.
7. Ограничения
К сожалению, на данный момент существует ограничение на использование webHook — он работает только по https и только с валидным сертификатом, что, например для меня пока критично за счет отсутствия поддержки сертифицирующими центрами динамических днс. К счастью, Telegram также умеет работать и по ручному обновлению, поэтому не меняя кода можно создать еще одну службу Puller, которая будет выкачивать их и слать на локальный адрес:
while True: r = requests.get(URL + "?offset=%s" % (last + 1)) if r.status_code == 200: for message in r.json()["result"]: last = int(message["update_id"]) requests.post("http://localhost:8888/", data=json.dumps(message), headers={'Content-type': 'application/json', 'Accept': 'text/plain'} ) else: logging.warning("FAIL " + r.text) time.sleep(3)
P.S. По пункту 7 нашел удобное решение — размещение бота не у себя, а на heroku, благо все имена вида *.herokuapp.com защищены их собственным сертификатом. UPD: Telegram улучшили Бот Апи, из-за чего, теперь не обязательно иметь отдельную функцию для отправки сообщений при установленном вебхуке, а в ответ на POST запрос можно отвечать тем же сформированным JSON с ответным сообщением, где одно из полей устанавливается как ч ‘method’: ‘sendMessage’ (или любой другой метод, используемый ботом).</at></commans:>
- Tutorial
Почему это вообще появилось здесь? Недавно я написал статью о разработке бота на php с использование laravel+botman для telegram. Самое первое, что написали, цитирую, “стрельба из пушки по воробьям”. Я согласен с этим, даже осознавал это во время разработки, но мне был интересен laravel. Сейчас же я разрабатывал бота на чистом php(без обвязок) и API telegram, а так как статей на подобную тему очень много, то плюсом немного затронем API google(api youtube). Надеюсь, вам будет интересно и полезно узнать о API youtube. Небольшое отступление. На данный момент я работаю frontend программистом и с php работаю лишь в свое удовольствие(хотя какое здесь удовольствие). Возможны глупейшие ошибки на стороне сервера, но это работает и мне на момент обучения этого достаточно.
Постановка задачи
Однажды вечером мне пришла идея связать бота и youtube, на тот момент я даже не подозревал о существовании api google. Требуется бот, который при выходе нового видео на youtube канале будет делать пуш уведомление в моего бота. В принципе, функционал довольно простой, но как работать с youtube? Оказывается решение этой задачи есть у самого google и имя ему google API. Он позволяет работать со всеми приложениями от компании, но меня интересовал лишь youtube.
Настройка и разработка
Так получилось, что во время изучения api youtube было найдено куда элегантное решение моей задачи, его предложила сама документация по api. Но сначала о api. Чтобы начать работать с ним вам необходимо перейти в google console и выбрать нужный вам вариант api. После чего путь лежит лишь в документацию или на stackoverflow. Сразу скажу, русского варианта документации нет, уроков тоже нет. Желательно иметь минимальные знания английского языка или действовать методом тыка. Выглядит это так. Вы заходите в google console, создаете свой проект и выбираете нужный API. А теперь к решению проблемы. Во время чтения документации я нашел(google сам показал) сервис pubsubhubbub.appspot.com/subscribe он позволяет связать youtube и ваше приложение. Как работает? Работает по принципу webhook. Вы вставляете youtube канала, который хотите прослушать и каждый раз при каких либо действиях на канале(добавление видео, удаление, изменение) будите получать данные на свой скрипт. Callback URL — скрипт, который будет принимать данные от google. Topic URL — канал, который вы хотите прослушивать. Ну и поле Mode позволяет выбрать, что вы хотите, подписаться или отписаться от прослушивания. Приступим к написанию кода, для начала давайте настроим наш скрипт для работы с youtube. Я писал все в одном файле т.к. это был тест + кода там действительно мало. После того, как вы отправите запрос на подписку его нужно подтвердить. Погуглив, можно найти ответ на всеми любимом сайте, один из комментариев на stackoverflow подсказывает.
$video = "null"; if (isset($_GET['hub_challenge'])) { echo $_REQUEST['hub_challenge']; } else { $video = parseYoutubeUpdate(file_get_contents('php://input')); } function parseYoutubeUpdate($data) { $xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA); $video_id = substr((string)$xml->entry->id, 9); $channel_id = substr((string)$xml->entry->author->uri, 32); $published = (string)$xml->entry->published; return array( 'video_id'=>$video_id, 'channel_id'=>$channel_id, 'published'=>$published ); }
Здесь мы создаем для удобства переменную в которой будет нужная нам инфа о видео. Две последующие строки, позволяют определить, есть ли возможность подтвердить запрос от pubsubhubbub, если да, то подтверждаем, если нет, то значит, что пришли данные от youtube и нам нужно их обработать. В функции parseYoutubeUpdate мы обрабатывает ответ, получаем всю нам нужную инфу. Здесь стоит сделать отступление и рассказать о особом(на мой взгляд, могу ошибаться) виде данных, которым пользуется youtube(для ответов) он называется, как я понял, atom(не путать с IDE или это обычный xml… опыта с ним было мало). Выглядит он как-то так(небольшой кусок ответа от youtube):
<id>yt:video:eE5mpblYpdY</id><yt>eE5mpblYpdY <yt>UCGqKr3O5ub-O7zEKx_qeHUQ <title>20b3560a49 1080</title><author><name>not Epic</name><uri>https://www.youtube.com/channel/UCGqKr3O5ub-O7zEKx_qeHUQ</uri></author><published>2019-07-14T05:10:49+00:00</published><updated>2019-07-14T05:11:07.600177664+00:00</updated></yt></yt>
Вернемся к parseYoutubeUpdate(). В функции мы преобразуем ответ в xml формат. Записываем в переменные нужные нам данные. А после возвращаем массив с этими данными. Переходим к telegram. Для начала хочется сказать, это ****** как легче работать нежели с botman. Если вы хотите разрабатывать ботов только под telegram, то не пользуйтесь библиотеками, которые позволяют разрабатывать ботов под разные платформ…. в этом нет смысла… больше проблем будет. API telegram’a очень понятное и простое даже для новичка, который только познакомился с php и имеет минимальные знания ООП. Так, ближе к делу, ближе к коду. Нам нужно создать бота и привязать его к нашему скрипту. Надеюсь, бота вы создать в состоянии. Записываем токен от бота и создаем запрос
const TOKEN = "6826815*******Yme99*****9kjzgVi*****3S******"; $url = 'https://api.telegram.org/bot' . TOKEN . '/sendMessage';
Теперь нам необходимо лишь отправить запрос на сервера telegram.
$params = [ 'chat_id' =>712531723, "text" => $linkVideo, ]; $url = $url . '?' . http_build_query($params);
Создаем необходимые параметры, для меня это id чата(если выводит на продакшен бота, то необходимо сохранять все id в БД чтобы спамить) и текстовое сообщение. Как вы могли заметить, я передаю ссылку как простое сообщение, а не видео. Как я понял, телеграм передает видео лишь в том случае, если оно загружено на сервер, а иначе нет… + Мне необходимо видеть превью картинку для видео. Теперь наш бот будет получать уведомления о выходе/редактирование видео. Выглядит это как-то так: Game over. У меня все на этом. Самый большой недостаток этого кода в том, что он находится в одном файле, но кода на 10 строк для меня не имела смысла разделять. Исходники — github.Используемые источники:
- https://waytostart.ru/blog/telegram-bot
- https://habr.com/ru/post/262247/
- https://habr.com/ru/post/463207/