Как отслеживать все сообщения в VK/ВК (входящие/исходящие) vkbottle?

Рейтинг: 0Ответов: 2Опубликовано: 09.02.2023

Пишу бота для сообщества ВК на vkbottle. Логика работы заключается в следующем: User общается сначала с ботом, а потом, если есть необходимость, нажимает кнопку "Перейти в чат с админом сообщества", в этот момент бот отключается и сообщения, которые пишет пользователь уходят на админа группы. После завершения диалога с админом сообщества надо включить бота обратно. Пытаюсь сделать через event, когда бот слушает все сообщения и по определенному тексту заново включает бота, но не получается.

Как отслеживать все сообщения в чате сообщества (в переписке с user)? С помощью event? Помогите пожалуйста

from vkbottle.bot import Bot, Message, MessageEvent
from vkbottle import Keyboard, KeyboardButtonColor, Text, OpenLink, GroupEventType, GroupTypes, VKAPIError


bot = Bot(TOKEN)


gremlins = (
        Keyboard(inline=True)
        .add(Text("Gizmo", {"btn": "Gizmo"}))
        .add(Text("Stripe", {"btn": "Stripe"}))
    ).get_json()


btn_ask_question_admin = (
        Keyboard(inline=True)
        .add(Text("Задать вопрос администратору", {"btn": "ask_question"}))
).get_json()


@bot.on.private_message(text=['Начать', 'hello', 'start', 'начать', 'привет'])
@bot.on.private_message(payload={"btn": "Начать"})
async def start(message: Message):
    await message.answer('Выбери своего гремлина!', keyboard=gremlins)


@bot.on.private_message(text='Начать')
@bot.on.private_message(payload={"btn": "Gizmo"})
async def gremlin_gizmo(message: Message):
    btn_return = Keyboard(one_time=True, inline=False).add(Text('Основное меню', {"btn": "Начать"}))
    await message.answer('ТЕКСТ ТЕКСТ ТЕКСТ', keyboard=btn_return)
    await message.answer('Не нашли нужного гремлина или хотите дополнить информацию, Вы можете связаться с нашим администратором.', keyboard=btn_ask_question_admin)


@bot.on.private_message(payload={"btn": "ask_question"})
async def ask_question_admin(message: Message):
    btn_return = Keyboard(one_time=False, inline=False).add(Text('Основное меню', {"btn": "Начать"}))
    await message.answer('Пожалуйста, напишите свой вопрос.', keyboard=btn_return) # тут пользователь пишет сообщения, которые уходят на админа сообщества


@bot.on.raw_event(GroupEventType.MESSAGE_REPLY) # вот тут пытаюсь отловить исходящие сообщения сообщества, то есть сообщения от админа к user, но постоянно падаю с ошибкой.
async def return_bot(event: Message):
    if event.reply_message.text == 'Благодарим':
        await bot.on.private_message(
            user_id=event.object.user_id,
            message='Выбери своего гремлина!',
            keyboard=gremlins,
            random_id=0
        )


if __name__ == "__main__":
    bot.run_forever()

Ответы

▲ 1

Решение следующее: отлавливать исходящие сообщение, и по определённому тексту включать бота обратно.

@bot.on.raw_event(GroupEventType.MESSAGE_REPLY)
async def return_bot(event: Message):
    if event.get('object', {}).get('text') == 'Благодарим за обращение!':
        await bot.api.messages.send(
            peer_id=event.get('object', {}).get('peer_id'),
            message='Выбери своего гремлина!',
            keyboard=gremlins,
            random_id=0
        )
    else:
        pass
▲ 0

Возможно эта информация сможет помочь некоторым! Принцип работы все остаётся такой же как и обсуждалось людьми выше

Но, можно немного улучшить, вместо того, чтобы писать "кодовое слово" можно чекать есть ли параметр в исходящем сообщении: event["object"]["admin_author_id"] - если он есть, то значит сообщение написал Администратор от имени сообщества. А вот если этого параметра нету, то значит сообщение пишет этот Бот