В интернете и так полным-полно мануалов по подключению базы данных к любому скрипту. Однако, несмотря на такое обилие информации, мои комментарии буквально ломятся от вопросов вида «как?»: «подключить, использовать, настроить» базу данных к telegram боту. Окей, почему бы не написать об этом соответствующую статью.
За основу возьмем заготовку, написанную в статье про бота для Telegram на Php, потому что в основном такие сложности возникают у читателей в комментариях этого материала.
Основа
Имеется скрипт-заготовка бота и имеется mysql, а так-же phpmyadmin, который мы и будем использовать для создания базы.
Да, чтобы работать с базой данных ее надо сначала… создать! Увы, система не сделает ничего за вас, придется делать все вручную. При первом знакомстве в mysql меня это немного разочаровало, но такова реальность. Можно, конечно, написать скрипт инициализации на манер wordpress’овского, я подобное уже делал, но это явно будет не уровень новичка. Поэтому руками, все руками!
Пишем TELEGRAM бота с БАЗОЙ ДАННЫХ на Python
Открываем phpmyadmin, заходим туда и создаем новую базу данных. Я назову ее «revcom_base»;
Тыкаем там создать, а потом переходим туда внутрь. Внутри базы нам надо перейти на вкладку «Операции». Там будет возможность создать первую таблицу.
Называем ее users и тыкаем «вперед». После чего задаем параметры столбцов в таблице:
Поле id у нас имеет атрибут A_I, то есть AUTO_INCREMENT, что означает буквально: у каждого нового пользователя будет свой id, который автоматически будет увеличиваться на 1 для каждого нового пользователя. Поле data_json — это данные пользователя. Если проще — обычное текстовое поле. В него будем записывать пользовательские настройки в формате json. Остальное думаю и так понятно.
Замечу, что все это можно было сгенерить используя SQL, но для простоты делать этого мы тут не будем.
Тыкаем внизу «создать» и получаем первую и единственную нужную нам для демонстрации таблицу. Теперь создадим «модель» то есть php обертку таблицы, которая удобно позволит работать с ней. Ато развелось любителей создавать сложные select запросы и всякие там fetch_assoc прямо в обработчиках команд… Так конечно тоже можно, но код смотрится страшно… И это не верный подход. Поэтому делать будем обертку.
Однако сначала подключение.
Подключение к базе данных
Тут все элементарно. Создаем файл «db_connect.php» прямо в папке бота, куда помещаем типичный шаблонный код:
Используем этот файл в начале нашего бота, размещая там строчку
Сохраняем оба файла и переходим на страничку бота. Если там нет ошибок, значит соединение установлено. Собственно файлы бота выглядят вот так теперь:
И на страничке бота ошибок нет:
Если у вас есть — указывайте правильные логин и пароль к базе до тех пор пока ошибки не пропадут.
Модель базы
Теперь делаем обертку для нашей базы данных.
Что нам надо уметь?
- Нам надо уметь создавать новых пользователей, то есть создавать новые записи в таблице «users»
- Нам надо уметь проверять есть этот пользователь в базе или его нет(чтобы не плодить сущности и не создавать по две-три записи в базе для одного пользователя)
- Нам надо уметь добавлять данные настроек бота(какие-нибудь) к пользователю
- Нам надо уметь считывать сохраненные данные пользователя
Ну вот и пишем нужные нам методы.
Вставка пользователей в базу
Первый метод — это создание, то есть сохранение юзера, в таблицу и выглядеть он будет так:
function make_user($name,$chat_id)< global $db; $name = mysql_real_escape_string($name); $chat_id = mysql_real_escape_string($chat_id); $query = «insert into `users`(name,chat_id) values(»,»)»; mysql_query($query,$db) or die(«пользователя создать не удалось»); >
Добавим этот метод в файл users.php, который, разумеется, надо сначала создать. Этот файл и будет нашей моделью для работы с базой.
Подключать его надо ниже под db_connect.php, вот так:
Ну и, чтобы … убрать вашу неуверенность, вот так выглядит сам файл users.php с нужным нам методом, на данном этапе:
Теперь давайте протестируем как работает этот метод. Человек должен добавляться в базу при поступлении от него первой команды. Поэтому лучше всего будет добавить метод make_user в начало секции on то есть вот, примерно, так:
// регистрация юзера $bot->on(function($Update) use ($bot)< $message = $Update->getMessage(); $mtext = $message->getText(); $cid = $message->getChat()->getId(); make_user($message->getFrom()->getUsername(),$cid); >, function($message) use ($name)< return true; // когда тут true — команда проходит >);
Если у вас уже этот обработчик есть просто добавьте строчку make_user($message->getFrom()->getUsername(),$cid); в нужное место.
Ну и, собственно, сохраняем, а потом пишем что-нибудь боту. Это должно добавить новую запись в таблицу.
Ремарка: у меня phpmyadmin глючит(чинить лень ибо это ни на что не влияет), поэтому внутрь таблицы я зайти не могу(а значит не могу и скриншет содержимого сделать), это исключительно проблема моего собственного сервера, у вас таких проблем быть не должно.
Впрочем это никак не повредит мне в разработке т.к. я отлично представляю себе как работает mysql.
Проверка на наличие пользователя в базе
Создание есть, осталось сделать так, чтобы один и тот-же пользователь не добавлялся по нескольку раз. (Вы можете отправить несколько сообщений в канал бота и это создаст столько-же записей в базе, чего быть не должно)
Для этого будем использовать запрос select и mysql_fetch_array вот так:
function is_user_set($name)
Теперь мы можем проверять есть этот пользователь в базе или нет. Делаем в методе on так:
if(is_user_set($message->getFrom()->getUsername()) == false)< make_user($message->getFrom()->getUsername(),$cid); >
Отлично, теперь сущности не плодятся:
Сохранение пользовательских данных
Теперь надо добавить методы задания настроек пользователем и считывания этих настроек, соответственно. Вообще зачем эти настройки нужны? А нужны они нам для множества разных вещей, от работы с несколькими состояниями бота, до, например, приема отзывов на бота.
// задание настройки function set_udata($name,$data = array()) < global $db; $name = mysql_real_escape_string($name); if(!is_user_set($name))< make_user($name,0); // если каким-то чудом этот пользователь не зарегистрирован в базе >$data = json_encode($data,JSON_UNESCAPED_UNICODE); mysql_query(«update `users` SET data_json = » WHERE name = »»,$db); // обновляем запись в базе > // считываение настройки function get_udata($name) < global $db; $res = array(); $name = mysql_real_escape_string($name); $result = mysql_query(«select * from `users` where name=’$name'»,$db); $arr = mysql_fetch_assoc($result); if(isset($arr[‘data_json’]))< $res = json_decode($arr[‘data_json’], true); >return $res; >
Для проверки этих методов засунем в on такой код:
// сохранение тестовых данных $data = array( «prevmsg» => $mtext ); set_udata($message->getFrom()->getUsername(), $data); // тест получения данных $data = get_udata($message->getFrom()->getUsername()); $bot->sendMessage($message->getChat()->getId(), json_encode($data,JSON_PRETTY_PRINT|JSON_UNESCAPED_UNICODE)); // тут меня кто-то спрашивал как дебажить базу данных. Вот так ее дебажат.
Теперь можно написать что-нибудь в бота и посмотреть на результат. Сначала надпись будет в базу помещена, а потом выдана нам в формате массива.
Все работает, так, как я и задумывал.
Пример использования
Теперь давайте сделаем небольшое взаимодействие с этим инструментарием.
Создадим разветвленный диалог вида: «ваше имя, ваш сайт» и после получения этих данных сохраним их в базе.
// регистрация юзера $bot->on(function($Update) use ($bot)< $message = $Update->getMessage(); $mtext = $message->getText(); $cid = $message->getChat()->getId(); if(is_user_set($message->getFrom()->getUsername()) == false)< make_user($message->getFrom()->getUsername(),$cid); > $data = get_udata($message->getFrom()->getUsername()); // получаем массив данных if(!isset($data[«mode»]))< // если в нем нет режима — значит человек еще не взаимодействовал с этой командой $mode = «name»; // поэтому задаем ему действие по дефолту >else < $mode = $data[«mode»]; >if($mtext == «/dbact»)< // по команде /dbact запускаем цепочку if($mode == «name»)< $bot->sendMessage($message->getChat()->getId(), «Добрый день, укажите, пожалуйста, ваше имя»); $data[«mode»] = «aftername»; set_udata($message->getFrom()->getUsername(), $data); // сохраняем изменения > > if($mode == «aftername»)< // помещаем имя в массив данных $data[«name»] = $message->getText(); // очевидно, что после запроса имени пользователь отправит следюущей командой свое имя, то есть оно будет в тексте сообщения. $bot->sendMessage($message->getChat()->getId(), «Добрый день, укажите ваш сайт»); $data[«mode»] = «website»; set_udata($message->getFrom()->getUsername(), $data); // сохраняем изменения > if($mode == «website»)< $data[«website»] = $message->getText(); // очевидно, что после запроса сайта пользователь отправит следюущей командой свой сайт, то есть адрес будет в тексте сообщения. $bot->sendMessage($message->getChat()->getId(), «спасибо.»); $data[«mode»] = «done»; set_udata($message->getFrom()->getUsername(), $data); // сохраняем изменения > if($mode == «done»)< // если человек уже прошел опрос — выводим ему собранную у него-же информацию $bot->sendMessage($message->getChat()->getId(), «Вы уже проходили опрос и указали такие данные:nИмя — «.$data[«name»].»nсайт — «.$data[«website»]); > >, function($message) use ($name)< return true; // когда тут true — команда проходит >);
При вызове команды /dbact мы сможем пройти такой вот диалог:
Для подобных сложных взаимодействий, когда надо, например, получить последовательно ряд результатов от пользователя и нужна база данных. Без нее подобные вещи становятся не осуществимыми.
Скачать готовый пример
Как обычно вы можете скачать готовый пример бота с этим функционалом
демо php telegram бота с базой данных
Источник: pozi.pro
#4 – SQLite3. Подключение к базе данных
За урок вы выполните подключение базы данных к вашему Телеграм Боту. Вы подключите БД SQLite3, но в будущем по схожему принципу сможете подключать любые другие БД.
Видеоурок
База данных SQLite3 была выбрана в качестве примера по причине ее простоты настройки и использования. В точно таком же формате вы в будущем можете подключиться к любой другой базе данных, что поддерживается языком Python. Это могут быть: MySQL, PostgreSQL, MongoDB и многие другие.
Если ваш сайт работает с MySQL, то вы легко можете скачать коннектор для Питона, установить его через pip и подключиться к вашей БД, что используется на сайте. Далее вы сможете выводить ту же информацию, что выводите на сайте.
В ходе урока был показан общий принцип работы с базами данных. В будущем вы можете использовать любую другую БД на свое усмотрение.
Весь код будет доступен после подписки на проект!
Источник: itproger.com
Как привязать БД к телеграм боту python
Захотел написать телеграмм бота для записи сообщений пользователя в БД.
Так вот набросал код но надо еще добавить запись в БД. Вот код:
Отслеживать
задан 17 июл 2020 в 15:04
user388705 user388705
Прежде чем добавлять запись в бд — ее нужно создать. Потом, чтобы создать бд нужно сначала выбрать какую бд вы будете использовать. Их как бы не один десяток.
17 июл 2020 в 15:09
И как бы токен от тг очень к месту.
17 июл 2020 в 15:10
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Шаг 1: Создаем базу данных и подключаем её к коду.
Если желаете файликом: используем библиотеку sqlite3 (Guide) Если хотите использовать базу из интернета используем mysql.connector (Guide)
Шаг 2: Пишем запросы
По ходу изучения материала выше узнаете как делать запросы в базу. Вот пример создания записи с использованием данных из телеграмма:
cursor.execute(«INSERT INTO table(id) VALUES(‘<>’)».format(message.from_user.id))
Источник: ru.stackoverflow.com