Answer the question
In order to leave comments, you need to log in
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']
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})
Answer the question
In order to leave comments, you need to log in
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})
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question