python273 / vk_api

Модуль для создания скриптов для ВКонтакте | vk.com API wrapper
https://pypi.org/project/vk-api/
Apache License 2.0
1.33k stars 321 forks source link

Vk Bot Api Bug #174

Closed DevRedOWL closed 5 years ago

DevRedOWL commented 6 years ago

Ошибка в BotLongpoll появляется даже при выполнении кода, приведенного в примере

Печатает 85514032 для -170800454

Traceback (most recent call last): File "C:\Users\User\Desktop\hsehelper\vkbot.py", line 67, in main() File "C:\Users\User\Desktop\hsehelper\vkbot.py", line 17, in main for event in longpoll.listen(): File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_api\bot_longpoll.py", line 271, in listen for event in self.check(): File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_api\bot_longpoll.py", line 251, in check for raw_event in response['updates'] File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_api\bot_longpoll.py", line 251, in for raw_event in response['updates'] File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_api\bot_longpoll.py", line 212, in _parse_event return event_class(raw_event) File "C:\Users\User\AppData\Local\Programs\Python\Python36-32\lib\site-packages\vk_api\bot_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()
Helow19274 commented 6 years ago

default

python273 commented 6 years ago

https://github.com/python273/vk_api/blob/master/vk_api/bot_longpoll.py#L160

нужно посмотреть почему тут у объекта может не быть peer_id

DevRedOWL commented 6 years ago

python273 commented 41 minutes ago https://github.com/python273/vk_api/blob/master/vk_api/bot_longpoll.py#L160 нужно посмотреть почему тут у объекта может не быть peer_id

Не очень понял, что мне нужно сделать, чтобы код заработал. И могут ли как то влиять настройки у самой группы?

python273 commented 6 years ago

Падает при получении сообщения? Можешь запустить и скинуть вывод после чего обычно падает?

# -*- coding: utf-8 -*-
import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType

class VkBotLongPollRaw(VkBotLongPoll):
    CLASS_BY_EVENT_TYPE = {}

def main():
    vk_session = vk_api.VkApi(token='токен группы')
    longpoll = VkBotLongPollRaw(vk_session, идгруппы)

    for event in longpoll.listen():
        print(event.raw)

if __name__ == '__main__':
    main()
python273 commented 6 years ago

Возможно в этом дело: vk_session = vk_api.VkApi(логин, пароль), для бота нужно токен группы передавать, а не логин с паролем

DevRedOWL commented 6 years ago

python273

Ближе к вечеру попробую запустить и скину результаты.

Если передавать надо токен группы, то где мне его взять? Это те, которые ключи доступа и создаются через настройки? Ибо ы разделе лонгпула в вк не создается ключ.

Helow19274 commented 6 years ago

для бота нужно токен группы передавать, а не логин с паролем

Без разницы. Если пользователь админ в группе group_id, то работает и от имени пользователя

python273 commented 6 years ago

Это те, которые ключи доступа и создаются через настройки?

Да

Без разницы. Если пользователь админ в группе group_id, то работает и от имени пользователя

Хмм, может там есть какие-то особенности для юзеров 🤔

Helow19274 commented 6 years ago

@python273 я проверял, и так и так работает. Даже проверял не от создателя группы, а от администратора

DevRedOWL commented 6 years ago

python273, скажи свой вк, я напишу, потому, как тут с ботами происходит нечто странное

DevRedOWL commented 6 years ago

Коротко говоря, через raw заработало

# -*- coding: utf-8 -*-
import vk_api
import options as o
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType

class VkBotLongPollRaw(VkBotLongPoll):
    CLASS_BY_EVENT_TYPE = {}

def main():

    vk_session = vk_api.VkApi(o.login, o.password)
    vk_session.auth()
    longpoll = VkBotLongPollRaw(vk_session, o.group_id)

    for event in longpoll.listen():

        if event.type == VkBotEventType.MESSAGE_NEW:
            print('Новое сообщение:')
            print('Для меня от: ',event.obj.user_id, end='')
            print('Текст:', event.obj.body)
            print()
python273 commented 6 years ago

Ну с raw понятно, что заработает 😃 Скинь вывод скрипта https://github.com/python273/vk_api/issues/174#issuecomment-418533599 , а то не понятно как фиксить

rdstonech commented 6 years ago

Встретился с той же проблемой, падает при получении сообщения. Авторизуюсь через токен

backtrace: Exception in thread Thread-1: Traceback (most recent call last): File "C:\Users\rdsto\AppData\Local\Programs\Python\Python37-32\lib\threading.py", line 917, in _bootstrap_inner self.run() File "C:\Users\rdsto\develop\python\projects\pythoncoding\pythoncoding\server.py", line 30, in run for event in bot_longpoll.listen(): File "C:\Users\rdsto\develop\python\projects\pythoncoding\venv\lib\site-packages\vk_api\bot_longpoll.py", line 271, in listen for event in self.check(): File "C:\Users\rdsto\develop\python\projects\pythoncoding\venv\lib\site-packages\vk_api\bot_longpoll.py", line 251, in check for raw_event in response['updates'] File "C:\Users\rdsto\develop\python\projects\pythoncoding\venv\lib\site-packages\vk_api\bot_longpoll.py", line 251, in <listcomp> for raw_event in response['updates'] File "C:\Users\rdsto\develop\python\projects\pythoncoding\venv\lib\site-packages\vk_api\bot_longpoll.py", line 212, in _parse_event return event_class(raw_event) File "C:\Users\rdsto\develop\python\projects\pythoncoding\venv\lib\site-packages\vk_api\bot_longpoll.py", line 158, in __init__ if self.obj.peer_id < 0: TypeError: '<' not supported between instances of 'NoneType' and 'int'

image

python273 commented 6 years ago

Можешь запустить https://github.com/python273/vk_api/issues/174#issuecomment-418533599 и скинуть вывод? Видимо peer_id не всегда есть в сообщении

rdstonech commented 6 years ago

Всё запустил, вот вывод:

{'type': 'message_new', 'object': {'id': 14, 'date': 1536382284, 'out': 0, 'user_id': 157817863, 'read_state': 0, 'title': '', 'body': 'Привет мир!'}, 'group_id': 171055070}

как видно, peer_id отсутствует

DevRedOWL commented 6 years ago

Можешь запустить #174 (comment) и скинуть вывод? Видимо peer_id не всегда есть в сообщении

Челодой моловек, вам тут ответили

python273 commented 6 years ago

Фиксится установкой версии API 5.80+. Не уверен стоит ли фиксы для прошлых версий добавлять

screen shot 2018-10-02 at 10 12 37 pm