VK API вызывается два раза на Python

Рейтинг: 0Ответов: 1Опубликовано: 08.01.2023

Использую API VK для автоматического добавления пользователей в закрытое сообщество:

import vk_api
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
from datas import token
import datetime


def main():
    vk_session = vk_api.VkApi(token=token)

    vk = vk_session.get_api()
    group_id = "ххх"

    i = 0

    longpoll = VkBotLongPoll(vk_session, group_id=group_id)
    for event in longpoll.listen():
        if event.type == VkBotEventType.GROUP_JOIN:
            print(event.obj.user_id, end=' ')
            try:
                vk.groups.approveRequest(group_id=group_id, user_id=event.obj.user_id)
            except Exception:
                pass
            i = i+1
            print(f" Вступил в группу {datetime.datetime.today()}. Сегодня присоединилось {i} человек")
        elif event.type == VkBotEventType.GROUP_LEAVE:
            print(event.obj.user_id, end=' ')

            print('Покинул группу!')


if __name__ == "__main__":
    main()

На выводе получаю:

394277503 Покинул группу!
394277503  Вступил в группу 2023-01-08 18:24:30.795948. Сегодня присоединилось 1 человек
394277503  Вступил в группу 2023-01-08 18:24:31.239004. Сегодня присоединилось 2 человек

Функция выполняется два раза по неизвестным мне причинам. Если закрыть на это глаза, то через некоторое время всё падает с ошибкой:

Traceback (most recent call last):
  File "/home/vk/auto.py", line 33, in <module>
    main()
  File "/home/vk/auto.py", line 16, in main
    for event in longpoll.listen():
  File "/usr/local/lib/python3.9/dist-packages/vk_api/bot_longpoll.py", line 286, in listen
    for event in self.check():
  File "/usr/local/lib/python3.9/dist-packages/vk_api/bot_longpoll.py", line 255, in check
    response = self.session.get(
  File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 600, in get
    return self.request("GET", url, **kwargs)
  File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 587, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.9/dist-packages/requests/sessions.py", line 701, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.9/dist-packages/requests/adapters.py", line 578, in send
    raise ReadTimeout(e, request=request)
requests.exceptions.ReadTimeout: HTTPSConnectionPool(host='lp.vk.com', port=443): Read timed out. (read timeout=35)

Что нужно сделать для того, чтобы функция автодобавления отрабатывала без ошибок и не крашилась со временем?

Ответы

▲ 0

Обращаемся к документации VK API: События в сообществах

Тип события: group_join

Добавление участника или заявки на вступление в сообщество.

Формат поля object:

  • user_id (integer) — идентификатор пользователя;

  • join_type (string) — указывает, как именно был добавлен участник.

    Возможные значения:

    • join пользователь вступил в группу или мероприятие (подписался на публичную страницу);
    • unsure — для мероприятий: пользователь выбрал вариант «Возможно, пойду»;
    • accepted — пользователь принял приглашение в группу или на мероприятие;
    • approved — заявка на вступление в группу/мероприятие была одобрена руководителем сообщества;
    • request — пользователь подал заявку на вступление в сообщество.

Следовательно наш бот получает два события: когда присоединяется пользователь и когда бот принимает заявку. Исправить можно при помощи дополнительного условия:

    ...
    for event in longpoll.listen():
        if event.type == VkBotEventType.GROUP_JOIN and event.obj.join_type == "request":
            print(event.obj.user_id, end=' ')
            ...

А то, что он через некоторое время всё падает с ошибкой, это периодические проблемы у VK и/или с вашим интернетом.