Pull to refresh

Comments 73

Спасибо, сохранил в закладки, много нюансов.

В частности:
Не больше одного сообщения в секунду в один чат

Забавно, что мой бот рассылает по 3 сообщения в +-60 чатов. За 30 чатов в секунду обработал ограничение (слип 5 сек поставил), а за секунду в один — не знал. Видимо 3 — еще терпимо для телеграма).
Они советуют растянуть рассылку на длительное время (8-12 часов)

Не понимаю откуда взялись числа 8-12 часов. Если ограничение связано с 30 пользователями в секунду, то логично отталкиваться от количества пользователей в рассылке, а не просто 8-12 часов. Может есть логика в этих числах?
Я при написании первого бота на aiogram, купил курс за 999р. Одна из самых полезных вещей, что там была, это готовый скелет для бота типа такого github.com/Forden/aiogram-bot-template Только там db_api было сделано для django ORM. Предлагаю в статью добавить ссылки на такого рода шаблоны. Когда есть готовый скелет реализовывать нужные фичи гораздо быстрее и легче, особенно в первый раз.

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

Хм, ожидал чего-то большего, чем пересказ официальной документации по ботам…
Когда писал телеграм игру понял, что мне нужна стейт машина, чтобы переключать юзера по разным "экранам" и запоминать его текущее состояние. Или ещё стоит отметить сложности синхронизации этого состояния, когда сообщения распределяются по нескольким воркерам.

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

Довольно неплохой пересказ, где в одном месте собраны ключевые фишки, но без лишних деталей, типа "все 20 видов inline query result" (их действительно столько).


Что касается FSM, не вы один столкнулись с этим. Сколько ботов не видел — везде либо используется, либо напрашивается FSM. Ну и TG Bot API тут ни при чём — реализации стейт-машин зависят от технологий, используемых для вашего бота.

Аналогично — надеялся что автор раскроет аспект хранения состояния. Делал бота на Kotlin и тоже пришел к стейт машине — кажется любой бот, чуть более сложный чем запрос/ответ, не может быть stateless, в то же время подходящих библиотечек работающих с состоянием не попадалось
Лично я храню состояния в бд ¯\_(ツ)_/¯
А вообще в aiogram есть встроенная FSM
Выглядит это так: пользователь вводит юзернейм бота в поле для ввода сообщения. После юзернейма можно ещё записать запрос (текст до 256 символов).

Откуда взялось 256? Пробовал в озвучку @uttsbot — где-то в районе 230 уже затыки.


Можно совмещать два типа, но корректно отображается это только на Telegram Desktop.

Чудеса. Посмотрел в дебаг-логе Telegram Desktop на том же @TsyaBot — там


      gallery: [ SKIPPED BY BIT 0 IN FIELD flags ],
      next_offset: [ SKIPPED BY BIT 1 IN FIELD flags ],
      switch_pm: [ SKIPPED BY BIT 2 IN FIELD flags ],

То есть это еще вопрос, кто на самом деле ведёт себя корректно :) Или же, что было названо "совмещением"?

Откуда взялось 256?
Из документации.
Я только что проверил: в действительности не совсем так, бот может увидеть даже больше. Если ввести текст до 270 символов, то бот видит весь текст. Если ввести больше символов, то бот почему-то видит только первые 255.

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

Пытался недавно решать задачу слежения за каналами, фильтрации нужных сообщений и пересылки их в отдельный канал. Информации в Телеграме сейчас много, и не хочется загружать мозг отфильтровыванием абсолютно ненужной информации. Так вот либо я не доразобрался, либо решения в данном случае достаточно костыльные. Нашлось некоторое количество ботов, которые вроде как умеют такое делать, но они фактически открывают сессию под твоим аккаунтом (ты им сообщаешь телефон, тебе приходит код, ты передаешь его боту), что уже не очень хорошо. Но к тому же нормально работающего так и не нашел, глючат, иногда стоят каких-то неразумных денег за такую простую задачу. И подумал, что может проще платить за свой минимальный сервер и написать самому нужный функционал. В результате получился мини-клиент на базе Telethon (похоже это и есть юзербот, не знал до данного момента про такую классификацию). Код достаточно тривиален, правда получилась проблемка, что когда под своим аккаунтом сообщение пересылаешь, в канале-получателе то не будет уведомления о непрочитанном сообщении, а нормального функционала «сделать сообщение непрочитанным» найти не получилось, пришлось делать промежуточного простого бота, единственная функция которого — принять сообщение и переслать в конечный канал. Но решение выгляди костыльно. Это я недоразобрался или всё так и есть?
В этом случае нет позиции «Непрочитанные сообщения» в самом канале, просто канал помечается непрочитанным. Не очень удобно.

Но про костыльность — это я не только про непрочитанные сообщения. Вообще всё решение выглядит костыльно.
Насколько мне известно, единственный способ получить уведомление о своём же сообщении — это отложенная отправка сообщений. Можно попробовать сделать костыль с ней. Ну или да, через отдельного бота
junction_bot не подходит? Он, правда, с задержками собирает инфу.
И я не разбирался, как там с закрытыми чатами, но для открытых каналов пользуюсь иногда.

Только недавно статью об этом писал на хабр, абсолютно идентичные задачи и инструменты. В итоге за 2 дня уперся в лимит — 500 каналов на аккаунте. Теперь думаю, ему обойти. Наверное, буду выкладывать решение, чтобы каждый мог себе развернуть юзербота. Автор, добавь в статью ограничение про 500 каналов для юзерботов.

Автор дал же ссылку на лимиты — https://limits.tginfo.me
Там все есть (в том числе и про 500 каналов и супергрупп на пользователя).

Новый день, новый пост про телеграм ботов
Про лимиты очень размыто написано.

Рекомендую дополнить:
Лимиты можно увеличить для популярных ботов, при двух условиях:
1. Бот будет забывать про сообщения старше недели. Т.е. получая CallbackQuery из такого сообщения, вы не сможете получить объект Message.
2. Владелец обязуется не использовать смягчение лимитов для рассылок, в обратном случает лимиты вернут
Ох, спасибо, как раз в тему! Допиливаю на Integromat бота для сотрудников компании. Ну там, всякие рацпредложения и инициативы полезные, голосование, определение лучшей за месяц и все такое прочее. Нюансы из статьи очень пригодятся, улучшают общее понимание логики работы.
Очень хорошая статья, спасибо за труд. Изучаю Python по курсу Практикума и для разнообразия пару раз писал бота, по типу. Курс крипты за выбранный период. И примитивные диалоги. Понимаю, сколько можно еще использовать и сколько есть нюансов.
Спасибо. Хотелось бы побольше про HTML-игры на платформе. Требуется ли иметь собственный HTML-сервер (сайт) для игры, или всё взаимодействие с пользователем идёт через API внутри Телеграма.
С HTML-играми я как раз не разбирался. Конечно, игра должна быть веб-страничкой
Там боль в том, что HTML-приложение работает на стороне пользователя и можно делать с результатами что угодно. Любая HTML игра, которую я видел в телеграм, ломается в отличие о игр в ботах (True Mafia например), где пользователю код на устройство не загружается
Немного не понял — возможно ли добавить бота в группу, как обычного пользователя, не обладая правами админа в группе?
Можно, но только в непубличную группу (то есть в группу без юзернейма)

Не так давно делал модуль, в котором необходимо обрабатывать сообщения от бота. Не знал до этого, что боты не видят сообщения других ботов, пришлось переделать на tg API)

Спасибо! Хорошая статья, некоторые вопросы уточнил для себя.
Недавно нужно было написать бота для тещи. Взял дотнет и в связке f# и Telegram.Bot достаточно быстро написал легкую реализацию. Единственное, что смутило, а может просто не нашёл, как отправить сообщения хозяину бота. В итоге поковырял, и сделал через простой патернматчинг, на входе проверяя ID пользователя, и для хозяина показываю один интерфейс, а для пользователей другой
Да, кроме проверки ID это никак не делается
Хоть и статья про ботов, интересно было узнать, что у каждого пользователя в Телеграм есть собственный id.

Мне был интересен бот для удаленного управления/контроля программируемыми устройствами, сделал первые шаги в эту сторону https://www.youtube.com/watch?v=7l8woF2JhH8, сейчас пытаюсь модернизировать. Ищу быстрый легкий способ обрабатывать русские буквы в cJSON.

Дополню про группы и супергруппы:

Если функции бота завязаны на работу с группами, то нужно обратить внимание, что миграция группы в супергруппу сопровождается сервисным сообщением, в котором будет указан новый id группы в поле migrate_to_chat_id объекта Message.
Поэтому важно отслеживать изменения id и фиксировать их у себя.

Может сбивать с толку еще такая штука, что по старому id будут доступны некоторые запросы, например, можно проверить, находится ли юзер в группе или нет. Но вот кикать по старому id уже не получится, будут лететь ошибки "group chat was upgraded to a supergroup chat".

В Bot API перед id супергрупп и каналов пишется -100. Так, id 1356415630 превращается в -1001356415630

Тут нужно отметить: действительно, id супергрупп и каналов начинаются с -100, но id супергруппы != -100id_группы
При преобразовании группы в супергруппу создается новая супергруппа, в которой есть специальное поле, в котором сохраняется старая группа. Поэтому айди абсолютно разные. Также все юзеры, которые были в группе до этого все еще остаются в старой группе, но она становится «рид онли».

Не давно столкнулся с такой проблемой. Если юзернейм бота строчными буквами и у него есть инлайн режим, то поделиться им в сообщениях будет сложно. Например @vkmusic_bot, без bot в конце проблем нет, например gif. Не понятно баг это или нет, но я бы дополнил статью столь важным моментом. Лучше при создании бота использовать хоть одну заглавную букву.

Если юзернейм бота строчными буквами

Заглавные буквы в юзернейме бота не влияют на активацию инлайн-режима.
Но в любом случае, поделиться таким ботом можно, использовав пробел в начале сообщения (в итоге в сообщение он не попадет, а в inline-режим Вы не войдёте).

Пост интересный, но в итоге у меня образовалось только больше вопросов, чем было :)


  1. Чем aiogram так сильно лучше того же telebot?
  2. Как реализовать бота без отвалов? У меня есть бот, который периодически отваливается. Перешёл на вебхуки, но помогло это мало. Вероятно, дело в домашней сети (крутится на RPi). Никакого автоперезапуска не нашел, увы.
  3. Можно ли как-то обойти ограничение, что один бот не может писать другому?
Тут концептуальное ограничение в том, что бот не может написать первым, соответственно, стартануть другого бота.
В свое время с помощью github.com/zerobias/telegram-mtproto писал своего серверного клиента для телеги, бот был от реального пользователя. Там много чего удавалось, но с тех пор прошло уже лет пять.

На второй вопрос:
Концептуально нужно отслеживать силами ОС, работает ваш скрипт или нет и перезапускать его. Как это конкретно реализовать — зависит уже от вашей ОС.
Ну либо более радикально — автоматически перезапускать скрипт раз в n-е количество времени.

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

На нем. Есть инфа, что дело именно в этом?

Да, вот и ответ на первый вопрос)

Ну мне говорили, что телебот иногда просто запросы не обрабатывает, да

А что за exception выскакивают? Может их отлавливать и (на крайний случай) рестартовать скрипт по возникновению этого исключения?

Но polling сообщений отваливается

Из серии "как опознать пользователя pyTelegramBotAPI" :)
Закопайте стюардессу)

Отличная статья, спасибо, нашел для себя кое-что новое

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

Почитайте про FSM.
Если вкратце, то храните где-нибудь шаг, на котором сейчас пользователь.

Тема локального сервера не раскрыта.

А какой локальный сервер имеете ввиду?
Недавно появивишйся локальный сервер для Telegram Bot Api или что-то другое?

Недавно появившийся локальный сервер для Telegram Bot Api.
Огромное спасибо за статью! Вроде уже имею достаточный опыт в создании ботов, а всё равно открыла для себя кое-какую интересную информацию:)

Есть ли хорошие перл-модули для наваяния ботов?

Всё четко и понятно, спасибо автор! Может это и пересказ оф.доки, но именно такой подачи мне не хватало. Успехов!

Автор отметил, что есть способы форматирования сообщения: html & md.


Я так для одного из своих ботов выбрал форматирование через md. В один день в мониторинг начали сыпаться ошибки 400: Bad Request: can't parse entities, падало на вот таком сообщении: _cs_summit_. Избавиться от ошибки помог только переход на html разметку.


Полная версия истории

tmat


Видимость сообщений в группах
Сообщения с упоминанием бота

Когда-то делал бота на aiogram, и сообщения с упоминанием долетали, сейчас попробовал и почему-то не работает. Сообщения с упоминанием бота до бота не долетают. Это и по логам видно (их нет), сообщения просто игнорируются как и другие сообщения в группе. Сообщения с цитированием или командой до бота доходят. Они точно ничего не меняли в API/правилах видимости сообщений в группах?

Если вопрос в обычных сообщениях, убедитесь, что у бота ВЫКЛЮЧЕНА приватность или выданы права администратора. Если вопрос в упоминаниях, то надо дебажить aiogram - спросите в чате, помогут

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

Ну обычно так и делают.
Можно не раскатывать отдельный сервер, а стартовать прямо на рабочей машине.
Либо второй вариант:
Изначально заложить в боте возможность функционала "only admins" и тестировать функции там. Но все равно придется рестартить бота, после подключения каждой фичи.

Что имеете в виду под рестартом бота?

Имею ввиду следующее:

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

Понял, спасибо! Видел у одного игрового бота проверку на бота, как бы это ни звучало. Там бот скидывает ссылку на капчу и после ее подтверждения возвращает назад в приложение и работа с ботом начинается как бы с начала, то есть в диалоге с ботом вместо инпута для ввода команда находится кнопка Start, при этом вся история сохраняется. Беглый гуглинг не дал ответ, как это сделано, поэтому подумал, что это и есть рестарт, о котором вы говорите. Не подскажете, что это за "рестарт"?

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

Не знаю правильно ли я вас понял, но из описанного я думаю просто используется deeplink с передачей параметров для кнопки старт. Благодаря чему, в обработчике можно навесить различные действия, в зависимости от передаваемых параметров. В aiogram про этот механизм можно почитать тут: deeplink aiogram
В других системах не знаю, работал только с aiogram

Понимаю оба ответа, но они всё же немного не о том. Вот когда только добавляешь к себе бота, то в диалоге с ним вместо инпута находится кнопка\ссылка "Старт" (андроид, русская версия). После нажатия на неё вместо неё появляется уже инпут, через который можно дальше общаться с ботом. Так вот вопрос в том, как можно вернуть это начальное состояние, когда пользователь бота видит вместо инпута для ввода текста - кнопку "Старт". При чём со стороны апи телеграмма, а не когда пользователь его блокирует\удаляет\останавливает и начинает всё сначала.

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

Блин, а ведь точно. И об этом писали в комменте выше. Спасибо!

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

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

Sign up to leave a comment.

Articles