Не понимаю как остановить прослушивание longoll python vk coin
import random
import time
import vkcoin
from vk_api import VkApi
from vk_api.bot_longpoll import VkBotEventType, VkBotLongPoll
from vk_api.longpoll import VkLongPoll
from vk_api.utils import get_random_id
import datetime
from pycbrf import ExchangeRates
stavki = {}
vk_session = VkApi(
token=) # сессия вк
longpoll = VkLongPoll(vk_session)
merchant = vkcoin.VKCoin(key='', user_id=, token = '') # сессия вк коин
amount = 0
user_id = ''
@merchant.payment_handler(handler_type='longpoll')
def payment_received(data):
"""
При получении платежа будет запущена эта функция. Она может называться как угодно
:param data['to_id']: Ваш ID ВКонтакте
:param data['id']: ID платежа
:param data['created_at']: Unix timestamp, время когда был совершён платёж
:param data['from_id']: ID отправителя платежа
:param data['amount']: Количество полученных VK Coin
"""
user_id = data['from_id']
amount = data['amount']
print('Получен платёж на сумму {amount} от {user_id}'.format(amount=amount, user_id=user_id))
def m():
longpoll = VkBotLongPoll(vk_session, '192247413') # longpoll
vk = vk_session.get_api()
for event in longpoll.listen(): # проверяем сообщения
if event.type == VkBotEventType.MESSAGE_NEW: # новое сообщение
if event.obj.text.lower() == 'пополнить баланс' \
or event.obj.text.lower() == 'пополнить счёт' \
or event.obj.text.lower() == 'пополнить':
vk.messages.send(
user_id=event.obj.from_id,
random_id=get_random_id(),
message=['Для пополнения перейдите по ссылке:' "\n"
f'{merchant.get_payment_url(1, 777, True)}']
)
merchant.run_longpoll(tx=[1])
if __name__ == '__main__': # включение бота
m()
Ответы (1 шт):
Автор решения: Вячеслав Сысоев
→ Ссылка
Описание функций LongPool модуля VK_API
Здесь написано что метод Listen() бесконечно слушает сервер, вот его исходный код:
def listen(self):
""" Слушать сервер
:yields: :class:`Event`
"""
while True:
for event in self.check():
yield event
Поэтому его можно остановить только прерыванием программы (а прерывание потом можно отловить с помощью try).
Или же вы можете использовать другой метод. Там есть функция Check(), которая проверяет события от сервера один раз.
UPD: Вот пример кода через try .. except
import time
def Listen():
while True:
time.sleep(1)
print("hello")
if __name__ == "__main__":
try:
Listen()
except KeyboardInterrupt:
print("Stop!")
Тут функцию Listen из Vk api я заменил своей. По факту она должна быть просто в блоке try. При нажатии CTRL+C подаётся прерывание с клавиатуры (Keyboard Interrupt). И сразу оно отлавливается в блоке except.