Пора делать нормальных телеграм-ботов #3

Очень неочевидные вещи, о которых никогда не приходится задумываться, пока не сталкиваешься с реальными проблемами [иногда очень злонамеренного неправильного] использования ботов

Предыдущие части:

#1 Про кнопочки, интерфейс и внешний вид в общем

#2 Про недоверие к пользователям и самому телеграму

Я не думал, что выход этой части затянется почти на год, однако я узнал несколько новых вещей, о которых не задумывался или вовсе не знал (по большей части, они бесполезны лично для меня и моих ботов, потому и несильно был разочарован своим незнанием; но узнавать что-то новое, даже если оно бесполезно на данный момент, всегда полезно), часть из которых тоже будет здесь.

1. Язык вашего бота – его враг (и ваш)

Не в прямом смысле, конечно, но то, что отправляет бот, является сообщением, какой-то информацией, которая может вредить, быть запрещённой в некоторых странах и т. п. Будьте аккуратны при отправке, например, сгенерированных текстов ChatGPT или подобных решений, поскольку любой получатель сообщения может отправить жалобу на сообщение, и никакие дисклеймеры о том, что сообщение не отражает официальную позицию или мнение разработчика и блаблабла, не помогут. Особенно будьте аккуратны при рассылке рекламы. Если достаточно пользователей пожалуются на спам, ваш бот будет удалён.

Что происходит при удалении бота из-за жалоб? Он просто перестаёт существовать. Ни в @BotFather, ни в списке контактов вы его не увидите.

Что делать? Попробуйте написать в @BotSupport, вдруг ответят.

2. Нежданные сообщения – зло.

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

Как не докучать неактивным пользователям? Есть несколько вариантов:

  • Вы не собираете статистику, не храните список пользователей — в этом случае вы не сможете рассылать сообщения, пока не узнаете ID пользователя, то есть пока не получите сообщение от него, которое (помимо прочего) содержит это поле.
  • Вы не собираете статистику, но храните список пользователей — в этом случае храните и время последнего действия пользователя. Действие — это обычное сообщение, нажатие на кнопку, какие-то действия в WebApp и прочее, что будет точно говорить о том, что пользователь использует бота. Однако, когда пользователь блокирует бота или удаляет его из списка заблокированных, вы получаете сообщение об этом, которое нельзя считать активностью.
  • Вы собираете статистику, но не храните список пользователей — в этом случае статистика обезличена, но неточна, ведь пользователь может повторно что-то сделать, и статистика снова посчитает это за очередное анонимное действие. В любом случае, нужен ID пользователя (которого у вас нет), чтобы отправить сообщение, когда пожелаете, так что этот вариант, скорее всего, никто никогда не использует.
  • Вы собираете статистику и храните список пользователей — самый распространённый вариант, используемый разработчиками ботов, которые на них же и зарабатывают. Чаще всего такой вариант включает удобную веб-панель для администрирования и прочие удобства, плюс приносит неплохой доход от рекламы (или прочих платных действий пользователей), так как пользователей у ботов десятки тысяч и более. Такие боты специально отслеживаются официальным мониторингом, даже следят за статистикой сообщений, чтобы расширять (скорее всего, я точно не знаю) стандартные лимиты на количество сообщений в секунду и прочие, и в случае отказа пришлют вам сообщение с просьбой проверить, всё ли у вас в порядке, ведь ваш бот отвечал не на все поступавшие обращения в течение какого-то времени. Очень часто я сталкиваюсь с этими ботами, и, на удивление, у всех одна и та же проблема: они шлют письма всем. Вообще всем, кто у них есть в базе. Бессмысленно рассылать сообщения тем, кто не пользуется ботом уже давно и не блокирует его. Достаточно рассылать тем, кто хотя бы в течение 48 часов был активен. Я не считаю агрессивную рекламу правильной по отношению к пользователю, но я смотрю с точки зрения пользователя, а не маркетолога, поэтому мнения будут расходиться. Такие боты не могут удалить пользователя из базы (или обезличить, потому что скорее всего в базе данных поле с ID пользователя используется в качестве уникального идентификатора строки) из-за целостности статистики, однако они всё же могут добавить флаг блокировки пользователя, чтобы не отсылать ему ненужные сообщения.

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

3. Данные в нажимаемой кнопке могут занимать только 64 байта

Я написал байта, а не символа, потому что телеграм использует кодировку UTF-8, символ в которой, в общем-то, может весить от 1 до 4 байт. Пока в параметры с текстовым наполнением (типа callback_data в кнопке или text в сообщении) вы вписываете латинские буквы, цифры и знаки препинания (всё, что есть печатаемого в таблице ASCII), каждый символ будет занимать 1 байт. Как только вы переходите на кириллицу – каждый её символ будет занимать 2 байта (так как будет кодироваться в JSON-формате, в отличие от латиницы, например). Эмодзи занимают уже от 2 до 4 байт. В итоге из 64 символов у вас остаётся вдвое – а то и вчетверо – меньше. Но я бы не написал это просто так, чтобы напомнить. В телеграме (насколько мне известно) все шрифты одинаково отображают латиницу и кириллицу, а значит разницы между латинской «a» и русской «а» пользователь не заметит. Поэтому для экономии места все совпадающие с латинскими по начертанию кириллические символы можно заменять.

4. Данные в нажимаемой кнопке – это то, что можно подсмотреть и подделать

В прошлый раз я написал, что для защиты от нажатия на «опасные» кнопки дважды можно в каждую добавлять генерируемый при отправке этих кнопок секрет, а потом его проверять. Также можно этот секрет обновлять с каждым сообщением. Этой защиты достаточно, но есть два нюанса. Если ваш бот имеет ценность, достаточно большую ценность – ваши кнопки начнут разбирать, используя самодельные телеграм-клиенты, где вся информация о содержимом кнопки просматривается, поскольку это необходимо для того, чтобы поместить эту информацию в нарисованную кнопку или показать пользователю. А значит кнопка может нажаться совсем не та, которую вы ожидаете. Поэтому всегда проверяйте, может ли конкретный пользователь на данный момент нажать на эту кнопку, использовать заложенную в неё функцию. Второй нюанс заключается в содержимом параметра callback_data. В моих ботах, к примеру, я использую кнопки в качестве замены команд, но обрабатываются они как команды, то есть параметры содержат что-то вроде:

/edit 1 3 some text

Этот текст можно напрямую отправить как сообщение, и бот точно так же его обработает.

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

5. Какой ещё secret_token?

Такой вопрос я задал в пустоту, когда прочёл где-то очередную статью о вебхуках. Я не знаю, как я пропустил это, но оно уже используется давно, и это очень полезная вещь. Скорее даже обязательная.

При установке вебхука одним из GET-параметров можно указать secret_token с секретным значением, которое будет присылать вам в заголовке каждый раз сам телеграм, чтобы вы могли идентифицировать его запросы. Так вы убедитесь в том, что запросы действительно от него. Проблема может быть в том, что этот токен могут узнать, если на вашем компьютере установлен кейлоггер или что-то подобное, дабы отлавливать именно такие вещи, или конфиденциальность вашей работы на компьютере ещё каким-либо образом скомпрометирована. В общем, это вероятно точно так же, как и просмотр и подделка ваших кнопок на кастомном телеграм клиенте, и эта вероятность прямо пропорциональна ценности компрометации вашей разработки. Если вы какой-нибудь Сбер – задумайтесь над этим. Если вы Вася – забейте, ваш бот никому не нужен. А впрочем, это уже совсем другая история…

22
5 комментариев

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

Например парсер по ключевым словам и фразам, да ещё и желательно с фильтраций.

Короче много чего придумать можно и заработать на этом в том числе.

Это здесь к чему вообще?

Ботов теперь хоть отбавляй. Их кто-нибудь чистит?

Не понимаю, о чём речь и как это к статье относится