2013-12-14 2 views
1

У меня есть список видеороликов youtube из разных плейлистов, и мне нужно проверить, действительно ли эти видеоролики остаются в силе (их около 1000). То, что я делаю в данный момент он ударяя Youtube, используя его API v2 и Groovy с помощью этого простого скрипта:Несколько запросов к API Youtube V2 с использованием Groovy

import groovyx.net.http.HTTPBuilder 
import static groovyx.net.http.Method.GET 

http = new HTTPBuilder('http://gdata.youtube.com') 

myVideoIds.each { id -> 
    if (!isValidYoutubeUrl(id)) { 
     // do stuff 
    } 
} 

boolean isValidYoutubeUrl (id) { 
    boolean valid = true 
    http.request(GET) { 
     uri.path = "feeds/api/videos/${id}" 

     headers.'User-Agent' = 'Mozilla/5.0 Ubuntu/8.10 Firefox/3.0.4' 

     response.failure = { resp -> 
      valid = false 
     } 
    } 
    valid 
} 

, но через несколько секунд он начинает возвращать 403 ни для одного идентификатора (это может быть связано с факт, что это слишком много запросов). Проблема уменьшается, если я вставляю что-то вроде Thread.sleep(3000). Есть ли лучшее решение, чем просто откладывание запросов?

ответ

2

В V2 API существуют ограничения по времени на количество запросов, которые вы можете сделать, но они не являются жестким и быстрым лимитом (то есть, это зависит от многих факторов под капотом и может не всегда быть одним и тем же пределом). Вот что написано в документации:

API YouTube применяет квоты для предотвращения проблем, связанных с неправильным использованием API . В частности, ошибка too_many_recent_calls указывает, что серверы API получили слишком много вызовов от того же вызывающего абонента за короткий промежуток времени. Если вы получили этот тип ошибки , мы рекомендуем вам подождать несколько минут, а затем повторите запрос .

Вы можете избежать этого, поставив спать так же, как и вы, но вы хотите, чтобы оно составляло 10-15 секунд или около того.

Однако более важно реализовать пакетную обработку. При этом вы можете составлять до 50 запросов одновременно (это составляет 50 запросов против вашего общего запроса в день квоты, но только как один против вашей квоты времени). Пакетная обработка с v2 API немного задействована, поскольку сначала вы отправляете запрос POST в конечную точку пакета, а затем на основе этих результатов вы можете отправлять несколько запросов. Вот документация:

https://developers.google.com/youtube/2.0/developers_guide_protocol?hl=en#Batch_processing

Если вы используете v3 АФИ, пакетная обработка становится совсем немного проще, так как вы просто отправить 50 идентификаторов в то время в запросе. Изменение:

http = new HTTPBuilder('http://gdata.youtube.com') 

к:

http = new HTTPBuilder('https://www.googleapis.com') 

Затем установите uri.path в

youtube/v3/videos?part=id&max_results=key={your API key}&id={variable here that represents 50 YouTube IDs, comma separated} 

Для 1000 видео, то вам нужно всего лишь сделать 20 звонков. Любое видео, которое не возвращается в списке больше не существует (если вам нужно, чтобы получить сведения о видео, измените параметр part быть id,snippet,contentDetails или что-то подходит для ваших нужд

Вот документация:.

https://developers.google.com/youtube/v3/docs/videos/list#id

+0

Спасибо за ваши предложения, я поеду за ним! – Randomize

Смежные вопросы