Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Flood control #19

Open
h31p opened this issue Oct 3, 2024 · 4 comments
Open

Flood control #19

h31p opened this issue Oct 3, 2024 · 4 comments
Labels
help wanted Extra attention is needed

Comments

@h31p
Copy link

h31p commented Oct 3, 2024

vkms -vv -i xxxxxxxxx dump -a -t 1 --export-json

2024-10-03 09:47:15,086 | INFO | vkms.main | MainThread |: VKMS 1.0.3.dev7+gf299608 started
2024-10-03 09:47:49,109 | ERROR | vk.session | Thread-_0 |: Handle API error: 9. Flood control. request_params = {'method': 'messages.getHistory', 'oauth': '1', 'v': '5.131', 'offset': '800', 'count': '200', 'peer_id': 'xxxxxxxxx', 'rev': '1'}
2024-10-03 09:47:50,305 | ERROR | vk.session | Thread-_0 |: Handle API error: 9. Flood control. request_params = {'method': 'messages.getHistory', 'oauth': '1', 'v': '5.131', 'offset': '2400', 'count': '200', 'peer_id': 'xxxxxxxxx', 'rev': '1'}
2024-10-03 09:47:57,067 | ERROR | vkms.actions | MainThread |: Downloading peer xxxxxxxxx failed: 9. Flood control. request_params = {'method': 'messages.getHistory', 'oauth': '1', 'v': '5.131', 'offset': '800', 'count': '200', 'peer_id': '56834073', 'rev': '1'}
2024-10-03 09:47:57,067 | INFO | vkms.main | MainThread |: VKMS completed

как бороться? пробовал выжидать время - даже спустя несколько часов с первого же раза Flood control

[       4096]  .
└── [       4096]  vkms-result
    ├── [       4096]  .json
    ├── [        916]  logs.txt
    └── [       4096]  .sqlite
        └── [      16384]  xxxxxxxxx.sqlite

@YariKartoshe4ka
Copy link
Owner

YariKartoshe4ka commented Oct 16, 2024

Сейчас за 5 минут накостылил такое решение: вставлять мусорные запросы между нужными. Выглядит ущербно и работает гораздо медленнее (только в 1 потоке). Если есть идеи, буду рад.

diff --git a/vkms/actions.py b/vkms/actions.py
index 61b5f81..c5d6166 100644
--- a/vkms/actions.py
+++ b/vkms/actions.py
@@ -1,7 +1,9 @@
 import logging
 from time import sleep
+from random import choice
 
 import vk
+from vk.api import APIRequest
 from sqlalchemy import func
 from vk.exceptions import VkAPIError
 
@@ -30,10 +32,27 @@ def dump(out_dir, include, exclude, token, nthreads, max_msgs, append, export_js
     """
     # Получаем объект для работы с VK API
     class API(vk.API):
+        def send(self, request, *args, flood=False, **kwargs):
+            if not flood:
+                methods = [
+                    'users.get',
+                    'wall.get',
+                    'docs.get',
+                    'friends.get',
+                    'pages.get',
+                    'account.getInfo'
+                ]
+                self.send(APIRequest(choice(methods), request.method_params), flood=True)
+
+            return super().send(request, *args, **kwargs)
+
         def on_api_error_6(self, request):
             sleep(1)
             return self.send(request)
 
+        def on_api_error_100(self, request):
+            return
+
         def get_captcha_key(self, request):
             return input(f'Captcha needed ({request.api_error.captcha_img}): ')

@YariKartoshe4ka YariKartoshe4ka added the help wanted Extra attention is needed label Oct 16, 2024
@YariKartoshe4ka
Copy link
Owner

Выяснил экспериментально, что ошибка Flood Control привязывается к определнному приложению, т.е. чем больше токенов от разных приложений используется, тем меньше шанс ее возникновения. Пробовал тестить с 8 разными токенами в одном потоке, работает несколько циклов и все равно выдает ошибку. Нужно как-нибудь нафаззить дополнительных cleint_id оффициальных приложений с правами messages. Я нашел только VK Admin, VK Admin (iOS), Маруся, Звонки ВКонтакте, vk.com, VK for Android, VK for iPhone, Kate Mobile

@YariKartoshe4ka
Copy link
Owner

Почему-то я все еще могу выгружать сообщения через execute (без ошиюок в 4 потока). Если мне не изменяет память, использование методов API через execute тоже подсчитывалось. Как будет время попробую переписать дамп на API.execute

@zhilemann
Copy link

vkms под флуд контроль попадает потому-что для юзеров есть лимит в 3 rps
с таким вот (СТРАШНО костыльным) фиксом в actions.py всё работает:

class API(vk.API):
    def send(self, *args, **kwargs):
        if hasattr(self, "_last_req"):
            elapsed = time() - self._last_req
            delta = 0.34 - elapsed
            if delta > 0: sleep(delta)

        self._last_req = time()
        return super().send(*args, **kwargs)

полноценный пул реквест делать лень xdddd
у вас в коде есть sleep(1) в случае error 6, но видимо error 6 вк больше не кидает)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
help wanted Extra attention is needed
Projects
None yet
Development

No branches or pull requests

3 participants