我有一个来自不同播放列表的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