从gae app调用youtube api会返回403

时间:2013-10-10 13:47:28

标签: python google-app-engine youtube-api

我尝试使用Python调用以下URL来获取返回的JSON:

http://gdata.youtube.com/feeds/api/users/pbsnewshour/uploads?v=2&alt=jsonc&prettyprint=true

但我得到的只是:

 File "/base/data/home/runtimes/python27/python27_dist/lib/python2.7/urllib2.py", line 531, in http_error_default
    raise HTTPError(req.get_full_url(), code, msg, hdrs, fp)
HTTPError: HTTP Error 403: Forbidden

我需要补充一点,我为gae应用启用了YouTube Analytics API和YouTube Data API v3服务。

这是我在python端使用的代码:

req = urllib2.Request(url, headers={'User-Agent' : "Magic Browser"})
response = urllib2.urlopen( req )
dump = response.read()
d = json.loads(dump)

在当地一切正常。

关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:0)

除了403代码,http请求的内容是什么?

我在浏览器中使用GAE托管的代理尝试了您的API网址,我也获得了403,其中包含以下XML内容。

<error>
    <domain>yt:quota</domain>
    <code>too_many_recent_calls</code>
</error>

我猜GAE的urlfetch服务托管在一些单独的服务器上。许多gae app实例与ip共享相同的urlfetch服务器。因此,GAE应用程序很容易达到Youtube的每个IP的电话号码限制。

此SO帖子中有一些解决方法:yt:quota too many recent calls - Youtube API help。但似乎他们并没有完全解决问题。

答案 1 :(得分:0)

您应该在请求中包含开发人员密钥,您可以注册一个here

答案 2 :(得分:0)

这里有一些问题。首先,因为您启用了YouTube Data API v3服务,所以您应该使用API​​的v3;但是,您在示例中请求的URL是针对API的v2。您要用于v3的端点与此对应:

https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails&playlistId=UU6ZFN9Tx6xh-skXCuRHCDpQ&key={YOUR_API_KEY}

其次,正如另一篇文章提到的那样,您需要在您的请求中使用API​​密钥;对于API的v3,您可以在Google API console(或新的Cloud Console)中为您的应用生成他们称之为“浏览器密钥”的内容。将其附加到端点中的相关位置,您应该返回您感兴趣的JSON。

最后,您可能想知道长字符串来自何处用作上面提到的请求URL中的playlistId的参数;在API的v3中,您可以向用户的“频道”端点发出请求,如下所示:

https://www.googleapis.com/youtube/v3/channels?part=snippet%2CcontentDetails&forUsername=pbsnewshour&key={YOUR_API_KEY}

您将返回与该用户相关的各种Feed;我从中提取的字符串是“上传”Feed,因此它与原始帖子中的内容相对应。