@Hramoff

Почему функция с вызовом API вызывается два раза?

Использую 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 Вступил в группу 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)


Что нужно сделать для того, чтобы функция автодобавления отрабатывала без ошибок и не крашилась со временем?
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 1
@gergerov
сначала идет join_type=request, потом ты подтверждаешь и идёт approved, поэтому у тебя 2 события приходит.
нужно анализировать поле join_type
63bcea2dd8bd8242099383.jpeg
читай доку
ошибка вероятно происходит из-за того, что на событие group_join с join_type=approved ты пытаешься выполнить метод одобрения заявки на вступление в сообщество, но в этом на 100% не уверен.
Ну и счетчик не держи так. Потеряешь. В файл пиши рядом, если минисервис без БД (читаешь с файла при старте приложения, сохраняешь при выходе из приложения).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы