ЧаВо?
Здесь собраны часто задаваемые вопросы, которые не поместились больше нигде. Вопросы, касающиеся общих ошибок и Deno, были сгруппированы в двух специальных разделах.
Если этот FAQ не отвечает на ваш вопрос, вам также стоит заглянуть в Bot FAQ, написанный командой Telegram.
Где найти документацию метода?
В документации API. Возможно, вы захотите лучше понять это.
Методу не хватает параметра!
Нет, это не так.
- Убедитесь, что у вас установлена последняя версия grammY.
- Проверьте здесь, является ли параметр обязательным. Если нет, то grammY будет собирать его в объекте опций под названием
other
. Передайте{имя
в это место, и все заработает. Как обычно, TypeScript автоматически подставит имена параметров._параметра: значение} - Возможно, перепроверьте сигнатуру метода в
ctx
здесь, или методов API (ctx
,.api bot
) здесь..api
Как получить доступ к истории чата?
Вы не можете.
Telegram не хранит сообщения для вашего бота.
Вместо этого вам нужно ждать появления новых сообщений / постов в канале и сохранять их в своей базе данных. Затем вы можете загрузить историю чатов из своей базы данных.
Именно это и делает плагин conversations для соответствующей части истории сообщений.
Как я могу работать с медиагруппами?
Нельзя… по крайней мере, не так, как вы думаете.
Медиагруппы в действительности существует только в пользовательском интерфейсе клиента Telegram. Для бота работа с медиагруппой это то же самое, что и работа с серией отдельных сообщений. Самый практичный совет — игнорировать существование медиагрупп и просто писать бота, ориентируясь на отдельные сообщения. Тогда медиагруппы будут работать автоматически. Например, вы можете попросить пользователя нажать кнопку или отправить /done
, когда все файлы будут загружены в чат вашего бота.
«Но если клиент Telegram может это делать, то и мой бот должен уметь делать то же самое!»
И да, и нет. Технически, существует media
, который позволяет определить сообщения, принадлежащие одной медиагруппе. Однако,
- Нет способа узнать количество сообщений в медиагруппе.
- Нет возможности узнать, когда было получено последнее сообщение в медиагруппе.
- Между сообщениями медиагруппа могут быть отправлены другие сообщения, например текстовые, служебные и т.д.
Так что да, теоретически вы можете знать, какие сообщения принадлежат друг другу, но только в отношении тех сообщений, которые вы получили на данный момент. Вы не можете знать, будут ли добавлены новые сообщения в медиагруппу позже. Если вы когда-нибудь получали группу фотографий в Telegram при очень плохом интернете, вы можете увидеть, как клиент неоднократно перегруппировывает медиагруппу по мере поступления новых сообщений.
Почему я получаю эту ошибку?
400 Bad Request: Cannot parse entities
Вы отправляете сообщение с форматированием, то есть устанавливаете parse
при отправке сообщения. Однако ваше форматирование нарушено, поэтому Telegram не знает, как его разобрать. Вам следует перечитать раздел о форматировании в документации Telegram. Смещение байта, указанное в сообщении об ошибке, подскажет вам, где именно в вашей строке находится ошибка.
Передача entities
вместо форматирования
При желании вы можете предварительно разобрать сущности для Telegram и указать entities
при отправке сообщения. Тогда текст вашего сообщения может быть обычной строкой. Таким образом, вам не придется беспокоиться о появлении странных символов. Может показаться, что для этого нужно больше кода, но на самом деле это гораздо более надежное и безошибочное решение данной проблемы. Самое главное, что это значительно упрощается благодаря нашему плагину parse
401 Unauthorized
Ваш токен бота неправильный. Возможно, вы думаете, что он правильный. Это не так. Поговорите с @Bot
403 Forbidden: bot was blocked by the user
Вероятно, вы пытались отправить сообщение пользователю и столкнулись с этой проблемой.
Когда пользователь блокирует вашего бота, вы не можете отправлять ему сообщения или взаимодействовать с ним каким-либо другим способом (за исключением случаев, когда ваш бот был приглашен в групповой чат, участником которого является пользователь). Telegram делает это для защиты своих пользователей. Вы не можете ничего с этим поделать.
Но вы можете:
- Обработать ошибку и, например, удалить данные пользователя из своей базы.
- Проигнорировать ошибку.
- Слушать обновления
my
через_chat _member bot
, чтобы получить уведомление, когда пользователь заблокирует вашего бота. Подсказка: сравните поля.on("my _chat _member") status
старого и нового участника чата.
404 Not found
Если это происходит при запуске бота, значит, у вас неправильный токен. Поговорите с @Bot
Если ваш бот работает нормально большую часть времени, но потом внезапно вы получаете сообщение 404, значит, вы делаете что-то очень странное. Вы можете спросить нас в групповом чате (или в русскоязычном групповом чате).
409 Conflict: terminated by other getUpdates request
Вы случайно запускаете бота дважды при Long Polling. Вы можете запустить только один экземпляр своего бота.
Если вы думаете, что запустили бота только один раз, вы можете просто отозвать токен бота. Это остановит все остальные экземпляры. Для этого обратитесь к @Bot
429: Too Many Requests: retry after X
Поздравляем! Вы столкнулись с ошибкой, которая относится к числу наиболее трудно устранимых.
Есть два возможных сценария:
Первый: У вашего бота не так много пользователей. В этом случае вы просто спамите серверам Telegram, отправляя слишком много запросов. Решение: не делайте этого! Вам следует серьезно задуматься о том, как существенно сократить количество вызовов API.
Второй: Ваш бот становится очень популярным и у него много пользователей (сотни тысяч). Вы уже позаботились о том, чтобы использовать минимальное количество вызовов API для самых распространенных операций вашего бота, но все равно сталкиваетесь с этими ошибками (так называемые ограничениями флуда).
Вы можете сделать несколько вещей:
- Прочитайте эту статью в документации, чтобы получить базовое понимание ситуации.
- Используйте плагин
auto
.-retry - Обратитесь за помощью к нам в групповой чат. Там есть опытные люди.
- Можно попросить Telegram увеличить лимиты, но это маловероятно, если вы не выполнили сначала шаги 1-3.
Cannot find type definition file for ‘node-fetch’
Это происходит из-за отсутствия деклараций типов.
Рекомендуемый способ исправить это — установить skip
на true
в настройках компилятора TypeScript (в файле tsconfig
).
Если вы уверены, что вам нужно сохранить значение false
, вы можете установить недостающие определения типов, выполнив команду npm i
.
Вопросы о Deno
Почему вы поддерживаете Deno?
Некоторые важные причины, по которым мы любим Deno больше, чем Node
- Проще и быстрее начать работу.
- Инструментарий значительно лучше.
- Он нативно запускает TypeScript.
- Нет необходимости поддерживать
package
или.json node
._modules - Пересмотренная стандартная библиотека.
Компания Deno была основана Райаном Далом — тем самым человеком, который изобрел Node.js. Он рассказал о своих 10 сожалениях о Node.js в этом видео.
Сам grammY — это в первую очередь Deno, и он портирован для поддержки Node.js так же хорошо.