D
D
dyrtage62020-06-14 22:35:00
Python
dyrtage6, 2020-06-14 22:35:00

How to get definitions from Wikipedia via vk_api?

I want to help classmates with the search for information. I decided to create a VK bot that will drop definitions through the wikipedia library. An error comes up -

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']


The bot stops working, here is what the code looks like
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})

How to remove the error and make it work?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
S
soremix, 2020-06-14
@dyrtage6

You took the text everywhere through
event.object.text
Why do you do it for a wiki?
event.text
In general, your work logic is basically wrong.
First, you don't need to check the event type if "wiki" is in the text.
Secondly, this method will not process the search request.
I advise you to do better on the example of one message, for example,
/ wiki HERE SEARCH QUERY.
It would be something like this, plus it's better to check the wiki for a post entry than a wiki entry for a post.

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

If you still want through two messages, first a wiki, then a request, then you will need to remember which user wrote it, store it somewhere. It's better not to bother, especially for beginners.
And an addition for those who understand: why does everyone send random_id = 0? Liba itself then generates or what? Is it possible to mark all messages with zeros?

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question