Проблема возникает на строке
for event in longpoll.listen():
Полный текст ошибки следующий:
Traceback (most recent call last):
File "F:/Projects/VKbot/main.py", line 12, in <module>
for event in longpoll.listen():
File "F:ProjectsVKbotvenvlibsite-packagesvk_apibot_longpoll.py", line 285, in listen
for event in self.check():
File "F:ProjectsVKbotvenvlibsite-packagesvk_apibot_longpoll.py", line 262, in check
return [
File "F:ProjectsVKbotvenvlibsite-packagesvk_apibot_longpoll.py", line 263, in <listcomp>
self._parse_event(raw_event)
File "F:ProjectsVKbotvenvlibsite-packagesvk_apibot_longpoll.py", line 225, in _parse_event
return event_class(raw_event)
File "F:ProjectsVKbotvenvlibsite-packagesvk_apibot_longpoll.py", line 169, in __init__
peer_id = self.obj.peer_id or self.message.peer_id
AttributeError: 'NoneType' object has no attribute 'peer_id'
Полный текст моего кода:
import constants
import ncov
import random
import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
def send_message(text):
vk.messages.send(
random_id=random_id,
chat_id=chat_id,
message=text)
vk_session = vk_api.VkApi(token='ЦЕНЗУРА')
longpoll = VkBotLongPoll(vk=vk_session, group_id='ЦЕНЗУРА')
vk = vk_session.get_api()
while True:
for event in longpoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat and event.object.text:
random_id = random.randint(1, 2147483647)
chat_id = event.chat_id
message_text = event.object.text.lower()
if message_text.startswith('/'):
if message_text == "/virus":
send_message(f'{ncov.get_virus_world()} 💉')
elif message_text.startswith("/virus "):
country_request = message_text[8:]
send_message(f'{ncov.get_virus_country(country_request)} ☢')
elif message_text == "/help":
send_message(
"/virus - Кол-во заражённых COVID-19 в мире 💉n"
"/virus [страна] - Кол-во заражённых COVID-19 в стране ☢n")
else:
send_message(
"❌ Нераспознанная команда! ❌n"
"Чтобы вызвать список команд отправьте '/help'")
Ошибка в BotLongpoll появляется даже при выполнении кода, приведенного в примере
Печатает 85514032 для -170800454
Traceback (most recent call last):
File «C:UsersUserDesktophsehelpervkbot.py», line 67, in
main()
File «C:UsersUserDesktophsehelpervkbot.py», line 17, in main
for event in longpoll.listen():
File «C:UsersUserAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apibot_longpoll.py», line 271, in listen
for event in self.check():
File «C:UsersUserAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apibot_longpoll.py», line 251, in check
for raw_event in response[‘updates’]
File «C:UsersUserAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apibot_longpoll.py», line 251, in
for raw_event in response[‘updates’]
File «C:UsersUserAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apibot_longpoll.py», line 212, in _parse_event
return event_class(raw_event)
File «C:UsersUserAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apibot_longpoll.py», line 158, in init
if self.obj.peer_id < 0:
TypeError: ‘<‘ not supported between instances of ‘NoneType’ and ‘int’
# -*- coding: utf-8 -*-
import vk_api
import options as o
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
def main():
""" Пример использования bots longpoll
https://vk.com/dev/bots_longpoll
"""
vk_session = vk_api.VkApi(логин, пароль)
vk_session.auth()
longpoll = VkBotLongPoll(vk_session, идгруппы)
for event in longpoll.listen():
if event.type == VkBotEventType.MESSAGE_NEW:
print('Новое сообщение:')
print('Для меня от: ', end='')
print(event.obj.from_id)
print('Текст:', event.obj.text)
print()
elif event.type == VkBotEventType.MESSAGE_REPLY:
print('Новое сообщение:')
print('От меня для: ', end='')
print(event.obj.peer_id)
print('Текст:', event.obj.text)
print()
elif event.type == VkBotEventType.MESSAGE_TYPING_STATE:
print('Печатает ', end='')
print(event.obj.from_id, end=' ')
print('для ', end='')
print(event.obj.to_id)
print()
elif event.type == VkBotEventType.GROUP_JOIN:
print(event.obj.user_id, end=' ')
print('Вступил в группу!')
print()
elif event.type == VkBotEventType.GROUP_LEAVE:
print(event.obj.user_id, end=' ')
print('Покинул группу!')
print()
else:
print(event.type)
print()
if __name__ == '__main__':
main()
```
>>Пробовал добавлять random_id — Вы его добавили в вызов Вашей функции write_msg
, но функция ожидает только 2 аргумента (user_id
и message
). Отсюда первая ошибка: Вы передаёте в функцию 3 аргумента, когда она ожидает двух.
>>random_id не определяется — правильно. Потому что Вы нигде не объявили никакого random_id
, отсюда интерпретатор и не знает, что это такое.
Смотрите документацию:
random_id — уникальный (в привязке к API_ID и ID отправителя) идентификатор, предназначенный для предотвращения повторной отправки одинакового сообщения. Сохраняется вместе с сообщением и доступен в истории сообщений.
Заданный random_id используется для проверки уникальности за всю историю сообщений, поэтому используйте большой диапазон (до int64).
целое число, доступен начиная с версии 5.45
Т.е. Вы должны передавать параметр random_id
при обращении к методу API, а его значением должно быть любое 64-х битное целое число (насколько я помню, раньше было 32-х битное).
Как сгенерировать random_id
?
Можно воспользоваться функцией getrandbits
из модуля random
(предпочтительнее):
random_id = random.getrandbits(64) # 64 бита
Можно воспользоваться функцией get_random_id
из vk_api.utils
, которая делает то же самое, что и первый вариант:
random_id = vk_api.utils.get_random_id()
Как передать random_id
?
Исправьте описание функции write_msg
, добавив в вызов метода параметр 'random_id'
со значением, полученным одним из способов, описанных выше.
В общем, сделал следующее:
1. По примерам из Интернета, с помощью библиотеки vk_api написал такого бота, который просто должен отвечать на каждое сообщение.
2. Создал закрытую группу, получил ключ API, включил longpull и добавил разрешения на чтение и отправку сообщений
3. В настройках беседы дал боту доступ ко всем сообщениям, и даже пытался сделать его администратором беседы.
ПРОБЛЕМА:
Пишу в ЛС группы — бот отвечает. Добавляю бота в беседу, состоящую из нескольких человек — бот молчит как партизан.
Судя по всему, longpoll.listen() даже не отрабатывает, когда в группе кто-то пишет. Пробовал указывать имя бота (@PyBot), но и это не помогает.
В чем проблема? Пробовал реализации с другими библиотеками, пытался запустить различные примеры из Интернета, но там другие ошибки возникали. Ни один пример бота не заработал в беседе.
Кто сталкивался с таким, помогите пожалуйста!
Python | ||
|
Также, пробовал использовать вместо VkLongPoll — VkBotLongPoll, но он начинает ругаться на то, что в VkBotEventType нет from_user и from_chat
VkEventType.USER_OFFLINE
[9, -46003497, 1, 1538593005]
Пользователь 46003497 оффлайн VkOfflineType.AWAY
VkEventType.USER_OFFLINE
[9, -386277338, 0, 1538593290]
Пользователь 386277338 оффлайн VkOfflineType.EXIT
VkEventType.USER_OFFLINE
[9, -145170120, 0, 1538593304]
Пользователь 145170120 оффлайн VkOfflineType.EXIT
VkEventType.USER_ONLINE
[8, -386277338, 4, 1538593299]
Пользователь 386277338 онлайн VkPlatform.ANDROID
VkEventType.USER_TYPING_IN_CHAT
[62, 265762564, 30]
Печатает 265762564 в беседе 30
Traceback (most recent call last):
File "test.py", line 79, in <module>
main()
File "test.py", line 34, in main
for event in longpoll.listen():
File "C:UsersАндрейAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apilongpoll.py", line 595, in listen
for event in self.check():
File "C:UsersАндрейAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apilongpoll.py", line 544, in check
for raw_event in response['updates']
File "C:UsersАндрейAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apilongpoll.py", line 544, in <listcomp>
for raw_event in response['updates']
File "C:UsersАндрейAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apilongpoll.py", line 498, in _parse_event
return self.DEFAULT_EVENT_CLASS(raw_event)
File "C:UsersАндрейAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apilongpoll.py", line 355, in __init__
self._parse_peer_id()
File "C:UsersАндрейAppDataLocalProgramsPythonPython36-32libsite-packagesvk_apilongpoll.py", line 404, in _parse_peer_id
if 'from' in self.extra_values:
TypeError: argument of type 'NoneType' is not iterable