For event in longpoll listen ошибка

Проблема возникает на строке

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import random
import requests
import vk_api
from vk_api.longpoll import VkLongPoll, VkEventType
from bs4 import BeautifulSoup
 
api_key = 't-o-k-e-n'
 
session = requests.Session()
vk_session = vk_api.VkApi(token=api_key)
try:
    vk_session._auth_token()
except vk_api.AuthError as error_msg:
    print(error_msg)
    exit(0)
 
longpoll = VkLongPoll(vk_session)
vk = vk_session.get_api()
 
 
while True:
    for event in longpoll.listen():
        if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
            if event.from_user: #Если написали в ЛС
                vk.messages.send( #Отправляем сообщение
                    user_id=event.user_id,
                    message='Ваш текст', random_id=random.randint(1, 10000))
            if event.from_chat: #Если написали в Беседе
                vk.messages.send( #Отправляем собщение
                    chat_id=event.chat_id,
                    message='Ваш текст', random_id=random.randint(1, 10000))
                print("asdasdasdasdasdasdasdasdasdsa")

Также, пробовал использовать вместо 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

Понравилась статья? Поделить с друзьями:
  • Font capture acrord32 exe ошибка приложения
  • Fondital ошибка cf что это
  • Fondital victoria compact неисправности ошибки
  • Fondital victoria compact коды ошибок
  • Fondital minorca ctfs 24 ошибки