VK API вызывается два раза на Python
Использую 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)
Что нужно сделать для того, чтобы функция автодобавления отрабатывала без ошибок и не крашилась со временем?
Ответы (1 шт):
Обращаемся к документации 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 и/или с вашим интернетом.