Coder Social home page Coder Social logo

fscdev / vkwave Goto Github PK

View Code? Open in Web Editor NEW
232.0 12.0 36.0 4.82 MB

Asynchronous framework for building high-performanced & easy to scale projects interacting with VK's API.

License: MIT License

Makefile 0.19% Python 97.01% HTML 2.79% Cython 0.01%
vkwave vk vk-api async-vk async bot vk-bot

vkwave's Introduction

vkwave

Уважаем все остальные библиотеки. VKWave здесь.

Бот не должен быть вашим первым проектом, сначала на достаточном уровне изучите язык и поделайте более простые проекты

VkWave

🇺🇸 English version

VKWave - это фреймворк для создания производительных и лёгких в расширении проектов, взаимодействующих с API ВКонтакте.

VKWave вдохновлен многими библиотеками, в частности: aiogram, vk.py и многими другими.

Текущий мейнтейнер проекта: @KurimuzonAkuma

Документация

Примеры использования

Почему VKWave?

  • Максимальная кастомизация
  • Полная асинхронность
  • Использование аннотаций типов

Установка

С GitHub, со всеми свежими обновлениями:

pip install https://github.com/prostomarkeloff/vkwave/archive/master.zip

Или с PyPI (более надежная):

pip install vkwave

Производительность

VKWave - это не самая быстрая библиотека, из-за нашей уверенности в том, что лёгкая настройка под себя, а также удобство при использовании во всех задачах являются более важными характеристиками библиотеки, чем скорость.

Но мы всегда заинтересованы в улучшении производительности, поэтому не стесняйтесь делать Pull Request-ы и обсуждать проблемы производительности.

Сообщество

VKWave - это очень молодой проект.

Простая библиотека для быстрого доступа к API

Телеграм чат

Учебники для лёгкого старта

Дополнения

Если вы хотите создать дополнение для VKWave (например, более простой способ написания ботов, даже проще vkwave.bots.addons.easy), то вам следует назвать свой проект так: vkwave-bots-really-easy.

Общий паттерн для дополнений: vkwave-<часть-vkwave>-<название-проекта>.

vkwave's People

Contributors

0ralo avatar arsen-chechen avatar bloodielie avatar callistoboy avatar crafterkolyan avatar dadyarri avatar eoftgge avatar gabbhack avatar haalon avatar hov9zok avatar iqiexie avatar jieggii avatar kesha1225 avatar krasnovmv avatar krimsn avatar kurimuzonakuma avatar masynchin avatar monosans avatar nibezo avatar prostomarkeloff avatar qulaz avatar saoqq avatar stunnerr avatar sumjest avatar tdakkota avatar uvicorn avatar vodogamer avatar wrongnull avatar yorkdw avatar zen220 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

vkwave's Issues

[ИДЕЯ]: Использование методов fave.getPosts, fave.getPhotos, fave.getVideos так как fave.get возвращает не все данные

Чеклист

  • Я убедился, что похожая идея еще не была описана

Описание

В данный момент в актуальном api вк нет методов для получения некоторой части закладок (лайкнутых пользоваталем объектов)

Метод fave.get не возвращает лайкнутые видео и посты (возвращает тоолько пост о том, что закладки переехали)
Для фото же, если судить по возможным значениям параметра item_type, этот метод вообще не применим

Есть deprecated методы fave.getPosts fave.getPhotos fave.getVideos

Они на данные момент поддерживаются, и позволяют получить соответственно посты, фото и видео, лайкнутые пользователем.

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

[БАГ]: Исключение при получении списка всех альбомов пользователя включая системные

Чеклист

  • Я убедился, что похожая проблема еще не была описана

  • VKWave установлен из (выберите один вариант)

    • PyPI
    • Github

Описание

Получение всех альбомов включая системные (при использовании need_system=True) выбрасывает исключение парсинга модели PhotosGetAlbumsResponse.

Конкретно не могут быть распаршены поля в PhotosPhotoAlbumFull.

Трейсбек (лог с ошибкой)

Exception has occurred: ValidationError
6 validation errors for PhotosGetAlbumsResponse
response -> items -> 0 -> created
  field required (type=value_error.missing)
response -> items -> 0 -> updated
  field required (type=value_error.missing)
response -> items -> 1 -> created
  field required (type=value_error.missing)
response -> items -> 1 -> updated
  field required (type=value_error.missing)
response -> items -> 2 -> created
  field required (type=value_error.missing)
response -> items -> 2 -> updated
  field required (type=value_error.missing)

Код, вызвающий ошибку

token = UserSyncSingleToken(Token(text_token))
async with API(tokens=token) as api:
    api_ctx = api.get_context()

    test = await api_ctx.photos.get_albums(need_system=True)

    print(test)

Ожидаемое поведение

Модель должна парсится без проблем

Решение

Системные альбомы не имеют полей created и updated, поэтому эти поля нужно сделать опциональными в PhotosPhotoAlbumFull

P.S: прошу, покройте код юнит-тестами 🧪

User longpoll

We need to implement user polling in vkwave-longpoll. Also it needs extension for bots (vkwave-bots)

Bots docs

VKWave Bots framework needs documentation. Currently small part is written.

AttributeError: 'MessagesMessage' object has no attribute 'message'

Делал бота на основе примера https://github.com/kesha1225/VkWaveBotExample

Сам бот работает, но в консоле все равно появляется куча ошибок, на которые не очень приятно смотреть.


Task exception was never retrieved
future: <Task finished name='Task-54' coro=<Dispatcher.process_event() done, defined at /Users/imac/Desktop/vkbot/botenv/lib/python3.9/site-packages/vkwave/bots/core/dispatching/dp/dp.py:41> exception=AttributeError("'MessagesMessage' object has no attribute 'message'")>
Traceback (most recent call last):
  File "/Users/imac/Desktop/vkbot/botenv/lib/python3.9/site-packages/vkwave/bots/core/dispatching/dp/dp.py", line 66, in process_event
    if not await self.middleware_manager.execute_pre_process_event(event):
  File "/Users/imac/Desktop/vkbot/botenv/lib/python3.9/site-packages/vkwave/bots/core/dispatching/dp/middleware/middleware.py", line 27, in execute_pre_process_event
    m_res = await middleware.pre_process_event(event)
  File "/Users/imac/Desktop/vkbot/middlewares/user_data_middleware.py", line 10, in pre_process_event
    user_id = event.object.object.message.from_id
AttributeError: 'MessagesMessage' object has no attribute 'message'
Task exception was never retrieved
future: <Task finished name='Task-59' coro=<Dispatcher.process_event() done, defined at /Users/imac/Desktop/vkbot/botenv/lib/python3.9/site-packages/vkwave/bots/core/dispatching/dp/dp.py:41> exception=AttributeError("'MessagesMessage' object has no attribute 'message'")>
Traceback (most recent call last):
  File "/Users/imac/Desktop/vkbot/botenv/lib/python3.9/site-packages/vkwave/bots/core/dispatching/dp/dp.py", line 66, in process_event
    if not await self.middleware_manager.execute_pre_process_event(event):
  File "/Users/imac/Desktop/vkbot/botenv/lib/python3.9/site-packages/vkwave/bots/core/dispatching/dp/middleware/middleware.py", line 27, in execute_pre_process_event
    m_res = await middleware.pre_process_event(event)
  File "/Users/imac/Desktop/vkbot/middlewares/user_data_middleware.py", line 10, in pre_process_event
    user_id = event.object.object.message.from_id
AttributeError: 'MessagesMessage' object has no attribute 'message'

При этом бот отвечает на сообщения, но при каждом новом сообщении выходит это.

Rework vkwave.bots.core.dispatching.cast

Getting cast by type(value) looks bad.
It should have list of handlers that will inspect object each by each and if handlers don't return any cast, caster will run default implementation.

def cast(self, obj: typing.Any):
    result = self.from_handlers(obj) or self.default(obj)
    return result

Unable to parse poll attachement

Suspicios behavior for wall.get using vk API above 5.84
Poll attachement has anonymous field that has values 0 or 1 for VK api versions <=5.84
For some reason versions above do report that field but not it's value, it just returned as null

It must be VK api bug, though official VK page does report correct values for anonymous

Original post that have such issue

Ошибка

Когда я пытаюсь запустить скрипт, где используются юзерботы, происходит ошибка

Код:

from vkwave.bots import SimpleLongPollUserBot, TaskManager, ClonesBot


bot = SimpleLongPollUserBot("first token")
bot_2 = SimpleLongPollUserBot("second token")


@bot.message_handler(bot.command_filter(commands=["ping"]), bot.from_me_filter(False))
async def start(event: bot.SimpleBotEvent):
    await event.answer("pong")


clones = ClonesBot(bot, bot_2)

clones.run_all_bots()

Ошибка:

Task exception was never retrieved
future: <Task finished name='Task-1' coro=<BaseSimpleLongPollBot.run() done, defined at /data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.8/site-packages/vkwave/bots/addons/easy/base_easy_bot.py:300> exception=TypeError('start() takes 1 positional argument but 2 were given')>
Traceback (most recent call last):
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.8/site-packages/vkwave/bots/addons/easy/base_easy_bot.py", line 303, in run
    await self._lp.start(ignore_errors)
TypeError: start() takes 1 positional argument but 2 were given
Task exception was never retrieved
future: <Task finished name='Task-2' coro=<BaseSimpleLongPollBot.run() done, defined at /data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.8/site-packages/vkwave/bots/addons/easy/base_easy_bot.py:300> exception=TypeError('start() takes 1 positional argument but 2 were given')>
Traceback (most recent call last):
  File "/data/user/0/ru.iiec.pydroid3/files/aarch64-linux-android/lib/python3.8/site-packages/vkwave/bots/addons/easy/base_easy_bot.py", line 303, in run
    await self._lp.start(ignore_errors)
TypeError: start() takes 1 positional argument but 2 were given

[БАГ]: Загрузка изображений в беседы без главного админа

Чеклист

  • Я убедился, что похожая проблема еще не была описана

  • VKWave установлен из (выберите один вариант)

    • PyPI
    • Github

Описание

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

Трейсбек (лог с ошибкой)

Task exception was never retrieved
future: <Task finished name='Task-42' coro=<Dispatcher.process_event() done, defined at C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\core\dispatching\dp\dp.py:43> exception=APIError('[1] Unknown error occurred')>
Traceback (most recent call last):
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\core\dispatching\dp\dp.py", line 72, in process_event
    result = await router.process_event(event)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\core\dispatching\router\router.py", line 48, in process_event
    h_res = await handler.process_event(event)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\core\dispatching\handler\base.py", line 40, in process_event
    c_result = await self.callback.execute(event)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\addons\easy\easy_handlers.py", line 771, in execute
    return await self.func.execute(new_event)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\core\dispatching\handler\callback.py", line 18, in execute
    return await self.func(event)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\hearthstone_deckview\main.py", line 152, in main
    resp = await photo_uploader.get_attachment_from_path(
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\utils\uploaders\uploader.py", line 69, in get_attachment_from_path
    return await self.get_attachment_from_io(peer_id, file_data, file_name=file_name)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\utils\uploaders\uploader.py", line 58, in get_attachment_from_io
    await self.upload(upload_url, f, file_extension=file_extension, file_name=file_name)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\bots\utils\uploaders\photo_uploader.py", line 40, in upload
    await self.api_context.photos.save_messages_photo(
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\api\methods\photos.py", line 1132, in save_messages_photo
    raw_result = await self.api_request("saveMessagesPhoto", params)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\api\methods\_category.py", line 22, in api_request
    return await self.__api.api_request(self.make_method_name(method_name), params)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\api\methods\_abc.py", line 195, in api_request
    err_handler_result = await self.handle_error(Error(result))
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\api\methods\_abc.py", line 151, in handle_error
    return await dispatcher.process_error(error, self)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vkwave\api\methods\_error.py", line 98, in process_error
    raise APIError(code, err["error_msg"], err["request_params"])
vkwave.api.methods._error.APIError: [1] Unknown error occurred

Код, вызвающий ошибку

photo_uploader = PhotoUploader(api_context=bot.api_context)
resp = await photo_uploader.get_attachment_from_path(peer_id=event.peer_id, file_path="pic.png", file_extension="png")

Хочу уточнить, что возможно этот баг - не ваш, а всего апи, пытался сделать это и на голом vk_api, все равно ошибка:

import random

import requests
import vk_api

from tokens import TOKEN

vk = vk_api.VkApi(token=TOKEN)
api = vk.get_api()

m = api.photos.getMessagesUploadServer(peer_id=2000000017)
url = m['upload_url']
resp = requests.post(url, files={"file1": open("pic.png", "rb")}).json()

ph = api.photos.saveMessagesPhoto(photo=resp['photo'],
                                  server=resp['server'],
                                  hash=resp['hash'])

api.messages.send(
    random_id=random.getrandbits(32),
    text="test",
    attachments=f'photo{ph["owner_id"]}_{ph["id"]}'
)
Traceback (most recent call last):
  File "C:\Users\hex\Desktop\Python\Python\deck_view\hearthstone_deckview\test\main.py", line 16, in <module>
    ph = api.photos.saveMessagesPhoto(photo=resp['photo'],
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vk_api\vk_api.py", line 737, in __call__
    return self._vk.method(self._method, kwargs)
  File "C:\Users\hex\Desktop\Python\Python\deck_view\venv\lib\site-packages\vk_api\vk_api.py", line 697, in method
    raise error
vk_api.exceptions.ApiError: [1] Unknown error occurred

Uploaders without file saving

Now all uploaders' methods get_attachment_from_link in vkwave-bots-utils saves files to disk, but we need to store temporary photo's data in memory, (io.BytesIO maybe...)

Fastapi в качестве сервера

Крутой проект, обязательно попробую.
Респект за pydantic очень его люблю и смотрю что написали очень много классов. Что очень удобно.

А не думали Fastapi в качестве сервера? он тоже из коробки идет с pydantic

Починить проверки

  • Куча ошибок в MyPy (хотя авторы гордятся наличием кучи статических типов)
  • Не проходят тесты
  • Flake8 ругается #146

[БАГ]: Исключение при попытке сделать импорт библиотеки

Чеклист

  • Я убедился, что похожая проблема еще не была описана

  • VKWave установлен из (выберите один вариант)

    • PyPI
    • Github

Описание

Когда пытаюсь просто импортнуть обычного бота(SimpleLongPollBot) выскакивает ошибка(установлено через poetry)
Тестировал как через PyPi, так и через GitHub, ошибка одна и та же.

Трейсбек (лог с ошибкой)

Traceback (most recent call last):
  File "C:\Users\Bit\PycharmProjects\test_timetable\main.py", line 1, in <module>
    from vkwave.bots import SimpleLongPollBot
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\vkwave\bots\__init__.py", line 1, in <module>
    from .core.dispatching.dp.dp import Dispatcher
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\vkwave\bots\core\__init__.py", line 1, in <module>
    from .dispatching.dp.dp import Dispatcher  # noqa: F401
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\vkwave\bots\core\dispatching\dp\__init__.py", line 1, in <module>
    from .result_caster import BaseResultCaster, ResultCaster
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\vkwave\bots\core\dispatching\dp\result_caster.py", line 6, in <module>
    from vkwave.bots.core.dispatching.events.base import BaseEvent
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\vkwave\bots\core\dispatching\events\base.py", line 7, in <module>
    from vkwave.types.user_events import BaseUserEvent
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\vkwave\types\user_events.py", line 39, in <module>
    class MessageData(pydantic.BaseModel):
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\pydantic\main.py", line 292, in __new__
    cls.__signature__ = ClassAttribute('__signature__', generate_model_signature(cls.__init__, fields, config))
                                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Bit\AppData\Local\pypoetry\Cache\virtualenvs\test-timetable-9v-t2yrb-py3.11\Lib\site-packages\pydantic\utils.py", line 258, in generate_model_signature
    merged_params[param_name] = Parameter(
                                ^^^^^^^^^^
  File "C:\Python311\Lib\inspect.py", line 2715, in __init__
    raise ValueError('{!r} is not a valid parameter name'.format(name))

Код, вызвающий ошибку

from vkwave.bots import SimpleLongPollBot

Ожидаемое поведение

Импорт библиотеки для дальнейшего использования

Мультиакк лонгполл

Как реализовать лонгполл на много аккаунтов?
Мне нужно чтобы одновременно работало несколько ботов

Добавить админку боту

Бот проверяет ид юзера и пр. И если это совпадает с данными об админе - предоставляет ему доступ к панели админа.
Панель админа будет реализована паттерном MVC, что даст более гибкую структуру панели.
Сама панель будет состоять из кнопок или чего-то другого.

Добавить админку боту

То есть бот проверяет ид юзера и пр. И если это совпадает с данными об админе - предоставляет ему что-либо(например кнопки для просмотра логов/дебага/спец возможностей)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.