Как сделать бота с базой данных ВК

В интернете и так полным-полно мануалов по подключению базы данных к любому скрипту. Однако, несмотря на такое обилие информации, мои комментарии буквально ломятся от вопросов вида «как?»: «подключить, использовать, настроить» базу данных к 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» прямо в папке бота, куда помещаем типичный шаблонный код:

Используем этот файл в начале нашего бота, размещая там строчку

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

БАЗА ДАННЫХ ПОЛЬЗОВАТЕЛЕЙ ДЛЯ БОТА ВК

И на страничке бота ошибок нет:

Если у вас есть — указывайте правильные логин и пароль к базе до тех пор пока ошибки не пропадут.

Модель базы

Теперь делаем обертку для нашей базы данных.

Что нам надо уметь?

  1. Нам надо уметь создавать новых пользователей, то есть создавать новые записи в таблице «users»
  2. Нам надо уметь проверять есть этот пользователь в базе или его нет(чтобы не плодить сущности и не создавать по две-три записи в базе для одного пользователя)
  3. Нам надо уметь добавлять данные настроек бота(какие-нибудь) к пользователю
  4. Нам надо уметь считывать сохраненные данные пользователя
Еще по теме:  Когда музыка Вконтакте стала платной

Ну вот и пишем нужные нам методы.

Вставка пользователей в базу

Первый метод — это создание, то есть сохранение юзера, в таблицу и выглядеть он будет так:

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

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