Как удалить сообщение с помощью библиотеки vkbottle в Python?

Я пытаюсь реализовать функцию, которая будет автоматически удалять сообщение с текстом "test" сразу после его отправки, но получаю ошибку: <br/> <pre><code>vkbottle.exception_factory.code_exception.VKAPIError_15: Access denied: message can not be deleted (peer message)</code></pre> <br/> Не могу понять, в чем причина этой ошибки. Вот мой код: <br/> <pre><code class="python">from vkbottle.bot import Bot, Message
from config import token_vk
from all_function import text

bot = Bot(token=token_vk)
bot.labeler.custom_rules['text'] = text

@bot.on.private_message(text='test')
async def test(message: Message):
    await bot.api.messages.delete(message_ids=[message.id], delete_for_all=True)

if __name__ == '__main__':
    bot.run_forever()</code></pre>
  • 5 октября 2024 г. 7:04
Ответы на вопрос 1
Ошибка, с которой вы сталкиваетесь, связана с тем, что вы пытаетесь удалить сообщение, отправленное в личные сообщения (рекурсивно) от вашего бота, что не разрешено в API ВКонтакте. 

Чтобы исправить это, вы можете использовать метод, который удаляет только сообщения, отправленные от имени пользователя, а не от имени бота. Однако, если ваша цель — удалить сообщение, отправленное ботом, вам нужно учесть следующее:

1. **Сообщения бота** не могут быть удалены через `delete_for_all`, если они были отправлены в личные сообщения. В таком случае, вам нужно рассмотреть возможность удаления сообщения только от имени вашего аккаунта.

2. Чтобы успешно удалять свои сообщения, вам нужно использовать отдельный вызов для удаления. Попробуйте удалить сообщение с помощью `delete_for_all=False`.

Вот пример вашего кода с учетом вышеупомянутого:

```python
from vkbottle.bot import Bot, Message
from config import token_vk
from all_function import text

bot = Bot(token=token_vk)
bot.labeler.custom_rules['text'] = text

@bot.on.private_message(text='test')
async def test(message: Message):
    # Сообщение удаляется, но только для текущего пользователя
    await bot.api.messages.delete(message_ids=[message.id])

if __name__ == '__main__':
    bot.run_forever()
```

### Важно:
- **Access denied**: Убедитесь, что у вашего бота есть необходимые права доступа. Если бот находится в группе, убедитесь, что он имеет доступ к удалению сообщений.
- Проверьте настройки вашей группы или приложения в ВКонтакте, чтобы гарантировать, что у вас достаточно прав для выполнения этой операции.
- Помните, что удалять сообщения можно только в пределах личной переписки и не для сообщений, пришедших уже в диалог, который не управляется вашим ботом.

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