Обработка кода ошибки 6 в Вконтакте - Слишком много запросов в секунду
10 апреля 2018 г. 10:26
При работе с API в Контакте можно встретить следующий ответ:
{'error': 'Too many requests per second', 'error_code': 6}
Значение 6
ключа error_code
говорит о том, что превышено допустимое количество обращений api в течение некоторого времени (обычно в течение секунды).
Обработать его можно достаточно легко, например:
import requests import time def get_vk_data(method, params, max_attempts=20): url = f'https://api.vk.com/method/{method}' attempt = 0 while attempt < max_attempts: resp = requests.get(url, params=params) data = resp.json() if 'error' in data and data['error'].get('error_code') == 6: time.sleep(2) attempt += 1 continue break return data
Другими словами, мы пытаемся получить ответ (в переменную data
) до тех пор, пока либо не будет ошибки (покаdata
не будет содержать ключ error
), либо код ошибки будет отличный от 6
. Также предусмотрим максимальное количество попыток получить данные.
В качестве примера приведу обновление (синхронизацию) информации пользователя ВК:
class VKUser(models.Model): vk_user_id = models.IntegerField(_('VK User ID'), null=True, blank=True) screen_name = models.CharField(_('Screen name'), max_length=100, blank=True) pic_url = models.URLField(_('Pic url'), blank=True) first_name = models.CharField(_('First name'), max_length=100) last_name = models.CharField(_('Last name'), max_length=100) def sync_data(self): params = { 'v': '3.0', 'access_token': settings.ACCESS_TOKEN, 'user_ids': self.vk_user_id, 'fields': 'first_name, last_name, screen_name, photo_100', } data = get_vk_data('users.get', params)['response'][0] self.first_name = data['first_name'] self.last_name = data['last_name'] self.screen_name = data.get('screen_name', '') self.pic_url = data['photo_100'] self.save()
Метод sync_data()
обновляет поля: имя и фамилия пользователя, а также его аватар и короткое имя (screen_name).
Теперь этот код можно использовать так:
for vk_user in VKUser.objects.all(): vk_user.sync_data()
для того, чтобы обновить информацию о всех пользователях.
Обратите внимание, что можно было бы передать в params['user_ids]
список id
пользователей, чтобы в одном запросе получить информацию о всех нужных пользователях, а не в цикле поочерёдно получать информацию о пользователе. Но иногда нужно именно поочерёдно использовать для получения некоторых полей, например, counters
(https://dev.vk.com/reference/objects/user#counters)
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0