Бот в вк как сделать: как работают, как сделать / Skillbox Media

python — Как сделать, чтобы чат бот ВК на питоне отвечал каждому пользователю по отдельности?

Вопрос задан

Изменён 3 месяца назад

Просмотрен 107 раз

Пишу простого чат бота для квиза на питоне. Проблема заключается в том, что если люди пишут ему в разное время, то все хорошо работает и он им отвечает каждому по отдельности. А когда люди пишут ему одновременно, то он работает сразу на всех и мешает их сообщения и свои ответы. Например: Один пользователь один отвечает на вопрос, а бот засчитывает это за ответ и другого пользователя, поэтому сбивается вся программа. Подскажите, пожалуйста, как это исправить.

for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW:
  if event. to_me:
    
    msg = event.text.lower()
    id = event.user_id
            
    if msg == 'хочу проверить свои знания':
      for i in id_list:
        if i == id:
          i = 1
          break
      if i == 1:
        sender(id, 'Вы уже вытянули свой билет')
      else:
        sender(id, answer, old_keyboard)
    
    if msg == 'тянуть билет':
      ticket_num = random.randint(1,max_value)
      ticket_txt = tickets.tickets[ticket_num]['questions']['first']
      id_list.append(id)
      sender(id, ticket_txt)
      questions_got = 1
    if questions_got == 1 and msg != 'тянуть билет':
        if msg == tickets.tickets[ticket_num]['answers']['first'].lower():
          ticket_txt = 'Правильно! Следующий вопрос: ' + tickets.tickets[ticket_num]['questions']['second']
          sender(id, ticket_txt)
          questions_got = 2
          right_answers += 1
        else:
          ticket_txt = 'К сожалению, вы ошиблись. \n Правильный ответ: ' + tickets.tickets[ticket_num]['answers']['first'] + '\nСледующий вопрос:\n ' + tickets.
tickets[ticket_num]['questions']['second'] sender(id, ticket_txt) questions_got = 2 elif questions_got == 2 and msg != 'тянуть билет': if msg == tickets.tickets[ticket_num]['answers']['second'].lower(): ticket_txt = 'Правильно! Следующий вопрос: ' + tickets.tickets[ticket_num]['questions']['third'] sender(id, ticket_txt) questions_got = 3 right_answers += 1 else: ticket_txt = 'К сожалению, вы ошиблись. \n Правильный ответ: ' + tickets.tickets[ticket_num]['answers']['second'] + '\nСледующий вопрос:\n ' + tickets.tickets[ticket_num]['questions']['third'] sender(id, ticket_txt) questions_got = 3 elif questions_got == 3 and msg != 'тянуть билет': if msg == tickets.tickets[ticket_num]['answers']['third'].lower(): right_answers += 1 ticket_txt = 'Правильно!\n' + 'Вы ответили правильно на ' + str(right_answers) + ' вопросов.' sender(id, ticket_txt) else: ticket_txt = 'К сожалению, вы ошиблись.
\n Правильный ответ: ' + tickets.tickets[ticket_num]['answers']['second'] + '\nВы ответили правильно на ' + str(right_answers) + ' вопросов.' sender(id, ticket_txt)
  • python
  • vkontakte-api
  • бот

Зарегистрируйтесь или войдите

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации

Почта

Необходима, но никому не показывается

Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки

Гайд — VK Бот на Python 2 часть — Keyboard / Динамичное меню | BLASTHACK

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

Хотел бы начать с того, что данный модуль действительно удобен во многом — код, реакция на ошибки со стороны вк, структура.
НАДА:
1. Python(Желательно 3.9) — python.org
2. Любой кодовый редактор(НЕ БЛОКНОТ!) — Notepad ++, Atom, VSC, IDLE Python, PyCharm, я использую Sublime Text и вам советую.
3. Сама библиотека vkbottle — Установка: pip install vkbottle
4. Так же библиотека asyncio — pip install asyncio

Так же:
pip install requests

ВНИМАНИЕ! В данном гайде я не буду рассказывать как создать python-файл и как запустить его, так как если вы не знаете этого, данная тема будет вам довольно сложна и не понятно, советую вам начать с vk_api если так надо.

Начнём с настройки сообщества, перед этим создаем его, создаем API ключ, ставим галочки на нужные евенты, так же и с LongPoll, затем ставим самую последнию версию Long Poll Api(Советую 5.

131)

Затем, заходим в «Сообщения» включаем их, так же включаем возможности ботов, по желанию можно включить кнопку «Начать» и указать приветствие.


Теперь копируем наш созданный API ключ, так же нам нужно ID сообщества(цифры после public….) если у вас паблик уже с аудиторией, вы можете узнать ID своего паблика тут -regvk.com

Теперь наконец-то, мы можем перейти к коду =)
Для начала импортируем нужные нам библиотеки и библиотеки которые мы установили.
Затем создадим переменные в которые поместим и передадим нужные нам данные, в нашем случае это токен и id нашей группы.
Так же, дабы не ходить во круг и около, создадим первую функцию ответа на сообщение!

# - НАДА -
import asyncio
import requests
import random
# - Вк -
from typing import Optional
from vkbottle import GroupEventType, GroupTypes, Keyboard, Text, VKAPIError
from vkbottle.bot import Bot, Message
from vkbottle import Keyboard, KeyboardButtonColor, Text, OpenLink
from vkbottle.
tools import DocMessagesUploader # Переменные group_id = '206644831' secret = 'ВАШ ТОКЕН' # Для удобства bot_token = secret bot_group_id = group_id vk = Bot(bot_token, bot_group_id) # Приветствие # Есть 3 типа - private_message - ожидание\ответ только в личные сообщения группы! # chat_message - ожидание\ответ только в беседе! # message - ожидание\ответ и в беседе и в личные сообщения! @vk.on.private_message(text=['Начать', 'Ку', 'Привет']) # Сама функция: async def privet(message: Message): # Ответ на сообщение await message.answer('Приветик!') # Толик видиорегистратор система мене vk.run_forever()

Теперь сразу разберем вопрос с вложениями видео/фото/файлы и тд
В методах вк -vk.com/dev, в категории messages, есть метод attachment — отвечающий за прикрепление вложений к сообщению.

Создадим пару функций..

# - НАДА -
import asyncio
import requests
import random
# - Вк -
from typing import Optional
from vkbottle import GroupEventType, GroupTypes, Keyboard, Text, VKAPIError
from vkbottle. bot import Bot, Message
from vkbottle import Keyboard, KeyboardButtonColor, Text, OpenLink
from vkbottle.tools import DocMessagesUploader
# Переменные
group_id = '206644831'
secret = 'ВАШ ТОКЕН'
ya = 'doc381260583_611979108'
ya2 = 'photo381260583_457378962'
ya3 = 'video-200537102_456239073'
# Для удобства
bot_token = secret
bot_group_id = group_id
vk = Bot(bot_token, bot_group_id)
# Приветствие
# Есть 3 типа - private_message - ожидание\ответ только в личные сообщения группы!
# chat_message - ожидание\ответ только в беседе!
# message - ожидание\ответ и в беседе и в личные сообщения!
@vk.on.private_message(text=['Начать', 'Ку', 'Привет'])
# Сама функция:
async def privet(message: Message):
    # Ответ на сообщение
    await message.answer('Приветик!')
# Фото
@vk.on.private_message(text='фото')
async def photo(message: Message):
    await message.answer('Вот твоя фотка ', attachment=ya2)
# Видео
@vk.on.private_message(text='видео')
async def video(message: Message):
    await message.answer('Вот твое видео ', attachment=ya3)
# Файл
@vk.
on.private_message(text='файл') async def file(message: Message): await message.answer('Вот твой файл ', attachment=ya) # Толик видиорегистратор система мене vk.run_forever()

Теперь рассмотрим клавиатуру и напишем простое динамичное меню, так же добавим ответ на сообщение которое мы не знаем =)

# - НАДА -
import asyncio
import requests
import random
# - Вк -
from typing import Optional
from vkbottle import GroupEventType, GroupTypes, Keyboard, Text, VKAPIError
from vkbottle.bot import Bot, Message
from vkbottle import Keyboard, KeyboardButtonColor, Text, OpenLink
from vkbottle.tools import DocMessagesUploader
# Переменные
group_id = '206644831'
secret = 'ВАШ ТОКЕН'
ya = 'doc381260583_611979108'
ya2 = 'photo381260583_457378962'
ya3 = 'video-200537102_456239073'
# Для удобства
bot_token = secret
bot_group_id = group_id
vk = Bot(bot_token, bot_group_id)
# Приветствие
# Есть 3 типа - private_message - ожидание\ответ только в личные сообщения группы!
# chat_message - ожидание\ответ только в беседе!
# message - ожидание\ответ и в беседе и в личные сообщения!
@vk.
on.private_message(text=['Начать', 'Ку', 'Привет']) # Сама функция: async def privet(message: Message): # Ответ на сообщение await message.answer('Приветик!') # Фото #@vk.on.private_message(text='фото') #async def photo(message: Message): # await message.answer('Вот твоя фотка ', attachment=ya2) # Видео #@vk.on.private_message(text='видео') #async def video(message: Message): # await message.answer('Вот твое видео ', attachment=ya3) # Файл #@vk.on.private_message(text='файл') #async def file(message: Message): # await message.answer('Вот твой файл ', attachment=ya) # Меню @vk.on.private_message(text=['/mm', 'menu', 'меню']) @vk.on.private_message(payload={'cmd': 'menu'}) async def menu(message: Message): await message.answer( # Сообщение при отправлении клавиатуры message = 'Меню: ', # Клавиатура keyboard = ( # one_time - True - одноразовая клавиатура, False - постоянная клавиатура # inline - True - клавиатура прикрепляется к сообщению(РАССМОТРИМ), False - клавиаутра в стандартном положении # .
add - добавить кнопку # .row - отступ # Цвета: POSITIVE - Ярко зеленый, SECONDARY(можно нечего не указывать) - БЛЕДНО БЕЛЫЙ # PRIMARY - СИНИЙ, NEGATIVE - КРАСНЫЙ Keyboard(one_time = False, inline = False) .add(Text('Инфа'), color=KeyboardButtonColor.POSITIVE) .add(Text('ЛУЧШИЙ ПОРТАЛ'), color=KeyboardButtonColor.NEGATIVE) .row() .add(Text('Магаз'), color=KeyboardButtonColor.PRIMARY) ) ) @vk.on.private_message(text='Магаз') async def magaz(message: Message): await message.answer( message = 'Пятерочка: ', keyboard = ( Keyboard(one_time = False, inline = False) .add(Text('Сигареты'), color=KeyboardButtonColor.POSITIVE) .add(Text('Чипсы'), color=KeyboardButtonColor.POSITIVE) .row() .add(Text('Блейзуха'), color=KeyboardButtonColor.POSITIVE) .add(Text('Круггетсы'), color=KeyboardButtonColor.NEGATIVE) . row() .add(Text('Назад', payload={'cmd': 'menu'})) ) ) # <3 @vk.on.private_message(text='ЛУЧШИЙ ПОРТАЛ') async def blasthk(message: Message): await message.answer( message = 'ЛУЧШИЙ СУКА САЙТ:', keyboard = ( Keyboard(inline = True) .add(OpenLink('https://blast.hk/', 'ЛУЧШИЙ ПОРТАЛ')) ) ) # нада сделать @vk.on.private_message() async def main(message): await message.answer('Я не знаю, что ответить на это =(\n\nВозможно потом когда нибудь я смогу ответить тебе на это =)') # Толик видиорегистратор система мене vk.run_forever()

Вроде бы все, прикреплю исходный файл к теме, так же видео дабы показать как это все работает =)
Если у вас есть срочные вопросы можете задавать их напрямую в
вк(кликабельно), а так пишите в данной теме.
Думаю, основное я вам донёс 🙂

Видео:

p. s я импортировал модуль Random, хотел сделать отправку рандомных ответов, думаю кто знает python тот сам знает как это сделать.