Как остановить через минуту выполнение цикла for event in longpoll.listen():

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

listen() запускает "слушать сервер". C помощью break с условием "стоп" программа останавливается. Но как сделать, чтобы программа остановилась через определенное время, если нет событий (message), без 'KeyboardInterrupt'. Или подскажите готовый ответ по ссылке.

import time
vk = vk_api.VkApi(token=group_token)
longpoll = VkLongPoll(vk, group_id=group_id)
def write_msg(user_id, message):
    vk.method('messages.send', {'user_id': user_id, 'message': message,  'random_id': random.randrange(10**7)})
        
for event in longpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW:

        if event.to_me:
            msg_to_me = event.text.lower()
            event_id = event.user_id

            if msg_to_me == "привет":
                write_msg(event_id, f"Привет, друг!")
            elif msg_to_me == "пока":
                write_msg(event_id, "Пока, дружище!")
            elif msg_to_me == "8":
                write_msg(event_id, "Сеанс окончен")
                break
            else:
                write_msg(event_id, "Напишите 'привет' или 'пока' или '8', если хотите завершить сессию...")
            print(f'{msg_to_me}, {event_id}')
time = 10
stop_event.wait(time)

Ответы

▲ 1Принят

У VkLongPoll есть параметр wait, который отвечает за время ожидания ответа (после которого снова отправляется запрос). Тогда longpoll.listen(), который запускает вечный цикл, не нужен, достаточно longpoll.check().

...

longpoll = VkLongPoll(vk, group_id=group_id, wait=60)

while len(events := longpoll.check()) > 0:
    for event in events:
        ...

Но ВКонтакте в своей документации предупреждает:

Некоторые прокси-серверы обрывают соединение после 30 секунд, мы рекомендуем указывать wait=25.

Максимальное значение 90 секунд, что вполне достаточно.


Если данное решение вам не подходит или нужна задержка больше, вы можно создать свой listen(), который будет выключаться через N запросов на сервер:

...

longpoll = VkLongPoll(vk, group_id=group_id, wait=20)


def custom_listen(n=3):
    counter = 0  # Текущее количество пустых запросов
    while counter < n:
        events = longpoll.check()
        if len(events) == 0:
           counter += 1
        else:
           counter = 0

        for event in events:
            yield event


for event in custom_listen(3):
    ...

Таким образом, после трёх пустых запросов, длинной 20 секунд, он завершит свой цикл.