使用Groovy向Youtube API V2发出多个请求



我有一个来自不同播放列表的youtube视频列表,我需要检查这些视频是否仍然有效(大约1000个)。目前我正在做的是使用API v2和Groovy使用以下简单脚本访问Youtube:

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
}

但几秒钟后,它开始为任何单个id返回403(这可能是由于它运行的请求太多)。如果我插入类似Thread.sleep(3000)的内容,问题就会减少。有比延迟请求更好的解决方案吗?

在API的V2中,您可以发出的请求数量有基于时间的限制,但它们不是一个硬性限制(也就是说,它在某种程度上取决于许多底层因素,可能并不总是相同的限制)。文件上写着:

YouTube API强制执行配额,以防止与API使用不规范。特别是too_many_cent_calls错误指示API服务器从短时间内同一个呼叫者。如果您收到这种类型的错误,那么我们建议您等待几分钟,然后尝试再次请求。

你可以通过像你一样入睡来避免这种情况,但你希望它是10-15秒左右

不过,实现批处理更为重要。这样,您一次最多可以提出50个请求(这在您每天的总请求配额中算作50个请求,但在您每次的配额中只能算作一个请求)。使用API的v2进行批处理有点复杂,因为您首先向批处理端点发出POST请求,然后根据这些结果可以发送多个请求。这是文档:

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

如果您使用API的v3,那么批处理就会变得容易一些,因为您只需在请求中一次发送50个ID。更改:

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

相关内容

  • 没有找到相关文章