@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})

Как сделать, чтобы убрать ошибку и чтобы она заработала?
  • Вопрос задан
  • 358 просмотров
Решения вопроса 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? Либа сама потом генерирует или что? Разве можно нулями все сообщения отмечать?
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы