Задать вопрос
@dyrtage6

Как получать определения из Википедии через vk_api?

Хочу помочь одноклассникам с поиском информации. Решил создать вк бота, который будет через библиотеку wikipedia скидывать определения. Выходит ошибка -
Traceback (most recent call last):
  File "/home/dyrtage2006/vbotk.py", line 31, in <module>
    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Вот что я нашёл: \n" + str(wikipedia.summary(event.text)),
AttributeError: 'VkBotMessageEvent' object has no attribute 'text'(Я уже использовал event.object['text']


Бот перестает работать, вот как выглядит код
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
import vk_api
import random
import wikipedia

vk = vk_api.VkApi(token="какой то токен")
vk._auth_token()
vk.get_api()
longpoll = VkBotLongPoll(vk, какой то айди)

play = ["Бумага", "Ножницы", "Камень"]
wikipedia.set_lang("RU")

while True:
    for event in longpoll.listen():
        if event.type == VkBotEventType.MESSAGE_NEW:
            if event.object.peer_id != event.object.from_id:
                if event.object.text.lower() == "привет":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Привет! Я бот беседы. Я умею играть(команда 'Игра'), смотреть информацию с Википедии(в стадии разработки). Остально тоже в стадии разработки.",
                                                "random_id": 0})
                if event.object.text.lower() == "игра":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Давай сыграем в игру 'Камень, ножницы, бумага'. Напиши свой ход и я его сделаю",
                                                "random_id": 0})
                if event.object.text.lower() == "бумага" or event.object.text.lower() == "ножницы" or event.object.text.lower() == "камень":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": random.choice(play) + ". Теперь сам думай кто выиграл, потому что разработчику лень додумывать",
                                                "random_id": 0})
                if event.object.text.lower() in "вики":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Введите запрос: ",
                                                "random_id": 0})
                    if event.type == VkBotEventType.MESSAGE_NEW:
                        vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Вот что я нашёл: \n" + str(wikipedia.summary(event.text)),
                                                "random_id": 0})

Как сделать, чтобы убрать ошибку и чтобы она заработала?
  • Вопрос задан
  • 367 просмотров
Подписаться 2 Простой Комментировать
Решения вопроса 1
SoreMix
@SoreMix Куратор тега Python
yellow
Вы же везде текст брали через
event.object.text

Почему для вики делаете
event.text

А вообще, у вас в принципе логика работы неправильная.

Во-первых, не нужно проверять тип ивента, если "вики" есть в тексте.
Во-вторых, таким методом не обработаете запрос поисковой.

Советую сделать лучше на примере одного сообщения, например,
/вики ТУТ ПОИСКОВОЙ ЗАПРОС.

Будет примерно так, плюс лучше проверить вики на вхождение в сообщение, чем вхождение сообщения в вики.
while True:
    for event in longpoll.listen():
        if event.type == VkBotEventType.MESSAGE_NEW:
            if event.object.peer_id != event.object.from_id:
                if event.object.text.lower() == "привет":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Привет! Я бот беседы. Я умею играть(команда 'Игра'), смотреть информацию с Википедии(в стадии разработки). Остально тоже в стадии разработки.",
                                                "random_id": 0})
                if event.object.text.lower() == "игра":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": "Давай сыграем в игру 'Камень, ножницы, бумага'. Напиши свой ход и я его сделаю",
                                                "random_id": 0})
                if event.object.text.lower() == "бумага" or event.object.text.lower() == "ножницы" or event.object.text.lower() == "камень":
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": random.choice(play) + ". Теперь сам думай кто выиграл, потому что разработчику лень додумывать",
                                                "random_id": 0})
                if "/вики" in event.object.text.lower():
                    search_query = event.object.text.lower().replace('/вики ', '')
                    search_result = str(wikipedia.summary(search_query))
                    message = "Вот что я нашёл: \n{}".format(search_result)
                    vk.method("messages.send", {"peer_id": event.object.peer_id, "message": message, "random_id": 0})


Если все же хотите через два сообщения, сначала вики, потом запрос, то нужно будет запоминать какой пользователь написал это, хранить где нибудь. Лучше так не заморачиваться, особенно новичкам.

И дополнение для разбирающихся: почему все шлют random_id = 0? Либа сама потом генерирует или что? Разве можно нулями все сообщения отмечать?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SPA2099 Москва
До 100 000 ₽
HR Prime Москва
от 300 000 до 3 800 000 ₽