Добавим еще один обработчик для получения текстовых сообщений. Когда робот получает «Привет», он также говорит «Привет». Все остальные сообщения определяются как нераспознанные:
Как всё будет работать
В этом проекте есть три соединения: наш компьютер Python, сервер Telegram и клиент Telegram.
На компьютере запускается интерпретатор Python, а в интерпретаторе выполняется программа Python. Он отвечает за весь контент: у него есть все шаблоны текста, вся логика, все поведение.
Внутри программы Python работает библиотека, которая отвечает за связь с сервером Telegram. Мы встроили секретный ключ в библиотеку, чтобы сервер Telegram знал, что наша программа подключена к определенному боту.
Когда клиент Telegram запрашивает график бота, запрос достигает сервера, а сервер отправляет его на наш компьютер. Запрос обрабатывается программой на языке Python, ответ отправляется на сервер Telegram, а сервер возвращает ответ клиенту. Просто:
Обратите внимание, что наш робот работает только тогда, когда компьютер включен и на нем запущена программа Python. Если компьютер выключится, если вы потеряете доступ в Интернет или выключите переводчик, робот перестанет работать: Запросы будут поступать, но никто не будет отвечать. В следующей статье мы запустим все это на удаленном сервере и будем доступны в любое время.
Что будем делать
Если мы запишем наш план шаг за шагом, он будет выглядеть следующим образом:
- Регистрируем бота в Телеграме.
- Устанавливаем Python-библиотеку для работы с Телеграмом.
- Добавляем библиотеку в программу с гороскопом и учим программу реагировать на сообщения в чате.
- Пишем там же код, который покажет кнопки для выбора знаков зодиака.
- Сделаем так, чтобы по кнопкам появлялся гороскоп для этого знака.
Давайте теперь разберем каждый пункт по очереди.
Регистрация нового бота
Найдите канал @BotFather в Telegram, который отвечает за подписку новых ботов:
Нажмите Start и введите команду /newbot. Он будет спрашивать по очереди имя и ник бота (мы нашли его только с третьей попытки, потому что остальные были заняты):
Часть 2: Подготовка к написанию кода
Как указано в заголовке, мы будем писать бота на языке Python. В этой статье описывается работа с библиотекой PyTelegramBotAPI (Telebot). Если у вас не установлен Python, сначала нужно сделать следующее: в терминале Linux введите.
sudo apt-get install python python-pip
Если вы используете Windows, вам нужно будет загрузить Python с официального сайта.
Затем в терминале Linux или в командной строке Windows введите следующее
pip install pytelegrambotapi
Теперь вы готовы к написанию кода.
Часть 3: Получаем сообщения и говорим «Привет»
Небольшое отступление. Telegram может информировать бота о действиях пользователя двумя способами: через запрос к серверу (длинный опрос) и через webhook, когда сервер Telegram сам отправляет сообщение, информирующее бота о том, что написал пользователь. Второй способ кажется очевидно лучшим, но требует выделенного IP-адреса и установки SS
if message.text == «Hello»: bot.send_message(message.from_user.id, «Здравствуйте, я могу вам помочь?») elif message.text == «/help»: bot.send_message(message.from_user.id, «Напишите Hello») else: bot.send_message(message.from_user.id, «Я вас не понимаю. Напишите /help.»)
Эта часть кода не нуждается в комментариях, как мне кажется. Теперь нам нужно добавить всего одну строчку в наш код (без всех методов).
bot.polling(none_stop=True, interval=0)
Теперь наш бот будет постоянно спрашивать сервер Telegram: «Кто-нибудь опросил меня?», и когда мы опросим нашего бота, Telegram передаст ему наше сообщение. Сохраните весь файл и запишите его в консоль.
Здесь bot.py - это имя нашего файла.
Теперь мы можем написать боту и посмотреть результат:
Отправлять сообщения, безусловно, весело, но еще веселее вести диалог с пользователем, задавать ему вопросы и получать ответы. Допустим, наш бот теперь поочередно спрашивает имя, фамилию и возраст пользователя. Для этого мы используем метод register_next_step_handler бота:
имя = »; фамилия = »; возраст = 0? @bot.message_handler(content_types=’text’) def start(message): if message.text == ‘/reg’: bot.send_message(message.from_user.id, «What is your name?»); bot.register_next_step_handler(message, get_name); bot. register_next_step_handler(message, get_name); #следующим шагом будет функция get_name else: bot. send_message(message.from_user.id, ‘Write /reg’); def get_name(message): #get name global name; name = message.text; bot.send_message(message.from_user. id, ‘Какая у вас фамилия?’); bot. register_next_step_handler(message, get_surname); def get_surname(message): global surname; surname = message.text; bot.send_message(‘Сколько вам лет?’); bot. register_next_step_handler(message, get_age); def get_age(message): global age; while age == 0: #confirm that age has changed try: age = int(message. text) #проверить, что возраст был введен правильно except Exception: bot.send_message(message.from_user.id, ‘Numeric, please’); bot.send_message(message.from_user.id, ‘Are you ‘+str(age)+’ old, your name ‘+name+’ ‘+lastname+’?’)
И вот как мы записали данные пользователя. В данном примере показан очень упрощенный пример. Хорошо хранить промежуточные данные и состояния пользователя в базе данных, но сегодня мы работаем с роботом, а не с базой данных. Последний штрих — попросить пользователя подтвердить, что все правильно, не просто так, а с помощью ключей! Для этого нам необходимо немного изменить код метода get_age
def get_age(message): global age; while age == 0: #проверить, изменился ли возраст try: age = int(message.text) #проверить, правильный ли возраст except Exception: bot.send_message(message.from_user.id, 'In digits, please'); keyboard = types.InlineKeyboardMarkup(); #Наш T
@bot.callback_query_handler(func=lambda call: True) def callback_worker(call): if call.data == «yes»: #call.data — это данные обратного вызова, которые мы указали при объявлении кнопки. #код для сохранения или редактирования данных bot.send_message(call.message.chat.id, ‘Remember : )’); elif call.data == «no»:. #повтор
Теперь осталось добавить строку в начало файла:
из telebot импортированные типы
Вот и все, сохраните и запустите нашего бота:
Вы можете загрузить Python с официального сайта (о том, как установить пакет на Centos 8, читайте в этом посте), но мы не будем с этим возиться.
Часть 4: Кнопки и ветки сообщений
Чтобы установить пакет pyTelegramBotAPI, используйте pip :
pip install pytelegrambotapi
Теперь все готово, и мы можем приступить к написанию бота.
Поскольку наш бот является тестовой средой и не будет содержать много кода, я напишу его непосредственно на сервере, на котором установлена Centos 8 и который использует процессор Nano по умолчанию. Создайте файл bot.py, открыв его с помощью nano:
Сначала мы импортируем библиотеку pyTelegramBotAPI:
Импортный телебот
Затем установите переменную token, равную токену, который вы получили от BotFathe r для связи с Telegram Bot Api:
token = 'ваш токен api'
bot = telebot.TeleBot(token)
Установка Python и библиотеки pyTelegramBotAPI
Далее мы определяем декоратор. Пока что наш бот будет обрабатывать только команду start:
@bot.message_handler(commands=’start’)
pip install pytelegrambotapi
def start_message(message): bot.send_message(message.chat.id, ‘Hi!’)
Пишем Telegram Bot на Python
Если вы хотите, чтобы бот постоянно ждал запроса пользователя, напишите это в конце:
В конце мы получаем код:
import telebot token = 'Your token api' bot = telebot.TeleBot(token) @bot.message_handler(commands='start') def start_message(message): bot.send_message(message.chat.id, 'Hi!') bot.polling()
Далее откроем наш бот (вы можете найти его по имени) и дадим ему команду /start :
Поздравляем с первыми словами нашего бота PocketAdmin!
При запуске сценария может возникнуть следующая ошибка:
requests.exceptions.ConnectionError: (‘Соединение было прервано.’, ConnectionResetError(104, ‘Соединение сброшено сверстником’)).
Чтобы устранить проблему, можно попробовать подключиться через прокси-сервер:
из telebot import apihelper apihelper.proxy =
где login:password@ip:port - соответствующие данные для подключения к прокси-серверу.
Если вы получаете такие ошибки, как: Схема прокси Socks5 не поддерживается или отсутствуют зависимости Для поддержки SOCKS необходимо установить модули:
pip install requestsocks PySocks
Использование прокси в telebot
<'https':'socks5://login:password@ip:port'>