Обработка кода ошибки 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