etoughas
@etoughas

Как настроить бота ВК для беседы?

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

import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType

bot = vk_api.VkApi(token="token")

for event in VkLongPoll(bot).listen():
    if event.type == VkEventType.MESSAGE_NEW and event.to_me:
        text = event.text.lower()
        user_id = event.user_id

        from vk_api.utils import get_random_id
def send_message(user_id, message):
    bot.method('messages.send', {
        "user_id": user_id,
        "message": message,
        "random_id": get_random_id()
    }) 
    if text == "Привет": 
        send_message(user_id, "Привет!")

Еще у меня есть подозрение, что модуль VkBotLongpoll вообще не существует в vk_api потому что у меня частая ошибка в коде по типу -
line 2, in <module>
    from vk_api.longpoll import VkLongPoll, VKBotLongPoll
ImportError: cannot import name 'VKBotLongPoll' from 'vk_api.longpoll'
  • Вопрос задан
  • 176 просмотров
Решения вопроса 1
@barkami
После установки модуля vk_api сделайте следующее:
  1. Импортируйте необходимые классы и функции:
    from vk_api import VkApi
    from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
    from vk_api.utils import get_random_id
    import time


  2. Создайте объекты и переменные, с которыми будете работать всё время:
    vk_session = VkApi(token='ТОКЕН ВАШЕГО БОТА')
    longpoll = VkBotLongPoll(vk_session, АЙДИ ВАШЕГО БОТА (СООБЩЕСТВА ВКОНТАКТЕ))
    bot_name = "рыбка"  # никнейм для обращения к боту


  3. Создайте функцию для отправки сообщения:
    def sender(text, peer_id):
        vk_session.method('messages.send', {'random_id':get_random_id(), 'message':text, 'peer_id': peer_id, } )

    где random_id - уникальный идентификатор сообщения бота, message - текст сообщения, а peer_id - айди диалога (хоть личные сообщения, хоть многопользовательская беседа)

  4. В бесконечном цикле с обработкой ошибок (ВКонтакте перезагружает сервера время от времени, из-за чего бот будет "отваливаться" - будем ждать 30 секунд и пробовать снова) будем отправлять запрос на получение новых событий и принимать их при наличии таковых. Весь код засунем в функцию main и будем вызывать её при запуске программы:
    def main():
        while True:
            try:
                for event in longpoll.listen():
                    # если бот получил новое сообщение
                    if event.type == VkBotEventType.MESSAGE_NEW and bot_name in event.obj.text.lower():
                        # если сообщение из чата
                        if event.from_chat:
                            sender("Привет! Какая классная у вас беседа тут!", event.obj.peer_id)
                        # если сообщение от пользователя
                        elif event.from_user:
                            sender("Привет! О чём поговорим?", event.obj.peer_id)
            except:
                print("\n Попытка восстановить соединение через 30 секунд \n")
                time.sleep(30)
    
    
    if __name__ == "__main__":
        main()



P.S.: предварительно сгенерируйте ключ доступа, включите Long Poll API и настройте тип получаемых событий. Лично я пользовался версией Long Poll API 5.85, а так как синтаксис ответа от ВК может отличаться от версии к версии API, то при появлении странных ошибок попробуйте переключиться на неё.
P.P.S.: потом посмотрите на внутренности объекта event, чтобы понять что да как там и понять как лучше обрабатывать события.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы