Базы данных для ТГ ботов

Запуск простейшего ТГ бота и подключение его к БД MS SQL Server

С развитием современных социальных сетей и мессенджеров, появляется много возможностей для создания интерактивных приложений по мониторингу или обработке данных БД удобных и для разработчика, и для бизнес-пользователя. В этой статье мы расскажем о том, как просто подключить базу данных MS SQL к Telegram боту.

Windows 10
Python 3.11.4

1. Регистрация бота
1.1 Необходимо найти пользователя BotFather, нажимаем запустить, появится перечень команд нам, выбираем /newbot

1.2 Нас попросят ввести имя, а затем имя с префиксом bot.

Бот зарегистрирован, необходимо сохранить токен, по которому бот будет выходить в онлайн.
1.3 Чтобы подключить бота к группе как администратора, запускаем команду /setprivacy. Выбираем нужного бота, нажимаем disable.

Телеграм бот на Python / #4 – SQLite3. Подключение к базе данных

Бот готов, теперь его можно найти в поиске
1.4 Создаем группу, добавляем туда бота и делаем его администратором

2. Создание виртуального окружения для проекта
2.1 Создаем пустую папку «tg_bot», заходим в нее и запускаем в ней PowerShell. Запускаем команду:

Должна появиться папка с окружением (изолированный python с пакетным менеджером)

2.2 Активируем окружений, для этого запускаем файл activate. Запускаем файл activate:
venvScriptsactivate

2.3 Устанавливаем библиотеку для разработки бота командой:
pip install aiogram

2.4 Устанавливаем библиотеку для работы с БД
pip install pypyodbc

После успешной установки можно закрыть и проверить библиотеки в папке Libsite-packegis

3. Запускаем бота
3.1 Создаем в каталоге tg_bot файл tg_bot.py

3.2 Создаем файл сценария командной строки (bat файл) для запуска бота в корневом каталоге, в него добавим токен

Открываем bat-файл любым редактором и добавляем код:
Чтобы в консоль не выводилась служебная информация самого файла

Активируем виртуальное окружение (%~dp0 – получение текущего окружения)

Заходим в папку с проектом

Задаем переменную с токеном

set TOKEN=Your TOKEN

Запуск скрипта проекта

python tg_bot.py

Чтобы увидеть ошибки в скрипте в консоли
pause

Еще по теме:  Как зайти на второй Телеграмм если вышел

3.3 Переходим к коду проекта. Создадим простого эхо бота. В файле пишем следующий код tg_bot.py.

Импорт необходимых библиотек

from aiogram import Bot, types
from aiogram.dispatcher import Dispatcher
from aiogram.utils import executor
import os

Инициализируем бота и диспетчер

bot = Bot(token=os.getenv(‘TOKEN’))
dp = Dispatcher(bot)

Записываем декоратор message_handler при помощи диспетчера dp чтения сообщения

В декоратор поместили асинхронная функция (async def) echo_send, которая будет обрабатывать входящие сообщения (события message)

async def echo_send(message : types.Message):

Функция при появлении события message ответит (answer) тем же сообщением (message.text)

Запускаем бота, skip_updates устанавливаем в True, чтобы не принимались сообщения, которые пришли во время нахождения бота оффлайн

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

Гугл таблица как бд для телеграм бота (продолжение)

Гугл таблица как бд для телеграм бота (продолжение)

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

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

Ячейки гт в кнопки тг — превращение

Вернемся к структуре таблицы, в которой лежат кнопки (к тем значениям, которые будут использованы для текста кнопок).

Таблица Answers

Это таблица Answers с тремя колонками:

  • ид текста вопроса, к которому относится ответ;
  • текст кнопки;
  • маркер верного ответа.

Дополним существующий скрипт обработкой данных из этой таблички и формированием объекта типа InlineKeyboardMarkup согласно документации Telegram bot api.

Вернемся к функции sendQuestions(chat_id) из последнего поста

function sendQuestions(chat_id) < const questionsArr = questionsSheet.getRange(1,1,questionsSheet.getLastRow(), questionsSheet.getLastColumn()).getValues(); Logger.log(questionsArr) questionsArr.forEach(e =>send(e[1],chat_id)) >

И добавим строку для получения всех значений из вкладки Answers.

const answersArr = answersSheet.getDataRange().getValues();

Как было отмечено в комментариях к прошлой статье, есть более понятный способ получения всех данных из листа, а именно метод .getDataRange().

const questionsArr = questionsSheet.getRange(1,1,questionsSheet.getLastRow(), questionsSheet.getLastColumn()).getValues();

тоже изменить на

const questionsArr = questionsSheet.getDataRange().getValues();

В итоге получаем

function sendQuestions(chat_id) < const questionsArr = questionsSheet.getDataRange().getValues(); const answersArr = answersSheet.getDataRange().getValues(); Logger.log(questionsArr) Logger.log(answersArr) //questionsArr.forEach(e =>send(e[1],chat_id)) >

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

Запускаем функцию и получаем в логере два массива — с вопросами и ответами.

Еще по теме:  Как разрешить доступ ирису к сообщениям в Телеграмме на Андроид

*Такой же результат можно получить вложенными циклами

for (let i=0; i Logger.log(arr) >

Начиная с третьей строки в логере, выводятся отфильтрованные значения по каждому из ид вопросов — 1, 2, 3 и 4.

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

questionsArr.forEach(e => < let arr = answersArr.filter(el =>el[0] == e[0]) arr = arr.map(el => []) Logger.log(arr) const keyboard = < «inline_keyboard»: arr >//send(e[1],chat_id) >)

Внутри метода map() ссылаюсь на элемент массива arr через el, беру значение на позиции 1 и присваиваю его ключам text и callback_data. То есть элемент [1.0, Джейк пес, ] превратится в []

И пример того, как это будет в циклах без применения методов (ну за исключением одного)

for (let i=0; i arr.push(

) > > Logger.log(arr) >

*Метод .push() вставляет указанный в скобках элемент в конец массива

И вывод в логере модифицированного массива arr

Вся функция sendQuestions() ниже

function sendQuestions() < const questionsArr = questionsSheet.getDataRange().getValues(); const answersArr = answersSheet.getDataRange().getValues(); Logger.log(questionsArr) Logger.log(answersArr) //Альтернатива 1 /* for (let i=0; iarr.push(

) > > Logger.log(arr) > */ //конец Альтернативы 1 //Альтернатива 2 questionsArr.forEach(e => < let arr = answersArr.filter(el =>el[0] == e[0]) arr = arr.map(el => []) Logger.log(arr) //конец Альтернативы 2 const keyboard = < «inline_keyboard»: arr >//send(e[1],chat_id) >) >

На этом этапе мы готовы отправить клавиатуру с сообщением, но нам нужна функция, которая эта делает. Внесем некоторые правки в существующую функцию send().

У нас появился новый передаваемый параметр, имя ключа этого параметра reply_markup, а значение keyboard:

‘reply_markup’ : JSON.stringify(keyboard)

Не забудем указать keyboard в параметрах функции. Таким образом, получим

function send(msg, chat_id, keyboard) < const payload = < ‘method’: ‘sendMessage’, ‘chat_id’: String(chat_id), ‘text’: msg, ‘parse_mode’: ‘HTML’, ‘reply_markup’ : JSON.stringify(keyboard) >const data = < ‘method’: ‘post’, ‘payload’: payload, ‘muteHttpExceptions’: true >UrlFetchApp.fetch(‘https://api.telegram.org/bot’ + token + ‘/’, data); >

Сохраняем проект и деплоим (Как это делать?). Не забываем запустить функцию api_connector() с новым значением appLink

function api_connector() < const appLink = «Ваш URL»; UrlFetchApp.fetch(«https://api.telegram.org/bot»+token+»/setWebHook?url full-width»>Базы данных для ТГ ботов

Бот ответил отправив все вопросы с кнопками вариантов ответов.

Ниже весь код, который у нас есть на текущий момент

const doc = SpreadsheetApp.getActive(); const questionsSheet = doc.getSheetByName(«Questions»); const answersSheet = doc.getSheetByName(«Answers»); const usersSheet = doc.getSheetByName(«Users»); const token = «Ваш токен» function api_connector () < const App_link = «Ваш URL»; UrlFetchApp.fetch(«https://api.telegram.org/bot»+token+»/setWebHook?url=»+App_link); >function doPost(e) < const update = JSON.parse(e.postData.contents); let msgData = <>if (update.hasOwnProperty(‘message’)) < msgData = < id : update.message.message_id, chat_id : update.message.chat.id, user_name : update.message.from.username, text : update.message.text, is_msg : true >; > sendQuestions(msgData.chat_id); > function send(msg, chat_id, keyboard) < const payload = < ‘method’: ‘sendMessage’, ‘chat_id’: String(chat_id), ‘text’: msg, ‘parse_mode’: ‘HTML’, ‘reply_markup’ : JSON.stringify(keyboard) >const data = < ‘method’: ‘post’, ‘payload’: payload, ‘muteHttpExceptions’: true >UrlFetchApp.fetch(‘https://api.telegram.org/bot’ + token + ‘/’, data); > function sendQuestions(chat_id) < const questionsArr = questionsSheet.getDataRange().getValues(); const answersArr = answersSheet.getDataRange().getValues(); Logger.log(questionsArr) Logger.log(answersArr) questionsArr.forEach(e => < let arr = answersArr.filter(el =>el[0] == e[0]) arr = arr.map(el => []) Logger.log(arr) const keyboard = < «inline_keyboard»: arr >send(e[1], chat_id, keyboard) >) >

Еще по теме:  Как в Телеграмме перевести с английского на русский язык в настройках

Продолжение следует.

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

Спасибо за комментарии к прошлому посту и обязательно дайте знать, если что-то непонятно, буду рада помочь 🙂

Источник: frontend-spectre.ru

Базы данных для тг ботов

Бот на Python с ChatGPT 3.5 Turbo для Telegram: запоминаем контекст общения [Гайд]

Бот на Python с ChatGPT 3.5 Turbo для Telegram: запоминаем контекст общения [Гайд]

02 апреля 2023
Оценки статьи
Еще никто не оценил статью

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

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

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

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

Все откликнувшиеся на зов помощи будут упомянуты после выполнения целей

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