Чуть меньше года назад я обещал написать, как сделать на php телеграм-бота, работающего через longpolling. И вот, наконец-то, у меня дошли руки, чтобы выполнить это обещание.
В чём идея этого метода и чем он принципиально отличается от вебхуков, я уже описывал в первой части этой статьи. Главный смысл тут в том, что данные не присылают по заранее указанному адресу, а мы должны сами посылать на сервера телеграм запросы на их получение. На самом деле я бы назвал этот способ просто polling, поскольку запросы могут быть как «долгими» (или «длинными», — longpolling), так и обычными (или «короткими», — shortpolling).
Разница между «длинными» и обычными опросами состоит в том, что в случае с «длинными» опросами клиент может ждать ответ на отправленный запрос в течении довольно длительного, заранее указанного времени (всё это время соединение не будет разрываться), а в случае с обычными запросами ответ должен поступить сразу, иначе клиент просто будет считать, что сервер не отвечает. В случае с telegram это означает следующее: для «длинных» опросов при отсутствии новых апдейтов сервер telegram сначала подождёт указанное время и если за это время апдейты не появились, то пришлёт ответ с пустым массивом, а для обычных опросов при отсутствии новых апдейтов сервер telegram сразу пришлёт ответ с пустым массивом.
Webhook и Long Polling! Чем отличаются? Что лучше использовать?
Учтите, что оба способа одновременно (вебхуки и поллинги) использоваться не могут, — если установлен вебхук, то отвечать на запросы серверы телеграм не будут (как снять установленный ранее вебхук читайте в статье про работу с telegram через вебхуки).
Какие преимущества мы получаем при использовании поллингов вместо вебхуков? Ну, самое главное, что нам в этом случае не нужен обратный адрес (хостинг и доменное имя), то есть можно хоть на домашнем компе Telegram-бота поднять. Есть и, как бы это сказать, не недостатки, но дополнительные сложности, — апдейты теперь будут прилетать не по одному, а массивами, соответственно, сначала нужно будет разобрать полученные данные на отдельные апдейты, а потом уже обрабатывать их аналогично тому, как мы это делали с вебхуками.
На этом закончим с введением и перейдём к более конкретным вещам, — разберём API телеграмма для работы через поллинги.
Итак, для получения массива апдейтов нужно воспользоваться методом getUpdates и отправить на сервера телеграм запрос следующего вида: https://api.telegram.org/botYOUR_BOT_TOKEN/getUpdates[?options], где YOUR_BOT_TOKEN — токен вашего бота, options — список дополнительных опций.
Опции могут быть следующими:
- offset — идентификатор первого запрашиваемого апдейта. С этой опцией будут получены все апдейты, начиная с апдейта с указанным в поле offset идентификатором. То есть, для того, чтобы получать все апдейты — мы должны каждый раз в запросе указывать идентификатор на единицу больше, чем идентификатор (update_id) последнего полученного апдейта. Все апдейты с идентификаторами меньше присланного значения offset «забываются»;
- limit — максимальное количество апдейтов, которое будет прислано за один раз. Может принимать значения от 1 до 100 (по умолчанию 100).
- timeout — время ожидания для «длинного» запроса. По умолчанию = 0 (то есть по умолчанию используется обычный опрос);
- allowed_updates — тип сообщений, которые мы хотели бы получать (например можно получать только сообщения типа message). Эта опция добавлена недавно и на момент написания этой статьи мне не удалось добиться её заявленной работы (выбранные типы сообщений приходят не от всех пользователей).
Вот и весь API, можно переходить к переделыванию нашего бота, описанного в четвёртой части.
Сначала давайте разберёмся, что именно мы будем переделывать. Как я уже говорил, в ответ на запрос мы получим оформленный в json массив апдейтов, исходя из этого (и всего остального, что я написал выше) переделывание будет заключаться в следующем:
- Нужно написать код, формирующий и отправляющий запрос на сервера телеграм. Здесь следует учесть, что функция file_get_content не умеет работать через https (или я не смог разобраться как это сделать). К счастью, у нас есть curl, который умеет всё, что нам нужно.
- Полученный ответ нужно будет разобрать на отдельные апдейты. Здесь нам поможет уже известная нам функция json_decode.
- Далее нужно будет перебрать все апдейты (их количество можно подсчитать функцией count) и обработать их аналогично тому, как это было в случае с вебхуками.
- Для каждого апдейта нужно извлекать update_id и сохранять в БД update_id последнего полученного апдейта. Это нужно для того, чтобы далее, при формировании запроса, мы могли извлечь из БД сохранённый там ранее update_id и прибавив к нему единицу сообщить в запросе, какие апдейты нам нужны (параметр offset).
Для сохранения в базе данных MySQL значения update_id заведём отдельную таблицу tlgrm_updates с полями update_id и number, типа integer. Нужное нам значение update_id будем хранить в ячейке update_id с индексом number=0.
Всё, теперь осталось только написать код.
Первое. Заменим file_get_content на curl. Для этого напишем новую функцию execRequest такого вида:
Код под катом
function execRequest($telegram_req_url){ $telegram_ch = curl_init(); curl_setopt($telegram_ch, CURLOPT_URL, $telegram_req_url); curl_setopt($telegram_ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($telegram_ch, CURLOPT_HTTPGET, true); // необязательно curl_setopt($telegram_ch, CURLOPT_SSL_VERIFYPEER, false); // отменяем проверку сертификатов curl_setopt($telegram_ch, CURLOPT_SSL_VERIFYHOST, false); // (это для тестов, ну а что делать) curl_setopt($telegram_ch, CURLOPT_MAXREDIRS, 10); // необязательно curl_setopt($telegram_ch, CURLOPT_CONNECTTIMEOUT, 5); // необязательно (таймаут попытки подключения) curl_setopt($telegram_ch, CURLOPT_TIMEOUT, 20); // необязательно (таймаут выполнения запроса) $telegram_ch_result = curl_exec($telegram_ch); return $telegram_ch_result; }
Теперь во всех местах, где мы пользовались функцией file_get_content будем просто формировать нужный url, а сам запрос выполнять новой функцией execRequest, задавая для неё в качестве параметра нужный url.
Второе. Код обработки апдейта, который у нас ранее располагался в конструкции вот такого вида:
Код под катом
$input_array = json_decode(file_get_contents(‘php://input’),TRUE) if($input_array) < код обработки апдейта >else
теперь вместо этого заключим вот в такую конструкцию:
Код под катом
Вот и всё. Понимаю, выглядит всё это довольно громоздко, но если последовательно собирать этот код по всем выложенным описаниям, по всем частям этой статьи, то всё обязательно получится, не так уж это на самом деле и сложно.
В дополнение ко всему изложенному хотелось бы добавить несколько замечаний:
- Как известно, в нашей стране Telegram в настоящее время запрещён, его пытается лочить РКН. Однако, РКН не умеет лочить IPv6. То есть, если вы подключены к интернету по IPv4, то ваши запросы могут не доходить до серверов Telegram. Чтобы они до серверов Telegram доходили — придётся подключаться к интернету по IPv6 (если провайдер позволяет) или что-то колхозить с vpn и проксяшниками.
- Вот здесь можно почитать про пример организации домашней сети таким образом, чтобы одновременно пользоваться плюшками и от IPv6, и от IPv4.
- Если домашний роутер раздаёт IPv6, то можно поднять бота на отдельном, воткнутом в домашнюю сеть микрокомпьютере (например Omega2), который будет включен в режиме 24/7, и будет заниматься только этим ботом. К сожалению, родная прошивка микрокомпьютера Omega2 не поддерживает IPv6, однако его поддерживает моя самодельная прошивка, которую можно найти вот в этой статье. Другие альтернативные прошивки с поддержкой IPv6 можно скачать с нашего форума.
- Для запуска на микрокомпьютере Omega2 описанного в этой статье Telegram-бота с использованием интерпретатора php7, на омеге должны быть установлены следующие модули:
Список под катом
- php7
- php7-cgi
- php7-fastcgi
- php7-mod-curl
- php7-mod-hash
- php7-mod-iconv
- php7-mod-json
- php7-mod-mysqli
- php7-mod-mysqlnd
- php7-mod-openssl
- php7-mod-sockets
- php7-mod-xml
- Часть 1. Что такое Telegram боты и как они работают
- Часть 2. Регистрация аккаунтов Telegram ботов в картинках
- Часть 3. Пишем простого чат-бота для Telegram на чистом php (webhook)
- Часть 4. Прикручиваем MySQL к чат-боту для Telegram на php (webhook)
- Часть 5. Пишем Telegram бота на php для работы через longpolling
- Часть 6. Делаем пользовательскую клавиатуру для бота
- Дополнение. Как отправлять правильные https-запросы через curl и при чём здесь SSL-cертификаты
Источник: radiohlam.ru
Пишем Telegram Bot на Python
Python – язык программирования высокого уровня, который появился сравнительно недавно. Однако его простота и легкий синтаксис уже сделали язык лидером в программировании. Многие предпочитают Python для создания Telegram Bot.
Что требуется для создания бота
- Среда программирования Python.
- Если у вас установлена версия до 3.4, то следует скачать Gid и Pip. Первое – система управления версиями, второе – система управления пакетами Python. Pip позволяет устанавливать пакеты из командной строки.
- Регистрация на GitHub.com
- Регистрация на сервере Heroku.com.
Последние два позволят развернуть бот в сети.
Создаем бота
В результате вы получите токен – символьно-числовую последовательность, уникальную для каждого бота Telegram. Именно с помощью этого идентификатора отправляются запросы на сайт https://api.telegram.org.
Каждый запрос имеет вид:
Методы описаны в документации к Telegram Bot API и являются стандартными. Задача программиста при написании бота заключается в создании кода, который получает сообщения от пользователя и отправляет команду боту на выполнение действий. Запрос может выглядеть следующим образом:
Это пример отправки сообщения для клиента Telegram. Обязательно необходимо знать параметр id_chat – это идентификатор чата. Узнать его можно из ответа, который присылает сервер, который имеет вид JSON-строки:
По сути программа отправляет запросы, считывает ответы и выполняет парсинг полученной строки. В зависимости от сообщений пользователя выполняются те или иные действия.
Пишем бота для Telegram на Python
Сначала создадим программный код. Необходимо установить Python и среду разработки.
- Скачайте Python с официального сайта https://www.python.org/downloads/
- Установите, обязательно указав «Add Python to Path».
- Проверьте установку, открыв командную строку и набрав pip. Должен появится справочный материал по pip.
Откройте среду программирования IDLE. Это делается через пуск, в главном меню ищите раздел с установленным Python и выбирайте нужную команду. Отроется окно. Создайте в нем новый файл и вставьте программный код бота Telegram на Python.
import requests
import datetime
#Установка адреса бота
url = https://api.telegram.org/bot507226896:AAGT_fsEO1milOkqbNp-VolQDJ0tGjaPvD7/
#Поиск последнего сообщения из массива чата с пользователем Telegram.
def lastUpdate(dataEnd):
res = dataEnd[‘result’]
totalUpdates = len(res) — 1
return res[totalUpdates]
#Получение идентификатора чата Telegram
def getChatID(update):
chatID = update[‘message’][‘chat’][‘id’]
return chatID
#отправка запроса sendMessage боту
def sendResp(chat, value):
settings =
resp = requests.post(url + ‘sendMessage’, data=settings)
return resp
#Get-запрос на обновление информации к боту. Результат – строка json. Метод .json позволяет развернуть ее в массив
def getUpdatesJson(request):
settings =
response = requests.get(request + ‘getUpdates’, data=settings)
return response.json()
#Главная функция
def main():
chatID = getChatID(lastUpdate(getUpdatesJson(url)))
sendResp(chatID, ‘Ваше сообщение’)
updateID = lastUpdate(getUpdatesJson(url))[‘update_id’]
#Бесконечный цикл, который отправляет запросы боту на получение обновлений
while True:
#Если обновление есть, отправляем сообщение
if updateID == lastUpdate(getUpdatesJson(url))[‘update_id’]:
sendResp(getChatID(lastUpdate(getUpdatesJson(url))), ‘проба’)
updateID += 1
sleep(1)
#Запуск главной функции
if __name__ == ‘__main__’:
main()
Python чувствителен к пробелам и табуляции, поэтому выполните Format-Untabify Region.
Запустите здесь же в среде разработки. В созданном боте Telegram должно появиться сообщение «Ваше сообщение Проба».
Разворачиваем проект на сервере
Самое сложное – заставить наш проект для Telegram работать на сервере. Мы воспользуемся бесплатным сервисом Heroku.
- Устанавливаем окружение, набирая pip install pipenv – ее надо набрать в командной строке.
- Регистрируемся на Heroku.com
- Устанавливаем интерфейс командной строки Heroku (CLI)
https://devcenter.heroku.com/articles/getting-started-with-python#set-up - В командной строке набираем Heroku и Enter
- Вводим адрес электронной почты, с которым регистрировались на сервере, и пароль, придуманный при регистрации
- Создаем папку. Ее лучше создать в папке с Python. Для примера создадим папку run
- Набираем virtualenv run , чтобы инициализировать в ней virtualenv.
- Регистрируемся на github.com и создаем свой репозиторий
- Переходим в папку run с помощью cd run
- Клонируем репозиторий git командой git clone https:/github.com/ВАШЕ_ИМЯ/ВАШ РЕПОЗИТОРИЙ . ВАШЕ_ИМЯ – имя пользователя на github
- Скопируйте скрипт в папку созданного репозитория (она появится в run)
- Зайдите в папку run/scripts , чтобы запустить файл activate.bat. Если он сработал успешно, то перед адресом в командной строке будет стоять название вашей папки. Например,
- Перейдем в папку run , затем в папку репозитория с помощью команды cd
- Установим модуль requests. Наберем pip install requests
- Чтобы создать зависимость введите pip freeze > requirements.txt
- В папке run создайте файл Procfile или Procfile.windows (для Windows) и сохраните в нем строку web: python bot.py, где bot.py – имя вашего файла с программой для бота
- В папке репозитория создайте файл __init__.py. Он будет пустым
Далее последовательно набирайте в командной строке
Вы увидите сообщение об инициализации пустого репозитория.
Внимание, после add пробел и точка! Добавляет файлы в локальный депозиторий.
Выполнение команды занимает некоторое время, необходимо подождать.
git commit -m ‘short message that describe changes to commit’
Фиксирует изменения в репозитории.
git push -u https://github.com/ИМЯ_ПОЛЬЗОВАТЕЛЯ/ИМЯ_РЕПОЗИТОРИЯ
Позволит развернуть проект на github.
Затем выполните команды:
heroku create имя проекта
В результате вы получите адрес вашего проекта, например, runbot.herokuapp.com.
git push heroku master
Ждем окончания процесса компиляции проекта.
heroku ps:scale web=1
heroku open
Последняя команда откроет ваше приложение на сервере. Бот на Питоне для Телеграмма начнет свою работу.
На сайте с документацией можно посмотреть другие Telegram Bot примеры на Python.
Источник: telegramzy.ru
Как запустить python скрипт на постянную работу для телеграмм бота long polling
Частенько прожжёные сисадмины, у которых на предприятии всё давным-давно налажено и автоматизировано по полной программе задаются вопросом, чем можно заняться в свободное время, чтобы поднять бабла на фрилансе? Вариантов заработка для шарящего компуктерщика сегодня не мало. Можно удалённо админить сервера Майнкрафт в датацентре, создавать сайты и посадочные страницы для тёлочек из инсты, заниматься продвижением гавно-групп из контакта или вообще кидать людей на лавэ в онлайн-играх.
Но согласитесь, все эти мракобесные виды заработка весьма далеки от созидательной деятельности, к которой привык любой мало-мальски интеллектуальный ITшник с IQ выше сотки.
Нам, как обычно, хочется чего-то великого, общественно значимого и при этом не сильно напряжного. Да ещё чтоб платили за это достойно и непременно в долларовом эквиваленте.
Именно поэтому, сегодня, я расскажу вам о том, как быстро и без лишних головняков в виде знания программирования можно создать рабочего Telegram-бота на Python.
Такого бота запросто можно продать на фрилансе и получить за это 50, а в случае особо жирного заказа от какого-нибудь интернет-магазина и все 150 долларов, как с куста.
В общем, если вам интересна тематика программирования на Питоне, вы любите быстрый и лёгкий заработок, а также не чураетесь саморазвития в таком направлении, как разработка ботов для Телеги, тогда устраивайтесь по удобней, наливайте себе 300 грамм новичка. И будем начинать.
Регистрация на Sprintbox
Для того, чтобы создать бота я буду использовать высокоскоростную виртуальную машину на внешнем сервере от Sprintbox. Если в вкратце, то спринтбокс – это мощные VDS-сервера. Так называемые боксы.
Их можно настроить, как вам угодно. Установить готовый популярный дистрибутив выбрав его инсталляшку из вариантов в панели управления сервиса.
Либо же накатить собственную операционную систему вручную. Можно установить сервер в игре майнкрафт, задеплоить любые типы ботов. Дискорд, VK и, разумеется, Telegram. Куда ж без него.
Именно ради него родимого мы с вами сегодня и собрались. Прежде всего давайте пройдём регистрацию на портале. Вводим на главной странице электронную почту, желаемый пассворд для входа и кликаем на заветную кнопку.
Перед нами та самая панель управления, в которой нам сходу предлагают поставить дистрибутив.
В меню слева можно подключиться к партнёрской программе, активировать фаервол, врубить защиту от внешних DDoS-атак, прикупить доменное имя и конечно же сделать бэкап наших боксов.
Мне пока что бэкапить нечего, поэтому давайте создадим бокс и установим в него образ Ubuntu.
Выбираем из списка тариф. Обращаю ваше внимание, что несмотря на то, что оплата указывается за месяц, запустить бокс вы сможете даже если на вашем счету будет всего 100 рублей.
После того, как закините сотку на счёт, можно запустить созданный бокс посредством VNC веб-клиента не выходя из панели.
Настройка виртуального стенда
Первым делом, зайдём под рутом используя те данные, которые пришли нам на почту и поменяем пароль от данного пользователя на своей собственный. Акцентирую внимание новичков на том, что в Linux-системах пароль не отображается на экране, но при этом вводится. Так что не пугайтесь, что вместо набираемого пароля в командной строке вы видите пустоту.
После того, как пассворд рута успешно поменян, самое время проверить, не появились ли актуальные обновы для нашей убунты. Вводим apt-get update с ключом yes и дожидаемся завершения операции.
Затем делаем apt-upgrade с тем же параметром.
Как вы знаете, работать под суперпользователем root очень небезопасно. А у нас тут вроде как канал, топящий за безопасность везде и во всём. Поэтому давайте создадим отдельного пользователя в нашей системе. Вводим adduser bot. И задаём для него безопасный пароль.
После ввода пароля система предлагает заполнить информацию о новом пользователе. Все поля, кроме пароля, не обязательны. Жмякаем Enter для подстановки значений по умолчанию.
Подготовка окружения
Далее, давайте установим менеджер пакетов pip. В дальнейшем он пригодится для загрузки библиотек для питона. Вводим apt install python3-pip.
И дождавшись завершения операции завершаем сеанс пользователя root командой logout
Логинимся под созданным ранее пользователем Bot. И приступаем к созданию виртуального окружения. Это нужно для того, чтобы устанавливать дополнительные модули для разных проектов и избегать появляющихся конфликтов.
Вводим команду pip3 install virtualenv —user. Ключ —user установит модуль локально для нашего пользователя bot.
Далее нужно добавить виртуальное окружение в системные пути пользователя.
Создаём новое окружение введя соответствующую команду. Ключ —system-site-packages задействует внутри окружения модули, ранее установленные в системе, а python – представляет собой произвольное имя нового виртуального окружения.
Давайте его активируем.
А затем установим модули, которые нам потребуются для запуска бота. В первую очередь это конечно же pyTelegramBotAPI.
Регистрация бота
После того, как «папа» вежливо спросит, как будет называться ваш бот и какое имя необходимо указать пользователю, вам будет выдан уникальный токен для API.
Создание бота в Telegram на Python
Окружение подготовлено, бот зарегистрирован, а значит можно начинать кодить, попутно теребонькая маленького питончика. Лёгким движением создаём директорию для хранения файлов проекта.
Внутри неё создаём конфигурационный файл, в котором будут храниться данные нашего поистине масштабнейшего проекта.
Добавляем в файл токен и сохраняем внесённые изменения.
Гуд. Далее в том же каталоге создаём файл самого бота.
И применяя навыки мамкиного программера тихим сапом начинаем набивать гавно-код. Сначала активируем виртуальное окружение, которым будет пользоваться бот.
Затем даём команду на импорт нужных библиотек и настроек из config.py.
Даём ему возможность отвечать на стандартную команду /start.
А эта часть кода позволит боту повторять тексты всех отправленных ему сообщений. Так называемый попугай.
Добавим строчку отвечающую за постоянную обработку информации, приходящей с серверов Telegram.
И можно в принципе сохранять изменения. Окей. Запускаем файл с ботом.
И пробуем обратиться к нему в телеге командой /start. Бот отвечает нам бодрейшим приветствием.
Теперь давайте затестим режим попугая. Введём произвольный текст. Вуаля. Всё работает, как часы.
В данном примере, мы запустили бота прямым вызовом интерпретатора Python в консоли. Поэтому очевидно, что работать он будет, только пока активна сессия SSH.
Однако, можно запустить его в tmux или screen и автоматизировать мониторинг работы с помощью системных демонов Linux. Более подробно про эту движуху вы можете почитать в базе знаний спринтбокса.
Ведь именно на основе здешней инструкции «Создание telegram-ботов на Python» и был подготовлен весь сегодняшний материал. Однако, я сознательно утаил пару последних строчек, чтобы вы имели возможность самостоятельно поработать с интересными мануалами.
Если же вдруг вы не справитесь, то всегда можно обратиться в техническую поддержку сервиса. Сотрудники незамедлительно вам ответят и постараются решить все проблемы в максимально короткие сроки.
Само-собой это не самый совершенный бот из всех существующих. Да и я не профессиональный программер, занимающийся исключительно ботами в телеграмме.
Я всего лишь блогер, который своей деятельностью пытается донести до подписчиков сложные вещи максимально простым языком. И меня очень радует, что в последнее время на рынке отечественных разработок появляются подобные сервисы.
Ну вот скажите, могли бы вы подумать, ещё каких-то 2-3 года назад, что за пару сотен рублей можно поднять действительно мощный внешний сервак с возможностью безопасного подключения и управлением через телегу?
Да-да, вы сейчас не ослышались. Боксами также можно легко управлять посредством удобно-настроенного одноимённого бота Спринтхост. Мега удобная тема. Особенно для тех, кто админя кучу проектов вынужден вечно мотаться в командировки.
Посмотреть статус, ребутнуть и даже отрубить тачку в случае критичного инцидента, можно буквально в несколько кликов с мобилы. А если вы ещё заюзаете мой промокод, то непременно получите 50% кэшбек при первом пополнении счёта.
Так что, ребятки, не тупим. Сворачиваем этот унылый видос и идём создавать рабочий бот для общения, заработка или продаж на базе VDS от Спринтбокса прямо сейчас.
Главное про бэкапы и снапшоты не забывайте. А то будете потом, как я, по 300 раз одну и ту же портянку из кода вбивать. Ладненько. До новых встреч, мои кайфные друже. Всем пока.
Источник: kurets.ru