Pull to refresh

Comments 20

Я бы хотел где-нибудь держать простую бд ключ-значение, чтобы бот на сервере не хранил состояние, а был чистым кодом. Может, в каком-нибудь сообщении? Жалко у ботов нет saved messages.

В обертках вокруг телеграмм апи, по крайней мере на питоне, есть встроенная база данных in-memory с сохранением в файл

Про какой saved messages может идти речь если нужное сообщение можно просто сохранить в виде айди

В обертках вокруг телеграмм апи, по крайней мере на питоне, есть встроенная база данных in-memory с сохранением в файл

Это где такая? В telebot не нашел. Ну и она опять же, сохраняет на своем сервере, и кроме кода и токена бота надо еще и файл с бд хранить, заботиться об актуальности и все такое.

Про какой saved messages может идти речь если нужное сообщение можно просто сохранить в виде айди

Куда сохранить?

python-telegram-bot иммет отдельные объекты для данных бота, чата и юзера и может сохранять их в pickle-файл

А нельзя сделать для бота отдельный кпнал, в который он бы и писал свою базу в виде сообщений?

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

Можно сделать одно pinned сообщение для этого

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

Боты не умеют искать. Могут только прочитать сообщение с заранее известным номером. Да и то не совсем прочитать. Чтение это побочный эффект от fodwardMessage и делать это слишком часть бот тоже не может.

Можно попробовать сделать что-то на основе google script apps. Оно позволяет сделать и выставить в мир АПИ, а также в разумных пределах к нему обращаться. Сам скрипт в процессе обработки запроса может ходить в ваши spreadsheets, что-то оттуда выбирать, что-то туда дописывать или логировать.

Для получения от ТГ сообщений (updates), есть три варианта и все они не подходят в случае Apps Script:

  1. webhook - не подходит, т.к. у вас нет public key certificate Google;

  2. long polling - упрётся в квоты для выполнения скриптов;

  3. регулярные запросы - возможно выполнение по триггеру. Минимальное время проверки - раз в минуту, что не очень оперативно. Также упрётся в дневные квоты для запуска триггеров.

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

Очень много вопросов...

Но подсвечу то, что первым пришло в голову:

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

Если бот падает из-за потери связи с бд/сервисом/сокетом, то нужно зеркалить именно их, а не бота. Это всего лишь клиент. Все равно, что в браузере запускать сразу 2 сайта в разных вкладках и если на одной вкладке на сайте упало соединение с бэком, то закрыть вкладку и переключиться на вторую. Бессмысленно :)

Если бот падает, потому что сам сервер работает коряво или на нем падает инет - тут лучше поменять сервак и выбрать тот, у которого аптайм ближе всего к 100. В ситуации с падающим сервером, конечно, можно притянуть варик поднимать "теневых" ботов на других серверах, но тогда вместо 3-4 оплаченных серверов лучше взять только 2, но с высоким аптаймом и при падении пойти смотреть, что там опять случилось (если сервак дома, например). Вероятность падения одновременно 2х серверов, никак не связанных друг с другом, как говориться "крайне мала".

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

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

У ботов как и у пользователей не хватает автоматической архивации, у пользователей хотябы есть сама функция... Которая сохраняет не только данные но и составляет из них html страницу повторяющую мессенджер.

Не знаю зачем это мне лично может понадобиться, но интересный хак!

Я как понимаю, боты основаны на поллинге, и тем самым просто решается проблема отсутствия общей базы данных?

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

Очень странно выглядящий костыль, если честно)
Но, ладно. Если мы говорим про файл, а в частности, картинки, то при загрузке прилетает 2 эвента сразу, с разными мессадж ид. Я только сегодня это увидел (только начинаю с ботами). Как я понял, то один мессадж содержит ид файла/ов thumbnails, второй ид "оригинальных" файлов. Как определить что сохранять? Я могу ошибаться, но два раза пробовал и оба раза по 2 эвента прилетает. В целом, одним, но листом из 2х эвентов.

У картинки там оригинал и сжатая копия. Или типа того.

Мне кажется это прекрасный костыль для тех, кто хочет сделать serverless бота и хочет сэкономить на инфре для базы данных. Получается можно сделать очень легковесный скрипт (всего с одной зависимостью на telegram api и без всяких прочих google docs api), захостить его в условной aws lambda functions, хранить состояние бота, которое можно передавать между инстансами лямбды и не платить ничего лишнего.

Интересно, какие ограничения по количеству запросов и размеру такой "базы"?

На количество файлов ограниченной нет и телега обещает хранить их "долго". Но есть ограничение на паузу между запросами.

Sign up to leave a comment.

Articles