Skip to main content

Асинхронная библиотека для создания ботов в Яндекс Мессенджере

This project has been archived.

The maintainers of this project have marked this project as archived. No new releases are expected.

Project description

yandex-aiobot-py

Современная асинхронная библиотека для создания ботов в Яндекс Мессенджере

Простая. Надёжная. Без спама при старте. Работает в личке и группах.

PyPI version Python versions License

Возможности

  • Полностью асинхронная (asyncio + aiohttp)
  • Автоматическое определение: личный чат или группа
  • Inline-кнопки, опросы, фото, файлы
  • skip_old_messages=Trueне отвечает на старые сообщения при старте
  • Простой декоратор @bot.on_message
  • Поддержка callback-кнопок
  • Минималистичный и понятный API

Установка

pip install yandex-aiobot-py

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

import asyncio
import logging
from yandex_aiobot_py.client import Client, Button, Message
import config

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)


async def main():
    bot = Client(api_key=config.API_KEY, ssl_verify=False)

    @bot.on_message("/test")
    async def test_session_steps(message: Message):
        await bot.send_message(
            login=message.user.login,
            text="Пожалуйста, введите коротко тему обращения:",
        )
        await bot.register_next_step_handler(message.user.login, step_2)

    async def step_2(message: Message):
        # Шаг 2: Вопрос о подробной информации
        await bot.send_message(
            login=message.user.login,
            text="Пожалуйста, введите подробную информацию о вашей проблеме:",
            inline_keyboard=[
                await bot.create_universal_button(
                    text="Отмена",
                    phrase="/test_session_steps",
                    callback_data={"action": "cancel"},
                ),
            ],
        )
        await bot.register_next_step_handler(message.user.login, step_3)

    async def step_3(message: Message):
        # Шаг 3: Подтверждение обращения
        await bot.send_message(
            login=message.user.login,
            text="Вы уверены, что хотите отправить обращение?",
            inline_keyboard=[
                await bot.create_universal_button(
                    text="Да",
                    callback_data={"action": "confirm"},
                ),
                await bot.create_universal_button(
                    text="Нет",
                    callback_data={"action": "cancel"},
                ),
            ],
        )
        await bot.register_next_step_handler(message.user.login, step_4)

    async def step_4(message: Message):
        # Шаг 4: Завершение сессии
        if message.callback_data.get("action") == "confirm":
            await bot.send_message(
                login=message.user.login,
                text="Ваше обращение принято. Мы свяжемся с вами в ближайшее время.",
            )
        else:
            await bot.send_message(
                login=message.user.login,
                text="Обращение отменено.",
            )

    @bot.on_message("/start", chat_type="group")
    async def start_handler_g(message: Message):
        await bot.send_message(
            text="Вы обратились ко мне из группы!",
            chat_id=message.chat.chat_id,
        )

    @bot.on_message("/start", chat_type="private")
    async def start_handler_p(message: Message):
        await bot.send_message(
            text="Это личный чат.",
            login=message.user.login,
        )

    @bot.on_message("/image", chat_type="private")
    async def image_handler_p(message: Message):
        await bot.send_image(
            "/data/Script/Python/MyLibrary/yandex_aiobot_py/files/5435871924950525925.jpg",
            login=message.user.login,
        )

    @bot.on_message("/start")
    async def start_handler(message: Message):
        if message.chat and message.chat.chat_id:
            await bot.send_message(
                text="!!Вы обратились ко мне из группы!!!!",
                chat_id=message.chat.chat_id,
            )
        else:
            await bot.send_message(
                text="Это личный чат. 1",
                login=message.user.login,
            )

    @bot.on_message(r"/menu")
    async def show_menu(message: Message):
        btn = [
            Button(
                text="Выход",
                phrase="/exit_poll",
                callback_data={"actions": "exit_poll"},
            )
        ]

        await bot.send_message(
            text="Отправьте ссылку на чат",
            login=message.user.login,
            inline_keyboard=btn,
        )

    @bot.on_message(r".*")
    async def echo_handler(message: Message):
        chat_id = getattr(message.chat, "chat_id", None)
        logger.debug("Message chat_id: %s", chat_id)
        logger.debug("Message user login: %s", message.user.login)

        try:
            if chat_id:
                # Отправляем в чат, если chat_id есть
                await bot.send_message(
                    text=f"Вы написали: {message.text}", chat_id=chat_id
                )
            elif message.user and message.user.login:
                # Если chat_id нет, отправляем по логину пользователя
                await bot.send_message(
                    text=f"Вы написали: {message.text}", login=message.user.login
                )
            else:
                logger.warning(
                    "Не удалось определить chat_id или login для сообщения: %s", message
                )
        except Exception as e1:
            logger.exception("Ошибка при обработке сообщения: %s", e1)

    try:
        await bot.start_session()
        await bot.run()  # Запускаем метод run с асинхронным polling и watchdog
    except asyncio.CancelledError:
        logger.info("Bot stopped by cancellation")
    except Exception as e2:
        logger.exception("Произошла ошибка при запуске бота: %s", e2)
    finally:
        await bot.close_session()


if __name__ == "__main__":
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        logger.info("Программа остановлена пользователем")

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

yandex_aiobot_py-0.2.1.tar.gz (16.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

yandex_aiobot_py-0.2.1-py3-none-any.whl (15.8 kB view details)

Uploaded Python 3

File details

Details for the file yandex_aiobot_py-0.2.1.tar.gz.

File metadata

  • Download URL: yandex_aiobot_py-0.2.1.tar.gz
  • Upload date:
  • Size: 16.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for yandex_aiobot_py-0.2.1.tar.gz
Algorithm Hash digest
SHA256 3ab298360a772c57c50664fe79a9e97ab0f7ac5315c14be5561e8d2eee0f79d4
MD5 d2d3d994069a301a3b666fe6816f2a3b
BLAKE2b-256 f0a46c5e9f1d3ab8030b1faf1e87f39df940febe61664ea33526ec7759da9768

See more details on using hashes here.

File details

Details for the file yandex_aiobot_py-0.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for yandex_aiobot_py-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 5f46738c6ef69ade4929b69355d401d616b597769d1c266b78082c09692e9e46
MD5 4be72c7655334d53af0b5744905dd9cf
BLAKE2b-256 35cd81c93951451c94b8a0172b0385fa86008c827291dd3f2236141735e9f528

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page