Как создать Telegram бота

 


 

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

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

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

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

Поехали:

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

Приступим:

Инициируем диалог с @BotFather и запрашиваем список доступных команд:

/start

Создаём бота:

/newbot

После чего бот попросит у нас выбрать имя:

Alright, a new bot. How are we going to call it? Please choose a name for your bot.

Придумываем имя, пишем его и отправляем.

Если имя не занято, то бот создается и будет предложено создать пользователя для бота. Пользователь может быть с любым именем, но должен заканчиваться на bot, например TetrisBot или tetris_bot

Good. Now let's choose a username for your bot. It must end in `bot`. Like this, for example: TetrisBot or tetris_bot.

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

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

Запросим всех ботов:

/mybots

Выбираем созданного ранее бота, далее жмем на “Edit Bot” для редактирования, после этого мы можем выбрать изменение имени, описания, команд, изображения и т.д. Выбираем “Edit Botpic”, после чего прикрепляем и отправляем аватарку. Через некоторое время аватар нашего бота будет заменён на отправленный нами. Подобным образом можно отредактировать любую информацию бота.

 

Программирование Telegram бота

Теперь необходимо запрограммировать бота на нужные нам действия и делать мы это будем через представленный Telegram API. А для создания программного кода воспользуемся языком программирования Python.

Я предполагаю, что Python уже установлен, если нет, то его необходимо установить. О том как это сделать уже писали множество раз. Единственное о чём хочу напомнить, если у вас на сервере уже установлено несколько версий и вам сложно за этим следить, то не забывайте использовать окружения. Лично я пользуюсь pyenv, который позволяет довольно удобно переходить от версии к версии от окружения к окружению. Об этом напишу пару слов, возможно кому-то это будет интересно:

Установка необходимых библиотек:

$ sudo apt-get install -y build-essential libbz2-dev libssl-dev libreadline-dev libsqlite3-dev tk-dev libpng-dev libfreetype6-dev

Установка pyenv:

$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash

Сделать запись в ~/.bashrc:

$ vim ~/.bashrc

Запись:

export PATH="~/.pyenv/bin:$PATH"

eval "$(pyenv init -)"

eval "$(pyenv virtualenv-init -)"

Перезагрузить bashrc:

$ source ~/.bashrc

Установка любой версии Python:

$ pyenv install 3.6.0

Создание среды:

$ pyenv virtualenv 3.6.0 [имя_среды]

Активирование среды:

$ pyenv activate [имя_среды]

Деактивация среды:

$ pyenv deactivate

Сделать среду глобальной (если требуется)

$ pyenv global [среда]

Создание окружения для бота:

$ pyenv activate telebot

Активация среды:

$ pyenv activate telebot

Мы не буем изобретать велосипед и воспользуюсь библиотекой python-telegram-bot, в которой уже присутствует основной функционал для запросов к telegram:

$ pip install python-telegram-bot --upgrade

Установим ещё библиотеку emoji, она нам пригодится, для вставки emoji на кнопки и в сообщения бота:

$ pip install emoji

Создадим файл для бота:

$ vim telebot.py

На этом все подготовки окончены, ещё подготовим не большую логику для бота, какой-то тестовый функционал для него. Пусть будет так:

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

Главное меню: Создать сайт, Нужно продвижение сайта, Запросить консультацию, Показать случайную статью

Хочу сайт -> кнопки выбора типа сайта: Landing Page, Сайт визитка, Интернет-магазин, Корпоративный сайт, Веб-сервис -> после выбора типа сайта предложить ввести контактные данные

Нужно продвижение сайта -> предложить указать контактные данные

Запросить консультацию -> предложить указать контактные данные

Показать работу из портфолио -> случайным образом выдать ссылку на одну из статей 7SL
Приступим собственно к написанию кода, постараюсь снабдить его вспомогательными комментариям (написано на коленке для демонстрации):

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# подключаем необходимые библиотеки работы с Telegram API
from telegram import InlineKeyboardButton, InlineKeyboardMarkup, ReplyKeyboardMarkup, ParseMode
from telegram.ext import (Updater, CommandHandler, CallbackQueryHandler, MessageHandler,
                          Filters, RegexHandler, ConversationHandler)
# библиотека Эмодзи
from emoji import emojize

# библиотека логгирования
import logging

# библиотека для работы с JSON
import json

# библиотека для создания случайного выбора
import random

# готовим логи
logging.basicConfig(format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
                    level=logging.INFO)

logger = logging.getLogger(__name__)

# иницируем возможные состояния
# 0 - ожидание выбора в главном меню, 1 - ожидание ввода контактов
MAIN_MENU, KEEP_CONTAKTS = range(2)

# задаём картинки и текст для кнопок основного меню
# все доступные картинки можно посмотреть тут http://apps.timwhitlock.info/emoji/tables/unicode
button_site = emojize(':rocket: Заказать сайт')
button_seo  = emojize(':chart_with_upwards_trend: Продвижение сайта', use_aliases=True)
button_cons = emojize(':mobile_phone: Запросить консультацию')
button_exam = emojize(':rainbow: Статья из блога')

# текст для запроса контактов
ask_contacts = 'Укажите, пожалуйста, свои контакты. Мы обязательно с вами свяжимся.'

# создаём основное меню
reply_keyboard = [[ button_site, button_seo, button_cons, button_exam ], ['Завершить']]
markup = ReplyKeyboardMarkup(reply_keyboard, one_time_keyboard=True, resize_keyboard=True)

# метод команды "/start"
def start(bot, update):
    # выводим приветствие и главное меню
    update.message.reply_text(
        "Добро пожаловать!\n"
        "Веб-студия 7SL к вашим услугам.",
        reply_markup=markup)
    
    return MAIN_MENU

# метод заказа сайта
def site(bot, update, user_data):
    user_data['choice'] = 'Site';
    
    # кнопки выбора типа сайта
    keyboard = [[InlineKeyboardButton("Landing Page", callback_data='Landing Page'),
                 InlineKeyboardButton("Сайт визитка", callback_data='Сайт визитка')],[
                 InlineKeyboardButton("Интернет-магазин", callback_data='Интернет-магазин'),
                 InlineKeyboardButton("Корпоративный сайт", callback_data='Корпоративный сайт')],[
                 InlineKeyboardButton("Веб-сервис", callback_data='Веб-сервис')]]

    # формирование кнопок
    reply_markup = InlineKeyboardMarkup(keyboard)
    
    # вывод сообщения и кнопок для выбора типа сайта
    update.message.reply_text('Выберите тип сайта:', reply_markup=reply_markup)
    
    return KEEP_CONTAKTS

# метод для продвижения
def seo(bot, update, user_data):
    user_data['choice'] = 'SEO';
    # вывод сообщения - запрос контактов
    update.message.reply_text(ask_contacts)
    
    # ожидаем ввода контактов
    return KEEP_CONTAKTS

# метод запроса консультации
def cons(bot, update, user_data):
    user_data['choice'] = 'Consultation';
    # вывод сообщения - запрос контактов
    update.message.reply_text(ask_contacts)
    
    # ожидаем ввода контактов
    return KEEP_CONTAKTS

# метод вывода случайной статьи
def exam(bot, update, user_data):
    # тестовый набор статей
    articles = {
        'как-получить-бесплатный-ssl-сертификат': 'Как получить и настроить бесплатный SSL-сертификат',
        'принципы-разработки-интерфейса': 'Принципы разработки пользовательского интерфейса',
        'интернет-магазин-прием-платежей': 'Интернет-магазин: прием платежей',
        'создание-конкурентного-web-дизайна': 'Создание конкурентного web-дизайна',
        'создание-сайта-формирование-главной': 'Создание сайта: формирование главной страницы',
        'современный-дизайн': 'Современный дизайн'
    }
    
    # случайный выбор статьи
    key, title = random.choice(list(articles.items()))
    
    # выводим сообщение со ссылкой случайной статьи в html формате и выводим главное меню
    bot.sendMessage(chat_id=update.message.chat_id,
                    text='<b>Статья:</b> <a href="https://7sl.ru/' + key + '/">' + title + '</a>.',
                    parse_mode=ParseMode.HTML, reply_markup=markup)
    
    # ожидаем выбора из главного меню
    return MAIN_MENU

# определям вызываемые методы для кнопок главного меню
button_func = {button_site: site, button_seo: seo, button_cons: cons, button_exam: exam};

# метод главного меню
def main_menu(bot, update, user_data):
    # получаем введёный текст пользователем в чат
    # по факту это текст на кнопки главного меню
    button_text = update.message.text
    
    # если в нашем списке функций есть нужная функция, иначе возвращаем ошибку
    if button_text in button_func:
        return button_func[button_text](bot, update, user_data)
    else:
        update.message.reply_text('Нет такой функции', reply_markup=markup)
        return MAIN_MENU

# метод получения контактов
def keep_contacts(bot, update, user_data):
    # получаем данные введённые пользователем
    # это должны быть контакты
    contacts = update.message.text
    user_data['contacts'] = contacts;
    
    # данные юзера
    user = update.message.from_user
    user_data['first_name'] = user.first_name
    user_data['last_name'] = user.last_name
    
    update.message.reply_text('И вот все собранные данные, которые можно передать или сохранить: ' +
                              json.dumps(user_data), reply_markup=markup)
    
    # тут мы можем делать любую логику, записать в БД или отправить на e-mail или что-то ещё
    
    return MAIN_MENU

# метод завершения диалога
def done(bot, update, user_data):
    user_data.clear()
    return ConversationHandler.END

# метод принимающий callback от кнопок под сообщением
def button(bot, update, user_data):
    query = update.callback_query
    
    # заменям сообщение с кнопками сообщением о сделанном выборе
    bot.editMessageText(text='Вы выбрали тип сайта: {}.\n {}'.format(query.data, ask_contacts),
                        chat_id=query.message.chat_id,
                        message_id=query.message.message_id)
    
    user_data['type'] = query.data;
    
    # ожидаем ввода контактов
    return KEEP_CONTAKTS

# метод формирования ошибки
def error(bot, update, error):
    logger.warn('Update "%s" caused error "%s"' % (update, error))

# создаём апдейтер и передаём им наш токен, который был выдан после создания бота
updater = Updater("ваш_токен")

# определяем диспетчер для регистрации обработчиков
dp = updater.dispatcher

# подготваливаем перечисление возможных выборов главного меню
main_menu_regexp = '|'.join([button_site, button_seo, button_cons, button_exam])

# инициируем обработчики для диалога
conversation = ConversationHandler(
    # команды
    entry_points=[CommandHandler('start', start)],
    
    # состояния, в зависимости от состояния вызывается обработчик
    # состояния передаются так же уже завершёнными обработчиками
    states={
        MAIN_MENU    : [RegexHandler('^(' + main_menu_regexp + ')$', main_menu, pass_user_data=True)],
        KEEP_CONTAKTS: [MessageHandler(Filters.text, keep_contacts, pass_user_data=True)],
    },
    
    fallbacks=[RegexHandler('^Завершить$', done, pass_user_data=True)]
)

# добавляем в диалог обработчики состояний
dp.add_handler(conversation)

# добавляем в диалог обработчик кнопок
dp.add_handler(CallbackQueryHandler(button, pass_user_data=True))

# логирование ошибок
dp.add_error_handler(error)

# запуск бота
updater.start_polling()

# запуск цикла ожидания запросов
updater.idle()
главное меню Telegram бот
Главное меню
заказать сайт в Telegram
Заказать сайт
заказ сайта в Telegram
Завершение заказа
cтатьи в Telegram бот
Вывод случайной статьи


Если желаете опробовать бота вживую, то вас ожидает @web7sl_bot

 

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

 

На этом пока всё. Всего вам доброго!

Контакты

г. Краснодар

+7 (909) 466-0-995

hello@7sl.ru