В прошлом гайде мы написали движок, и базу для плагинов, в этой части, заключительной для моей серии статей по написанию бота, мы напишем первые плагины и расширим некоторыми функциями вспомогательный модуль.
Приступим:
Чтож, на этом я закончу свою серию статей по написанию чат-бота для вк на питоне.
Если что-то не понятно в каком-то из уроков вы можете спросить об этом в теме, либо в лс, я все распишу и объясню наиболее понятно.
Приступим:
Самый стандартный функционал при тестировании бота, код будет выглядеть так:
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 # возвращаем его
Если что-то не понятно в каком-то из уроков вы можете спросить об этом в теме, либо в лс, я все распишу и объясню наиболее понятно.