У моего демо-бота один адресный ствол — t.me/millerpro_demo_bot. Но ссылка с окончанием ?start=lead ведёт к вопросу «Какая работа нужна?», а с ?start=booking — «На какую услугу записать?». Бот тот же. Ремонтом ванной он интересуется в одном случае, стрижкой — в другом. Разница помещается после знака равенства.
Я Владислав, делаю Telegram-ботов и показываю их устройство на собственном демо. Здесь мне нравится маленькая подробность — человеку, который пришёл посмотреть запись на услуги, незачем сначала выбирать её в общем меню, поскольку нужный первый вопрос уже можно указать в ссылке. (До выбора стрижки дело ещё не дошло, а выбирать лишний раздел уже не пришлось.)
Это и есть ссылка на бота с параметром start; у Telegram для такого входа есть название deep link. В адресе остаётся username бота, после него идут знак вопроса, слово start, знак равенства и короткая метка — подсказка программе, с какого места начать разговор. Смысл слова booking задаю я, когда пишу обработчик.
Вот вход в сбор заявок, который стоит и на моей главной. Telegram передаёт боту стартовую команду с аргументом — /start lead. Моя программа получает lead, находит соответствующую функцию и показывает начало анкеты. В ней можно выбрать ремонт ванной, кухню под ключ, замену проводки или другую работу. Это демонстрационная мастерская, а не рассказ о заказчике, которому я будто бы передал такую заявку.
По ссылке на запись приходит /start booking. Тут уже начало другого сценария: стрижка, окрашивание, маникюр. Можно выбирать услугу, затем день и свободное время. Ссылка избавляет от поиска раздела, но услугу за человека не выбирает. В моей реализации запись появляется в базе после выбора времени и повторной проверки, что оно ещё свободно.
Мне полезно держать рядом эти два момента — открыли сценарий и завершили действие, иначе легко самому себе приписать лишнюю автоматизацию и принять появление первого вопроса за готовую заявку, хотя посетитель пока ничего о себе не сообщил. В заявках после входа ещё надо выбрать работу, указать удобное время звонка, написать имя; только потом обработчик сохраняет результат. Слово lead в адресной строке имени не содержит и анкету за посетителя не заполняет.
Дверь открыта — заявки пока нет.
При первом открытии чата Telegram показывает кнопку Start — запуск ещё нужно подтвердить. Сам переход с сайта я бы не считал полученной командой. С произвольным сообщением похожая история. Через start нельзя просто приказать Telegram отправить от имени посетителя любой приготовленный текст в чат. Документированный результат такого запуска — служебная команда /start с параметром. Дальше отвечает бот, а человек нажимает кнопки или пишет сам. Я не стал бы подписывать кнопку на сайте «Заявка отправлена», если она всего лишь ведёт на начало анкеты.
Правила самой метки я сверяю с документацией Telegram. Допустимы латинские буквы A–Z и a–z, цифры, подчёркивание и дефис. Максимум — 64 символа в параметре, не во всём адресе. Кириллицу, пробелы и произвольную строку с пунктуацией туда буквально не подставишь. Для кодирования другого содержимого Telegram рекомендует base64url; после кодирования ограничение длины никуда не исчезает.
У меня в демо шесть коротких ключей: lead, booking, shop, chat, paid, api, каждый связан со своей функцией в словаре STARTERS. В обработчике я беру аргумент команды, убираю пробелы по краям и проверяю точное совпадение со словарём — нашёл, вызываю нужное начало, не нашёл, показываю общее меню. По отсутствующей метке бот не догадывается, чего хотел посетитель.
Здесь возникает соблазн дописать к booking название рекламной площадки. Скажем, придумать booking_site и считать, что теперь всё готово и для записи, и для учёта источника. Но такого ключа у моего демо нет. По нынешнему коду получится общее меню, а не запись. Программе придётся отдельно объяснить, где в значении имя сценария, где источник и куда его сохранить. В моём обработчике start такого разбора и сохранения источника нет.
Длина здесь даже не главная трудность. Можно уложиться в разрешённые символы и всё равно не попасть в нужный экран — потому что никто не написал обработку нового значения. При описании задачи я бы начал с первого вопроса, который должен увидеть человек, а следом оговорил поведение при ошибочной метке. И лишь потом подбирал короткое слово для ссылки.
У демо связи с сайтом своя граница. Начальная функция показывает кнопки формы и таблицы, при необходимости готовит для них токен. Но строка заявки появится после отдельного действия: отправки формы или нажатия соответствующей кнопки в боте. Даже здесь, где рядом уже сайт и таблица, запуск сценария и отправка данных остаются разными шагами.
С авторизацией я был бы ещё осторожнее. Telegram допускает передачу через deep link токена для связи аккаунтов, но проверку такого токена должна выполнять программа. Обычная метка lead ничего не доказывает о правах человека — её видно в адресе, её можно скопировать, а в моём start она всего лишь выбирает сценарий. Паролем она от этого не становится.
Для добавления бота в группу предусмотрен другой параметр — startgroup. Он предлагает выбрать группу. Подменять им start в ссылке на личную анкету незачем: это другой вход, с другим действием пользователя. Я бы оставил ссылку на запись ссылкой на запись, без попытки поручить короткому хвосту адреса сразу всю работу бота.
Повторный запуск тоже заслуживает внимания. У себя я очищаю ожидание текстового ответа, когда приходит новая команда start, чтобы человек, остановившийся на имени в анкете и затем запустивший другой сценарий, не обнаружил, что программа по-прежнему ждёт от него имя для старой заявки. Но в самом обработчике старта нет очистки всех корзин и готовых записей. Начать разговор заново и стереть накопленные данные — разные решения разработчика.
Я не знаю, сколько посетителей моего сайта после такого входа доходят до покупки — подтверждённых данных о конверсии для этого сравнения у меня нет. По ссылке и исходнику можно проверить выбор сценария, но сделать из этого обещание продаж было бы уже моей выдумкой. Даже правильно открытая анкета может остаться незаполненной.
У короткого lead в моём демо впереди ещё выбор работы и времени звонка. Потом бот спрашивает: «Как к вам обращаться?» На это в адресной строке ответа нет.