我正在使用YouTube api v3检索视频列表,示例如下https://developers.google.com/youtube/v3/code_samples/php#retrieve_my_uploads
我打开页面,应用程序请求授权。我点击链接进行授权,选择我的gmail账户,我就可以获得列表了。
问题是,当我在几秒钟后返回应用程序时,我必须再次授权该应用程序。
我想,一旦该应用程序获得授权,你就可以用代币换取刷新代币。
有没有任何地方向一些代码展示了如何获得刷新令牌,因为文档或对它的任何在线引用都非常糟糕。
我真的需要一些帮助来完成这项工作,因为我在过去的几周里一直在努力,但一无所获。
我有一个冗长的答案,但这应该是一个很大的帮助。我也有同样的问题,文档不好,我也在尝试从我的项目的播放列表中获取视频列表。API v3在经历了几天的挣扎后,神奇地开始为我工作,下面是我所做的。
首先是获取API密钥。我相信你现在已经进入了谷歌开发者控制台,但以防万一,这一步该怎么做:
- 在谷歌开发者控制台中创建项目
- 启用YouTube数据API v3 API
- 在"凭据"下,如果您有与我相同的问题,您可以创建新的客户端ID,但不能创建API密钥
这是一个主要问题,因为您需要一个API密钥来在未经授权的情况下进行简单的数据请求,例如,从播放列表中获取视频列表。要获取API密钥,请返回"API"部分,单击"YouTube Data API v3",这里是一个带有从不加载任何内容的加载指示器的屏幕。然而,你可以点击这里的"配额",它会带你进入开发者控制台的旧版本。
在此旧版本中,您可以转到"API访问"并添加简单API访问密钥(API密钥在此旧版本上工作,但不在新版本的开发人员控制台上工作)。我可能错了,但我认为"Create new Server key…"适用于PHP等服务器端语言,而"Create new Browser key…"则适用于Javascript等客户端语言。安卓和iOS按键也有按钮,但我想你不需要这些。无论如何,我在PHP中使用cURL,服务器密钥对我有效,我将其设置为在我的项目仍在开发中时允许任何引用。
一旦您在简单API访问下获得服务器应用程序的密钥,使用该密钥的任何请求可能需要一段时间才能真正工作。对我来说,我的脚本在4-5个小时内无法运行(我认为谷歌本周的服务器出现了真正的问题,这也是我不得不"欺骗"它给我一个API密钥的原因。这可能也是"凭据"页面没有加载任何内容的原因)。
现在使用上的工具https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.playlists.list以帮助创建GET请求。在部分字段中输入"snippet",必要时为maxResults输入一个整数。然后从Youtube上的URL中获取播放列表的ID。例如,柯南的"无线索游戏玩家"系列https://www.youtube.com/playlist?list=PLVL8S3lUHf0RqD7TZ6hohWk8Sd3asaqnY,因此ID为PLVL8S3lUHf0RqD7TZ6ohWk8Sd3asaqnY。然后单击执行。
现在它会给你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密钥未经授权,在这种情况下,您需要等待几个小时。再说一遍,我认为谷歌最近遇到了真正的服务器问题,所以请耐心等待;不是你的脚本不起作用,而是谷歌;)
我会注意到
$resp = file_get_contents($request_url);
似乎也能工作,但我真的不知道cURL和file_get_contents()之间哪种方法"更好"。
我花了很长时间才解决这个问题,因为我找不到任何关于如何轻松做到这一点的例子。
事实证明,我需要创建一个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
在出现一些错误(如"Missing grant_type"、"Invalid code")后,它现在可以工作了。
我撤销了对该应用程序的访问,运行了以下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%2Fauth2登录演示.appspot.com%2Fcode&,response_type=代码&client_id=812741506391.apps.googleusercontent.com&approvel_prompt=强制