YouTube API v3 每次都要求授权

Posted

技术标签:

【中文标题】YouTube API v3 每次都要求授权【英文标题】:YouTube API v3 keeps asking for authorisation every time 【发布时间】:2014-11-05 08:48:22 【问题描述】:

我正在使用 YouTube api v3 来检索视频列表,使用 https://developers.google.com/youtube/v3/code_samples/php#retrieve_my_uploads 的示例

我打开页面,应用程序要求授权。我点击链接进行授权,选择我的 gmail 帐户并获得列表。

问题是当我在几秒钟后返回应用程序时,我必须再次授权应用程序。

我认为一旦应用获得授权,您就可以将令牌换成刷新令牌。

是否有任何地方显示一些代码如何获取刷新令牌,因为文档或任何在线参考都很差。

我真的需要一些帮助才能让这个工作正常进行,因为我在过去几周一直在尝试但一无所获。

【问题讨论】:

你用的是最新的api客户端吗? github.com/google/google-api-php-client我在当地下雨,对我来说工作得很好。 是的,我是。您能否发布一些示例代码,因为我尝试过的所有内容都不起作用。我可以授权我的应用,但每次我尝试使用它时,我都必须再次授权 【参考方案1】:

我有一个冗长的答案,但这应该是一个很大的帮助。我对糟糕的文档也有同样的问题,我也试图从我的项目的播放列表中获取视频列表。在过去几天的挣扎之后,API v3 神奇地开始为我工作,这就是我所做的。

首先实际上是获取 API 密钥。我确定您现在已经在 Google Developers Console 中了,但以防万一以下是此步骤的操作:

    在 Google Developers Console 中创建项目 启用 YouTube 数据 API v3 API 在“凭据”下,如果您遇到与我相同的问题,您可以创建新的客户端 ID,但不能创建 API 密钥。

这是一个主要问题,因为您需要 API 密钥才能在未经授权的情况下发出简单的数据请求,例如,从播放列表中获取视频列表。要获取 API 密钥,请返回“API”部分,单击“YouTube 数据 API v3”,这里是加载指示器的屏幕,它永远不会加载任何内容。但是,您可以点击此处的“配额”,然后转到旧版本的开发者控制台。

从此旧版本开始,您可以转到“API 访问”并添加您的 Simple API 访问 密钥(API 密钥适用于旧版本,但不适用于新版本的开发者控制台) .我可能错了,但我认为“创建新的服务器密钥...”适用于 PHP 等服务器端语言,而“创建新的浏览器密钥...”适用于 javascript 等客户端语言。还有用于 androidios 键的按钮,但我认为您不需要这些。无论如何,我在 PHP 中使用 cURL 并且服务器密钥对我有用,我已将其设置为在我的项目仍在开发中时允许任何引荐来源。

简单 API 访问下获得服务器应用密钥后,使用该密钥的任何请求可能需要一段时间才能真正起作用。对我来说,我的脚本在 4 到 5 个小时内都没有工作(我认为谷歌本周的服务器遇到了真正的问题,这也是我不得不“欺骗”它给我一个 API 密钥的原因。这可能是为什么“凭据”页面没有加载任何内容)。

现在使用https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.playlists.list 上的工具来帮助创建您的 GET 请求。如有必要,在 part 字段中输入“sn-p”并为 ma​​xResults 输入一个整数。然后从 Youtube 上的 URL 获取播放列表的 ID。比如柯南的《无知玩家》系列是https://www.youtube.com/playlist?list=PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY,所以ID是PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY。然后点击执行

现在它会给你 GET 请求,类似于

GET https://www.googleapis.com/youtube/v3/playlists?part=snippet&id=PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY&maxResults=20&key=YOUR_API_KEY

X-JavaScript-User-Agent:  Google APIs Explorer

只需获取单词 GET 之后的 URL 并将 YOUR_API_KEY 替换为您的 API 密钥。

现在您可以在 cURL 请求中使用此 URL,如下所示,其中 $request_url 是上面的 URL,其中包含您的 API 密钥:

//http://codular.com/curl-with-php
// Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, array(
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => $request_url,
    CURLOPT_USERAGENT => 'Codular Sample cURL Request'
));
// Send the request & save response to $resp
$resp = curl_exec($curl);
// Close request to clear up some resources
curl_close($curl);

现在 $resp 将保存一个 JSON 字符串,您可以对其进行解析并获取该播放列表视频的数据。我会将 JSON 解析留给您,但这就是您获取数据的方式,类似于 v2 中旧的 gdata 方式。并且没有身份验证:)

它可能会报告您的 API 密钥未经授权的错误,在这种情况下,您需要等待几个小时。再说一次,我认为谷歌最近遇到了真正的服务器问题,所以请耐心等待;不是你的脚本不起作用,而是 Google ;)

我会注意到

$resp = file_get_contents($request_url);

似乎也可以,但老实说,我不知道 cURL 和 file_get_contents() 之间哪种方法“更好”。

【讨论】:

我会接受这个作为我的答案,因为当我需要再次这样做时,这将是一个有用的参考【参考方案2】:

我花了很长时间才解决这个问题,因为我找不到任何关于如何轻松做到这一点的示例。

原来我需要创建一个 POST 请求来获取访问代码和刷新令牌,这是通过在命令行中使用 Curl 实现的

url --data "code=AUHROISATON_CODE&client_id=CLIENT_ID.apps.googleusercontent.com&client_secret=CLINET_SECRET&redirect_uri=http://www.example.com&grant_type=authorization_code" https://accounts.google.com/o/oauth2/token

在出现“缺少授权类型”、“无效代码”等一些错误后,它现在可以工作了。

我撤销了对应用程序的访问权限,运行以下 GET 请求(取自 https://developers.google.com/accounts/docs/OAuth2WebServer#formingtheurl)以获取代码,并且能够使用上述 Curl 语句中的代码

https://accounts.google.com/o/oauth2/auth? 范围=https://www.googleapis.com/auth/youtube& state=security_token%3D138r5719ru3e1%26url%3Dhttps://oa2cb.example.com/myHome& redirect_uri=https%3A%2F%2Foauth2-login-demo.appspot.com%2Fcode&, response_type=代码& client_id=812741506391.apps.googleusercontent.com& 批准提示=强制

【讨论】:

以上是关于YouTube API v3 每次都要求授权的主要内容,如果未能解决你的问题,请参考以下文章

Java 示例代码示例 youtube 数据 api v3 和授权方法作为 api 密钥

使用 Youtube Data API V3 和 Google API Client PHP 将视频上传到 Youtube - 获取 401(未经授权)消息

错误:授权Youtube API V3时的restricted_client

如何在 android 的 Youtube API V3 中按频道 ID 获取 Youtube 直播?

如何使用 Youtube v3 API 获取 Youtube 视频的 mp4 url

无法在 google api youtube 中授权,如何解决? [关闭]