Как обновить данные в getupdates telegram
Перейти к содержимому

Как обновить данные в getupdates telegram

  • автор:

Как обойти ограничение getUpdates? (Telegram BOT)

Недавно я пытался создать функциональную телеграмму BOT, используя официальный API, но у меня есть некоторые проблемы. Цель BOT — переслать все сообщения, полученные от человека x, в группу y.

BOT проверяет «https://api.telegram.org/bot <> / getUpdates» .format (TOKEN) для своего последнего полученного сообщения, чтобы он мог проверить, что это за сообщение и отправлено ли оно человеком x. И все это работало до тех пор, пока мой URL-адрес не перестал обновляться после того, как он достиг 100 записей.

Должен быть способ очистить эти записи автоматически, верно? Я прочитал немного о «-offset» и попытался реализовать его через строку URL Query, но, похоже, это не дало результата.

Спасибо за помощь.

2 ответа

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

Так как после того, как я отправил сообщение, мне больше не нужны старые обновления, я использовал это:

Где обновления равны:

Как уже было сказано, def вызывается после оператора send_message в виде:

Который будет гарантировать, что последнее обновление в getUpdates будет первым обновлением после повторного запуска кода

Вы можете удалить конкретное сообщение, как только оно было сохранено / переслано с помощью

Telegram-бот+GoogleSheets: решение некоторых проблем

Тема Telegram-ботов только ширится. Если вы разрабатываете дополнения для Google Sheets, то пишете код на Google App Script (GAS). Поэтому наверное, и мозги для этих ботов пишете на GAS.

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

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

Неважно, на каком языке вы пишете мозги для своего бота — на GAS, PHP, Pyton или чём-то ещё. В любом случае вы используете Телеграм API.

API сейчас поддерживает два способа обработки обновлений ботов: getUpdates и setWebhook.

getUpdates — это механизм pull, setWebhook — push.

Например, вы 1 раз в час запускаете getUpdates и получаете все сообщения, написанные в чате за этот час. В GAS можно настроить временной триггер с таким интервалом. Но это значит, что для нашего примера с антиспам-ботом спам будет целый час безнаказанно висеть в чате. Нехорошо это, желательно подстрелить спам сразу на подлёте.

Поэтому надо использовать setWebhook. Как написано в “Чудесном путеводителе Марвина по всем вещам Webhook”:

Webhook по сравнению с getUpdates

  • избавляет вашего бота от необходимости часто запрашивать обновления.
  • избегает необходимости в каком-либо механизме опроса в вашем коде.

Теперь пара слов о механизме получения апдейтов, или, проще говоря, сообщений из Телеграм-чата.

  • Пишем в редакторе GAS простейший скрипт:

Всё, в переменной contents у нас апдейт. С помощью дальнейшей обработки из него можно извлечь всё, что нужно. Например, chat_id — идентификатор отправителя сообщения, text — текст сообщения.

Дальше можно эти данные записать на лист, переслать кому-то и т.д.

  • Разворачиваем этот скрипт как веб-приложение.

При этом указываем параметры “Запуск от имени: От моего имени, У кого есть доступ: Все” и копируем ссылку на веб-приложение (webAppUrl).

  • Формируем ссылку.

Для этого надо соединить токен бота и урл веб-приложения следующим образом:

  • Фетчим урл и устанавливаем webhook:

Можно и безо всякого скрипта перейти по этому url в браузере и увидеть

Это объект JSON, разобрав который, можно извлечь все 3 поля по отдельности — ok, result и description. Затем их можно использовать в условной логике, показывать юзеру и всё такое.

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

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

Не тут-то было! Всем удобны Google-сервисы. И таблицы они вам предоставляют, и среду разработки скриптов, и мощные сервера по всему свету, на которых эти скрипты работают, и многие другие вкусные плюшки. Однако есть подводные камни, и один них — квоты и ограничения Google. “Службы Apps Script имеют ежедневные квоты и ограничения на некоторые функции. Если вы превысите квоту или ограничение, ваш скрипт выдаст исключение и выполнение остановится”. Например, вызовы URL Fetch ограничены 20,000 в день, а ограничение на одновременное выполнение скрипта — 30 юзеров. Это означает, что если число пользователей бота станет достаточно большим, он перестанет работать.

И что же делать?

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

Разработчику может прийти в голову следующее.

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

Заинтересованный пользователь может это сделать в 3 клика. Надо только дать ему шаблон таблицы с внедрённым в него скриптом. Он сделает себе копию таблицы, развернёт скрипт как веб-приложение и вставит webAppUrl в нужную ячейку таблицы.

Теперь будут расходоваться квоты и ограничения не разработчика, а пользователя.

И очень маловероятно, что у этого пользователя в его Телеграм-группе будет больше 20,000 сообщений в день.

Всё, вроде бы, должно заработать. Не тут-то было! 🙂

Каждый разработчик хочет, чтобы плоды его творчества приносили пользу. И ему, и пользователям.

Как распространять наш скрипт, чтобы о нём узнали заинтересованные пользователи? Можно писать статьи на тематических площадках, давать рекламу в Google, Яндекс и т.п.

Это всё замечательно, но грех не использовать и бесплатные инструменты.

Говоря о плюшках Google, нельзя не упомянуть Google Workspace Marketplace. Там разработчики Google публикуют дополнения для продуктов Google — для таблиц, документов, почты и пр.

Таким образом, идея реализации нашего Телеграм-бота вырисовывается такая:

  • Делаем шаблон таблицы Google.

В нём нарисован интерфейс с нужными заголовками, к таблице прикреплён скрипт веб-приложения.

  • Переносим всю логику обработки сообщений из Телеграм-чата в дополнение и публикуем его на Google Workspace Marketplace.
  • Пользователь устанавливает дополнение, делает себе копию шаблона, делает начальные установки (вводит в нужные ячейки токен бота, урл веб-приложения, свои ключевые слова) и пользуется себе на радость.

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

Тем более, что опять не тут-то было, здесь есть ещё подводные камни 🙂

Проблема в том, что вы НИКАК не можете передать данные непосредственно в дополнение. Т.е. вам по вебхуку пришло сообщение, но вы в обработчик, который, напомню, вынесен в дополнение, это сообщение передать не можете.

Вы не можете запустить функцию, находящуюся внутри дополнения.

Вы даже не можете передать в дополнение какой-то тег или сигнал типа “Эй, адд-он! Пришло сообщение! Запускай fetch(url) и читай!”.

Низзя. Не знаю почему, то ли из соображений безопасности, то ли по ещё каким-то причинам. Об этом можно почитать тут: How to transfer data from webapp to addon.

Может прийти в голову мысль: “Мы же пишем сообщения на лист. Ставь триггер onEdit() или onChange() и, как только сообщение запишется в таблицу, триггер сработает, считает данные и всё обработает, как надо”.

Тут есть 2 закавыки.

Одна из них заключается в том, что все операции с листами типа ввода-вывода относительно медленны — это доли секунды. При интенсивном общении в Телеграм-чате множественные обращения к листу и с листа могут вызвать существенные задержки.

В отличие от ситуации, если данные передавать минуя листы, непосредственно из fetch() в код дополнения. Сервера у Google шустрые, и такие операции занимают миллисекунды.

Вторая закавыка заключается в том, что триггеры onEdit() или onChange() НЕ срабатывают при изменении данных на листе программным путём.

Эти триггеры срабатывают, если данные на листе изменил пользователь. Например, ввёл с клавиатуры, или выбрал из меню.

Подробнее об этом тут: Event Objects.

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

Вот только она платная при превышении определённых показателей.

Да и хороших мануалов по нему я не видел.

По GAS таких ресурсов полно. Это и Google Apps Script, и mdn web docs, и ещё куча.

По Google Cloud же таких ресурсов намного меньше.

Поэтому, когда через полгода в пост пришёл Alan Wells и написал про Sheets API и USER_ENTERED, то сразу всё прояснилось.

  • Включаем Sheets API в сервисах веб-приложения. Вы можете убедиться, что всё правильно, если посмотрите код файла appsscript.json. Если кто забыл, то для этого в настройках скрипта чекните флажок “Показывать файл манифеста appsscript.json в редакторе”.

В нём должен присутствовать следующий код:

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

Как удалить все запросы из базы данных Telegram Bot (getUpdates)

привет мой бот, продолжай посылать мне сообщение.
мой код:

Решение

Ваша проблема в том, что вы помещаете свой код, который проверяет наличие обновлений, в бесконечность while петля. Таким образом, вы получаете бесконечные сообщения. Чтобы это исправить:

    Управляйте «смещениями» обновлений. Каждое обновление имеет уникальный идентификационный номер update_id , Каждый раз, когда получено обновление, его update_id равняется update_id из последних сообщений + 1 (каждый раз, когда приходит обновление, его update_id увеличивается на единицу). Вы можете попросить Bot Api получать только обновления, которые имеют update_id больше или равно заданному вами, передавая offset при выполнении getUpdates :

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *