Почему чат-бот вк отвечает всем сразу
Пишу чат-бот для группы на питоне. Проблема в том что если один пользователь нажимает кнопку на клавиатуре то бот отправляет ответ сразу всем. Например пользователь нажимает кнопку "о факультете" и бот всем у кого с ним есть диалог отвечает "бла бла бла". Я думал многопоточность решит эту проблему, но тоже не помогает. Вот код:
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
from vk_api.utils import get_random_id
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from threading import *
token = 'dc052153daa647a77f5c4e5342afcf3006c14e357a24988e5f9f06f85d32e0165b9d1181a390794baf56a'
authorize = vk_api.VkApi(token=token)
longpoll = VkLongPoll(authorize)
keyboard = VkKeyboard(one_time=True)
keyboard.add_button('Опрос-распределение', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_openlink_button('Игра Квиз', link='https://pornhub.com')
keyboard.add_line()
keyboard.add_button('О Факультете', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_button('О СибАДИ', color=VkKeyboardColor.POSITIVE)
users = {}
def write_message(sender, message, keyboard): # универсальная клавиатура, переделать все под нее
authorize.method('messages.send', {'user_id': sender, 'message': message, 'random_id': get_random_id(),
'keyboard': keyboard.get_keyboard()})
def main(user_id):
sender = user_id
write_message(sender, 'фгбоу во сибади и все такое', keyboard)
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
res_msg = event.text.lower()
if res_msg == 'опрос-распределение':
write_message(sender, 'Томское моторно тракторное училище', keyboard)
if res_msg == 'о факультете':
write_message(sender, 'бла бла бла', keyboard)
if res_msg == 'о сибади':
write_message(sender, 'кекно-мемный колледж', keyboard)
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
user_id = event.user_id
temp = user_id in users
if temp == False:
thread = Thread(target=main, args=(user_id,))
users[user_id] = thread.start()
print(users)
Ответы (1 шт):
Автор решения: Rolles
→ Ссылка
import vk_api
import random
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
vk_session = vk_api.VkApi(token='token')
vk = vk_session.get_api()
longpoll = VkBotLongPoll(vk_session, 'group_id')
keyboard = VkKeyboard(one_time=True)
keyboard.add_button('Опрос-распределение', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_openlink_button('Игра Квиз', link='https://pornhub.com')
keyboard.add_line()
keyboard.add_button('О Факультете', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_button('О СибАДИ', color=VkKeyboardColor.POSITIVE)
def send_message(event, message):
vk.messages.send(peer_id=event.object.message['peer_id'], message=message,
random_id=random.random())
def send_keyboard(event):
vk.messages.send(peer_id=event.object.message['peer_id'],
random_id=random.random(), keyboard=keyboard.get_keyboard(),
message='opa')
for event in longpoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW:
if event.object.message["text"] == 'о факультете':
send_message(event, 'бла бла бла')
elif event.object.message["text"] == 'clav':
send_keyboard(event)