Чтобы создать ссылку на 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.