Funpay Bot Engine - современный асинхронный фреймворк для создания Funpay ботов.

Qvvonk

Новый пользователь
535204307-0fe5e617-e20d-42b4-804c-88d3356143d3.webp


Если вы пытались как-либо автоматизировать FunPay, то знаете, что адекватной обёртки для него нет.
Единственное подобие - FunPayAPI - непонятная поделка без возможности расширения, более того, заброшенная.

FunPay Bot Engine - это современный полноценный асинхронный фреймворк, который позволит вам легко создавать ботов для FunPay.

Под капотом используется:

  • pydantic для удобной сериализации, десериализации, а так же валидации данных;
  • eventry для создания событийной системы с роутерами, фильтрами, миддлварями и хэндлерами;
  • funpayparsers - дабы отделить логику парсинга. FunPay parsers в свою очередь используют под капотом selectolax, который является одним из самых быстрых, если не самым быстрым html парсером на данный момент (ну, точнее, оберткой над lexbor)

Синтаксиз привязки хэндлеров к событиям сделан похожим на Aiogram / FastAPI / любой другой событийно-ориентированный фреймворк.
Так, чтобы создать простейшего бота, вам нужен лишь небольшой сниппет:
Python:
import asyncio
from funpaybotengine import Bot, Dispatcher
from funpaybotengine.types import Message


bot: Bot = Bot(golden_key='12345678901234567890123456789012')  # Создаем экземляр бота
dp: Dispatcher = Dispatcher()  # Создаем диспетчер - корневой роутер


# Регистрируем хэндлер на событие о новом сообщении
# Хэндлер сработает тольько в том случае, если текст сообщения == 'привет'
@dp.on_new_message(lambda message: message.text.lower() == 'привет')
async def echo(message: Message) -> None:
    await message.reply('Пока')


async def main() -> None:
    # Запускаем цикл получения новых событий.
    await bot.listen_events(dp)


if __name__ == '__main__':
    asyncio.run(main())


Одной из особенностей FunPayBotEngine (а точне Eventry) - при отрабатывании первого подходящего хэндлера, процесс поиска подходящий хэндлеров не останавливается. FunPayBotEngine выполнит все подходящие к событию хэндлеру.
Python:
# Регистрируем хэндлер на событие о новом сообщении
# Хэндлер отработает на абсолютно любое сообщение.
@dp.on_new_message()
async def print_message(message: Message) -> None:
    print(f'Пришло новое сообщение от {message.sender_username}: ')
    print(message.text or message.image_url)


# Регистрируем хэндлер на событие о новом сообщении
# Хэндлер сработает тольько в том случае, если текст сообщения == 'привет'
@dp.on_new_message(lambda message: message.text.lower() == 'привет')
async def echo(message: Message) -> None:
    await message.reply('Пока')

В случае выше, если мы получим сообщение "привет" - отработают оба хэндлера.
У вас есть возможность отменитьь выполнение последующих хэндлеров достаточно ли вызвать [srci]⁡event.stop_propagation()[/srci] ⁡ , однако на практике это ни разу не пригождалось, т.к. чаще всего, автоматизируя FunPay, нам необходимо навешивать все больше и больше хэндлеров на одни и те же события, а не наоборот.


FunPayBotEngine может много чего еще:
  • Хорошо реализованый сборщик событий: все события получаются из сообщений, после чего события о новых заказах / отзвых и т.д. дополняются объектами самих заказов / отзывами и т.д. (и нет, обмануть FunPay Bot Egnine, отпарвив фейковое сообщение, не получится). Такой способ позволяет не упустить ни одного события (в том же FunPay API если заказ старый или сообщение - первое в новом чате - события вы не получите).
  • Реализовано более 30 самых частоиспользуемых методов: от обычного получения страниц, до действий типа отправки сообщений / управления отзывами / заказами и т.д.
  • Все типы данных представлены в виде pydantic моделей: никаких словрей и прочей ерунды.
  • Естетсвенно, роутеры, фильтры, хэндлеры, миддлвари разных типов и т.д. Кстати говоря, для всех этих сущностей нет фиксированных сигнатур. Вы можете указывать в хэндлеры любый параметры, которые захотите, главное, чтобы они присутствовали в [srci]⁡workflow_data[/srci] ⁡ и контектсе события. Таким образом вы можете написать хэндлер, который вообще не принимает никакие аргументов, если оно вам надо.

P.S. На данный момент фреймворк все еще разрабатывается, потому, увы, документации пока нет (но со временем появится, чего уж там).
Однако пользоваться им уже можно, просто смотря в исходники, а не в документацию. Исходники простые для понимания, т.к. вся логика парсинга и т.п. вынесены в отдельный пакет, в FunPayBotEngine - только сами методы, классы и т.д.

Если у вас есть какие-то предложения / баг репорты и т.д., добро пожаловать на github. А еще лучше пул реквест оформите.

Ну и любые вопросы можно в телеге задать: клик. Мы тут неболььшой (пока) компанием сидим.
 
Назад
Сверху