Polling и long polling
Чат-боты должны получать уведомления от соцсети моментально. Они не могут проверять обновления каждую секунду, это неэффективно. Большинство ответов от сервера будут неинформативны, вроде «У вас пока нет новых сообщений».
Такой подход, когда раз в n секунд опрашивается сторонний сервис, называется polling.
Чтобы сэкономить на ресурсах, можно использовать long polling. Устроен он так же, как и polling, с одним отличием: сервер дольше отвечает. Вообще, при лонг-поллинге сервер отвечает в двух случаях: или потому, что пришло новое сообщение, или потому, что соединение пора разрывать.
У каждого запроса есть timeout — время, в течении которого нужно ответить. Если на запрос не ответили за это время, считается, что сервер не ответит вообще. Поэтому сервер смотрит на timeout и решает так:
- Если за это время у меня не появится обновлений для клиента, я отвечу ему, что их нет.
- Если появятся, я отправлю ему обновления сразу, не дожидаясь таймаута.
Чтобы реализовать long polling на стороне клиента, нужно выставить большой timeout: 30 или 60 секунд.
Вот так выглядит polling со стороны клиента на Python:
from time import sleep import requests while True: response = requests.get("http://someurl.com") for message in response: bot.answer(message) sleep(1)
А вот так выглядит long polling:
import requests while True: response = requests.get("http://someurl.com", timeout=60) for message in response: bot.answer(message)
Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
Телеграм бот на Python
Telegram – это одно из самых популярных приложений для обмена сообщениями, и многие люди используют его для общения с друзьями и близкими. Однако, Telegram также может быть использован для создания ботов, которые могут помочь в бизнесе, образовании и многих других областях.В этой статье мы рассмотрим, как создать Telegram бота с помощью библиотеки Telebot на языке Python.
189 показов
421 открытие
Шаг 1: Создание нового бота
Прежде чем начать создание бота, необходимо создать новый бот в Telegram. Для этого нужно зайти в приложение Telegram, найти в нем бота @BotFather и следовать инструкциям по созданию нового бота.
После создания нового бота, получите токен, который будет использоваться в коде бота. Токен выглядит примерно так:123456789:AbCdEfGhIjKlMnOpQrStUvWxYz
После заходим в наш любимый Python.И вводим команду в терминале:
pip install pyTelegramBotAPI
Приступаем к работе с самим кодом.
#База и импорты import telebot token=»Ваш Токен здесь» bot=telebot.TeleBot(token) #Рабочий код @bot.message_handler(commands=[«start»]) def start(mesage): bot.send_message(mesage.chat.id,»Vc.ru лучший.») bot.polling()
Поясняю есть переменная «bot» в ней содержится токен.И вот с этой переменной мы будем работать,@bot.message_handler принимает запрос только от команды «/start» и напишет «Vc.ru Лучший».
Давайте еще дополним код:
@bot.message_handler(content_types=[«text»]) def echo_all(message): bot.send_message(message.chat.id,»Я не понял»)
И теперь в handler будет принимать все сообщения и писать Я не понял. А теперь вы можете себя похвалить,если вы прочитали все.А кто хочет скопировать весь код вот,только замените Токен:
import telebot token=»token» bot=telebot.TeleBot(token) @bot.message_handler(commands=[«start»]) def start(mesage): bot.send_message(mesage.chat.id,»Хабр лучший.») @bot.message_handler(content_types=[«text»]) def echo_all(message): bot.send_message(message.chat.id,»Я не понял») bot.polling()
Улучшеный курс по созданию телеграм ботов
Хай,привет я думаю ты задумавался сделать телеграм бота,ну да потому что ты кликнул на эту статью.Пошли кодить.
468 показов
343 открытия
Я буду использовать Telebot(PyTelegramBotApi) очень легкая библиотека:
pip install pyTelegramBotAPI
Теперь возмем Api ключ в телеграмме.Заходим в поиск и вбиваем @botFather(примерно так будет выглядить —>)
Берем в буфер ключ и идем в ide или где вы кодите:
import telebot token=’6250404026:AAFC4KiaDmFcCw51gpToPeueN-Ug64HHzyk’ bot=telebot.TeleBot(token) @bot.message_handler(commands=[‘start’]) def start(message): bot.send_message(message.chat.id,’Привет’) bot.polling()
Этот бот пишет привет.
После импорта , мы создали token и token передается в аргумент bot .После этого мы будем работать только с bot ,вот пример «@bot.message_handler(commands=[‘start’])»-это обработчик всех сообщений,но включается внизу код только если напишешь /start.Comands не одна настройка хэндлера.
import telebot token=’6250404026:AAFC4KiaDmFcCw51gpToPeueN-Ug64HHzyk’ bot=telebot.TeleBot(token) @bot.message_handler(content_types=[‘text’]) def start(message): bot.send_message(message.chat.id,’Привет’) bot.polling()
Теперь бот отвечает на все сообщения типа:текст.
«content_types=[‘text’]» это настройка на то чтобы бот писал привет,если пользователь будет писать сообщение,но на фото,видео и аудио не будет отвечать.
Теперь добавим кнопки:
import telebot from telebot.types import InlineKeyboardButton,InlineKeyboardMarkup token=’6250404026:AAFC4KiaDmFcCw51gpToPeueN-Ug64HHzyk’ bot=telebot.TeleBot(token) @bot.message_handler(commands=[‘start’]) def start(message): markup=InlineKeyboardMarkup(row_width=2) random=InlineKeyboardButton(‘Рандомное число’,callback_data=’random’) comands=InlineKeyboardButton(«Команды»,callback_data=’comands’) markup.add(random,comands) bot.send_message(message.chat.id,’Выбери опцию.’,reply_markup=markup) bot.polling()
- InlineKeyboardButton
- InlineKeyboardMarkup
- ReplyKeyboardMarkup
- KeyboardButton
Я использовал InlineKeyboardButton:
Markup это наша клавиатура содержит кнопки,у меня есть только две кнопки «Рандомное число»,»Команды».Их мы добавляем кнопки с помощью ‘markup.add’.Теперь мы добавим reply_markup чтобы увидеть клавиатуру.
@bot.callback_query_handler(func=lambda call: True) def handle_button_press(call): if call.data == ‘random’: # Обработка нажатия кнопки «Рандомное число» random_number = random.randint(1, 100) bot.send_message(call.message.chat.id, f’Случайное число:
Кнопки есть callback_data и это как id кнопки когда вы нажимаете на кнопку проверяются все callbackи на то что пользователь нажал на кнопку.
На этом я заканчиваю,если хотите продолжение напиши в коментарий и подпишись.Я же стараюсь.
Создание telegram-ботов на Python
Если вы хотите просто попробовать свои силы в размещении телеграм-бота и пока только знакомитесь, для ваших целей хватит базового тарифа. Когда бот вырастет, и ресурсов перестанет хватать, тариф можно будет увеличить.
Для готового бота подобрать ресурсы сложнее, и если вы не уверены, задайте вопрос нашей поддержке через форму подбора тарифа. Чем подробнее вы опишете ваш проект, тем точнее специалисты смогут подобрать подходящий тариф.
Операционная система подойдет любая, но если это ваш первый проект, то лучше выбрать Ubuntu: она проще в администрировании, чем CentOS.
Подключитесь к боксу по SSH и обновите ОС — с момента создания образа на нашей площадке могло выйти несколько обновлений для операционной системы и других пакетов, в которых могли быть закрыты обнаруженные уязвимости.
Для Ubuntu обновление проводится в 2 команды:
root@box-10000:~# apt-get update root@box-10000:~# apt-get upgrade
Их можно совместить в одну:
root@box-10000:~# apt-get update && apt-get upgrade
Когда все основные компоненты системы будут обновлены, можно приступать к подготовке бокса к размещению телеграм-бота.
Создание пользователя для бота
Запускать бота под пользователем root небезопасно. Сделайте отдельного пользователя для этих целей.
Запустите команду adduser, передав ей аргументом имя будущего пользователя.
root@box-10000:~# adduser bot
Далее команда предложит придумать пароль, повторить его ещё раз и заполнить информацию о новом пользователе. Все поля, кроме пароля, не обязательны, можно жать Enter для подстановки значения по умолчанию.
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully Changing the user information for username Enter the new value, or press ENTER for the default Full Name []: Room Number []: Work Phone []: Home Phone []: Other []: Is the information correct? [Y/n]
Стать новым пользователем можно командой su:
root@box-10000:~# su - bot bot@box-10000:~$
Переключиться обратно к root-пользователю можно с помощью команды logout, либо сочетанием клавиш Ctrl+D, которое сразу выполнит эту команду:
bot@box-10000:~$ logout root@box-10000:~#
Подготовка окружения
Проверьте версию Python, на котором будет запускаться бот:
root@box-10000:~# python3 --version Python 3.8.5
Если вы будете размещать готового бота, версия Python должна соответствовать той, на которой бот был разработан.
Для создания нового бота подойдет любая версия.
Если у вас есть готовый бот, написанный на более старой версии языка, установите интерпретатор для него.
Установите менеджер пакетов pip. Он пригодится в дальнейшем для загрузки библиотек.
В Ubuntu установка производится так:
root@box-10000:~# apt install python3-pip
Следующий шаг — создание виртуального окружения. Это нужно для того, чтобы устанавливать разные модули разным проектам и избегать их конфликтов.
Станьте пользователем bot и установите модуль virtualenv командой:
bot@box-10000:~$ pip3 install virtualenv --user
Ключ —user поставит его локально для пользователя bot.
После установки добавьте виртуальное окружение в системные пути пользователя:
bot@box-10000:~$ export PATH=$HOME/.local/bin:$PATH
Создайте новое окружение:
bot@box-10000:~$ virtualenv --system-site-packages python
python — произвольное имя нового виртуального окружения
Ключ —system-site-packages задействует внутри окружения модули, уже установленные в системе.
И активируйте его:
bot@box-10000:~$ source ~/python/bin/activate (python) bot@box-10000:~$
Выйти из окружения можно с помощью команды deactivate:
(python) bot@box-10000:~$ deactivate bot@box-10000:~$
После создания и активации окружения можно устанавливать модули, которые нам потребуются для запуска бота. В первую очередь это pyTelegramBotAPI. Установим его:
(python) bot@box-10000:~$ pip3 install pyTelegramBotAPI
Регистрация бота
Создание любого бота начинается сообщения отцу ботов в телеграме — @BotFather.
Он может управлять всеми существующими ботами, с помощью множества команд. Их список в любой момент можно вызвать командой /help
Для создания нового бота отправьте команду /newbot. После ответов на пару вопросов бот будет создан, а отец ботов пришлёт токен. Его нужно будет указывать в коде для взаимодействия с BotAPI.
Токен для каждого бота уникален. Нельзя, чтобы он попал в открытый доступ. Однако если это произошло, его всегда можно сменить через ботопапу командой /revoke.
Так будет выглядеть диалог создания бота:

Создание бота
Окружение подготовлено, бот зарегистрирован, можно начать писать его код.
Создайте директорию для бота, в ней будут все файлы проекта:
bot@box-10000:~$ mkdir tgbot
В директории создайте конфигурационный файл, в котором будут храниться некоторые данные проекта, например, токен:
bot@box-10000:~$ vim tgbot/config.py
Помимо vim можно использовать vi или nano. Далее добавьте в файл токен, в виде такой строки:
TOKEN #bot-launch" name="bot-launch">Запуск ботаВ примере выше бот запускается прямым вызовом интерпретатора Python в консоли, но работать он будет, пока активна сессия SSH. Ещё можно запустить его в tmux или screen, но нужно будет следить за тем, чтобы бот всегда работал и поднимать его. Этот процесс можно упростить с помощью системных демонов linux.
Для этого создайте сервис:
root@box-10000:~# vim /etc/systemd/system/bot.serviceИ добавьте в него такой код:
[Unit] Description=Awesome Bot After=syslog.target After=network.target [Service] Type=simple User=bot WorkingDirectory=/home/bot/tgbot ExecStart=/usr/bin/python3 /home/bot/tgbot/bot.py Restart=always [Install] WantedBy=multi-user.targetПосле этого выполните 3 команды друг за другом. Первая перезапустит менеджер служб, вторая включит демона, третья — запустит бота:
root@box-10000:~# systemctl daemon-reload root@box-10000:~# systemctl enable bot root@box-10000:~# systemctl start botПроверить, что бот работает, можно командой:
root@box-10000:~# systemctl status botЕё вывод будет примерно таким:
● bot.service - Awesome Bot Loaded: loaded (/etc/systemd/system/bot.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2021-03-29 05:52:50 MSK; 3min 12s ago Main PID: 2087 (python3) Tasks: 4 (limit: 2344) Memory: 19.9M CGroup: /system.slice/bot.service └─2087 /usr/bin/python3 /home/bot/tgbot/bot.pyСамое важное здесь — состояние бота, в строке «Active». Если бот вдруг остановился, его можно снова запустить:
root@box-10000:~# systemctl start botКогда вы вносите изменения в код бота, сервис нужно перезапускать:
root@box-10000:~# systemctl restart botЧтобы отключить автоматический перезапуск бота, нужно его остановить и отключить демона:
root@box-10000:~# systemctl stop bot root@box-10000:~# systemctl disable botДокументация
- Вводная статья на сайте Telegram
- API telegram-ботов
- Библиотека pyTelegramBotAPI
