Лайфхаки

Маленькие, полезные хитрости

Telegram Bot api через setWebhook на Python. А в чём, собственно, разница?

30.06.2023 в 23:59

Telegram Bot api через setWebhook на Python. А в чём, собственно, разница?

(Следующий абзац был написан в 2015-2016г., библиотеки с того момента много обновлялись, поэтому в некоторых случаях использовать Long Polling будет не хуже, чем вебхуки) .
Давайте для начала разберемся, как боты принимают сообщения. Первый и наиболее простой вариант заключается в периодическом опросе серверов Telegram на предмет наличия новой информации. Всё это осуществляется через т.н., т.е. открывается соединение на непродолжительное время и все обновления тут же прилетают боту. Просто, но не очень надежно. Во-первых, серверы Telegram периодически начинают возвращать(Gateway Timeout), из-за чего некоторые боты впадают в ступор. Даже pyTelegramBotAPI, используемый мной, не всегда может пережить такое. Во-вторых, если одновременно запущено несколько ботов, вероятность столкнуться с ошибками возрастает. Это вдвойне обидно, если сами боты используются не очень часто.

Вебхуки работают несколько иначе. Устанавливая вебхук, вы как бы говорите серверам Telegram: “Слышь, если кто мне напишет, стукни сюда — (ссылка)”. Отпадает необходимость периодически самому опрашивать серверы, тем самым, исчезает неприятная причина падений ботов. Однако за это приходится платить необходимостью установки полноценного веб-сервера на ту машину, на которой планируется запускать ботов. Что ещё неприятно, надо иметь собственный SSL-сертификат, т.к. вебхуки в телеграме работают только по HTTPS . К счастью, в один прекрасный день появилась поддержка самоподписанных сертификатов . Вот об их применении я и расскажу.

Webhook Telegram Python. Telegram Chatbot Using Python and Django: Part 1

Telegram is one of the simplest platforms to build chatbots. Telegram does not have lengthy approval processes or strict quality guidelines. In this tutorial, You will learn how to build a telegram bot using Python and Django.

This is the first part of a three-part tutorial. Here are the links to other parts of this tutorial.

  1. Part 1 (You are here)
  2. Part 2
  3. Part 3

Creating A Bot

Managing a telegram app different from how you typically manage bots with other platforms such as Facebook. With telegram, creating and managing bots are done by sending messages to a special account called the Bot Father.

You will need a telegram account to complete this step. Install the Telegram application on your device before following the below steps.

  1. Find the
  2. Send/newbotto BotFather. BotFather will ask for a name and a username for your bot. You can name your bot anything you choose but the username should end with
  3. Once Bot Father is happy with your choices, he will create a bot for you and give you the credentials. Take a note of the token Bot Father sends you. It will start with a number followed by a colon(:) and some random characters.

Setting Up Django Project

In this section, we will be setting up a brand new Django project for our bot. Feel free to skip this section if you already have a project set up.

I will be using pipenv to manage my virtual environment. Install pipenv usingpip install pipenvif you don’t have it installed already. (On Linux and MacOS you might have to usesudo pip3 install pipenv.)

Create a directory for your chatbot project and open a terminal from that directory. Run the following command to create a new pipenv environment. Substitute 3.10 with your python version if you are using a different version.

pipenv --python 3.10

Start a pipenv shell next.

pipenv shell

Now, we need to install the packages needed for this project.

pipenv install django djangorestframework requests

The requests library is for making HTTP calls to the telegram API and djangorestframework is for creating a clean-looking API for telegram to call. Next, we need to create a new django project.

django-admin startproject your-project-name .

Open the settings file django created for you and add the following line to the end of it.

Don’t forget to replaceyour-tokenwith the token you got from Bot Father. (Ideally, you should not hard-code sensitive information in your settings files. You should be reading them from environment variables. We omit that step here to keep this tutorial simple.)

You should also addrest_frameworkto the installed apps section.

Whenever someone messages our bot, we want telegram to notify our django application. Then our application can take actions such as sending a reply. A webhook is a way for telegram to call us when someone is interacting with our bot.

A webhook is just a regular django view. It has a URL and it will receive data through the HTTP post method.

We will create a new app for our webhook views. Make sure you have pipenv activated and you are in the correct directory before running these commands.

Then open the settings file and add

Now open theviews.pyfile inside the newwebhooksapp and replace its contents with the following.

Here we have a plain rest framework view. When a request comes in, we are printing the post data and then return a JSON indicating a successful call.

Next, create aurls.pyinside

Then open your project’s mainurls.pyfile and add this to the existing URL patterns.

Don’t forget to update the import statements

from django.urls import include, path

python manage.py runserverand visit http://127.0.0.1:8000/webhooks/telegram/ from your browser. You should see the django rest framework view in your browser.

Enter some json in the content field and hit post. You should see the success response. If you open the terminal where django server is running, you should see the json data printed.

Setting Up Ngrock

When we develop our application, we need telegram to call our API but telegram cannot access the django server running on our computer. For this we will be using a tool called ngrock. You don’t have to do this if your API is deployed on a server.

The first step for this to go to ngrock website and follow the installation instructions for your operating system. Next, create an ngrock account from the website. You will get an API key once registration is complete.

Run the following command to set up your API key. You need to do this only once.

Next run ngrock tunnel using the following command.

Python-telegram-bot oop. Полное руководство Python по созданию Telegram Bot с использованием python-telegram-bot

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

1) как создать telegram-бота с помощью BotFather

2) задавать вопросы

3) получать и хранить ответы пользователей и фотографии

4) размещать эту информацию на общедоступном Telegram-канале

5) вызов API Google Maps, чтобы показать местоположение еды на карте.

Пищевые отходы - абсурдная проблема

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

В то же время 820 миллионов человек ежедневно голодают. Это кажется противоречивым - как мы можем тратить так много еды и в то же время позволить стольким людям в мире голодать? Это сводится к отсутствию связи между теми, у кого остались излишки и теми, кто нуждается в пище. Конечно, есть благотворительные организации, которые принимают пожертвования на питание, но нет прямой связи между теми, кто нуждается в еде и у того у кого продукты в избытке. В сочетании с удручающе запутанными регулирующими процессами неудивительно, что существует значительный временной промежуток между пожертвованиями продуктов питания и тем, когда они действительно приносят пользу, кто в них больше всего нуждается.

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

Конечно, это все звучит хорошо, но как мы можем реализовать это? Именно здесь боты и каналы Telegram предоставляют простое решение для связи поставщиков продуктов питания с теми, кто нуждается в пище.

Поставщики продуктов питания могут сначала пообщаться с ботом Telegram, чтобы предоставить важную информацию о еде, такую ​​как местоположение пищи, диетические характеристики и т.д. После того, как эта информация будет собрана, бот опубликует свои списки продуктов на канале Telegram, который доступен для общественности. Как только еда размещена на канале, нуждающиеся люди могут просто забрать еду. Все это может быть выполнено без какой-либо существенной задержки - фактически весь процесс отправки еды конечному пользователю, получающему информацию, может занять менее 10 секунд!

Иллюстрированный поток процесса размещения продуктов питания

Для этого бот будет задавать следующие вопросы из поста о продуктах:

  1. Расположение еды. Используя API Карт Google, местоположение будет преобразовано в соответствующие координаты широты и долготы, которые затем могут быть отображены на карте, чтобы пользователи могли легко перемещаться к этому местоположению.
  2. Изображение еды.
  3. Диетические характеристики, то есть, является ли еда халяльной, вегетарианской и так далее.
  4. Количество порций, доступных для приема.
  5. Время, за которое еда должна быть собрана, прежде чем она будет выброшена.

Пост с едой ответит на эти вопросы, а бот соберет ответы в одно сообщение. С этим кратким сообщением бот отправит информацию общедоступному каналу после того, как автор подтвердит правильность введенных данных.

Создание вашего бота

Теперь, когда у нас есть понимание того, как работает этот процесс, давайте перейдем к мельчайшим деталям!

Прежде всего, мы создадим бота. Для этого отправьте в телеграмме команду /newbot в BotFather. Он запросит у вас имя бота, а затем имя пользователя (которое должно заканчиваться на боте). Вы можете легко изменить имя бота с помощью команды /setname, но невозможно изменить имя пользователя бота через BotFather, поэтому, если вы не уверены, вы можете сначала создать тестового бота со случайным именем пользователя и после того, как вы проверили все функции и убедились, что ваш бот работает, создайте нового бота с желаемым именем пользователя.

Первое общение с BotFather - «one bot to rule them all»!

Setwebhook Telegram api. Making requests

All queries to the Telegram Bot API must be served over HTTPS and need to be presented in this form: /METHOD_NAME. Like this for example:

https://api.telegram.org/bot123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11/getMe

We support GET and POST HTTP methods. We support four ways of passing parameters in Bot API requests:

  • URL query string
  • application/x-www-form-urlencoded
  • application/json (except for uploading files)
  • multipart/form-data (use to upload files)

The response contains a JSON object, which always has a Boolean field 'ok' and may have an optional String field 'description' with a human-readable description of the result. If 'ok' equals True , the request was successful and the result of the query can be found in the 'result' field. In case of an unsuccessful request, 'ok' equals false and the error is explained in the 'description'. An Integer 'error_code' field is also returned, but its contents are subject to change in the future. Some errors may also have an optional field 'parameters' of the type, which can help to automatically handle the error.

  • All methods in the Bot API are case-insensitive.
  • All queries must be made using UTF-8.

Making requests when getting updates

If you're using, you can perform a request to the Bot API while sending an answer to the webhook. Use either application/json or application/x-www-form-urlencoded or multipart/form-data response content type for passing parameters. Specify the method to be invoked in the method parameter of the request. It's not possible to know that such a request was successful or get its result.

Please see ourfor examples.

Set webhook Telegram. Почему webhook

Чат‑бот в Telegram может работать в одном из двух режимов.

Один из них называется polling  — это когда код, непосредственно реализующий механику бота, опрашивает сервера Telegram с определенной периодичностью («не появилось ли чего новенького»). А если обнаружена активность в чате — реализуется определенная механика взаимодействия (общения).

Большинство материалов в интернете посвящено описанию того, как создавать ботов именно на этой механике, но мне (частное мнение без претензии на истину в последней инстанции) такой подход не очень нравится. Вот почему:

    не вижу смысла постоянно «дергать» сервера Telegram почем зря;

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

Второй режим работы ботов, webhook , подразумевает, что Telegram сам вызывает обработчик события/сообщения, когда в боте происходит какая‑то активность. Другими словами, код, реализующий механику бота, срабатывает по инициативе человека, который «общается» с ботом. Самый главный плюс от такого режима работы — ответ бота на действие человека происходит мгновенно: человек написал что‑то боту, Telegram тут же вызвал webhook, написанный код сразу «ответил» человеку.

Лирическое отступление: на тему «что лучше — polling или webhook» спорить можно бесконечно долго. Критерий истины: все зависит от решаемой задачи и от user‑story.

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

Python-telegram-bot webhook django. Вебхуки

Существуют два способа работать с Telegram Bot API (да и вообще со всеми микросервисами): пулинг и вебхуки.

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

    Webhook - это когда вы говорите серверам Телеги: присылай мне на мой URL события сам.

Первый способ сильно упрощает разработку ботов, в то время как второй требует поднятого веб-сервера, который будет слушать входящие сообщения и засовывать из в handlers, которые вы описали. Более того, серверы Телеграмма требуют настроенного HTTPS шифрования, поэтому, например, настроить вебхуки на ваш домашний IP без настроенного DNS вряд ли получится . Решение с ngrok поможет лишь протестировать работу бота через вебхуки, в продакшене его, конечно же, не надо использовать.

Если polling - отлично помогает при разработке телеграм бота, то Webhook отлично подходит для продакшена: в случаях наплыва пользователей, можно запустить два инстанса с вашими хендлерами, а заранее настроенный load balancer сам будет параллелить между ними входящие события по вебхуку (такая функция есть как в docker-compose, так и в большинстве современных облачных PaaS, таких как Heroku, Google App Engine или Digital Ocean App Platform).

Как работать с вебхуками в случае с Django? Просто создать view (), который получит входящий ивент от Телеграмма и отправит его в ваш обработчик событий (куда вы вешали handlers - логику реакций бота на разные действия пользователей) ().

Стоит создать Django Model для. И заполнять ее как минимум каждый раз, когда кто-то нажимает команду /start. В этом случае, все пользователи вашего бота будут аккуратно складываться в базу данных, и вы сможете как минимум их посчитать. Для этого рекомендую создать @classmethod , который будет создавать либо возвращать существующий объект класса User.

Telegram Bot api на русском. Introduction

At its core, you can think of the Telegram Bot API as software that provides JSON-encoded responses to your queries.

A bot, on the other hand, is essentially a routine, software or script that queries the API by means of anand waits for a response. There are several types ofyou can make, as well as many differentthat you can use and receive as responses.

Since your browser is capable of sending HTTPS requests, you can use it to quickly try out the API. After, try pasting this string into your browser:

/getMe

In theory, you could interact with the API with basic requests like this, either via your browser or other tailor-made tools like cURL . While this can work for simple requests like the example above, it's not practical for larger applications and doesn't scale well.
For that reason, this guide will show you how to use libraries and frameworks , along with some basic programming skills , to build a more robust and scalable project.

If you know how to code, you'll fly right through each step in no time – and if you're just starting out, this guide will show you everything you need to learn.

We will use Java throughout this guide as it's one of the most popular programming languages, however, you can follow along with any language as all the steps are fundamentally the same.
Since Java is fully cross-platform, each code example will work with any operating system.
If you pick another language, equivalent examples are available in C# , Python , Go and TypeScript .

Python-telegram Bot webhook flask. Соединение

Чем больше я работал с библиотекой telebot, тем больше она мне нравилась. Хотелось бы, используя приложение на flask’e, не терять эту возможность. Но как это сделать? Во-первых, мы можем вместо нашей функции send_message использовать готовую из библиотеки. Это будет выглядеть так:

from flask import Flask, request import telebot app = Flask(__name__) bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8') @app.route("/", methods=) def receive_update(): chat_id = request.json bot.send_message(chat_id, "Hello!") return "ok" if __name__ == "__main__": app.run()

Но, если присмотреться, можно заметить, что мы потеряли часть функционала, а именно @bot.message_handler - декораторы, которые отслеживают тип введенного боту сообщения (картинка, документ, текст, команда и т. д.). Получается, что если мы используем в качестве сервера наше flask приложение, то мы теряем некоторый функционал библиотеки telebot. Если же мы используем bot.polling(), то мы не можем обращаться к серверу “со стороны”. Конечно, хотелось бы как-то все соединить без потерь. Для этого я нашел немного костыльный способ, однако рабочий:

from flask import Flask, request import telebot bot = telebot.TeleBot('1111105161:AAHIjyAKY4fj62whM5vEAfotuixC5syA-j8') bot.set_webhook(url="https://8c6f687b75c9.ngrok.io") app = Flask(__name__) @app.route('/', methods=) def webhook(): bot.process_new_updates( ) return "ok" @bot.message_handler(commands=) def start_command(message): bot.send_message(message.chat.id, 'Hello!') if __name__ == "__main__": app.run()

Здесь мы пользуемся методом set_webhook, аналогично тому, как мы делали это ранее через postman, а на пустом роуте прописываем "немного магии", чтобы успешно получать обновления бота. Конечно, это не очень хороший способ, и в дальнейшем лучше самостоятельно прописывать функционал для обработки входящих сообщений. Но для начала, я считаю, это лучшее решение.