YouTube API v3每次都在要求授权

AdR*_*ock 5 php youtube-api google-oauth

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

我打开页面,应用程序要求授权。我单击授权的链接,选择我的Gmail帐户,然后得到列表。

问题是,即使几秒钟后我又回到该应用程序,我都必须再次授权该应用程序。

我以为一旦授权该应用程序,您就可以将令牌交换为刷新令牌。

由于文档或在线对其进行的引用非常贫乏,因此在任何地方都可以显示一些代码以获取刷新令牌的代码。

我真的需要一些帮助,以使它正常工作,因为我已经尝试了过去几周,却一无所获。

Jam*_*mes 3

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

首先是实际获取 API 密钥。我确信您现在已经进入了 Google 开发者控制台,但为了以防万一,以下是此步骤的操作:

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

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

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

一旦您在Simple API Access下获得了服务器应用程序的密钥,可能需要一段时间才能使用该密钥的任何请求真正起作用。对我来说,我的脚本在大约 4-5 小时内无法工作(我认为 Google 这周的服务器确实出现了问题,这也是为什么我不得不“欺骗”它给我一个 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 是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
Run Code Online (Sandbox Code Playgroud)

只需将 GET 一词后面的 URL 替换为您的 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);
Run Code Online (Sandbox Code Playgroud)

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

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

我会注意到

$resp = file_get_contents($request_url);
Run Code Online (Sandbox Code Playgroud)

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