Как остановить через минуту выполнение цикла for event in longpoll.listen():
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 секунд, он завершит свой цикл.