Tumgik
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 8
Рекурсия автоматизации
Продолжаем предыдущую статью.
Примеры из предыдущих статей требовали ручной запуск каждого процесса. Теперь попробуем завершить автоматизацию процесса некоторым циклом.
Создадим новую функцию:
CREATE OR REPLACE FUNCTION public.next_loop( param jsonb DEFAULT '{}'::jsonb)     RETURNS jsonb     LANGUAGE 'plpgsql'
    COST 100     VOLATILE
AS $BODY$DECLARE u text DEFAULT random()::text; j jsonb DEFAULT param; BEGIN PERFORM dblink.dblink_connect(u, 'host=/run/postgresql dbname=<dbname> user=<user> password=<password>'); PERFORM pg_advisory_unlock(100); PERFORM dblink.dblink_send_query(u, format('SELECT do_loop(%L)', j)); PERFORM dblink.dblink_disconnect(u); RETURN j; END$BODY$;
Эта функция использует расширение dblink и его нужно установить в нашу базу. Ещё в первой статье говорилось о процедурном языке PL/Python и ссылка на документацию. В документации было описание по его установке. Похожим образом устанавливается и расширение dblink. Однако в примере я использую отдельную схему с одноимённым названием расширения для удобства программирования. В этой функции ещё есть параметры <dbname>, <user> и <password>. Вы их укажете самостоятельно в соответствии с настройками вашей базы данных.
Приведу пример как двумя запросами создать схему и подключить расширение:
CREATE SCHEMA IF NOT EXISTS dblink; CREATE EXTENSION IF NOT EXISTS dblink SCHEMA dblink;
Теперь расширение и его функции будут находится в отдельной схеме. Таким образом не перемешиваясь с нашими рабочими функциями.
Создадим ещё одну функцию:
CREATE OR REPLACE FUNCTION public.do_loop( param jsonb DEFAULT '{}'::jsonb)     RETURNS jsonb     LANGUAGE 'plpgsql'
    COST 100     VOLATILE
AS $BODY$DECLARE l bool DEFAULT pg_try_advisory_lock(100); j jsonb DEFAULT param; BEGIN IF l THEN PERFORM get_updates(); PERFORM do_start_message(); SELECT next_loop(j) INTO j; END IF; RETURN j; END$BODY$;
На первый взгляд всё усложняется. Теперь мы уже создаём сразу больше одной функции. Но на самом деле просто разбили на две для удобства понимания.
Немного разберём эти две функции и их алгоритмы. Начнём с последней и опишем последовательность работы. Передачу параметров я поставил здесь только для примера. Параметры не используются.
В начале функции сразу используется триггер базы Postgresql. Который поможет предотвратить коллизию выполнения цикла. Внутри самой функции проверка на успешное включение триггера.
При успешном включении триггера сработают последовательно три функции. Первые две мы рассматривали в предыдущих статьях. А последнюю создали первой в этой статье. Вот последняя вызванная функция и зацикливает процесс.
Наша первая функция из этой статьи выполняет следующие действия. Она создаёт коннект к текущей базе. После чего снимает установленный во второй функции триггер. А дальше выполняет нашу вторую функцию асинхронно. Параметр как я писал выше просто для примера и не несёт никакого функционала. В завершении выполняется отсоединение от базы и завершение функции. Вот таким образом создаётся бесконечный цикл с минимальной нагрузкой на базу.
Протестировать работу можно выполнив запрос:
SELECT public.do_loop()
Теперь ваш бот будет постоянно в цикле реагировать на каждую новую команду /start. Также выполнение этой функции можно делать при запуске сервера. Но это отдельная тема и эту информацию можно почерпнуть из документации.
Для остановки нашего цикла просто выполните запрос:
SELECT pg_advisory_lock(100)
После выполнения этого запроса бесконечный цикл остановится.
Вот собственно основные шаги для создания Telegram бота созданного при помощи базы данных Postgresql.
В следующих статьях мы сможем рассмотреть более продвинутые алгоритмы для автоматизации бота.
Завершаю статью и напомню о рабочем сервере который использую по этому адресу. Социальные страницы для новостей и комментариев: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Смело задавайте ваши вопросы на которые я буду отвечать в следующих статьях. Приглашаю вас заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
1 note · View note
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 7
Автоматизация бота
Продолжение статьи.
Обрабатывать данные у нас получилось в прошлой статье. Сейчас будем начинать автоматизацию процессов. Пока в наших примерах нет особо ничего сложного.
Создаём новую функцию:
CREATE OR REPLACE FUNCTION public.do_start_message( )     RETURNS SETOF tgdata     LANGUAGE 'sql'
    COST 100     VOLATILE     ROWS 1000
AS $BODY$WITH s AS (SELECT do_start(tgdata), tgdata AS tgd FROM tgdata WHERE NOT tgdata?'ok' AND tgdata@>'{"message": {"text": "/start"}}' LIMIT 1) UPDATE tgdata SET tgdata=tgdata||s.do_start FROM s WHERE tgdata=s.tgd RETURNING tgdata$BODY$;
Теперь по традиции тестируем:
SELECT public.do_start_message()
В результате мы получили сообщение от бота в нашем тестовом чате идентичное предыдущему из примера в нашей прошлой статье. Немного разберём что делает эта процедура. Запрос в ней состоит из двух частей. Одна часть запроса функции практически повторяет пример из предыдущей статьи и присылает нам сообщение в чат бота. Отличием от предыдущего примера является наличие дополнительной проверки на уже обработанную запись. А наша вторая часть собственно сохраняет в базу некий статус обработки.
В нашем примере сохраняется ответ Telegram бота об отправленном сообщении. Это и будет сохранено в базу данных Postgresql в качестве некоторой пометки обработанной записи. По этим данным мы и определяем выполненный ответ. То есть поступило в чат сообщение и мы его обработали послав сообщение. А так же сохранили наш ответ в базу. Теперь мы знаем что сообщение было обработано и наш собеседник получил некий ответ.
Таким образом в нашей базе будут храниться ещё и некие отчёты по переписке. Вдобавок все сообщения поступившие в чате будут обрабатываться только единожды. Всё это можно с лёгкостью протестировать вживую выполняя все тесты в базе. Дальше алгоритмы будут усложняться и поэтому важно понимать каждый небольшой шаг последовательно рассмотренный в этих статьях.
Завершая статью напоминаю о рабочем сервере который использую по этому адресу. Социальные страницы для новостей и комментариев: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Смело задавайте ваши вопросы на которые я буду отвечать в следующих статьях. Ещё приглашаю заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
1 note · View note
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 6
Обработка данных
Предыдущая статья здесь.
Вот мы и добрались до момента обработки полученных из бота сообщений. У нас в результате предыдущих примеров в базе данных должно было сохраниться минимум одно полученное сообщение. На нём и будем ставить следующие опыты.
Создадим новую функцию:
CREATE OR REPLACE FUNCTION public.do_start( param jsonb DEFAULT '{}'::jsonb)     RETURNS jsonb     LANGUAGE 'sql'
    COST 100     VOLATILE
AS $BODY$SELECT public.tgapi(jsonb_build_object('method', 'sendMessage', 'params', jsonb_build_object('chat_id', param#>'{message,chat,id}', 'text', format('Hello, %s', param#>>'{message,chat,id}'))))$BODY$;
И сразу протестируем нашу функцию таким запросом:
SELECT do_start(tgdata) FROM public.tgdata WHERE tgdata@>'{"message": {"text": "/start"}}' LIMIT 1
После выполнения запроса мы получим сообщение в нашем тестовом чате и ответ от бота с уже знакомым нам результатом в виде json объекта Message. Во время создания наших примеров по программированию Telegram бота мы практически разбираем также и методы работы с базой данных Postgresql.
Последний пример уже использует сохранённые ранее данные полученные из бота. Таким образом мы постепенно подходим к автоматизации нашего тестового бота. Постепенно наши запросы и функции будут немного усложняться и всё более автоматизировать весь процесс. Может показаться что информация в статьях немн��го растянута. Однако хочется показать процесс изнутри и описать максимально мелкие детали из которых всё состоит. Это даст в итоге более лучшее понимание и усвоение.
Завершая статью напомню о рабочем сервере который я использую по этому адресу. Ссылки для общения в социальных сетях: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Смело задавайте ваши вопросы на которые я буду отвечать в следующих статьях. В завершении приглашаю заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
1 note · View note
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 5
Работа с данными
Ссылка на предыдущий пост.
В прошлой статье у нас получилось сохранить данные полученные из Telegram бота в базу Postgresql. Теперь нужно немного усовершенствовать алгоритмы для сохранения большего количества сообщений.
Создадим такое представление:
CREATE OR REPLACE VIEW public.get_updates AS SELECT tgapi(jsonb_build_object('method', 'getUpdates', 'params', jsonb_build_object('timeout', 1, 'offset', ( SELECT max((tgdata.tgdata -> 'update_id'::text)::bigint) + 1           FROM tgdata)))) AS tgapi;
Это представление получает данные которые мы рассматривали в предыдущих статьях. Но в этом примере мы уже используем дополнительные параметры. Параметр timeout обязателен для рабочей версии бота и о нём описано здесь. Там же описан и параметр offset в котором указывается последний сохранённый нами update_id увеличенный на 1. Использовать это представление удобно для тестовых получений данных от бота.
Теперь нужно создать процедуру сохранения данных:
CREATE OR REPLACE FUNCTION public.get_updates( )     RETURNS SETOF tgdata     LANGUAGE 'sql'
    COST 100     VOLATILE     ROWS 1000
AS $BODY$INSERT INTO tgdata SELECT value FROM public.get_updates, jsonb_array_elements(tgapi->'result') RETURNING *$BODY$;
Эта процедура сохранит полученные при помощи представления данные из бота и сохранит их в таблицу. Теперь просто вызывая эту процедуру мы будем получать новые сообщения из бота.
Для теста напишите любое сообщение в чат вашего бота и вызовите процедуру:
SELECT public.get_updates()
В итоге вы получите данные из бота с содержимым вашего сообщения в формате json. Содержимое данных мы уже рассматривали в статьях ранее.
Наши алгоритмы и становятся немного сложнее. Но в результате мы разбираем принципы работы Telegram бота и возможность программирования прямо на базе данных Postgresql. На мой взгляд это несколько упрощает дальнейшую работу.
В завершении статьи рабочий сервер который я использую находится по этой ссылке. Ссылки для общения в социальных сетях: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Вы смело можете задавать ваши вопросы на которые я отвечу в следующих статьях. Как всегда приглашаю заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
1 note · View note
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 4
Работа с базой
Продолжение темы из предыдущего поста.
Вот мы и подошли к началу автоматизации бота. А какая может быть автоматизация без сохранения данных. Поэтому мы рассмотрим как сохранять полученные данные от Telegram бота в базу Postgresql.
Для начала создадим новую таблицу в нашей базе данных:
CREATE TABLE public.tgdata (     tgdata jsonb NOT NULL,     CONSTRAINT tgdata_pkey PRIMARY KEY (tgdata) )
Не будем на данном этапе заморачиваться с оптимизациями и прочим. Нам нужно просто протестировать получение и сохранение данных для дальнейшей обработки.
Протестируем такой запрос:
INSERT INTO public.tgdata (tgdata) SELECT value FROM public.tgapi('{"method": "getUpdates", "params": []}'), jsonb_array_elements(tgapi->'result')
Этот наш запрос уже стал несколько сложнее. Вкратце мы просто добавляем строки полученные от бота и сохраняем их в базу. В этом примере есть и знакомый нам из предыдущих статей запрос. Правда он немного модифицирован для получения отдельных значений массива из объекта json.
Эти статьи не предназначены для изучения всех возможностей программирования. Скорее это просто демонстрация общей идеи работы с API Telegram бота и базы Postgresql. Для более полного понимания нужны основные понятия работы с базой Postgresql и типами данных.
Результатом вышеописанного примера будет созданная запись в таблице базы данных. Выполнив просмотр этой записи вы обнаружите объект описанный здесь. Его мы уже рассматривали в одной из предыдущих статей. От читателя ожидается и выполнения этих тестов вживую для лучшего визуального понимания происходящего.
В дальнейшем мы будем использовать модифицированные версии этих же запросов. Таким образом будет постепенно наращиваться функциональность бота. Поэтому важно понимать работу и функции каждого отдельного шага.
Рабочий сервер который я использую находится по этой ссылке. Ссылки для общения в социальных сетях: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Вы всегда можете обратиться ко мне за советом или помощью. По традиции приглашаю заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
1 note · View note
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 3
Отправка сообщений
Продолжим тему из предыдущего поста.
Эта статья покажет как можно отправить сообщение в чат Telegram бота при помощи базы Postgresql. Как и в примере из предыдущей статьи это сделать не очень сложно. Необходимо вызвать процедуру с определёнными параметрами описанными здесь.
Пример нашего запроса:
SELECT public.tgapi('{"method": "sendMessage", "params": {"chat_id": <chat_id>, "text": "message"}}')
Вот тут начинается самое интересное и появляется необходимость указывать обязательные параметры. В данном примере их два и один из них <chat_id>. Со вторым я думаю вообще особо не возникает вопросов и он просто содержит само сообщение “message” выведенное в чате бота. Теперь рассмотрим что такое <chat_id>. Чтобы лучше понять что это такое нужно вспомнить ответ примера из предыдущей статьи. Если вы не выполнили вживую тот пример самое время это сделать. В итоге вы получите реальный ответ описанный по ссылке в предыдущей статье. Ответ будет содержать такие json объекты как Message и Chat. Последний и будет содержать данное <id>. Этот <id> нам и нужен для теста вместо <chat_id> из запроса выше.
Выполнив наш запрос из примера с вышеописанными параметрами мы получим ответ от бота. Этот ответ будет также содержать json с объектом Message который мы рассмотрели выше.
Последние примеры из моих двух статей являются основными для дальнейшей работы с API бота. В последующих статьях мы рассмотрим автоматизацию процесса общения с ботом. Поэтому будем часто использовать данные из этих примеров. Рекомендую делать живые тесты уже сейчас и дальше будет всё намного проще.
Моя рекомендация по рабочему серверу находится по этой ссылке. Ссылки на сообщества в социальных сетях: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Вы всегда можете обратиться ко мне за советом или помощью. В завершении приглашаю заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
2 notes · View notes
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 2
Получение данных
Продолжаем тему из предыдущего поста.
В этой статье посмотрим каким образом можно получать данные из Telegram бота при помощи базы Postgresql. Используя процедуру из предыдущей статьи это очень легко сделать. Достаточно просто вызвать процедуру и передать параметры описанные тут.
Наш запрос будет выглядеть так:
SELECT public.tgapi('{"method": "getUpdates", "params": []}')
Так вот просто выглядит наш запрос используя процедурный язык PL/Python. В итоге мы получим ответ в формате json содержащий данные описанные тут.
Однако мы не передали ни одного параметра и скорее всего получили в ответе пустой массив. Ведь мы только в первой статье создали нового бота и в нём нет сообщений. C параметрами мы разберёмся в дальнейших статьях где будем рассматривать сохранение и обработку данных полученных от бота при помощи базы Postgresql. Теперь нужно найти нашего нового бота по названию в приложении Telegram или перейти по ссылке в сообщении от @BotFather о созданном боте. После чего в окне чата с ботом внизу нажать на кнопку Старт. Таким образом происходит подключение вашего Telegram аккаунта к боту.
Сейчас можно снова выполнить наш предыдущий запрос. На этот раз мы получим ответ от API с содержимым который описан по ссылке чуть выше. Этот ответ будет содержать данные с переданные от бота после нажатия на кнопку Старт. Как и с параметрами мы будем разбирать ответ бота более подробно в следующих статьях.
Если вы ещё не определились с рабочим сервером то посмотрите по этой ссылке. Ссылки на страницы в социальных сетях для общения: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Вы всегда можете обратиться ко мне за советом или помощью. Приглашаю заглянуть на страничку проекта пассивного дохода участником которого я являюсь.
2 notes · View notes
skidlv · 4 years
Text
Телеграм бот на Postgresql часть 1
Коннект к API
Меня зовут Сергей и я программист с достаточно обширным опытом работы.
В этой серии статей я хочу показать возможности одной из современных баз данных. Идея была в том что любой проект так или иначе использует базу данных. Тогда я и решил что можно часть алгоритмов заложить прямо в саму базу. Для примера я покажу как это может быть реализовано на примере Telegram бот API.
Я предполагаю, что тот кто читает этот текст хоть немного знаком с темой. Если нет, то прошу оставить в комментариях или личном сообщении ваши вопросы. Данные я дам без воды и очень сжато, но с примерами и некоторыми комментариями. Для начала нам нужна база Postgresql. На текущий момент использую версию 12. Мой предпочитаемый серверный провайдер с хорошими техническими характеристиками и умеренными ценами находится по этой ссылке.
Итак приступим и создадим первую функцию для запросов к Telegram бот API.
CREATE OR REPLACE FUNCTION public.tgapi( param jsonb DEFAULT '{"method": "getMe", "params": []}'::jsonb)     RETURNS jsonb     LANGUAGE 'plpython3u'
    COST 100     VOLATILE
AS $BODY$import json, requests jsn=json.loads(param) r=requests.post('https://api.telegram.org/bot<token>/'+jsn['method'], json=jsn['params']) return r.text$BODY$;
В данной функции используется процедурный язык PL/Python и библиотека Requests. Вместо <token> используется строка полученная после создания вашего бота. О том как создавать новых ботов описано здесь. Я использую язык Питон так как он уже есть в большинстве популярных дистрибутивов Линукс и требует минимум настроек для начала работы. Все дополнительные данные можно найти по ссылкам в тексте.
Теперь осталось протестировать эту функцию выполнив без параметров:
SELECT public.tgapi()
В результате получим ответ в формате json с данными описанными тут.
Вот у нас и получился первый запрос к Telegram бот API используя базу Postgresql. Следующие статьи будут раскрывать шаг за шагом различные возможности использования Telegram бот API и базы данных Postgresql.
Перечислю ссылки на страницы в социальных сетях: Facebook, Вконтакте, Telegram. Обязательно пишите ваши комментарии и подписывайтесь на мои страницы. Возможно предыстория будет написана в конце серии статей как это обычно происходит в сюжетах фильмов Квентина Тарантино. Вы всегда можете обратиться ко мне за советом или помощью. Также приглашаю заглянуть на страничку проекта пассивного дохода в котором я принимаю участие.
2 notes · View notes