Как стать автором
Обновить

Бот для VK на Python с MySQL за час ч.2

Время на прочтение 3 мин
Количество просмотров 14K

Предисловие


Прошу извинения за то, что в первой статье не написал про работу с базой данных, но именно эта часть направлена на работу с MySQL.

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

Подготовка


После прошлой статьи на руках мы должны иметь такой код:

import vk_api
from vk_api.utils import get_random_id
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import pymysql.cursors
import requests

def get_connection():
    connection = pymysql.connect(host='you_host',
                                 user='you_user',
                                 password='you_password',
                                 db='you_db'
                                 charset='utf8mb4',
                                 cursorclass=pymysql.cursors.DictCursor)
    return connection

<anchor>habracut</anchor>
vk_session = vk_api.VkApi(token="a6f87v8c9a9sa87a7af9a0f9f9v8a6s6c5b5m6n8bds09asc8d7b87d87bd87n")
vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, "637182735")
#Проверка действий 
for event in longpoll.listen():
    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)

Создадим бота, который будет возвращать нам результат положительный или отрицательный. Например «Life» и «Dead». Потом заносить его в базу данных и в будущем отправлять этот результат нам.

Для начала мы должны иметь свою базу данных с уже готовой таблицей.

Если кто то не умеет создавать таблицы, то вот код, который необходимо вставить будучи в mysql консоли:

CREATE DATABASE `firstbot`;
CREATE TABLE `mode`(Id_User INT(11), Mode VARCHAR(6) DEFAULT("NOT"), PRIMARY KEY(Id_User));

На этом каркас нашей таблицы будет готов. Подробнее о создании и изменении таблиц можно найти на офф. сайте(ссылка будет ниже).

Создадим функцию, которая будет рандомно возвращать Dead или Live:

#Подключим новый модуль random
import random
def random_mode():
    #Получаем рандомное число в районе от 1 до 200
    return random.choice(["Live","Dead"])

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

def add_to_database(function_mode, x):
    #Создаем новую сессию
    connection = getConnection()
    #Будем получать информацию от сюда
    cursor = connection.cursor()
    #Наш запрос
    sql = "INSERT INTO mode (Id_User, Mode) VALUES (%s, %s) ON DUPLICATE KEY UPDATE Mode = %s"
    #Выполняем наш запрос и вставляем свои значения
    cursor.execute(sql, (x, function_mode, function_mode))
    #Делаем коммит 
    connection.commit()
    #Закрываем подключение
    connection.close()
    #Возвращаем результат
    return function_mode


Мы создали функцию, которая будет добавлять человека в базу данных или заканчивать свою работу, если он уже там есть. В нашем случае все до ON DUPLICATE KEY UPDATE заносит наши результаты в базу данных. Если в базе данных есть уже колонка с id нашего юзера, то в базу данных не заносится новое значение, а обновляется за что и отвечает ON DUPLICATE KEY UPDATE.

Но помимо того, что мы заносим значения в базу данных, нам надо их получать. Для этого создадим такую функцию.

def select_from_database(x):
    connection = get_connection()
    cursor = connection.cursor()
    sql = "SELECT Mode FROM mode WHERE Id_User = %s"
    cursor.execute(sql, (x,))
    #Получаем запрашиваемые данных и заносим их в переменные
    for i in cursor:
        mode_send = i['Mode']
    #Проверяем точно ли есть такая запись
    if cursor.fetchall() == ():
        mode_send = 'Вы еще не пробовали'
    connection.close()
    return mode_send

cursor.fetchall() распаковывает получаемый нами запрос и отображает его. При помощи условия мы проверяем точно ли запись в базе данных есть. Если ее нет, то мы присваиваем ей желаемое значение-предупреждение
Все что нам осталось это собрать код полностью и добавить пару строк, что бы все работало так как мы хотим.

if event.obj.text == 'Попытка':
    if event.from_user:
        id_user  = event.obj.from_id
        vk.messages.send(
                            user_id=event.obj.from_id,
                            random_id=get_random_id(),
                            message="Ваш результат: " + add_to_database(random_mode(), id_user))
if event.obj.text == 'Прошлый результат':
    if event.from_user:
        idUser = event.obj.from_id
        vk.messages.send(
                            user_id=event.obj.from_id,
                            random_id=get_random_id(),
                            message="Ваш последний: " + select_from_database(id_user)
                            

И таким образом мы получим ответ от нашего бота



Итог


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

Полезные ссылки


Официальная страница PyMySQL
Официальная страница MySQL
Документация PyMySQL на русском
Документация vk_api
Документая API Вконтакте
Код самого бота
Теги:
Хабы:
+2
Комментарии 10
Комментарии Комментарии 10

Публикации

Истории

Работа

Data Scientist
66 вакансий
Python разработчик
136 вакансий

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн