Рубрики
Без рубрики

Как настроить Push-уведомления в вашей телеграмме бота

Автор оригинала: FreeCodeCapm Team.

Никита Холян

Telegram – отличная платформа с большим количеством отличных пользователей (я сам пользователь Telegram). И каково было бы лучшим способом для пользователей Telegram получать уведомления? Мы не можем точно знать. Может быть, им нравится электронная почта или что-то еще. Но мы можем догадаться, что отправка уведомлений о телеграмме будет довольно удобной.

Если вы хотите отправить уведомления Telegram из вашего приложения, вы пришли в нужное место. Я добавил эту функцию для мое приложение и я люблю это.

Одна быстрая нота. В этой статье я предоставляю примеры кода в Python. Но идеи не являются Python, и могут быть переведены на другой язык без каких-либо мостлей.

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

Создать бот телеграммы

Прежде всего, вам нужно создать бот телеграммы. Для этого вам нужно использовать другую телеграмму BOT, Botfather Отказ Просто поговорите с ним (нажмите Старт).

Теперь вы видите, что это может сделать. Но что нас интересует создание нового бота, так что это то, что мы собираемся выбрать ( /Newbot ).

Вы быстро собираетесь узнать, что имя бота должно закончиться «ботом». А поскольку вы как я, и приходите в игру слишком поздно, большинство имен ботов уже сделаны.

Но в конце концов, вы собираетесь найти имя для своего бота и получить токен доступа, нам понадобится.

Теперь, когда у вас есть бот, пользователи Telegram могут найти и использовать ее. Но есть одна проблема – вы не можете ассоциировать пользователей, которые приходят из Telegram для пользователей в вашем приложении. Позвольте мне показать вам, почему.

Как только пользователь нажимает кнопку «Пуск» на вашем боте, вы получите «Обновление». Вы можете проверить все обновления BOT даже в вашем браузере, посетив следующую URL https://api.telegram.org/bot (bot_token )/getupdates (Не забудьте использовать токен доступа в URL). Вот что я получил:

Не могу ничего читать? Не волнуйся. Вы можете исправить это, устанавливая несколько расширений Prettifier JSON в вашем браузере. Я использую JSON Formatter для хрома. Это выглядит намного лучше.

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

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

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

Можем ли мы сделать лучше?

Связывание пользователя

Конечно можем. Чтобы связать пользователя, мы будем использовать технику под названием Глубокая связка Отказ

Во-первых, вам нужно создать случайный уникальный токен для каждого пользователя. Я использовал следующий код для генерации токена с помощью Python:

from secrets import token_urlsafetoken = token_urlsafe(8)token# => 'uEDbtJFHxKc'

Затем вам нужно сохранить этот токен, чтобы иметь возможность найти пользователя с ним позже. Вы можете сохранить его в вашу базу данных или использовать некоторое другое место, например, кэш. У меня есть Уведомление Модель, поэтому я добавил поле на стол модели.

class Notification(models.Model):    user = models.ForeignKey(User, on_delete=models.CASCADE)	# ...    connect_token = models.CharField(max_length=64, null=True)

Итак, мы сгенерировали UEDBTJFHXKC токен и сохранил его. Теперь нам нужно использовать этот токен в URL для бота Telegram, который пользователь должен нажать, чтобы сделать все возможное:

telegram_url = 'https://www.telegram.me'bot_name = 'music_notification_bot'token = 'uEDbtJFHxKc'url = f'{telegram_url}/{bot_name}?start={token}'

Теперь, когда у нас есть наш URL, https://telegram.me/music_notification_bot?start=uedbtjfhxkc ' , пришло время показать его пользователю. Просто отобразите его в любом месте своего приложения и подождите, пока пользователь нажимает на него.

Как только пользователь берет приманку и нажимает «начать», вы должны получить другое обновление:

{    "ok": true,    "result": [        // ...        // previous updates       	// ...		{			"update_id": 599162365,			"message": {                "message_id": 174,                "from": { ... },                "chat": { ... },                "date": 1549788357,                "text": "/start uEDbtJFHxKc",                "entities": [ ... ]        	}        }    ]}

Наконец мы можем идентифицировать наш пользователь. текст Поле сейчас содержит наш токен пользователя. Давайте пойдем вперед и выберете это из этого поля:

bot_token = 'your_bot_token'updates_url = f'https://api.telegram.org/bot{bot_token}/getUpdates'import requestsresponse = requests.get(updates_url).json()text = response['result'][0]['message']['text']text# => '/start uEDbtJFHxKc'splitted_text = text.split(' ')# => ['/start', 'uEDbtJFHxKc']token = splitted_text[-1]# => 'uEDbtJFHxKc'

Этот токен можно использовать для поиска пользователя. Ваша реализация зависит от того, как вы сохранили токен в первую очередь. Но вот как я это делаю:

notification = Notification.objects.get(channel='telegram', connect_token=token)user = notification.user

Таким образом, пользователь нажал кнопку «Пуск». Но они видят, что ничего не произошло. Давайте по крайней мере приветствуем их.

Чтобы приветствовать пользователя, нам нужно обнаружить, что пользователь начал разговор с нашим ботом. Существует два варианта для того, как мы можем сделать это: опрос и окно.

Вы уже знаете, что такое опрос. Вы уже сделали это. Или, по крайней мере, видел меня сделать это. Как только мы проверили https://api.telegram.org/bot (bot_token )/getupdates Страница мы сделали один опрос. Опыление постоянно проверяет обновления, каждые 2 секунды. Таким образом, мы всегда можем знать, когда кто-то взаимодействует с ботом.

WebHooks взять немного другого направления. Вместо того, чтобы проверять каждые 2 секунды для обновлений, мы просто ждем, когда произойдет обновление. И когда произойдет, телеграмма отправит запрос с обновленными данными на URL-адрес, который мы указываем. Таким образом, мы можем дать как наши, так и телеграмму серверов немного отдыха и просто ждать приехать обновления.

Опрос может быть лучше, если у вас есть высокий трафик, но, к сожалению, это скорее исключение, поэтому я решил пойти с веб-капустом.

Веб-образ

Установка веб -ook в телеграмме очень легко. Вам просто нужно отправить запрос на https://api.telegram.org/bot (bot_token )/setwebhookurl= (Your_server_url} Отказ Открытие этой ссылки в вашем браузере тоже работает. your_server_url У URL Telegram отправит обновления на. Вот что вы должны получить в ответ:

{    "ok": true,    "result": true,    "description": "Webhook was set"}

Если вы не доверяете себе, вы можете посетить https://api.telegram.org/bot (bot_token )/getwebhookinfo Просто до Дублехика, что все в порядке. Вы должны увидеть что-то вроде этого:

{    "ok": true,    "result": {        "url": "https://example.com/your_server_endpoint",        "has_custom_certificate": false,        "pending_update_count": 0,        "max_connections": 40    }}

Сейчас. Если что-то не в порядке (например, вы устанавливаете неправильный URL), вы всегда можете удалить веб -ook, посетив https://api.telegram.org/bot (bot_token )/deletewebhook а затем снова настроить окно.

Местное развитие

Прежде чем продолжить, я хотел бы сказать несколько слов о местном развитии. WebHooks не очень подходит для этого. WebHooks отправляются на URL и, скорее всего, вы не знаете URL вашего компьютера. Кроме того, Telegram WebHook требует, чтобы URL был безопасным (HTTPS).

Но есть решение этой проблемы: Ngrok Отказ NGROK – это инструмент, который обнажает вашу местную среду в мир. Скачать Ngrok , установите его и запустите его с портом, на котором работает ваш сервер. Мой сервер работает на 8000 порт, поэтому мне нужно будет бежать в консоли

/path/to/ngrok http 8000

Тогда Ngrok должен дать вам URL, который вы можете использовать для установки веб-капуста.

Приветствуя пользователя

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

Как только пользователь нажимает «Пуск», ваша телеграмма отправит обновление на URL-адрес вашего сервера. Интересные части обновления должны выглядеть так:

{    "message": {        "chat": {            "id": 457        },		"text": "/start uEDbtJFHxKc",    }}

Это идеальное время, чтобы связать пользователь, используя текст сообщения. Существует также интересная часть информации, идентификатор чата. Идентификатор чата – это то, что нам нужно отправить сообщение для этого пользователя. У Telegram есть конечная точка API, чтобы отправить сообщение, которое выглядит так https://api.telegram.org/bot (bot_token )/sendmessage?chat_id= (kat_id }&text= {stext} . Отказ Я не уверен, что мне нужно объяснить, как использовать его, но вот что мой код, который обрабатывает веб -ookook:

import jsonimport requestsdef callback(request):    body = json.loads(request.body)    text = body['message']['text']    token = text.split(' ')[-1]    associate_user_by_token(token)    bot_key = os.environ.get('TELEGRAM_API_KEY')    chat_id = body['message']['chat']['id']	text = "Welcome!"	send_message_url = f'https://api.telegram.org/bot{bot_key}/sendMessage?chat_id={chat_id}&text={text}'	requests.post(send_message_url)

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

Толкание уведомлений

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

Вы уже знаете, как отправить уведомления. Вам просто нужно отправить сообщение, используя https://api.telegram.org/bot (bot_token )/sendmessage?chat_id= {at_id }&text= {notification_text} . Отказ

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

Вы также можете включить ссылки или другое форматирование в вашем сообщении. В этом случае вам нужно будет добавить другой параметр на URL отправки сообщений parse_mode Отказ Существует 2 варианта анализа: Markdown или HTML. Я использую Markdown, так как я нахожу это проще в использовании. Если вы не знакомы с Markdown, вы можете использовать HMTL, но я бы порекомендовал читать Насколько легко Markdown Отказ

Вот как у URL отправляемого сообщения выглядит на parse_mode параметр https://api.telegram.org/bot (bot_teken )/sendmessage?chat_id= (kat_id reciply stext=) Отказ

Я добавляю ссылки на новые выпуски в текст уведомлений, например {Release.date}: {Release.artist.name} - [{Release.title}] ({release.url}) Отказ Вы можете прочитать больше о том, как отформатировать ваши сообщения здесь Отказ

Кроме того, есть Доступнее больше параметров Для URL-адреса отправки сообщения как disable_notification Отказ Всегда есть место для изучения.

Заключение

Теперь вы должны знать, как

  • Создайте бот в телеграмме, используя botfather
  • Проверьте наличие обновлений (и что лучше – WebHooks или опрос)
  • ассоциировать пользователь, используя глубокое связывание
  • Отправьте приветственное сообщение и продолжайте отправлять уведомления
  • Формат сообщения, которые вы отправляете

Надеюсь, эта статья была полезна для вас. Это пятая часть ряд статей о Мун Отказ Оставайтесь настроек для части 6. Вы можете найти Кодекс этого проекта , а также моих других проектов, на мой Страница GitHub Отказ Оставьте свои комментарии ниже и следуйте за мной, если вам понравилась эта статья.

Первоначально опубликовано https://kholinlabs.com/telegram-push-notifications 12 февраля 2019 года.