В интернете и так полным-полно мануалов по подключению базы данных к любому скрипту. Однако, несмотря на такое обилие информации, мои комментарии буквально ломятся от вопросов вида «как?»: «подключить, использовать, настроить» базу данных к telegram боту. Окей, почему бы не написать об этом соответствующую статью.
За основу возьмем заготовку, написанную в статье про бота для Telegram на Php, потому что в основном такие сложности возникают у читателей в комментариях этого материала.
Основа
Имеется скрипт-заготовка бота и имеется mysql, а так-же phpmyadmin, который мы и будем использовать для создания базы.
Да, чтобы работать с базой данных ее надо сначала… создать! Увы, система не сделает ничего за вас, придется делать все вручную. При первом знакомстве в mysql меня это немного разочаровало, но такова реальность. Можно, конечно, написать скрипт инициализации на манер wordpress’овского, я подобное уже делал, но это явно будет не уровень новичка. Поэтому руками, все руками!
БОТ ДЛЯ БЕСЕДЫ ВК С БАЗОЙ ДАННЫХ | КИК, WARN
Открываем 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
Бот для VK на Python с MySQL за час ч.1
В интернете есть много туториалов как написать бота для Вконтакте, но все они имеют существенные недостатки для новичков. Они дают совсем минимальную базу из-за которой в будущем новичкам будет трудно понять как работают те или иные вещи.
В этом туториале я хочу показать как сделать максимально простого бота с довольно большим базовым функционалом.
Что нам понадобится?
- Python начиная с версии 2.7 (Весь код тестировался на версии 2.7.16 и 3.7.3)
- Модуль PyMySQL
- Модуль vk_api
- Модуль requests
- Группа Вконтакте (Внимание! Бот будет работать именно со стороны группы, а не стороны аккаунта человека)
- База данных (включая данные о пользователе и т.д)
Подключение
Для начала подключим все библиотеки:
import vk_api from vk_api.utils import get_random_id from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType import pymysql.cursors import requests
Теперь можно приступить к настройке бота и базы данных.
Именно в моем случае все данные находятся в файле config.py. Вы же можете прописать их где угодно. На функционал то никак не повлияет.
Подключение базы данных
Для этого создадим функцию при помощи модуля PyMySQL:
def get_connection(): connection = pymysql.connect(host=’you_host’, user=’you_user’, password=’you_password’, db=’you_db’ charset=’utf8mb4′, cursorclass=mymysql.cursors.DictCursor) return connection
Эта функция будет возвращать данные для дальнейшей работы с базой данных. Соответственно подставляем свои данные где видим «you_».
Настройка подключения к боту
Для начала нам нужно перейти в настройки своей группы:
Выбрать вкладку Работа с API и создать ключ доступа(в будущем он нам пригодится для подключения к боту.
Перейти во вкладку «Long Poll API» и включить его. А так же выбрать последнюю из доступных версий
Перейти в «Типы событий» и так же включить все, что вам понадобится. Я включил например все
И последнее. Перейти в «Сообщения» > «Настройки для бота» и включить возможность ботов. Теперь можно перейти к самой программе.
Подключение бота к группе
Теперь пропишем подключение бота к long poll и проверку действий со стороны Вконтакте:
vk_session = vk_api.VkApi(token=»Ваш ключ, который вы создали на странице настроек») #пример vk_session = vk_api.VkApi(token = «a6f87v8c9a9sa87a7af9a0f9f9v8a6s6c5b5m6n8bds09asc8d7b87d87bd87n» vk = vk_session.get_api() longpoll = VkBotLongPoll(vk_session, «id вашей группы Вконтакте») #пример longpoll = VkBotLongPoll(vk_session, «637182735») for event in longpoll.listen(): #Проверка действий if event.type == VkBotEventType.MESSAGE_NEW:
Теперь мы включили самого бота, который будет принимать входящие сообщения и анализировать их для дальнейшей работы.
Работа с ботом
Давайте добавим боту функцию отвечать на любые наши сообщения нашими же сообщениями. Для этого после последней строчки пропишем это:
if event.type == VkBotEventType.MESSAGE_NEW: # последняя строчка #проверяем не пустое ли сообщение нам пришло if event.obj.text != »: #проверяем пришло сообщение от пользователя или нет if event.from_user: vk.messages.send( user_id=event.obj.from_id, random_id=get_random_id(), message=event.obj.text)
Теперь про метод vk.messages.send().Это стандартный метод модуля vk_api. О методах можно будет прочитать на официальной документации Вконтакте(ссылка будет ниже).
Он позволяет отправлять сообщения пользователям.
Аргумент user_id указывает какому аккаунту это сообщение это надо отправить. В нашем случае event.obj.from_id указывает на аккаунт, который только что нам отправил сообщение. То есть мы отправляем сообщение тому человеку, который отправил его нам.
Указывать этот аргумент обязательно!
Аргумент random_id нужен для того, чтобы Вконтакте не отправлял сообщения по 2 раза. Указывать этот аргумент обязательно!
Аргумент message собственно указывает какое сообщение мы должны отправить. В event.obj.text хранится информация о том, какой текст в сообщении мы получили. Этот аргумент тоже обязателен.
Больше об аргументах к этому методу можно прочитать на официальной странице Вконтакте.
Запуск
Теперь наш бот готов и мы можем его запустить. После запуска можно смело писать боту и увидеть результат.
Итог
На этом 1 часть закончена. Мы научились включать бота. Настраивать его, а так же отправлять сообщения.
Во 2 части мы разберем, как при помощи библиотеки PyMySQL заносить сообщения в базу данных и так далее.
Источник: habr.com
Асинхронный ВК бот с базой данных. Как ускорить работу бота?
Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нем неправильно.
Необходимо обновить браузер или попробовать использовать другой.
zxqb
Пользователь
Апр 12, 2020 12 2 3
Пишу бот для вк, опыта 0
Думаю, вопрос полезный, исходя из того, сколько всего пришлось найти что б узнать все это с нуля, может быть, кому-то и пригодится
Использую библиотеки vkbottle, sqlite3, aiosqlite, asyncio
vkbottle отвечает за асинхронную обработку сообщений, база на sqlite, aiosqlite и asyncio — асинхронные запросы к базе.
Запрос состоит из трех параметров. Параметры задает пользователь и они поочередно записываются в словарь >
Общая структура:
Ну и собсно, по теме .. Использовать vkbottle вообще нормально? Что лучше и быстрее и дольше будет поддерживаться или еще чего?
SQLite лучше заменить MSQL? Почему? Или чем еще? Что быстрее и лучше?
Использование словарей и выборка данных из них сильно тормозит процесс, если будет много запросов? Лучше чем-то заменить?
Если не полноценные ответы на вопросы, то хотя бы темы на которые стоит обратить внимание подскажите
Источник: itfy.org