Чтобы создать ссылку на Telegram-бота, соедините https://t.me/ и его username без знака @. В шаблоне ниже замените BOT_USERNAME именем своего бота:

https://t.me/BOT_USERNAME

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

Если нужна просто ссылка для знакомых, откройте профиль своего бота в Telegram, найдите username и подставьте его в первую строку. Откройте полученный адрес и убедитесь, что попали в нужный чат. На этом задача с обычной ссылкой выполнена; токен и команды из дальнейшего упражнения вам не понадобятся.

Для двух разных входов удобно сначала собрать адреса с ИИ. Откройте DeepSeek в новом чате и вставьте запрос ниже; привычный ChatGPT или Claude тоже подойдёт.

Помоги собрать ссылки на моего Telegram-бота по этой статье.
Сначала спроси, нужна ли мне обычная ссылка или два входа:
каталог наборов для похода и помощь с выбором. Попроси только
публичный username, токен для сборки ссылок не нужен.
Покажи один следующий шаг и дождись моего результата.
Объясняй, куда вставить адрес и что проверить после открытия.
Если нужны разные ответы, сначала выясни, где они уже настроены:
в конструкторе, программе или пока нигде. Не обещай, что метка
в адресе сама создаст каталог. Техническую проверку по статье
объясняй по одному действию и только после выбора этого пути.
Экран я опишу словами; при ошибке разбери её текст без секретов.

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

Разберём обе ссылки и проверим, какая команда приходит боту. Для повторения технической части понадобятся отдельный собственный учебный бот, личный диалог с ним и Bash с curl. Запросы отправляются вручную. В работающем боте приём команды и выбор ответа выполняет уже подключённая программа или конструктор.

Как создать ссылку на Telegram-бота для двух сценариев

Возьмём учебный бот с наборами для похода. Все наборы и тексты ниже придуманы для примера. На витрине посетитель хочет увидеть состав наборов; в справке ему нужно понять, как их различать.

Обе ссылки используют один username:

Откуда приходит человек Ссылка после замены BOT_USERNAME Какой вход передаём
Витрина с наборами https://t.me/BOT_USERNAME?start=catalog Каталог, метка catalog
Страница с пояснениями https://t.me/BOT_USERNAME?start=help Помощь, метка help

В ссылку подставляется именно username, по которому открывается бот. Название в шапке чата может содержать пробелы и отличаться от него. Если своего бота пока нет, начните с регистрации через BotFather.

Часть ?start=catalog передаёт короткую метку. После запуска по такой ссылке бот получает сообщение:

/start catalog

Для второго входа ожидается другое сообщение:

/start help

Так работает deep linking в Telegram. Названия catalog и help выбраны нами. Содержимое каталога и помощи задаёт обработчик этих команд.

Что должно произойти после нажатия ссылки

Откройте ссылку в Telegram и нажмите Start / «Начать», чтобы передать выбранный вход. В официальной спецификации Bot links этот шаг предусмотрен и для человека, который уже запускал бота раньше.

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

Для своих меток используйте латинские буквы, цифры, подчёркивание или дефис. В параметре допускается до 64 символов. В нашем примере хватает коротких слов. Пробел и слеш в эти метки не входят: help и catalog передаются двумя отдельными ссылками.

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

Проверьте username и подготовьте учебный диалог

Если ссылка ведёт на действующего бота с готовым обработчиком, сверяйте вход в его обычном журнале и смотрите ответ. Ручной getUpdates ниже используйте на отдельном учебном боте без конструктора, webhook и другой программы, получающей его события.

В Bash введите токен скрыто и запросите сведения о боте:

read -r -s -p 'Токен учебного бота: ' LINK_BOT_TOKEN
printf '\n'
printf 'url = "https://api.telegram.org/bot%s/getMe"\n' "$LINK_BOT_TOKEN" |
  curl --silent --show-error --max-time 20 --config -

При ok:true найдите result.username. Метод getMe помогает сверить, какому боту принадлежит этот токен. Введите username из ответа без @:

read -r -p 'result.username: ' LINK_USERNAME
printf 'Каталог: https://t.me/%s?start=catalog\n' "$LINK_USERNAME"
printf 'Помощь: https://t.me/%s?start=help\n' "$LINK_USERNAME"

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

Теперь убедитесь, что для него свободен ручной способ получения сообщений:

printf 'url = "https://api.telegram.org/bot%s/getWebhookInfo"\n' "$LINK_BOT_TOKEN" |
  curl --silent --show-error --max-time 20 --config -

Продолжайте при ok:true и пустом result.url. Заполненный URL означает подключённый webhook; выберите другого учебного бота. Пустое поле проверяет только webhook, отсутствие другой программы с getUpdates проверьте по собственным подключениям.

В Telegram отправьте этому боту обычное /start и получите сообщение:

LINK_OFFSET=0
printf 'url = "https://api.telegram.org/bot%s/getUpdates"\n' "$LINK_BOT_TOKEN" |
  curl --silent --show-error --max-time 20 --config - --request POST \
    --data-urlencode "offset=$LINK_OFFSET" \
    --data-urlencode 'limit=1' \
    --data-urlencode 'timeout=0' \
    --data-urlencode 'allowed_updates=["message"]'

В result найдите своё /start. Из message.chat.id возьмите адрес диалога, из message.from.id сохраните отправителя:

read -r -p 'message.chat.id: ' LINK_CHAT_ID
read -r -p 'message.from.id: ' LINK_OWNER_ID

После обработки события запишите его update_id и подготовьте следующий номер:

read -r -p 'Обработанный update_id: ' LINK_UPDATE_ID
LINK_OFFSET=$((LINK_UPDATE_ID + 1))

Для следующих чтений повторяйте блок getUpdates со строки printf, с текущим LINK_OFFSET. Начальное LINK_OFFSET=0 повторять больше не нужно. Мы получаем по одному событию, чтобы разбирать их по порядку. Если перед ожидаемым сообщением пришло более раннее, сначала разберите его и обновите offset. Пустой result:[] означает, что сейчас нового события нет.

Очередь и подтверждение через offset описаны в getUpdates. Каждый ответ сначала прочитайте: при ok:false причина указана в description. Токен во всех запросах передаётся curl через стандартный ввод и остаётся отдельно от публичных ссылок.

Откройте каталог по первой ссылке

Подготовьте два разных ответа. Каталог перечисляет составы, помощь объясняет, как читать этот список:

LINK_CATALOG_TEXT='Каталог учебных наборов. «Налегке»: рюкзак и коврик. «Ночёвка»: рюкзак, коврик и палатка.'
LINK_HELP_TEXT='Помощь. Список под названием набора показывает его состав. Если нужна палатка, смотрите «Ночёвку»; для сравнения составов откройте ссылку «Каталог».'
printf -v LINK_HELP_TEXT '%s\nКаталог: https://t.me/%s?start=catalog' "$LINK_HELP_TEXT" "$LINK_USERNAME"
printf -v LINK_HOME_TEXT 'Учебный бот наборов.\nКаталог: https://t.me/%s?start=catalog\nПомощь: https://t.me/%s?start=help' "$LINK_USERNAME" "$LINK_USERNAME"
printf -v LINK_UNKNOWN_TEXT 'Такой вход пока не настроен.\n%s' "$LINK_HOME_TEXT"

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

Откройте ранее собранную ссылку с ?start=catalog, нажмите Start и выполните getUpdates с текущим offset. Сверьте message.chat.id и message.from.id с сохранёнными значениями. В message.text ожидается /start catalog.

При таком входе выберите текст каталога:

LINK_REPLY="$LINK_CATALOG_TEXT"

И отправьте его в свой проверенный диалог:

printf 'url = "https://api.telegram.org/bot%s/sendMessage"\n' "$LINK_BOT_TOKEN" |
  curl --silent --show-error --max-time 20 --config - --request POST \
    --data-urlencode "chat_id=$LINK_CHAT_ID" \
    --data-urlencode "text=$LINK_REPLY"

Ожидаемый вид ответа:

Каталог учебных наборов. «Налегке»: рюкзак и коврик.
«Ночёвка»: рюкзак, коврик и палатка.

При успешном ответе Bot API сверьте сообщение в чате. Если отправка оборвалась, сначала посмотрите, появилось ли оно, затем решайте вопрос повтора. После обработки обновите offset по событию /start catalog.

Проверьте помощь и два запасных входа

Теперь откройте ссылку с ?start=help, снова нажмите Start и прочитайте следующее событие. Проверьте тот же чат, отправителя и текст /start help. Затем задайте:

LINK_REPLY="$LINK_HELP_TEXT"

Повторите полный блок sendMessage выше. Вместо списка составов должен прийти текст, начинающийся со слова «Помощь». После обработки обновите offset.

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

Для общего входа отправьте в чате /start без параметра. Для проверки неизвестной метки отправьте /start unknown. Каждое сообщение получите отдельным getUpdates, сверьте чат и отправителя и выберите соответствующий ответ по таблице:

Полученный message.text Что задать перед sendMessage Ожидаемый смысл ответа
/start catalog LINK_REPLY="$LINK_CATALOG_TEXT" Состав двух учебных наборов
/start help LINK_REPLY="$LINK_HELP_TEXT" Пояснение к выбору и чтению каталога
/start LINK_REPLY="$LINK_HOME_TEXT" Общий вход с выбором из двух исходных ссылок
/start unknown LINK_REPLY="$LINK_UNKNOWN_TEXT" Сообщение о ненастроенном входе и возврат к известным ссылкам

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

В постоянном боте эта таблица становится правилом для обработчика /start. Общий адрес остаётся одним, а допустимые метки выбирают разные ответы. Наши ручные запросы демонстрируют этот порядок; после закрытия терминала обработку должен продолжать отдельный работающий обработчик.

Что проверить перед размещением ссылки

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

  • У обеих ссылок одинаковый проверенный username, параметры различаются.
  • Каталог передаёт /start catalog и показывает составы.
  • Помощь передаёт /start help и показывает пояснение.
  • Обычный /start и неизвестный параметр дают понятный общий путь.

Если ссылка открывает другого бота, начните с username. Если открывается правильный чат, но приходит только /start, сравните полный адрес с шаблоном и проверьте, сохранилась ли часть ?start=.... Если метка приходит верно, а раздел остаётся общим, проверьте её обработку.

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

Вопросы и ответы

Нужно ставить @ в ссылке?

В адресе https://t.me/BOT_USERNAME знак @ перед username опускается. В переписке можно отдельно указать @username, но для размещения полной ссылки используйте адрес с https://t.me/.

Что делать, если человек уже запускал бота?

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

Почему бот открылся, а каталог не появился?

Сначала проверьте Start и полученный message.text, затем ответ обработчика. Наличие ?start=catalog в адресе задаёт входную метку. Текст каталога выдаёт программа или, в нашем упражнении, ручной запрос sendMessage.

Эта ссылка добавит бота в группу?

Ссылка с start предназначена для личного диалога. Для добавления в группу используется другой параметр, startgroup. Это отдельный сценарий с выбором группы; текущая инструкция его не настраивает.

Можно дать обычную ссылку без настройки двух разделов?

Можно. Адрес https://t.me/BOT_USERNAME открывает чат с ботом. Параметры понадобятся, когда нужен определённый вход, а ответы на команды всё равно задаются в самом боте. Для простой ссылки токен и запросы Bot API не требуются.

Сохраните карту двух входов

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

С той же парой ссылок откройте практику сценария бота. В «Что запускает сценарий» внесите обе команды с параметрами, в «Что получает человек» сохраните разные ответы, а в «Неверный вход и отказ» укажите неизвестную метку. В «Первопроходцах» можно задать вопрос по собственной работе; проектные работы Никита Малов проверяет лично и даёт правки. Боты относятся к более позднему этапу программы, до которого участник проходит основы и предыдущие задания. Для разбора подготовьте конкретную пару «полученная команда и фактический ответ».

Официальные справки Telegram сверены 20 октября 2026 года. Наборы, тексты ответов и ожидаемые сообщения составлены для учебного примера. Обложка создана с помощью ImageGen.