YouTube API v2 /feeds/api/videos/VIDEOID завершается ошибкой после 200+ запросов: 400 неверных запросов
У меня опубликовано около 7000 видеороликов, и около 500 из них должны быть в списке. Сначала я хочу просмотреть список этих видео и посмотреть их текущий статус 'доступ' 'действие' 'в списке' '.
Я использую API YouTube V2, выполняю OAUTH-аутентификацию для своего контента. Затем я перебираю список идентификаторов видео с этим запросом:
url = 'http://gdata.youtube.com/feeds/api/videos/' + youtube_id + '?alt=json'
и после примерно 214 запросов все последующие отказывают:
<HTML>
<HEAD>
<TITLE>Bad Request</TITLE>
</HEAD>
<BODY BGCOLOR="#FFFFFF" TEXT="#000000">
<H1>Bad Request</H1>
<H2>Error 400</H2>
</BODY>
</HTML>
headers={'status': '400', 'content-length': '145', 'x-xss-protection': '1; mode=block', 'x-content-type-options': 'nosniff', 'expires': 'Fri, 21 Jun 2013 20:08:28 GMT', 'server': 'GSE', 'cache-control': 'private, max-age=0', 'date': 'Fri, 21 Jun 2013 20:08:28 GMT', 'x-frame-options': 'SAMEORIGIN', 'content-type': 'text/html; charset=UTF-8'}
Нет подробностей о том, почему это, а оставшиеся ~300, терпят неудачу.
Это повторяется, если я перезапущу, он умрет после 214-го снова и снова. Если я начну в середине последовательности, пропуская первый 212, он умирает на 426-м видео - так что это не видео #215, которое имеет проблемы в изоляции.
Звучит так, будто я нахожусь в квоте, но мы увеличили нашу, и консоль API показывает, что мы не достигли предела.
Есть идеи?
Я еще даже не начал писать изменения, так что это беспокоит. Благодарю.
1 ответ
Перед выполнением запросов к API я вошел в систему с OAUTH и создал объект HTTP-запроса. Мое исправление состояло в том, чтобы периодически повторно вызывать логин, который я сейчас делаю каждый 10-й запрос - этого кажется достаточно.
FWIW, моя процедура аутентификации (основанная на примерах Посника) и вызов выглядит следующим образом:
class YouTubeV2(object):
"""Authenticate to APIv2 and do stuff we can't do with v3, like captions
"""
OAUTH_SCOPE = "https://gdata.youtube.com"
def __init__(self, client_id, client_secret, developer_key):
"""OAuth authenticates, creates 'http' attribute to make a .request().
Get client_id, client secret from: http://code.google.com/apis/console
Get developer_key from: http://code.google.com/apis/youtube/dashboard
"""
# This auth code is generic and should be used for any APIv2 calls.
self.client_id = client_id
self.client_secret = client_secret
self.developer_key = developer_key
self.headers = {'GData-Version': '2',
'X-GData-Key': 'key=%s' % self.developer_key}
storage = Storage("%s-oauth" % sys.argv[0])
self.credentials = storage.get()
if self.credentials is None or self.credentials.invalid:
# If there are no valid cached credentials, take the user through the
# OAuth2 login flow, and rely on the client library to cache the
# credentials once that's complete.
flow = OAuth2WebServerFlow(
client_id=self.client_id,
client_secret=self.client_secret,
scope=self.OAUTH_SCOPE,
user_agent=sys.argv[0])
self.credentials = run(flow, storage)
self.http = self.credentials.authorize(httplib2.Http())
yt2 = YouTubeV2(client_id, client_secret, developer_key)