Делаем Telegram бота — Как создать бота телеграмм? Пишем, делаем, удаляем. Создание телеграм бота


Создание и хостинг телеграм бота. От А до Я / Хабр

Привет, хабрчане! Какой бы заезженной не была тема создания телеграм бота на python3, я не нашёл инструкций, где показан путь от первой строчки кода до деплоинга бота (по крайней мере все методы, что я видел, немного устарели). В этой статье я хочу показать процесс создания бота от написания BotFather-у до деплоинга бота на Heroku.

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

P.S. Пишите если нужна статья по созданию более сложного бота, т.е. с вебхуками, БД с настройками юзеров и т.д.

Для начала стоит определиться, что же будет делать наш бот. Я решил написать банального простого бота, кторый будет парсить и выдавать нам заголовки с Хабра. И так, начнём же.

BotFather

Для начала нам надо зарегистрировать нашего бота в Telegram. Для этого:

В поиске вбиваем @BotFather и переходим в диалог с Отцом Ботов.

Пишем /newbot. Указываем имя бота (то, что отображается в диалогах). Указываем его логин, по которому его можно булет найти.

P.S. Оно должно заканчиваться на Bot/bot

Вот. Нам дали API ключ и ссылку на бота. Желательно сохранить API ключ и перейти в диалог с ботом, чтобы потом не копаться в переписке с BotFather

Дальше добавим ему пару команд: пропишем /setcommands и одним сообщением, т.к. /setcommands не добавляет команды, а задаёт их с нуля, пошлём ему команды.

all - спарсить заголовки с вкладки "ВСЁ ПОДРЯД" top - спарсить заголовки с вкладки "ЛУЧШЕЕ"

На этом работа с BotFather закончилась, перейдём к следующей части.

Установка и настройка pipenv. Первый запуск.

Для начала создадим файл, в котором будет основной код бота bot.py. Если бот большой, то сразу создавайте файлы, куда вы вынесете функции, классы и т.д, иначе читаемость кода стремится к нулю. Я добавлю parser.py

Установим pipenv, если его конечно ещё нет.

Для Windows:

pip install pipenv Для Linux:sudo pip3 install pipenv Установим pipenv в папку проекта.pipenv install Установим интересующие нас библиотеки. Я буду работать с PyTelegramBotAPI. Также для парсинга добавим BeautifulSoup4.pipenv install PyTelegramBotAPI pipenv install beautifulsoup4 Начинаем писать код!

Открываем bot.py, импортируем библиотеки и создаём главные переменные.

import telebot import parser #main variables TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA" bot = telebot.TeleBot(TOKEN) Запустим бота. Посмотри наличие ошибок.Как запустить?Для Windows:python bot.py Для Linux:python3 bot.py Если ошибок не появилось, то продолжим.

Хэндлеры. Отвечаем на команды и сообщения

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

Начнём с самого простого: ответим на команды /start и /go

@bot.message_handler(commands=['start', 'go']) def start_handler(message): bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с Хабра') bot.polling() Сейчас разберёмся что это и как это работает. Передаём в message_handler параметр commands равный массиву со строками — командами, на которые он будет отвечать описанным ниже образом. (На все эти команды он ответит одинаково). Далее используем send_message, в него записываем id чата (его можно достать из message.chat.id), в который отправить сообщение и, собственно, само сообщение. Нельзя забыть написать bot.polling() в конце кода, иначе бот сразу же выключиться. Почему так мы узнаем позже.

Теперь можно запустить бота и написать ему /start или /go и он ответит.

P.S. Сообщение может быть не только строкой, а, в принципе, чем угодно.

P.S.S. Что за message?Это json объект, хранящий информацию об отправителе, чате, и самом сообщении.{ 'content_type': 'text', 'message_id': 5, 'from_user': { 'id': 333960329, 'first_name': 'Nybkox', 'username': 'nybkox', 'last_name': None }, 'date': 1520186598, 'chat': { 'type': 'private', 'last_name': None, 'first_name': 'Nybkox', 'username': 'nybkox', 'id': 333960329, 'title': None, 'all_members_are_administrators': None }, 'forward_from_chat': None, 'forward_from': None, 'forward_date': None, 'reply_to_message': None, 'edit_date': None, 'text': '/start', 'entities': [<telebot.types.MessageEntity object at 0x7f3061f42710>], 'audio': None, 'document': None, 'photo': None, 'sticker': None, 'video': None, 'voice': None, 'caption': None, 'contact': None, 'location': None, 'venue': None, 'new_chat_member': None, 'left_chat_member': None, 'new_chat_title': None, 'new_chat_photo': None, 'delete_chat_photo': None, 'group_chat_created': None, 'supergroup_chat_created': None, 'channel_chat_created': None, 'migrate_to_chat_id': None, 'migrate_from_chat_id': None, 'pinned_message': None }
Основы взаимодействия. Ответ на текстовые сообщения.
Теперь обработаем текстовые сообщения бота. Самое важное что нам нужно знать это то, что текст сообщения храниться в message.text и то, что, чтобы обрабатывать текст в message_handler нужно передавать content_types=['text'].

Добавим вот такой код.

@bot.message_handler(content_types=['text']) def text_handler(message): text = message.text.lower() chat_id = message.chat.id if text == "привет": bot.send_message(chat_id, 'Привет, я бот - парсер хабра.') elif text == "как дела?": bot.send_message(chat_id, 'Хорошо, а у тебя?') else: bot.send_message(chat_id, 'Простите, я вам не понял :(') Тут мы довабили пару переменных: вынесли текст сообщения (в нижнем регистре, чтобы не было лишних проблем с теми кто пишет капсом, заборчиком и т.д.) в переменную text, вынесли message.chat.id в отдельную переменную, чтобы каждый раз не обращаться к message. Также мы построили небольшое ветвление, для ответа на определённые сообщения, а также ответ на случай непонятного боту сообщения.Итоговый кодimport bs4 import parser #main variables TOKEN = "555555555:AAAAaaaAaaA1a1aA1AAAAAAaaAAaa4AA" bot = telebot.TeleBot(TOKEN) #handlers @bot.message_handler(commands=['start', 'go']) def start_handler(message): bot.send_message(message.chat.id, 'Привет, когда я вырасту, я буду парсить заголовки с хабра') @bot.message_handler(content_types=['text']) def text_handler(message): text = message.text.lower() chat_id = message.chat.id if text == "привет": bot.send_message(chat_id, 'Привет, я бот - парсер хабра.') elif text == "как дела?": bot.send_message(chat_id, 'Хорошо, а у тебя?') else: bot.send_message(chat_id, 'Простите, я вас не понял :(') bot.polling()
Основы взаимодействия. Ответ на картинки, документы, аудио и прочие.
Для ответа на картинки, стикеры, документы, аудио и т.д. нужно всего лишь поменять content_types=['text'].

Рассмотрим пример с картинкой, добавив этот код.

@bot.message_handler(content_types=['photo']) def text_handler(message): chat_id = message.chat.id bot.send_message(chat_id, 'Красиво.') Все типы контента:

text, audio, document, photo, sticker, video, video_note, voice, location, contact, new_chat_members, left_chat_member, new_chat_title, new_chat_photo, delete_chat_photo, group_chat_created, supergroup_chat_created, channel_chat_created, migrate_to_chat_id, migrate_from_chat_id, pinned_message

Строим цепочку ответов.
Пришло время закончить с элементарными действиями и начать что-то серьёзное. Попробуем построить цепочку ответов. Для этого нам понадобиться register_next_step_handler(). Создадим простой пример, на котором и разберёмся как работает register_next_step_handler()[email protected]_handler(commands=['start', 'go']) def start_handler(message): chat_id = message.chat.id text = message.text msg = bot.send_message(chat_id, 'Сколько вам лет?') bot.register_next_step_handler(msg, askAge) def askAge(message): chat_id = message.chat.id text = message.text if not text.isdigit(): msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.') bot.register_next_step_handler(msg, askAge) #askSource return msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.') И так, в первой функции добавился bot.register_next_step_handler(msg, askAge), в него мы передаём сообщение, которые хотим послать, и следующий щаг, к которому перейти после ответа пользователя.

Во второй функции всё поинтересней, здесь идёт проверка ввёл ли пользователь число, и, если нет, то функция рекурсивно вызывает сама себя, с сообщением «Возраст должен быть числом, введите ещё раз.». Если пользователь ввёл всё верно, то он получает ответ.

Но, есть тут проблема. Можно повторно вызвать команду /go или /start, и начнётся бардак.

Пофиксить это несложно, добавим переменную для проверки состояния выполнения скрипта.

@bot.message_handler(commands=['start', 'go']) def start_handler(message): global isRunning if not isRunning: chat_id = message.chat.id text = message.text msg = bot.send_message(chat_id, 'Сколько вам лет?') bot.register_next_step_handler(msg, askAge) #askSource isRunning = True def askAge(message): chat_id = message.chat.id text = message.text if not text.isdigit(): msg = bot.send_message(chat_id, 'Возраст должен быть числом, введите ещё раз.') bot.register_next_step_handler(msg, askAge) #askSource return msg = bot.send_message(chat_id, 'Спасибо, я запомнил что вам ' + text + ' лет.') isRunning = False С построением простых цепочек мы разобрались, пойдём дальше.
Добавляем парсер в цепочку.
Для начала нужен сам парсер. Обратим внимание на то, что во вкладках «Лучшее» и «Всё подряд» есть дополнительные фильтры: сутки, неделя, месяц и ≥10, ≥25, ≥50, ≥100 соответственно. Парсер конечно можно написать и в 1 функцию, но я разобью на 2, так будет проще читать код.Парсер.import urllib.request from bs4 import BeautifulSoup def getTitlesFromAll(amount, rating='all'): output = '' for i in range(1, amount+1): try: if rating == 'all': html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read() else: html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read() except urllib.error.HTTPError: print('Error 404 Not Found') break soup = BeautifulSoup(html, 'html.parser') title = soup.find_all('a', class_ = 'post__title_link') for i in title: i = i.get_text() output += ('- "'+i+'",\n') return output def getTitlesFromTop(amount, age='daily'): output = '' for i in range(1, amount+1): try: html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read() except urllib.error.HTTPError: print('Error 404 Not Found') break soup = BeautifulSoup(html, 'html.parser') title = soup.find_all('a', class_ = 'post__title_link') for i in title: i = i.get_text() output += ('- "'+i+'",\n') return output По итогу парсер возвращает нам строку с заголовками статей, основываясь на наших запросах. Пробуем, используя полученные знания, написать бота связанного с парсером. Я решил создать отдельный класс (это скорее всего неправильный метод, но это уже относится к питону, а не к основной теме статьи), и в объекте этого класса хранить изменяемые данные.

Итоговый код:

bot.pyimport telebot import bs4 from Task import Task import parser #main variables TOKEN = '509706011:AAF7ghlYpqS5n7uF8kN0VGDCaaHnxfZxofg' bot = telebot.TeleBot(TOKEN) task = Task() #handlers @bot.message_handler(commands=['start', 'go']) def start_handler(message): if not task.isRunning: chat_id = message.chat.id msg = bot.send_message(chat_id, 'Откуда парсить?') bot.register_next_step_handler(msg, askSource) task.isRunning = True def askSource(message): chat_id = message.chat.id text = message.text.lower() if text in task.names[0]: task.mySource = 'top' msg = bot.send_message(chat_id, 'За какой временной промежуток?') bot.register_next_step_handler(msg, askAge) elif text in task.names[1]: task.mySource = 'all' msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?') bot.register_next_step_handler(msg, askRating) else: msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.') bot.register_next_step_handler(msg, askSource) return def askAge(message): chat_id = message.chat.id text = message.text.lower() filters = task.filters[0] if text not in filters: msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.') bot.register_next_step_handler(msg, askAge) return task.myFilter = task.filters_code_names[0][filters.index(text)] msg = bot.send_message(chat_id, 'Сколько страниц парсить?') bot.register_next_step_handler(msg, askAmount) def askRating(message): chat_id = message.chat.id text = message.text.lower() filters = task.filters[1] if text not in filters: msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.') bot.register_next_step_handler(msg, askRating) return task.myFilter = task.filters_code_names[1][filters.index(text)] msg = bot.send_message(chat_id, 'Сколько страниц парсить?') bot.register_next_step_handler(msg, askAmount) def askAmount(message): chat_id = message.chat.id text = message.text.lower() if not text.isdigit(): msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.') bot.register_next_step_handler(msg, askAmount) return if int(text) < 1 or int(text) > 11: msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <11. Введите корректно.') bot.register_next_step_handler(msg, askAmount) return task.isRunning = False output = '' if task.mySource == 'top': output = parser.getTitlesFromTop(int(text), task.myFilter) else: output = parser.getTitlesFromAll(int(text), task.myFilter) msg = bot.send_message(chat_id, output) bot.polling(none_stop=True) Тут добавился none_stop=True) к bot.polling, из-за этого бот не будет падать при каждой ошибке.Task.pyclass Task(): isRunning = False names = [ ['лучшие', 'лучшее', 'топ'], ['всё', 'всё подряд', 'all'] ] filters = [ ['сутки', 'неделя', 'месяц'], ['без порога', '10', '25', '50', '100'] ] filters_code_names = [ ['daily', 'weekly', 'monthly'], ['all', 'top10', 'top25', 'top50', 'top100'] ] mySource = '' myFilter = '' def __init__(self): return parser.pyimport urllib.request from bs4 import BeautifulSoup def getTitlesFromAll(amount, rating='all'): output = '' for i in range(1, amount+1): try: if rating == 'all': html = urllib.request.urlopen('https://habrahabr.ru/all/page'+ str(i) +'/').read() else: html = urllib.request.urlopen('https://habrahabr.ru/all/'+ rating +'/page'+ str(i) +'/').read() except urllib.error.HTTPError: print('Error 404 Not Found') break soup = BeautifulSoup(html, 'html.parser') title = soup.find_all('a', class_ = 'post__title_link') for i in title: i = i.get_text() output += ('- "'+i+'",\n') return output def getTitlesFromTop(amount, age='daily'): output = '' for i in range(1, amount+1): try: html = urllib.request.urlopen('https://habrahabr.ru/top/'+ age +'/page'+ str(i) +'/').read() except urllib.error.HTTPError: print('Error 404 Not Found') break soup = BeautifulSoup(html, 'html.parser') title = soup.find_all('a', class_ = 'post__title_link') for i in title: i = i.get_text() output += ('- "'+i+'",\n') return output
Теория. Методы взаимодействия с ботом.
Мы используем long polling для получения данных о сообщениях от бота.

bot.polling(none_stop=True)

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

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

Маркапы. Добавляем клавиатуры для быстрого ответа.

Наконец основной код дописан. Теперь можно передохнуть и написать маркапы. Я думаю вы неоднократно видели их, но всё же, приложу скриншот. [SCREENSHOT]

Я выведу маркапы в отдельный файл — markups.py.

В написании маркапов нет ничего сложного. Нужно лишь создать маркап, указать пару параметров, создать пару кнопок и добавить их в маркап, далее просто указываем reply_markup=markup в send_message.

Примерmarkups.pyfrom telebot import types source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) source_markup_btn1 = types.KeyboardButton('Лучшие') source_markup_btn2 = types.KeyboardButton('Всё подряд') source_markup.add(source_markup_btn1, source_markup_btn2) В параметры маркапа указываем ширину строки и изменение размеров кнопок, иначе они огромны.Можно конечно заполнять отдельно каждую строк.markup = types.ReplyKeyboardMarkup() itembtna = types.KeyboardButton('a') itembtnv = types.KeyboardButton('v') itembtnc = types.KeyboardButton('c') itembtnd = types.KeyboardButton('d') itembtne = types.KeyboardButton('e') markup.row(itembtna, itembtnv) markup.row(itembtnc, itembtnd, itembtne) bot.pydef start_handler(message): if not task.isRunning: chat_id = message.chat.id msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup) bot.register_next_step_handler(msg, askSource) task.isRunning = True Применим полученные знания к нашему боту.Итоговый кодmarkups.pyfrom telebot import types start_markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True) start_markup_btn1 = types.KeyboardButton('/start') start_markup.add(start_markup_btn1) source_markup = types.ReplyKeyboardMarkup(row_width=2, resize_keyboard=True) source_markup_btn1 = types.KeyboardButton('Лучшие') source_markup_btn2 = types.KeyboardButton('Всё подряд') source_markup.add(source_markup_btn1, source_markup_btn2) age_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True) age_markup_btn1 = types.KeyboardButton('Сутки') age_markup_btn2 = types.KeyboardButton('неделя') age_markup_btn3 = types.KeyboardButton('Месяц') age_markup.add(age_markup_btn1, age_markup_btn2, age_markup_btn3) rating_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True) rating_markup_btn1 = types.KeyboardButton('Без порога') rating_markup_btn2 = types.KeyboardButton('10') rating_markup_btn3 = types.KeyboardButton('25') rating_markup_btn4 = types.KeyboardButton('50') rating_markup_btn5 = types.KeyboardButton('100') rating_markup.row(rating_markup_btn1, rating_markup_btn2) rating_markup.row(rating_markup_btn3, rating_markup_btn4, rating_markup_btn5) amount_markup = types.ReplyKeyboardMarkup(row_width=3, resize_keyboard=True) amount_markup_btn1 = types.KeyboardButton('1') amount_markup_btn2 = types.KeyboardButton('3') amount_markup_btn3 = types.KeyboardButton('5') amount_markup.add(amount_markup_btn1, amount_markup_btn2, amount_markup_btn3) bot.pyimport telebot import bs4 from Task import Task import parser import markups as m #main variables TOKEN = '509706011:AAF7aaaaaaaaaaaaaaaaaaaAAAaaAAaAaAAAaa' bot = telebot.TeleBot(TOKEN) task = Task() #handlers @bot.message_handler(commands=['start', 'go']) def start_handler(message): if not task.isRunning: chat_id = message.chat.id msg = bot.send_message(chat_id, 'Откуда парсить?', reply_markup=m.source_markup) bot.register_next_step_handler(msg, askSource) task.isRunning = True def askSource(message): chat_id = message.chat.id text = message.text.lower() if text in task.names[0]: task.mySource = 'top' msg = bot.send_message(chat_id, 'За какой временной промежуток?', reply_markup=m.age_markup) bot.register_next_step_handler(msg, askAge) elif text in task.names[1]: task.mySource = 'all' msg = bot.send_message(chat_id, 'Какой минимальный порог рейтинга?', reply_markup=m.rating_markup) bot.register_next_step_handler(msg, askRating) else: msg = bot.send_message(chat_id, 'Такого раздела нет. Введите раздел корректно.') bot.register_next_step_handler(msg, askSource) return def askAge(message): chat_id = message.chat.id text = message.text.lower() filters = task.filters[0] if text not in filters: msg = bot.send_message(chat_id, 'Такого временного промежутка нет. Введите порог корректно.') bot.register_next_step_handler(msg, askAge) return task.myFilter = task.filters_code_names[0][filters.index(text)] msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup) bot.register_next_step_handler(msg, askAmount) def askRating(message): chat_id = message.chat.id text = message.text.lower() filters = task.filters[1] if text not in filters: msg = bot.send_message(chat_id, 'Такого порога нет. Введите порог корректно.') bot.register_next_step_handler(msg, askRating) return task.myFilter = task.filters_code_names[1][filters.index(text)] msg = bot.send_message(chat_id, 'Сколько страниц парсить?', reply_markup=m.amount_markup) bot.register_next_step_handler(msg, askAmount) def askAmount(message): chat_id = message.chat.id text = message.text.lower() if not text.isdigit(): msg = bot.send_message(chat_id, 'Количество страниц должно быть числом. Введите корректно.') bot.register_next_step_handler(msg, askAmount) return if int(text) < 1 or int(text) > 5: msg = bot.send_message(chat_id, 'Количество страниц должно быть >0 и <6. Введите корректно.') bot.register_next_step_handler(msg, askAmount) return task.isRunning = False print(task.mySource + " | " + task.myFilter + ' | ' + text) # output = '' if task.mySource == 'top': output = parser.getTitlesFromTop(int(text), task.myFilter) else: output = parser.getTitlesFromAll(int(text), task.myFilter) msg = bot.send_message(chat_id, output, reply_markup=m.start_markup) bot.polling(none_stop=True)

Ура! С кодом впринципе разобрались. Теперь самое важное — деплоинг бота не хероку.

Деплоим бота на Heroku.

Для начала надо зарегистрироваться на Хероку и на Гитхабе.

Теперь создаём репозиторий на гитхабе. (нажмите плюсик слева от вашего аватара) Сейчас нам нужен Procfile (Procfile.windows для windows). Создаём его и записываем в него bot: python3 bot.py

Теперь удаляем TOKEN из bot.py, здесь он не нужен, ведь мы будем загружать этот файл на гитхаб. Через тот же терминале, что использовали для запуска бота, заливаем файлы на гитхаб. (Предворительно удалите папку __pycache__).

echo "# HabrParser_Bot" >> README.md git init git add . git add * git commit -m "Initial Commit" -a git remote add origin origin https://github.com/name/botname.git #Указываем свою ссылку git push -u origin master Гит просит логин и пароль, спокойно вводим и преступаем к деплоингу бота на хероку. Пишем всё в том же терминале.

Теперь возвращаем TOKEN в bot.py, здесь он нужен, ведь мы будем загружать этот файл на хероку.

heroku login #Вводим email и пароль heroku create --region eu habrparserbot #Не забываемпоменять имя приложения #P.S. в имени могут быть только буквы в нижнем регитсре, цифры и тире. heroku addons:create heroku-redis:hobby-dev -a habrparserbot #И снова меняем имя! heroku buildpacks:set heroku/python git push heroku master heroku ps:scale bot=1 # запускаем бота heroku logs --tail #включаем логи Чтобы выключить ботаheroku ps:stop bot И, не забываем перед залитием на гитхаб и удалить TOKEN из нашего bot.py. Ведь нам не нужно, чтобы кто-то им пользовался. Можно конечно воспользоваться .gitignore и вынести токены в отдельный фай.
Поздравляю!
Работа окончена, бот работает удалённо.

Ссылки

Конечный код бота на гитхабеAPI для управления ботомПро деплоингПро pipenvБольшой гайд, возможно кому-то пригодится

Заключение

Если кому-то было интересно, то цель написания статьи выполнена. Если кому-то хочется увидеть статью про более сложного бота (с вебхуками, подключенной БД с настройками пользователей и т.д.) — пишите.UPDATES
UPD1
  • Добавлены якори в содержание.
  • Изменён алгоритм залития кода на гитхаб и хероку.
  • Убрана версия PyTelegramBotAPI, т.к. теперь хероку работает нормально с новыми версиями.

habr.com

Как создать своего чат-бота для Телеграм новичку?

Привет, друзья! На волне тренда мессенджеров и чат-ботов, наконец, добралась до создания своего бота в Телеграме. Реализовала простенького бота-помощника, а заодно решила поделиться с вами инструкцией, как я это сделала. Кроме того, в мой адрес звучали вопросы такого типа: как через бота отдавать подарок новым подписчикам. В общем-то, я этим тоже озадачилась. :yes:

На самом деле, здесь нет ничего сложного. Главное продумать действия (команды) для бота.

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

Выглядит эта менюшка следующим образом:

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

Какие возможности есть у бота?

1) Создание пользовательских команд и ответов на них.

2) Создание меню из команд. Это удобно, так как пользователям не надо вводить команды, а можно использовать для навигации готовое меню.

3) Возможность отправлять сообщения подписчикам (в том числе отложенные), просматривать количество подписчиков в боте.

4) Несколько языков интерфейса, в том числе русский.

5) Можно настроить автопостинг в бота из rss блога или сайта, а также с YouTube-канала, ВК, Твиттер.

Как создать своего Телеграм-бота?

Я записала пошаговую видеоинструкцию – пример создания простого бота с меню:

Посмотреть на моего бота в действии вы можете здесь. В диалоге с ним нажмите «Начать» (Start), дальнейшие действия он вам подскажет.

Итак, для начала создания своего Телеграм-бота, зайдите на сайт manybot.io, там нажмите по кнопке «Создать бота». Вас перебросит на первоначальные инструкции.

Нужно перейти на Manybot в Телеграме и нажать «Начать» (Start) в чате с ботом, чтобы получить дальнейшие инструкции.

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

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

Первым делом вводим команду /addbot или просто жмем по ней в полученном от бота сообщении.

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

Следующим шагом нужно напечатать в диалоге с BotFather команду /newbot и следовать дальнейшим подсказкам. А именно:

1) На английском нам предлагают указать название (имя) своего будущего бота. Я его назвала ViktoriaHelps и отправила это название в диалоге BotFather.

2) Далее указываем логин для бота. Обязательное условие, чтобы логин оканчивался на bot. Можно написать концовку слитно или через нижнее подчеркивание: _bot.

3) После этого получила сообщение с поздравлением, что мой бот создан, ссылку на него в Телеграм, а также токен, который мне нужно скопировать.

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

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

Отправив Manybot описание, вижу сообщение, что мой бот успешно создан. Чтобы он появился в контактах слева, перейдите по ссылке на него и нажмите в чате «Начать».

Кстати, описание бота в любое время можно отредактировать. Делается это через команду /setdescription в диалоге с Manybot.

Настраиваем команды и меню в боте

Далее переходим к настройкам нашего бота и переключаемся на диалог с ним. Жмем внизу чата «Начать».

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

В сообщении ниже отобразится меню для управления вашим ботом (его видите только вы, как владелец бота). Если это сообщение не появилось, вы можете вызвать его сами, введя в чат команду /help или выбрав раздел «Помощь» в меню бота.

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

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

Для этого в меню под полем ввода сообщения кликаем по пункту «Пользовательские команды».

Выбираем «Создать команду».

Указываем название нашей команды – оно должно быть латиницей и без пробелов. Название может содержать цифры и нижнее подчеркивание (для разделения слов). Перед командой используем значок слеш (косую черту) /.

Вводим команду в поле сообщения и жмем Enter.

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

Мой пример ответа ниже, чтобы его сохранить, жмем «Enter», а затем кнопку «Сохранить».

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

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

Если вы хотите отредактировать или удалить команду, кликните по ней в меню.

Откроется новое меню, в котором вы сможете выбрать желаемое действие.

Например, выбираем редактирование. Здесь действия будут следующими:

1) Сначала нам нужно удалить предыдущий ответ на команду и подтвердить действие.

2) Затем нажать «Добавить сообщения к команде».

3) Вводим новый ответ, отправляем боту, сохраняем.

4) Получаем сообщение, что команда успешно отредактирована.

Чтобы вернуться к предыдущему меню, нажимаем «Назад».

Как добавить команду в меню бота?

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

Нажимаем по кнопке «Настроить главное меню».

Выбираем «Добавить пункт меню».

 

Выбираем нашу ранее созданную команду.

Вводим название для данного пункта меню и отправляем боту. Например, я назову «Перейти в блог».

 

Видим, что новый пункт добавился в меню!

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

А также кнопку возврата на предыдущее меню.

Как удалить команду из меню?

Если вы хотите удалить пункт меню или поменять его название, просто кликните по нему.

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

Опять же, проскроллив менюшку вниз, вы увидите кнопки «Переименовать» и «Убрать пункт из меню». Выбираете нужное действие и следуете подсказкам бота.

Например, я просто удалю пункт «Перейти в блог» из меню.

Вернуться к главному меню и настройкам бота

Для этого кликаем на кнопку «Назад» в открывающихся меню, пока не выйдем на главное.

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

Ну а в пункте «Настройки» главного меню можно подключать Телеграм-каналы для постинга из бота, настроить автопостинг из RSS, Twitter, YouTube, VK. А также настроить часовой пояс.

Как увидеть меню своего бота и покликать по нему в качестве нового пользователя?

Здесь вам понадобится другой аккаунт Телеграм. Вы можете создать его на другой номер телефона. Выйти из аккаунта под одним логином и зайти уже под новым. Далее переходите по ссылке на своего бота и тестируете его, как новый пользователь.

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

Друзья, если у вас есть вопросы по уроку, буду рада подсказать в комментариях. ;-)

Желаю успехов!

С уважением, Виктория Карпова

ТАКЖЕ РЕКОМЕНДУЮ ЭТИ МАТЕРИАЛЫ:

Как установить мессенджер Телеграм и начать им пользоватьсяКак создать и использовать канал в TelegramКак пользоваться блог-платформой Telegraph от Telegram

o-zarabotkeonline.ru

Как создать телеграм-бота за 4 шага? Инструкция

В марте 2018 наверное впервые случилось то, чего многие боялись — перестал работать телеграм на территории России. В сети сразу стали писать, что это дело рук российских спецслужб и до Telegram все таки добрались. Впрочем, быстро выяснилось, что проблемы возникли не только на территории России, но и в ряде других стран. До конца дня проблема была устранена и мессенджер снова заработал буквально через несколько часов. В этот день многие поняли насколько плотно вошел в нашу жизнь Telegram и как стало плохо когда он недоступен.

Телеграм стал тем, чем он стал не только потому что это удобный и безопасный мессенджер, но и потому что абсолютно любой пользователь может создавать полезных ботов. Для этого не обязательно знание языков программирования (хотя, безусловно, если вы владеете Python, Java или PHP, то возможностей у вас будет побольше). Сегодня мы посмотрим как можно создать бота в телеграмме, а также узнаем как на ботах можно зарабатывать деньги.

Создание ботов Telegram как способ заработка

Боты в телеграм внешне выглядят как обычный диалог с любым собеседником, только встроены специальные кнопки управления помимо строчки ввода текста. Бот — это сокращение от «робот» и как любой нормальный робот, телеграм-бот говорит на языке команд. Как правило это команды вида /start  (слэш+ слово-команда).

Что умеют делать телеграм-боты? На данный момент уже много чего:

  • работают с документами разных форматов, помогают делиться файлами с другими пользователями, могут конвертировать один формат файла в другой;
  • ищут и скачивают, в некоторых случаях пользоваться удобнее чем привычными поисковиками. Например, бот @ru_tracker_bot дает возможность находить и скачивать с заблокированного в России рутрекера;
  • боты-секретари. Составляют список дел, шлют напоминания прямо в телеграм, ведут учет ваших финансов (например бот @greenzbot )
  • заменяют или дополняют работу электронной почты;,
  • переводят, например бот-переводчик от Яндекса @ytranslatebot Или бот @pronunciationbot высылает вам аудиофайл с произношением слова в ответ на отправленный вами текст. Ну не чудо ли?
  • работают с текстом, проверяют ошибки — @grammarnazibot
  • улучшают работу самого Telegram, помогают вести каналы (ведут статистику, проводят голосования среди подписчиков, автоматически постят новости и т.д.)
  • помогают нам в городе: ищут кафе, заправки рядом с нами, выдают сводки пробок, ищут авиабилеты;
  • у вас свой бизнес и входящие сообщения от клиентов? Бот в телеграм может автоматически ответить на часто задаваемые вопросы или в режиме 24/7 показать состояние заказа

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

Чем дольше существует Telegram, тем всё больше и больше появляется ботов; тем больше функций и работы они способны выполнить. Вы можете разрабатывать телеграм-ботов для существующего бизнеса или же делать, что называется «для людей». Когда вы разрабатываете бота для сложившегося бизнеса, то получаете гонорар за выполненную работу. Если вы делаете бота «для людей», то вы разрабатываете бота бесплатно, но он будет пользоваться спросом (если вы угадаете с запросами людей) у большого числа людей и потенциально можно будет размещать рекламу в вашем боте. Либо, как делают некоторые, после того как вы воспользовались услугами бота вылазит меню с предложением пожертвовать небольшею сумму за хорошо сделанный сервис. Благодарные люди на самом деле готовы заплатить.

Вот вам пример бота сделанного для существующего серьезного бизнеса. У федеральной транспортной компании ПЭК, занимающейся грузоперевозками по все России и зарубежью, есть свой телеграм-бот @pecomru_bot

Клиенты ПЭК теперь могут не звонить и не писать в компанию, чтобы узнать что с их грузом и где он находится. В режиме 24/7 можно написать боту код груза и сразу же получить сводку о состоянии.

Как создать телеграм-бота. Инструкция

Шаг 1.

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

Шаг 2.

Создается новый бот при помощи специального бота @BotFather. Найдите его через поисковую строку в Telegram и начните с ним диалог. Далее введите /start чтобы увидеть возможные команды.

Шаг 3.

Вводим команду /newbot и придумываем новое уникальное имя для бота. Оно обязательно должно быть уникальным, то есть не повторятся с уже созданными ботами, и оканчиваться на bot. В моем случае бот будет называться @autorazmerbot. Вы придумываете свое название боту и если оно оказалось уникальным, то BotFather пришлет вам уникальный код, API. Он пригодится нам чуть позже.

Шаг 4.

Находим в Telegram @Manybot и начинаем с ним диалог. Бот предложит вам выбрать удобный для вас язык. Скорее всего это будет русский или English. Далее жмем «Добавить нового бота» и затем «Я скопировал токен». После чего вставляем и отправляем боту ранее полученный токен от BotFather в Шаге 3. Теперь нужно ввести описание бота, чем он полезен и что будет делать. Я написал следующее:

Поздравляю! Бот создан. Далее настройка.

Как настроить телеграм-бота

Чтобы настроить бота и создать меню команд нужно для начала зайти в наш только что созданного бота. Для этого находим его по юзернейму в телеграме. В моем случае это будет @autorazmerbot

Создаем меню для пользователей.

Чтобы сделать простейшее меню для пользователей сначала нужно создать определенные команды (тот самый формат /start).

В первую очередь давайте сделаем кнопку «Контакты» для связи пользователей с вами. Для этого пишем /commands и отправляем боту. Далее жмем в появившемся меню «Создать команду» и прописываем /contacts и пишем что бот может ответить одним или несколькими сообщениями, в том числе любыми файлами, музыкой, картинками и т.д. В нашем случае пишем, например «Для связи с разработчиком бота...» и пишем свой юзернейм в телеграме. Сохраняем. Команда создана.

Теперь если пользователь наберет в чате с ботом /contacts, то получит сообщение вида "Для связи с разработчиком бота @вашющернейм.

Но лучше, если  такая кнопка «Контакты» будет висеть в главном меню. Для этого в меню выбираем «Настроить гл. меню» и прописываем нужную команду — /contacts. Далее прописываем как будет называться сама кнопка меню — Контакты. Готова первая кнопка меню!

Заключение

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

Поделиться ссылкой:

Похожее

top-investor.ru

Делаем Telegram бота - Как создать бота телеграмм? Пишем, делаем, удаляем

Как создать бота в Телеграмм? В нашей статье ты найдешь все, чтобы у тебя получилось создать бота для Telegram без особого труда. Теперь каждый может (если знает) как создать бота телеграмм. Разработчики сделали общедоступной данную платформу.

Симулятор собеседника Telegram — это программа, которая запускается и работает на вашей стороне. Она посылает запросы к АПИ Telegram Bot, который является достаточно простым:

  • Программа обращается к установленным параметрам по ссылке;
  • Телеграмм отвечает JSON массивом.

Чтобы понять принцип работы Telegram API, нужно попробовать создать элементарного бота в Телеграмм.

Регистрация

До того как создать бота телеграмм, нужно сделать новую учетную запись для программы Telegram и получить присвоенный ей ID, который является также токеном. В Телеграмм помощь при такой регистрации оказывает виртуальный помощник @BotFather.

Делается это так:

  1. Боту следует написать инструкцию /start.
  2. В ответ он пришлет список всех своих команд.
  3. Далее нужно отправить установку /newbot.
  4. @BotFather предлагает придумать новое имя. Оно должно заканчиваться словом «bot».
  5. Если все сделано правильно, помощник присылает токен нового виртуального пользователя и url для добавления его в список контактов.

Полученную комбинацию желательно протестировать этой ссылкой: api.telegram.org/bot/getMe.

Процесс программирования

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

В Telegram есть возможность вместо выгрузки сообщений вручную установить вебхук, чтобы они присылали каждое письмо сами. Для создания Telegram бота на Python лучше воспользоваться каким-нибудь реактором, например, tornado.web.

Костяк программы:

Костяк программы

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

Логика будет находиться в классе tornado.web.RequestHandler, который реактор принимает для обработки запросов.

класс tornado.web.RequestHandler, который реактор принимает для обработки запросов

CMD обозначает словарь всех доступных команд. Send_reply — это функция отправления ответа. Она принимает готовый массив Message.

Код вот:

Команды

Сначала следует научить программу бота в Telegram константам /start и /help:

Учим программу константам /start и /help

Объект message[‘from’] является массивом типа User. От него бот получает данные пользователя, его ID и имя. Будет лучше, если функция ответов будет принадлежать message[‘chat’][‘id’]. Так при общении там будет User, а в случае чата — id последнего.

Установке /start отводится сразу две функции:

• команда без параметров нужна для вывода данных о боте; • с параметрами — для идентификации.

Есть смысл применять ее для требующих авторизации действий.

Теперь вы можете создать любое собственное задание. К примеру, /base64.

Создание /base64

Для тех, кто пользуется мобильным Telegram, будет полезно дать @BotFather перечень команд, которые должен принимать новый виртуальный собеседник:

Для мобильных Telegram перечень команд

Если пользователь Телеграмм захочет увидеть перечень доступных заданий (например, чтобы узнать, как убить программу после выполнения задачи), ему нужно будет написать «/».

Как научить бота говорить

Телеграмм присылает полностью все сообщение. Ограничение на необходимость ставить перед командами слеш создано только для удобства пользователей. Это позволяет научить программу отвечать по-человечески. Для того чтобы дать ей возможность получать в группах все сообщения, нужно написать /setprivacy помощнику @BotFather, отключая, таким образом, приватность.

В Handler следует добавить обработчик:

В список команд нужно включить речь:

В список команд включаем речь

Значение 75 здесь отображает вероятность того, что хочет сказать пользователь. Константа format_map удобна для описания требующих подстановки строк.

Так бот сможет отвечать на приветствия и обращаться к собеседнику по имени.

Отсылаемые сообщения могут быть не только текстовыми

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

Например, можно расширить словарь RESPONSES так:

И будем ловить сообщения:

Теперь объект Message не включает в себя текст, поэтому нужно изменить send_reply:

Так робот будет иногда присылать картинку вместо времени:

Отправка картинки со временем

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

Спасибо статье: https://habrahabr.ru/post/262247/

messagu.ru