Что нового?

Статья Чат-бот на питоне. Часть 3.

Lex

New member
Новичок

Lex

New member
Новичок
Статус
Оффлайн
Регистрация
20 Мар 2019
Сообщения
4
Реакции
2
В прошлом гайде мы написали движок, и базу для плагинов, в этой части, заключительной для моей серии статей по написанию бота, мы напишем первые плагины и расширим некоторыми функциями вспомогательный модуль.
Приступим:
Самый стандартный функционал при тестировании бота, код будет выглядеть так:
Python:
from Plugins.Base import BasePlugin as base


class SayPlugin(base):
    def __init__(self):
        super().__init__()
        self.name = 'Скажи'  # Название плагина
        self.description = 'Бот говорит то, что ему скажут'  # Описание плагина
        self.words = ["скажи", "повтори", "say", "repeat"]  # Ключевые слова для вызова плагина

    def func(self):
        try:
            # self.result - словарь который содержит в себе данные для ответа
            # self.text - текст который следует после команды
            self.result['message'] = self.text
            return True
        except Exception as e:
            self.result['message'] = str(e)
            return False
Данные плагин будет по команде отправлять случайную картинку в количестве от 1 до 10 из заданных групп.
Python:
from Plugins.Base import BasePlugin as base
from Utils import Engine as UEngine
import random


class BeautifulPlugin(base):
    def __init__(self):
        super().__init__()
        self.name = 'Красота'
        self.description = 'Отправляет красивую картинку'
        self.words = ["красота", "красиво", "beautiful"]

    def func(self):
        if not UEngine.is_int(self.text):  # после команды можно указать количество картинок которые мы хотим получить, если количество не указано, то будет 1
            self.text = 1
        if int(self.text) > 10:  # если количество больше 10, то приравниваем его к 10 тк вк не позволяет отправить больше 10 картинок
            self.text = 10
        try:
            groups = [  # ид групп из которых будут браться картинки, обязательно цифровой
                -1111111111111,
                -2222222222222,
                -3333333333333
            ]
            self.result['attachment'] = UEngine.get_random_wall_picture(random.choice(groups), int(self.text))
            return True
        except Exception as e:
            self.result['message'] = str(e)
            return False
Здесь мы уже видим функцию UEngine.get_random_wall_picture()
Вот ее код:
Python:
def get_random_wall_picture(group_id, count=1):
    import random
    while True:
        max_num = VK().Photos().get(owner_id=group_id, album_id='wall', count=0)['count']  # получаем количество картинок со стены группы
        if max_num > count:
            photos_result = ''
            for _ in range(count):
                num = random.randint(1, max_num)  # выбираем рандомный ид картинки
                photos = VK().Photos().get(owner_id=group_id, album_id='wall', count=1, offset=num)['items']  # получаем картинку
                photos_result += 'photo' + str(group_id) + '_' + str(photos[0]['id']) + ','  # добавляет в результат ид картинки
            return photos_result
Теперь добавим плагин который будет блюрить картинку, тут мы увидим как скачивать картинку и отправлять обратно.
Python:
from Plugins.Base import BasePlugin as base
from Utils import Engine as UEngine
from PIL import Image, ImageFilter
import requests
import os


class ImageBlurPlugin(base):
    def __init__(self):
        super().__init__()
        self.name = 'Сглаживание'
        self.description = 'Отправляет сглаженное фото'
        self.words = ["сгладь", "сгладить", "блюр", "заблюрь", "blur", "smoothing", "smooth"]

    def func(self):
        try:
            if not self.photo is None:
                if UEngine.is_int(self.text):
                    if 100 >= int(self.text) >= 0:
                        p = requests.get(self.photo)  # В теле бота, которое мы писали в одной из прошлых частей был код который доставал картинку из сообщения
                        out = open('img.jpg', 'wb')
                        out.write(p.content)  # скачиваем картинку в файл, желательно ее привязать к иду сообщения чтобы при асинхронной работе разные плагины в процессе не мешали друг-другу, но этим займетесь вы
                        out.close()

                        image = Image.open('img.jpg')  # открываем изображение

                        for i in range(int(self.text)):
                            image = image.filter(ImageFilter.BLUR)  # блюрим согласно коэффициенту, который можно указать после команды

                        image.save('img.jpg', "JPEG")  # сохраняем изображение
                        self.result['attachment'] = UEngine.image('img.jpg')  # прикрепляем изображение к ответному сообщению
                        os.remove('img.jpg')  # удаляем файл с изображением
                    else:
                        self.result['message'] = 'Введите коэффициент [0..100].'
                else:
                    self.result['message'] = 'Введите коэффициент.'
            else:
                self.result['message'] = 'Прикрепите фото.'
            return True
        except Exception as e:
            self.result['message'] = str(e)
            return False
Здесь мы снова видим новую функцию, вот она:
Python:
def image(image_name=None):
    server = VK().Photos().get_messages_upload_server()['upload_url']  # получаем сервер для загрузки изображения
    response = requests.post(server, files={'photo': open(image_name, 'rb')}).text  # загружаем изображение и получаем ответ
    r = json.loads(response)
    u = VK().Photos().save_messages_photo(server=r['server'], photo=r['photo'], _hash=r['hash'])[0]  # получаем данные изображения
    _str = 'photo' + str(u['owner_id']) + '_' + str(u['id']) + '_' + u['access_key']  # формируем ид который может съесть вк
    return _str  # возвращаем его
Чтож, на этом я закончу свою серию статей по написанию чат-бота для вк на питоне.
Если что-то не понятно в каком-то из уроков вы можете спросить об этом в теме, либо в лс, я все распишу и объясню наиболее понятно.
 

jelaxe

Member
Интересующийся

jelaxe

Member
Интересующийся
Статус
Оффлайн
Регистрация
31 Авг 2020
Сообщения
9
Реакции
1
Хотелось бы чуть поподробнее.
 
Сверху