Postgresql для Телеграм бота

Заикнулся в присутствии нового коллеги о своем блоге, первый его вопрос был “что за блог?”, а второй “а телеграм канал у тебя есть?”. Поймал себя на мысли неужели я стал ретроградом. Когда начался хайп вокруг влогов и Youtube каналов я остался верен теплому ламповому формату текстовых статей, так и сейчас, считаю что нет необходимости иметь свой Telegram канал, но задача меня заинтересовала.

Вокруг Telegram ботов сейчас много шумихи, как завести своего бота или канал написано в официальной документации. Не хотелось делать что-то надуманное, только ради “попробовать” и я решил что более менее полезной задачей будет уведомление о новых статьях в этом же блоге и только потом понял, что в принципе, мою реализацию можно использовать для любой RSS ленты c небольшими правками под себя.

Обзор

  • Вступление
  • Наивная реализация или тупой бот
  • Используем простую БД или чуть более умный бот
  • Прикручиваем РСУБД или умеренно сообразительный бот
  • Заключение

Наивная реализация или тупой бот

Первое что нужно сделать это создать бота и получить API токен.

Разработка телеграм бота с БД [Nest.js / PostgreSQL] — Todo Telegram Bot

Недолго думая, я взял самую популярную либу-обертку для ботов Telegram — gem telegram-bot-ruby и наваял следующий код:

Что же тут происходит? Все очень просто, вот здесь:

require ‘rss’ require ‘telegram/bot’

подключаем библиотеки для работы с RSS и Telegram, а вот здесь:

token = ENV[‘TELEGRAM_BOT_API_KEY’]

Здесь я использую переменные окружения (Environment variables), чтобы это работало, перед запуском скрипта нужно выполнить в командной строке export TELEGRAM_BOT_API_KEY=123456789 , где вместо 123456789 нужно вставить собственно токен. Использование переменных окружения один из двенадцати факторов приложения согласно — Adam Wiggins

Затем, с помощью строчки:

rss = RSS::Parser.parse(‘https://doam.ru/feed.xml’, false)

сохраняем в объект rss всю RSS ленту моего блога (я точно знаю что у меня там только 10 записей, поэтому не боюсь никаких переполнений или задержек).

После этого мы создаем бот клиента, обходим каждый item внутри rss и отправляем его ссылку в канал Telegram.

Таким образом, при каждом запуске скрипта в канал будет отправляться 10 сообщений с одинаковыми ссылками. Я использую бота, хотя для такого же функционала, например, в Slack я бы использовал Incoming Hooks.

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

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

Используем простую БД или чуть более умный бот

На самом деле новая версия бота растянулась на 55 строк кода, и вот он целиком:

Опять же приведу разбор этого кода по кусочкам далее по тексту.

require ‘telegram/bot’ require ‘rss’ require ‘sdbm’ require ‘json’ require ‘logger’

Я использую теже две библиотеки что и раньше rss и telegram , затем подключаю sdbm это встроенная либа Ruby, которая предоставляет простое хранилище типа ключ-значение (key-value), в качестве ключей или значений могут выступать только строки. Далее я подключаю json , чтобы легко кодировать объекты в строки и декодировать обратно. И еще одной библиотекой является logger , который предоставляет простой способ для отладки.

Еще по теме:  Почему не отображается звонок в Телеграмм

logger = Logger.new(STDOUT) if ENV[‘TELEGRAM_BOT_API_KEY’].nil? logger.fatal «Environment variable TELEGRAM_BOT_API_KEY not set!» exit 1 else token = ENV[‘TELEGRAM_BOT_API_KEY’] end rss = RSS::Parser.parse(‘https://doam.ru/feed.xml’, false)

Сперва делаем простые вещи, создаем объект для логирования и сетим переменную окружения.

Устанавливаем переменную окружения в этот раз мы чуть сложнее. Вначале мы проверяем что ENV пустая и если это так то выбрасываем ошибку через логгер и выходим из программы c использованием exit кода 1, в обратном случае, если переменная не пустая, записываем её значение в переменную, которую мы будем использовать в дальнейшем.

Парсинг RSS ленты происходит таким же образом как и ранее.

SDBM.open ‘doam_posts.db’ do |posts|

Далее, этой строчкой мы открываем нашу базу данных, которая является просто файлами в нашей файловой системе, в случае если базы не существует она будет создана с нуля.

rss.items.each do |item| key = item.link.href title = item.title.content published = item.published.content # next if posts[key] if posts.has_key?(key) logger.info «Post exist in DB will not rewrite» else posts[key] = JSON.dump( title: title, published: published, sended: 0 ) end end

И после этого мы начинаем первый цикл: обходим все полученные rss итемы, записываем ссылки, заголовок и дату публикации соответственно в переменные key, title и published. Проверяем есть ли в нашей базе ключ с таким же значением как наш и если есть просто выводим в лог текст, что не будем ничего перезаписывать (это нужно только на этапе отладки, но вообще не обязательно), в обратном случае, если в базе нет записи с таким ключом мы генерируем json строку и записываем её в базу. В качестве ключа я выбрал URL, так как они обеспечивают уникальность, всегда написаны в одном регистре и латиницей.

Следующим шагом я создаю объект типа Hash и прохожусь по всем записям которые есть в базе. С помощью hash[k] = JSON.parse(v) я делаю парсинг строки значения и создаю вложенные хеши. Затем проверяю значение поля sended , если там 0 то генерирую текст и отправляю его в канал, после чего перезаписываю объект cо значением 1, чтобы не отправить эту же запись при следующем запуске.

На самом деле это не совсем рабочая версия кода, я почему-то не закоммитил тот момент когда довел работу с SDBM до ума. Можете попробовать сами понять что здесь не так.

Теперь уже я решил попробовать задеплоить мой код на Heroku и выполнить его там. С использоавнием раннера задач все получилось, да только вот Heroku не сохраняет файлы между запусками задачи (да и вообще). Так что мое решение с SDBM является быстрым и простым, но может быть использовано только как selfhosted.

Прикручиваем РСУБД или умеренно сообразительный бот

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

Здесь проделывается точно такая же работа: иницилизируются необходимые компоннеты, синхронизируется rss лента и локальная база данных и отправляются ссылки на записи которые числятся в базе как “неотправленные”. Только в качестве базы используется PostgreSQL и все это обернуто в класс и методы. Метод initialize выполняется при вызове метода new на объекте класса DoamTelegramBot , остальные методы нужно вызывать отдельно. И чтобы выполнить всё правильно, я создал каталог bin в который положил файл с именем doam_bot и содержимым:

Еще по теме:  Как выглядит репост в Телеграмме

В котором я указываю что для выполнения скрипта нужно использовать язык Ruby, подключаю созданный мной класс через файл app.rb , создаю объект telegram и передаю в него урл для парсинга и id канала, вызываю методы sync и send . После чего я заливаю код на Heroku и создаю периодическую задачу, например раз в сутки. И если за сутки появились новые записи то в мой канал придет уведомление, уже без моего содействия в автоматическом режиме.

Заключение

Полностью это маленькое приложение можно посмотреть у меня в gitlab (для этого нужно залогиниться в gitlab.com). Лицензия пока не указана, но она MIT, т.е. можете править и использовать в своих целях. Если будет время я хотел бы прикрутить еще несколько функций, например отправку не только в телеграм но и другие сервисы, а также решить проблему первого запуска, когда база наполняется новыми записями с флагом “не отправлено” но неизвестно точно какие записи уже были отправлены в канал. В любом случае готов рассмотреть ваши Merge Requests.

  • Поблагодарить автора
  • Telegram канал

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

Postgresql для телеграм бота

Фото видео монтаж » Книги » Компьютеры и сети » Делаем бота с Aiogram, SQLAlchemy (PostgreSQL) и Docker

Делаем бота с Aiogram, SQLAlchemy (PostgreSQL) и Docker

Делаем бота с Aiogram, SQLAlchemy (PostgreSQL) и Docker

Делаем бота с Aiogram, SQLAlchemy (PostgreSQL) и Docker — Курс предназначен для людей, которые уже овладели языком Python, понимают что-такое ООП, хотят написать свой проект, но постоянно спотыкаются о непонимание работы с документацией библиотек/фреймворков и отсутствие идей для своего проекта.
Чему вы научитесь:
-Работать с aiogram
-Разрабатывать свои «Finite state machine»
-Запускать PosgreSQL на localhost
-Работать с базой данных через ORM SQLAlchemy
-Работать с Docker
-Получать данные от сторонних API

Скачать Делаем бота с Aiogram, SQLAlchemy (PostgreSQL) и Docker

Poproshajka

Коментарии

Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.

Источник: pixel-brush.ru

Подключаем Sqlite3 к Telegram боту

Для многих новичков в разработке на Python возникает проблема как подключить базу данных? Я сам столкнулся с такой проблемой в начале разработки. Тема оказалось довольно простой, но в интернете есть множество гайдов, которые могут запутать. В этом туториале я расскажу о том, как просто интегрировать базу данных Sqlite3 на примере Telegram бота.

Начало работы

Для работы нам понадобятся базовые знания в Python, достаточные для написания простого бота. Данный гайд можно использовать не только для интеграции с ботом, но и для других проектов. Если вы не используете PyCharm, и у вас нет средства для работы с БД, то необходимо установить утилиту SQLiteStudio с официального сайта.

Теперь давайте перейдем к написанию кода. В терминале необходимо установить pyTelegramBotAPI (если по какой-то причине у вас его нет).

pip install pyTelegramBotAPI

Далее создаем новый файл с расширением .py. В нем прописываем следующее:

import sqlite3import telebotbot = telebot.TeleBot(«token»)

Устанавливать sqlite3 не нужно это стандартная библиотека. Вместо «token» необходимо указать токен бота, который выдал вам BotFather. Теперь проверим, работает ли бот.

Запустим код. Если при запуске бота он пишет нам «Добро пожаловать», то все работает отлично.

Как мы видим, все работает.

Настройка базы данных

Открываем SQLiteStudio. Во вкладке Database выбираем пункт Add a database. Для удобства можно использовать сочетание Ctrl+O.

Еще по теме:  Как вычислить пользователя Телеграмм

Далее нажимаем на зеленую кнопку Создать новый фал базы данных. Выбираем директорию вашего проекта. В ней можете создать отдельную папку db, где будет хранится файл с базой. Вводим название, например database. Расширение будет присвоено автоматически. Нажимаем Сохранить. Теперь слева в списке у нас появился наш файл. Кликаем по нему ПКМ и выбираем пункт Connect to the database. Соединение с базой установлено. Появилось два подпункта: Таблицы и Представления. В этом уроке мы будем затрагивать только пункт Таблицы. Нажимаем по нему ПКМ и выбираем Add a table.

В поле для ввода указываем имя для таблицы. Я назову ее test. Чуть выше есть активная кнопка Добавить столбец (Ins). В появившемся окне указываем название столбца и тип данных. Для начала вам могут понадобится такие условия, как Первичный ключ, Не NULLи Уникальность. Первый столбец я назову id, выберу тип данных INTEGER и установлю все три условия. У Первичный ключ выберу настройку Автоинкремент. Этот столбец будет автоматически создавать ID записи в таблице. Работать с ним в коде мы не будем.

Второй столбец будет хранить user_id. Он будет иметь тип данных INT, уникален и не равен нулю. Третий столбец я назову user_name, присвою тип данных STRING и выберу пункт Не NULL. Еще 2 столбца будут называться user_surname и username. После того, как вы создали столбцы, нажимаем зеленую кнопку с галочкой.

В общем все будет выглядеть вот так.

Работа с базой данных в коде

Теперь давайте вновь перейдем к коду. Создадим 2 переменные.

conn = sqlite3.connect(‘db/database.db’, check_same_thread=False)cursor = conn.cursor()

В первой мы подключаем нашу базу данных, а во второй создаем курсор для работы с таблицами. Обратите внимание на то, что у меня в директории проекта создана папка db, а уже в ней находится файл БД. Если у вас по другому, укажите расположение в первой переменной.

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

def db_table_val(user_id: int, user_name: str, user_surname: str, username: str):cursor.execute(‘INSERT INTO test (user_id, user_name, user_surname, username) VALUES (?, ?, ?, ?)’, (user_id, user_name, user_surname, username))conn.commit()

Итак, сейчас объясню, что тут происходит. В аргументах функции мы указываем переменную user_id с типом данных inst. Далее добавляем запись в таблицу test в столбец user_id. С остальными значениями точно так же. В конце мы просто применяем изменения. Эта функция не будет выполнятся, пока мы ее не вызовем. Давайте исправим это. Создадим обработчик сообщений от пользователя и будем вносить в базу его данные.

В переменные мы вносим имя пользователя, id, имя и фамилию в Telegram, а потом сохраняем в БД. В конце кода можем сделать так, чтобы бот работал постоянно.

bot.polling(none_stop=True)

Пришло время проверить, как работает код. Запускаем бота и пишем ему «Привет».

Теперь можем зайти в SQLiteStudio, и выбрав вкладку Данные посмотреть что получилось:

Как мы видим, данные уже в базе. Если их по какой-то причине нет, то обновите базу, нажав на синюю кнопку Обновить

Заключение

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

Огромное спасибо за то, что прочитали. Надеюсь, кому-то помог. Всем удачи и поменьше багов в коде!

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

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