Добавить в корзинуПозвонить
Найти в Дзене

Python. Telegram bot. Deep links.

Давненько я ничего не писал про телеграмм ботов, да и смысла особого уже нет в наших реалиях. Однако, стоит напоследок затронуть тему с deeplink. Deeplink — это ссылка, которая при переходе открывает определенное место или выполняет определенное действие в приложении Telegram. Они бывают двух основных форматов: Давайте вкратце пробежимся по основным ссылкам, которые чаще всего используются при написании ботов. Чтобы поделиться ссылкой на пользователя, можно использовать: Где 123456789 — числовой ID пользователя, а username — его публичный юзернейм. Например: tg://user?id=777000 — ссылка на сервисный аккаунт Telegram. @bot.message_handler(commands=['owner'])
def send_user_link(message):
link_text = f"Нажми [сюда](tg://user?id={my_id}), чтобы написать пользователю."
bot.send_message(message.chat.id, link_text, parse_mode="Markdown", disable_web_page_preview=False) При вводе команды мы получим ссылку в сообщении (с форматированием markdown): @bot.message_handler(commands=['owner
Оглавление

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

Deeplink — это ссылка, которая при переходе открывает определенное место или выполняет определенное действие в приложении Telegram. Они бывают двух основных форматов:

  • Обычные URL вида https://t.me/... — работают в любом браузере и перенаправляют в приложение.
  • Схемы вида tg:// — работают только если Telegram установлен на устройстве.

Давайте вкратце пробежимся по основным ссылкам, которые чаще всего используются при написании ботов.

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

Чтобы поделиться ссылкой на пользователя, можно использовать:

  • tg-схему: tg://user?id=123456789
  • Обычный URL: https://t.me/username

Где 123456789 — числовой ID пользователя, а username — его публичный юзернейм.

Например: tg://user?id=777000 — ссылка на сервисный аккаунт Telegram.

  • Напишем обработчик команды /owner, который будет отправлять ссылку на нас:
@bot.message_handler(commands=['owner'])
def send_user_link(message):
link_text = f"Нажми [сюда](tg://user?id={my_id}), чтобы написать пользователю."
bot.send_message(message.chat.id, link_text, parse_mode="Markdown", disable_web_page_preview=False)

При вводе команды мы получим ссылку в сообщении (с форматированием markdown):

-2
  • Аналогично можно отформатировать текст сообщения в html:
-3
@bot.message_handler(commands=['owner'])
def send_user_link(message):
link_text = f'Нажми <a href="tg://user?id={my_id}">сюда</a>, чтобы написать пользователю.'
bot.send_message(message.chat.id, link_text, parse_mode="HTML")

  • Также мы можем добавить ссылку на нашего пользователя в кнопку:
-4
@bot.message_handler(commands=['owner'])
def send_user_link(message):
markup = InlineKeyboardMarkup()
button = InlineKeyboardButton(
text="Написать администратору",
url=f"tg://user?id={my_id}")
markup.add(button)
bot.send_message(message.chat.id, "Связь с админом:", reply_markup=markup)
-5

Заметьте, мы используем обычную inline кнопку без payload, но с вшитым url на пользователя. Телеграмм сам понимает, что ссылка ведет на пользователя и подставляет в кнопку иконку.

Ссылки на канал или группу

Для групп/каналов с публичным юзернеймом:

  • https://t.me/chat_username

Для приватных групп/каналов используется пригласительная ссылка:

  • https://t.me/joinchat/AbCdEfGhIjKlMnOp

Такую ссылку можно получить в настройках группы (Управление группой → Пригласить по ссылке).

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

Ссылки на бота

А теперь перейдем к самому интересному. Deeplink на бота - самый часто используемый функционал для интеграции ботов с внешними системами.

Ссылка для запуска бота с параметром выглядит так:

https://t.me/my_bot?start=hello_world

При переходе по ней бот получит команду /start hello_world. Параметр start может содержать любую строку (обычно до 64 символов). Это идеально для:

  1. Реферальных программ (start=ref_12345)
  2. Авторизации (start=token_a1b2c3)
  3. Передачи контекста из других приложений

  • Напишем функцию, которая будет обрабатывать payload из ссылки:
-6

При переходе по ссылке https://t.me/my_bot?start=123123 пользователь автоматически отправит сообщение /start боту, но с указанной строкой через пробел:

-7

Боту же придет сообщение: "/start 123123"

  • Добавим обработку разных deeplink:
-8
@bot.message_handler(commands=['start'])
def start_message(message):
if len(message.text.split()) > 1:
full_payload = message.text.split()[1]
payload_args = full_payload.split('_')
match payload_args[0]:
case 'ref':
bot.send_message(message.chat.id, f'Ваш реферальный токен: {payload_args[1]}')
case 'token':
bot.send_message(message.chat.id, f'Ваш токен авторизации: {payload_args[1]}')
case _:
bot.send_message(message.chat.id, 'Неизвестный аргумент')
else:
bot.send_message(message.chat.id, message.text)

  • Заметьте: каждый раз боту приходит просто команда /start:
-9

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