import hues from plugin_system import Plugin import publicsuffixlist import pickle import os psl = publicsuffixlist.PublicSuffixList() plugin = Plugin( 'Послать сообщение', usage=[ "напиши [id] [сообщение] - написать сообщение пользователю", "скрыть [id] - не получать сообщения от пользователя", "показать [id] - получать сообщения от пользователя", "небеспокоить - не получать сообщения вообще", "беспокоить - получать сообщения от пользователей, не в вашем чёрном списке" ]) black_list = {} muted = {} if not os.path.exists("plugins/temp/msg_sender_data"): os.makedirs("plugins/temp/msg_sender_data") try: with open('plugins/temp/msg_sender_data/bl.pkl', 'rb') as f: black_list = pickle.load(f) except: pass
from plugin_system import Plugin from settings import ACCEPT_FRIENDS, IS_GROUP from utils import schedule_coroutine if ACCEPT_FRIENDS: plugin = Plugin("Автоматическое добавление друзей(каждые 10 секунд)") @plugin.on_init() async def get_vk(vk): if not IS_GROUP: schedule_coroutine(add_friends(vk)) # Функция, если её запустить(см. get_vk для примера с выполнением в фоне), # будет выполняться каждые 10 секунд, до тех пор, пока stopper.stop == False # # Функция обязана принимать 1 обязательны параметр - stopper, но может # принимать и больше @plugin.schedule(10) async def add_friends(stopper, vk): result = await vk.method("friends.getRequests") if not result or not result["count"]: return users = result["items"] for user in users: await vk.method("friends.add", {"user_id": user})
import io import qrcode from qrcode.exceptions import DataOverflowError from plugin_system import Plugin plugin = Plugin( "QRCode генератор", usage=["qr [текст / ссылка] - генерирует QR код с вашим текстом"]) @plugin.on_command('qr') async def command(msg, args): if not args: await msg.answer('Введите слова или ссылку чтобы сгенерировать qr код') qr = qrcode.QRCode( error_correction=qrcode.constants.ERROR_CORRECT_L, box_size=10, border=4, ) qr.add_data(msg.text) try: qr.make(fit=True) except DataOverflowError: return await msg.answer('Слишком длинное сообщение!') img = qr.make_image()
import aiohttp from plugin_system import Plugin plugin = Plugin( "Скриншот любого сайта", usage=["скрин [адрес сайта] - сделать скриншот сайта [адрес сайта]"]) # Желательно первой командой указывать основную (она будет в списке команд) @plugin.on_command('скрин') async def screen(msg, args): if not args: return msg.answer('Вы не указали сайт!') async with aiohttp.ClientSession() as sess: async with sess.get("http://mini.s-shot.ru/1024x768/1024/png/?" + args.pop()) as resp: result = await msg.vk.upload_photo(await resp.read()) return await msg.answer('Держи', attachment=str(result))
import aiohttp from plugin_system import Plugin plugin = Plugin( 'Курсы валют', usage='курс - узнать курс доллара, евро, и фунта к рублю\n' 'сколько {валюты} в {кол-во} {валюте} - узнать курс между 2 валютами') async def get_rate(first: str, to: str = "RUB"): async with aiohttp.ClientSession() as sess: async with sess.get( f"http://api.fixer.io/latest?base={first}") as resp: try: data = await resp.json() return data['rates'][to] except (KeyError, IndexError): raise ValueError('Курса данной валюты не найдено') @plugin.on_command('курс', 'валюта') async def get_rates(msg, args): data = [] for cur in ('USD', 'EUR', 'GBP'): data.append(await get_rate(cur)) usd, eur, gbp = data vk_message = (f"1 Доллар = {usd} руб.\n" f"1 Евро = {eur} руб.\n" f"1 Фунт = {gbp} руб\n") await msg.answer(vk_message)
from plugin_system import Plugin plugin = Plugin('Список плагинов', usage='плагины - показать список загруженных плагинов') @plugin.on_command('плагины') async def call(msg, args): await msg.answer('Загруженные плагины:\n' + '\n'.join(pl.name for pl in msg.vk.get_plugins()))
from plugin_system import Plugin plugin = Plugin('Блокнот', usage='запомни [строка] - запомнить строку\n' 'напомни - напомнить строку') memoes = {} @plugin.on_command('запомни', 'запиши') async def memo_write(msg, args): string = ' '.join(args) memoes[msg.id] = string await msg.answer('Вроде запомнил...') @plugin.on_command('напомни', 'вспомни') async def memo_read(msg, args): string = memoes.get(msg.id, "Ничего") await msg.answer('Вот что я вспомнил:\n' + string)
from plugin_system import Plugin from settings import ADMINS plugin = Plugin('Сообщение админу', usage='админу [текст] - отослать администрации сообщение') @plugin.on_command('админу') async def toadmin(msg, args): data = ' '.join(args) sender_data = await msg.vk.method('users.get', { 'user_ids': msg.id, 'name_case': "gen" }) sender_data = sender_data[0] for uid in ADMINS: val = { 'peer_id': uid, 'message': f"Сообщение от {sender_data['first_name']} {sender_data['last_name']}, (vk.com/id{msg.id}):\n\"{data}\"", } if "attach1" in msg.brief_attaches: val['attachment'] = ",".join( str(x) for x in await msg.full_attaches) result = await msg.vk.method('messages.send', val) if not result: return await msg.answer('Сообщение не удалось отправить!') await msg.answer('Сообщение успешно отправлено!')
import time import aiohttp import hues from plugin_system import Plugin from utils import schedule_coroutine plugin = Plugin("Погода в вашем городе", usage="погода - погода") # сервис для определения погоды: http://openweathermap.org/api # введите свой ключ, если будете использовать! code = "fe198ba65970ed3877578f728f33e0f9" default_city = "Астрахань" text_to_days = { "завтра": 1, "послезавтра": 2, "через день": 2, "через 1 день": 2, "через 2 дня": 3, "через 3 дня": 4, "через 4 дня": 5, "через 5 дней": 6, "через 6 дней": 7, "через 7 дней": 8 } if code == "fe198ba65970ed3877578f728f33e0f9": hues.warn( "Вы используете общественный ключ для openweathermap.org! Рекомендуем вам получить личный!"
import random from plugin_system import Plugin from utils import load_settings from database import * plugin = Plugin('Видео группы', usage='случайное видео - прислать случайное видео из группы') class UserVideos(BaseModel): user_id = peewee.BigIntegerField(unique=True) video_list = peewee.TextField(default='') UserVideos.create_table(True) @plugin.on_init() async def check_group_videos(vk): plugin.temp_data['s'] = load_settings(plugin) # Получаем количество видео в группе values = {'owner_id': -int(plugin.temp_data['s']['public_id']), 'count': 0} resp = await vk.method('video.get', values) if resp: plugin.temp_data['public_video_count'] = resp.get('count') @plugin.on_command('случайное видео') async def send_videos(msg, args): """Отправляет пользователю видео из группы, записывает в базу уже отправленные"""
import random from database import * from plugin_system import Plugin from utils import load_settings plugin = Plugin( 'Узнать кто находится в беседе', usage=[ 'кто здесь - узнать членов беседы в которой вы введёте эту команду.' ]) @plugin.on_init() async def init(vk): plugin.temp_data = load_settings(plugin) emojis = [ '😏', '😄', '😠', '😆', '🤐', '😝', '🤔', '😎', '😐', '🙁', '😨', '🤔', '😠', '😝', '😘', '😗', '😙', '😙', '😟' ] @plugin.on_command('кто здесь', 'ктоздесь') async def who_is_here(msg, args): if msg.conf: all_users = await msg.vk.method("messages.getChatUsers", { 'chat_id': msg.cid, 'fields': 'name,online' })
import random from plugin_system import Plugin plugin = Plugin('Случайные мемы', usage='мемы - показать случайный мем') answers = '''Мемы поданы! Классный мемес! Знакомься, мемасик '''.splitlines() @plugin.on_command('мемы', 'мемасики', 'мем', 'мемчики', 'мемасик', 'мемосы') async def call(msg, args): photo = False data = None while not photo: values = { # owner_id = ид группы 'owner_id': -129950840, 'offset': random.randint(1, 400), 'count': 5 } data = await msg.vk.method('wall.get', values) data = data['items'][0] if 'attachments' in data: if 'photo' in data['attachments'][0]: photo = True attrs = data['attachments'][0]['photo']
import random from plugin_system import Plugin usage = """рандом (от) (до) - случайное число в диапазоне (от, до) Если нет "до", то диапазон (1, от). Если нет "от", то диапазон (1, 6)""" plugin = Plugin('Рандом', usage=usage) @plugin.on_command('рандом', 'случайно', 'кубик') async def call(msg, args): try: args = [int(arg) for arg in args] except ValueError: return await msg.answer("Один из аргументов - не число") # Если у нас два аргумента - это диапазон if len(args) == 2: start, end = args # Конечное значение больше начального if abs(end - start) > 0: num = random.randint(start, end) # Конечное число меньше начального else: num = random.randint(end, start) # Если один аргумент, то диапазон будет - (1, число) elif len(args) == 1: num = random.randint(1, args[0]) # Если нет аргументов, то диапазон, как в игральном кубике else: num = random.randint(1, 6)
from plugin_system import Plugin plugin = Plugin( "Калькулятор", usage="посчитать [выражение] - посчитать результат с помощью калькулятора") # def is_number(str): # @plugin.on_command('посчитать') # def calc():
from database import * from plugin_system import Plugin plugin = Plugin('Контроль бота (только для админов)', usage=['выключить - выключает бота', 'добавить в белый список [id] - добавить пользователя с id в белый список', 'убрать из белого списка [id] - убрать пользователя с id из белого списка', 'добавить в чёрный список [id] - добавить пользователя с id в чёрный список', 'убрать из чёрного списка [id] - убрать пользователя с id из чёрного списка', 'сделать админом [id] - добавить пользователя с id в список админов', 'убрать из админов [id] - убрать пользователя с id в список админов', 'чёрный список - показать чёрный список' 'белый список - показать белый список', 'админы - показать админов']) @plugin.on_command('выключить') async def shutdown(msg, args): if await get_or_none(Role, user_id=msg.user_id, role="admin"): await msg.answer('Выключаюсь, мой господин...') exit() else: await msg.answer('Я бы с радостью, но вы не мой администратор :)') @plugin.on_command('добавить в белый список') async def add_to_whitelist(msg, args): return await add_to_list(msg, args, "whitelisted") @plugin.on_command('добавить в чёрный список')
import random from plugin_system import Plugin plugin = Plugin("Случайные посты с 2ch") answers = ["Каеф", "Не баян (баян)", "Ну держи!", "🌚"] @plugin.on_command('двач', '2ch', 'двачик') async def get_memes(msg, args): isphoto = False boobs = None while isphoto is False: values = { # owner_id = ид группы 'owner_id': -22751485, 'offset': random.randint(1, 1985), 'count': 1 } boobs = await msg.vk.method('wall.get', values) if 'attachments' in boobs['items'][0]: if 'photo' in boobs['items'][0]['attachments'][0]: isphoto = True boobs_att = boobs['items'][0]['attachments'][0]['photo'] owner_id = str(boobs_att['owner_id']) att_id = str(boobs_att['id']) access_key = str(boobs_att['access_key'])
import hues from plugin_system import Plugin plugin = Plugin( "Отправка анонимного сообщения", usage=[ "анонимно [id] [сообщение] - написать анонимное сообщение пользователю" "(посылать можно только текст и/или фото)", "неполучатьанонимки - не получать анонимные сообщения", "получатьанонимки - получать анонимные сообщения" ]) DISABLED = ('https', 'http', 'com', 'www', 'ftp', '://') def check_links(string): return any(x in string for x in DISABLED) @plugin.on_init() def init(vk): if "donotdisturb" not in plugin.data: plugin.data["donotdisturb"] = {} else: for k in plugin.data["donotdisturb"]: plugin.data["donotdisturb"][int( k)] = plugin.data["donotdisturb"].pop(k) @plugin.on_command('анонимка', 'анонимно')
# -*- coding: utf-8 -*- import random from plugin_system import Plugin plugin = Plugin( 'Шар предсказаний', usage=['шар [строка] - вероятность того, что высказывание правдиво']) # Инициализируем возможные ответы answers = '''Абсолютно точно! Да. Нет. Скорее да, чем нет. Не уверен... Однозначно нет! Если ты не фанат аниме, у тебя все получится! Можешь быть уверен в этом. Перспективы не очень хорошие. А как же иначе?. Да, но если только ты не смотришь аниме. Знаки говорят — «да». Не знаю. Мой ответ — «нет». Весьма сомнительно. Не могу дать точный ответ. '''.splitlines() @plugin.on_command('правда', 'предсказание', 'реши', 'шар') async def tell_truth(msg, args):
import random import requests from plugin_system import Plugin plugin = Plugin('Шутки', usage='пошути - написать случайный анекдот') answers = '''А вот и шуточки подъехали!!! Сейчас будет смешно, зуб даю! Шуточки заказывали? Петросян в душе прям бушует :) '''.splitlines() @plugin.on_command('шутка', 'пошути', 'рассмеши') async def joke_get(msg, args): resp = requests.post('http://www.umori.li/api/random?num=10') try: print(resp.content) joke = resp.json()['joke']['text'] except: return await msg.answer("У меня шутилка сломалась :(") await msg.answer(random.choice(answers) + '\n' + str(joke))
import io import requests from PIL import Image from plugin_system import Plugin import publicsuffixlist psl = publicsuffixlist.PublicSuffixList() plugin = Plugin('Зеркало', usage="отзеркаль <прикреплённые фото> - ") FAIL_MSG = 'К сожалению, произошла какая-то ошибка :(' @plugin.on_command('отзеркаль') async def mirror(msg, args): photo = False for k, v in msg.brief_attaches.items(): if '_type' in k and v == "photo": photo = True break if not photo: return await msg.answer('Вы не прислали фото!') attach = (await msg.full_attaches)[0] response = requests.get(attach.link) img = Image.open(io.BytesIO(response.content)) w, h = img.size
from database import * from plugin_system import Plugin plugin = Plugin( "Отправка сообщения", usage=[ "напиши [id] [сообщение] - написать сообщение пользователю", "анонимно [id] [сообщение] - написать анонимное сообщение пользователю" "(посылать можно только текст и/или фото)", "не беспокоить - не получать сообщения", "беспокоить - получать сообщения" ], need_db=True) DISABLED = ('https', 'http', 'com', 'www', 'ftp', '://') def check_links(string): return any(x in string for x in DISABLED) @plugin.on_init() def init(vk): pass @plugin.on_command('анонимка', 'анонимно') async def anonymously(msg, args): text_required = True for k, v in msg.brief_attaches.items(): if '_type' in k and v == "photo":
from plugin_system import Plugin plugin = Plugin('Помощь', usage='команды - узнать список доступных команд') @plugin.on_command('команды', 'помоги', 'помощь') async def call(msg, args): usages = '\n\n✏ '.join(pl.usage for pl in msg.vk.get_plugins() if pl.usage) await msg.answer(f"⭐ Доступные команды: \n✏ {usages}")
import random from plugin_system import Plugin usage = [ 'двач - случайная фотка с двача', 'мемы - случайная фотка из https://vk.com/public129950840' ] plugin = Plugin("Случайные посты из пабликов", usage=usage) answers = ["Каеф", "Не баян (баян)", "Ну держи!", "🌚"] async def give_memes(msg, group_id): """Получает фотографию из случайного поста выбранной группы""" photo = None values = { # owner_id = ид группы 'owner_id': group_id, 'offset': random.randint(1, 1985), 'count': 1 } # Пока мы не нашли фотографию while not photo: data = await msg.vk.method('wall.get', values) attaches = data['items'][0].get('attachments') if attaches: photo = attaches[0].get('photo')
import random from plugin_system import Plugin usage = """рандом (от) (до) - случайное число в диапазоне (от, до) Если нет "до", то диапазон (1, от). Если нет "от", то диапазон (1, 6)""" plugin = Plugin( 'Рандом', usage=[ 'рандом (от) (до) - случайное число в диапазоне (от, до)\n' 'Если нет "до", то диапазон (1, от). Если нет "от", то диапазон (1, 6)' ]) @plugin.on_command('рандом', 'случайно', 'кубик') async def call(msg, args): try: args = [int(arg) for arg in args] except ValueError: return await msg.answer("Один из аргументов - не число") # Если у нас два аргумента - это диапазон if len(args) == 2: start, end = args # Конечное значение больше начального if abs(end - start) > 0: num = random.randint(start, end) # Конечное число меньше начального else: num = random.randint(end, start)
import hues from plugin_system import Plugin import publicsuffixlist import pickle import os psl = publicsuffixlist.PublicSuffixList() plugin = Plugin('Послать сообщение', usage='''напиши [id] [сообщение] - написать сообщение пользователю скрыть [id] - не получать сообщения от пользователя показать [id] - получать сообщения от пользователя небеспокоить - не получать сообщения вообще беспокоить - получать сообщения от пользователей, не в вашем чёрном списке'''.split("\n")) black_list = {} muted = {} if not os.path.exists("plugins/msg_sender_data"): os.makedirs("plugins/msg_sender_data") try: with open('plugins/msg_sender_data/bl.pkl', 'rb') as f: black_list = pickle.load(f) except: pass try: with open('plugins/msg_sender_data/m.pkl', 'rb') as f: muted = pickle.load(f)
from random import sample from plugin_system import Plugin plugin = Plugin("Кто в кого влюблён", usage=['кто кого - поиск парочек в беседе']) @plugin.on_command('кто кого', 'ктокого') async def gay_search(msg, args): if msg.conf: users = await msg.vk.method('messages.getChatUsers', {'chat_id': msg.cid, 'fields': 'name'}) love1, love2 = sample(users, 2) await msg.answer(f"[id{love1['id']}|{love1['first_name']} {love1['last_name']}] - ❤ Любит ❤ - " f"[id{love2['id']}|{love2['first_name']} {love2['last_name']}]") else: await msg.answer("Эту команду можно использовать только в беседе.")
2: "Февраль", 3: "Март", 4: "Апрель", 5: "Май", 6: "Июнь", 7: "Июль", 8: "Август", 9: "Сентябрь", 10: "Октябрь", 11: "Ноябрь", 12: "Декабрь" } diary = None plugin = Plugin('Уроки edu.tatar.ru', usage="уроки (число) - просмотреть расписание и задания " "на сегодня, или на (число)") async def get_diary(): async with aiohttp.ClientSession() as sess: async with sess.post(LOGIN_URL, headers=HEADERS, data=AUTH_DATA, allow_redirects=False) as resp: sess._cookie_jar.update_cookies({"DNSID": resp.cookies['DNSID']}) async with sess.get(DIARY_URL) as diary: async with sess.get(DIARY_URL) as diary: return await diary.text()
from plugin_system import Plugin from vbot import VERSION plugin = Plugin("Информация о боте", usage=["о боте - вывод информации о боте"]) @plugin.on_command('about', "о боте") async def command(msg, args): message = "🌍 VBot 🌍\n" \ "🌲 VBot - бот, написанный на языке программирования Python, способный выполнять различные " \ "команды, которые он может получать от пользователей. Бот может работать как пользователь или как " \ "группа. Этот бот может развлекать и поддерживать конференции, группы и просто быть приятным " \ "времяпровождением.\n" \ "🌲 Версия: " + VERSION + "\n" \ "🌲 https://github.com/VKBots/VBot" return await msg.answer(message)
from plugin_system import Plugin plugin = Plugin('Поиск видео', usage='видео [строка для поиска] - найти видео по запросу') @plugin.on_command('видео', 'видяшки', 'видос', 'видосик') async def video_search(msg, args): # Если нет аргументов if not args: return await msg.answer('Какое видео вас интересует?') query = ' '.join(args) params = { 'q': query, 'sort': 2, # Сортировка по релевантности 'adult': 0, # Включить "взрослый" контент 'count': 5 # Кол-во результатов } resp = await msg.vk.method('video.search', params) vids = resp.get('items') # Если не нашли ни одного видео if not vids: return await msg.answer('Ничего не найдено') resp = ','.join(f"video{vid['owner_id']}_{vid['id']}" for vid in vids) await msg.answer('Приятного просмотра!', attachment=resp)
import aiohttp from plugin_system import Plugin plugin = Plugin('Курсы валют', usage='курс - узнать курс доллара, евро, и фунта к рублю') async def get_rate(first: str, to: str = "RUB"): async with aiohttp.ClientSession() as sess: async with sess.get( f"http://api.fixer.io/latest?base={first}") as resp: try: data = await resp.json() return data['rates'][to] except (KeyError, IndexError): raise ValueError('Курса данной валюты не найдено') @plugin.on_command('курс', 'валюта') async def get_rates(msg, args): data = [] for cur in ('USD', 'EUR', 'GBP'): data.append(await get_rate(cur)) usd, eur, gbp = data vk_message = (f"1 Доллар = {usd} руб.\n" f"1 Евро = {eur} руб.\n" f"1 Фунт = {gbp} руб\n") await msg.answer(vk_message)