0

我正在尝试调用以下 URL 以使用 Python 获取返回的 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)

在当地一切正常。

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

4

3 回答 3

0

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

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

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

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

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

于 2013-10-10T14:32:03.563 回答
0

这里有几个问题。首先,因为您开启了 YouTube Data API v3 服务,所以您应该使用 v3 的 API;但是,您在示例中请求的 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 控制台(或他们的新Cloud Console)中执行此操作,您将在其中为您的应用生成他们所谓的“浏览器密钥”。将其附加到端点的相关位置,您应该会取回您感兴趣的 JSON。

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

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

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

于 2013-10-11T05:11:22.103 回答
0

你应该在你的请求中包含一个开发者密钥,你可以在这里注册一个。

于 2013-10-10T16:59:20.733 回答