Как хранить данные в Телеграмм боте

Главная — Вопросы по программированию — Как сохранить фотографию из Telegram-бота (Aiogram) в базу данных PostgreSQL?

Как сохранить фотографию из Telegram-бота (Aiogram) в базу данных PostgreSQL?

  • Post author: admin
  • Запись опубликована: 19 января, 2022
  • Post category: Вопросы по программированию

#python #postgresql #telegram #psycopg2

Вопрос:

Я использую это для загрузки фотографий:

file_info = await bot.get_file(photo[len(photo) — 1].file_id) new_photo = await bot.download_file(file_info.file_path)

а затем new_photo есть _io.BytesIO , но я хочу сохранить его в БД PostgreSQL в bytea поле, и у меня есть эта ошибка: psycopg2.ProgrammingError: can’t adapt type ‘_io.BytesIO’ .
Я не могу преобразовать в bytes эту переменную. Как сохранить его в моей базе данных? Я погуглил, но безрезультатно.

Ответ №1:

Мне пришлось преобразовать это в bytes с read() :

file_info = await bot.get_file(photo[len(photo) — 1].file_id) new_photo = (await bot.download_file(file_info.file_path)).read()

Вам также может понравиться

Построение решения интеграла на 3d поверхности (ОШИБКА)

30 ноября, 2022

объединение отчетов о покрытии Стамбула для интеграционных тестов

17 февраля, 2023

Программный поиск, существует или нет альтернативного перевода в файле .resx

12 февраля, 2023

  • О нас
  • Онлайн игры
  • Конвертеры
  • Base64 конвертер онлайн
  • Оформление кода JavaScript CSS HTML Онлайн
  • URL Encoder (кодировщик) / Decoder (декодировщик) онлайн
  • Конвертер регистров
  • Рассчитать количество дней между датами
  • Генератор ключей и паролей
  • Генератор QR кодов
  • Преобразование времени
  • Преобразование микросекунд в секунды
  • Преобразование микросекунд в миллисекунды
  • Преобразование миллисекунд в микросекунды
  • Преобразование миллисекунд в секунды
  • Преобразование миллисекунд в минуты
  • Преобразование миллисекунд в часы
  • Преобразователь миллисекунд в дату
  • Преобразование секунд в миллисекунды
  • Преобразование секунд в минуты
  • Преобразование секунд в часы
  • Преобразование секунд в дни
  • Преобразование минут во время
  • Преобразование минут в миллисекунды
  • Преобразование минут в секунды
  • Преобразование минут в часы
  • Преобразование часов в миллисекунды
  • Преобразование часов в секунды
  • Преобразование часов в минуты
  • Преобразование часов в дни
  • Преобразование дней в часы
  • Преобразование из часы в недели
  • Конвертация из недели в часы
  • Через несколько часов калькулятор
  • Преобразование времени AM/PM в 24-часовое
  • Преобразование Военного Времени
  • Время до десятичного калькулятора
  • Безопасность
  • Финансы
  • Энциклопедия

Источник: programbox.ru

ХРАНЕНИЕ ПОЛЬЗОВАТЕЛЕЙ в БАЗЕ ДАННЫХ | AIOGRAM + MONGODB | TELEGRAM БОТ С БАЗОЙ ДАННЫХ

СОЗДАЁМ TELEGRAM БОТА С БАЗОЙ ДАННЫХ | СОХРАНЕНИЕ ПОЛЬЗОВАТЕЛЕЙ | SQLITE3 | PYTHON

Telegram в качестве хранилища данных для IT проектов

Telegram в качестве хранилища данных для IT проектов

2019-08-24 в 11:57, admin , рубрики: Google Sheets, python, sql, sqlite, sqllite, telegram, telegram bots, базы данных, кликер, телеграмм боты, хранилища данных

Добрый день, сегодня я хотел бы поделится с Вами проблемами и их необычными решениями, которые встретились при написании небольших IT проектов. Сразу скажу, что статья для тех, кто хоть немного разбирается в разработке телеграмм ботов, баз данных, SQL и в языке программировании python.

Еще по теме:  Отключить приватность в Телеграмме

Весь проект выложен на github, ссылка будет в конце статьи.

image

Основная проблема

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

В итоге нужно было выбрать способ хранить эти данные.

  1. Вариант — глобальные переменные, оперативная память. Вариант сразу провальный, так как при падении программы мы теряем все
  2. Вариант — запись в файл на диске. Для такого проекта может и пойдет, но я планировал деплой бота на heroku, который каждый день стирает все данные с диска. Так что этот вариант не подошел
  3. Вариант — Google-таблицы. Изначально я хотел остановится на этом варианте, но начал разбираться и понял, что есть ограничение на количество запросов к таблице, и чтобы только начать использовать таблицу нужно написать кучу строк кода и разобраться в их не самом простом апи
  4. Вариант — база данных. Да, это наилучший вариант во всем. Но для такого проекта это даже смешно использовать. Также развертывание и поддержка базы данных на стороннем сервере обойдется в копеечку.

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

Решение

Идея очень простая, для хранения данных мы будем использовать in memory базу данных sqllite, так как она уже встроена в python 3 и будем делать бэкапы нашей таблицы на сервера Telegram с небольшим интервалом (примерно каждые 30 секунд) и бэкап при закрытие процесса программы.

Если сервер упал, то при первом запросе мы автоматически загрузим нашу таблицу с сервера Telegram и восстановим данные в sqllite.

Можно использовать и любую другую in memory бд, кому как нравится.

Плюсы

  1. Быстродействие — за счет работы с данными в оперативной памяти скорость выполнения программы даже быстрее, чем при использовании бд на стороннем сервере (графики скорости выполнения и тестирования будут в конце)
  2. Бесплатно — не нужно покупать сторонние сервера для баз данных и все данные хранятся в виде бэкапа бесплатно на серверах Telegramа
  3. Относительно надежно — если сервер падает по непонятным причинам, то мы максимум теряем данные за последние 30 секунд (время интервала бэкапов), для рабочего прототипа или небольшого проекта будет достаточно.
  4. Минимальные затраты при переходе на обычную бд — нужно заменить данные подключения, убрать код бекапов и перенести данные таблицы из бэкапа на новую бд.

Минусы

  1. Отсутствие горизонтального масштабирования
  2. Нужно два аккаунта в Telegramе (один для администратора, другой для тестирования пользователя)
  3. Сервер не будет работать в России из-за блокировок
  4. В комментариях я думаю Вы найдете еще десяток других нюансов.

Время говнокодить

Напишем простой кликер и проведем тесты на скорость выполнения.

Бот будет написан на языке программирования python с использованием асинхронной библиотеки взаимодействия с api телеграмма aiogram.

Еще по теме:  Закрепленное сообщение в Телеграмме не отображается

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

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

Для того, чтобы получить admin_id и config_id нам нужно запустить бота с аккаунта администратора и написать боту «admin», после чего он создаст первый бекап, и напишет ваш admin_id, config_id. Заменяем и запускаем бота заново.

#———————Настройки бота————————- # Ваш токен от BotFather TOKEN = ‘1234567:your_token’ # Логирование logging.basicConfig(level=logging.INFO) bot = Bot(token=TOKEN) dp = Dispatcher(bot) # Ваш айди аккаунта администратора и айди сообщения где хранится файл с данными admin_id=12345678 config_id=12345 conn = sqlite3.connect(«:memory:») # настройки in memory бд cursor = conn.cursor()

Так теперь пройдемся по основной логике бота

Если боту приходит сообщение со словом «admin», то мы создаем таблицу пользователей с такой моделью данных:

  • chatid — уникальный чат айди пользователя
  • name — имя пользователя
  • click — количество кликов
  • state — значение для машины состояний, в данном проекте не используется, но в более сложных без него не обойтись

Добавляем тестового пользователя, и отправляем документ на сервер Telegram с нашей таблицей. Так же отправляем admin_id и config_id администратору в виде сообщений. После получения айдишников, данный код нужно закомментировать.

# Логика для администратора if message.text == ‘admin’: cursor.execute(«CREATE TABLE users (chatid INTEGER , name TEXT, click INTEGER, state INTEGER)») cursor.execute(«INSERT INTO users VALUES (1234, ‘eee’, 1,0)») conn.commit() sql = «SELECT * FROM users » cursor.execute(sql) data = cursor.fetchall() str_data = json.dumps(data) await bot.send_document(message.chat.id, io.StringIO(str_data)) await bot.send_message(message.chat.id, ‘admin_id = <>’.format(message.chat.id)) await bot.send_message(message.chat.id, ‘config_id = <>’.format(message.message_id+1))

Логика для пользователя

Первым делом пытаемся получить из in memory бд данные пользователя, который отправил сообщение. Если ловим ошибку, то загружаем данные с бекапа сервера Telergam, заполняем нашу бд данными с бекапа и повторно пытаемся найти пользователя.

# Логика для пользователя try: sql = «SELECT * FROM users where chatid=<>».format(message.chat.id) cursor.execute(sql) data = cursor.fetchone() # or use fetchone() except Exception: data = await get_data() cursor.execute(«CREATE TABLE users (chatid INTEGER , name TEXT, click INTEGER, state INTEGER)») cursor.executemany(«INSERT INTO users VALUES (. )», data) conn.commit() sql = «SELECT * FROM users where chatid=<>».format(message.chat.id) cursor.execute(sql) data = cursor.fetchone() # or use fetchone()

Если мы нашли пользователя в бд, то обрабатываем кнопки:

  • При нажатие «Клик» мы обновляем количество кликов у данного пользователя
  • При нажатие «Рейтинг» мы выводим список пятнадцати человек у которых наибольшее количество кликов.

Если не нашли пользователя, то написать ему ошибку.

#При нажатии кнопки клик увеличиваем значение click на один и сохраняем if data is not None: if message.text == ‘Клик’: sql = «UPDATE users SET click = <> WHERE chatid = <>».format(data[2]+1,message.chat.id) cursor.execute(sql) conn.commit() await bot.send_message(message.chat.id, ‘Кликов: <> ‘.format(data[2]+1)) # При нажатии кнопки Рейтинг выводим пользователю топ 10 if message.text == ‘Рейтинг’: sql = «SELECT * FROM users ORDER BY click DESC LIMIT 15» cursor.execute(sql) newlist = cursor.fetchall() # or use fetchone() sql_count = «SELECT COUNT(chatid) FROM users» cursor.execute(sql_count) count=cursor.fetchone() rating=’Всего: <>n’.format(count[0]) i=1 for user in newlist: rating=rating+str(i)+’: ‘+user[1]+’ — ‘+str(user[2])+’n’ i+=1 await bot.send_message(message.chat.id, rating) else: await bot.send_message(message.chat.id, ‘Вы не зарегистрированы’)

Напишем логику для регистрации пользователя

Пытаемся найти пользователя в бд, если его нет, то добавляем новую строку в таблицу и делаем бэкап.

Еще по теме:  Как сохранить аудиозапись с Телеграмма на телефон

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

sql_select = «SELECT * FROM users where chatid=<>».format(message.chat.id) sql_insert = «INSERT INTO users VALUES (<>, ‘<>’, <>,<>)».format(message.chat.id,message.chat.first_name, 0, 0) try: cursor.execute(sql_select) data = cursor.fetchone() if data is None: cursor.execute(sql_insert) conn.commit() await save_data() except Exception: data = await get_data() cursor.execute(«CREATE TABLE users (chatid INTEGER , name TEXT, click INTEGER, state INTEGER)») cursor.executemany(«INSERT INTO users VALUES (. )», data) conn.commit() cursor.execute(sql_select) data = cursor.fetchone() if data is None: cursor.execute(sql_insert) conn.commit() await save_data() # Создаем кнопки button = KeyboardButton(‘Клик’) button2 = KeyboardButton(‘Рейтинг’) # Добавляем kb = ReplyKeyboardMarkup(resize_keyboard=True).add(button).add(button2) # Отправляем сообщение с кнопкой await bot.send_message(message.chat.id,’Приветствую <>’.format(message.chat.first_name),reply_markup=kb)

Так, ну и самое интересное.

Сохранение и получение данных с сервера Telergam

Masynchin/filogram

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags

Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

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

Основное приложение (работающее с файлами) написано на чистом Python с sqlite3 в качестве БД. Телеграм-оболочка написана на aiogram. Также есть логирование, реализовано с помощью loguru.

В качестве оболочки проекта используется poetry

Для запуска бота написан CLI, запускаемый командой poetry run bot [options] .

  • —stage: где запускается бот. Варианты: dev — при разработке, prod — в продакшене. По умолчанию — dev
  • —use: как запускать бота. Варианты: polling — через поллинг, webhook — через вебхук. По умолчанию — polling

В зависимости от параметра stage используется разный конфиг (лежат в filogram/config.py)

Тесты лежат в tests/, запускаются через poetry run pytest .

Переменная STAGE ставится сама после запуска через CLI

  • BOT_TOKEN — токен телеграм-бота

При использовании вебхука:

  • WEBHOOK_PATH
  • WEBHOOK_URL
  • WEBAPP_HOST
  • WEBAPP_PORT

Так как бот запускается через poetry, то данные переменные могут находится в файле .env главной директории. Для чтения переменных из данного файла должен быть подключён плагин poetry-dotenv-plugin (команда установки — poetry plugin add poetry-dotenv-plugin )

About

Телеграм-бот для хранения файлов

Источник: github.com

Рейтинг
( Пока оценок нет )
Загрузка ...