YouTube API v3每次都要求授权

时间:2014-09-11 11:56:33

标签: php youtube-api google-oauth

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

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

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

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

是否有任何地方显示某些代码如何获取刷新令牌,因为文档或在线对它的任何引用都很差。

我真的需要一些帮助才能让这项工作得以实现,因为我在过去的几周里一直在尝试并且无处可去。

2 个答案:

答案 0 :(得分:3)

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

首先是获得API密钥。我相信你现在已经加入了Google Developers Console,但以下是这里要做的事情:

  1. 在Google Developers Console中创建项目
  2. 启用YouTube Data API v3 API
  3. 在“凭据”下,如果您遇到与我相同的问题,您可以创建新的客户端ID,但不能创建API密钥。
  4. 这是一个主要问题,因为您需要API密钥才能在未经授权的情况下发出简单的数据请求,例如,从播放列表中获取视频列表。要获取API密钥,请返回“API”部分,单击“YouTube Data API v3”,此处是带有从不加载任何内容的加载指示器的屏幕。但是,您可以在此处单击“配额”,它会将您带到旧版本的开发人员控制台。

    从旧版本开始,您可以转到“API访问”并添加简单API访问键(API密钥适用于此旧版本,但不适用于新版本的Developers Console) 。我可能错了,但我认为“创建新服务器密钥...”适用于像PHP这样的服务器端语言,而“创建新浏览器密钥...”适用于像Javascript这样的客户端语言。还有Android和iOS键的按钮,但我认为你不需要那些。无论如何,我在PHP中使用cURL并且Server密钥对我有用,我将它设置为允许任何引用,而我的项目仍在开发中。

    简单API访问下获得服务器应用密钥之后,在使用该密钥的任何请求实际工作之前可能需要一段时间。对我来说,我的脚本大约4-5个小时没有工作(我认为Google本周在他们的服务器上遇到了真正的问题,这也是为什么我必须“欺骗”它给我一个API密钥。它可能是为什么“凭据”页面不会加载任何内容。

    现在使用https://developers.google.com/apis-explorer/#p/youtube/v3/youtube.playlists.list上的工具来帮助创建您的GET请求。如果需要,在部分字段中输入“代码段”,并输入 maxResults 的整数。然后从Youtube上的URL获取播放列表的ID。例如,柯南的“Clueless Gamer”系列是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一词后面加上网址,然后用您的API密钥替换{YOUR_API_KEY}。

    现在您可以在cURL请求中使用此网址,例如, $ request_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()之间“更好”。

答案 1 :(得分:0)

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

事实证明,我需要创建一个POST请求来获取访问代码并刷新令牌,这是通过使用Curlfrom命令行实现的

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','无效代码'后,它现在可以正常工作。

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

  

https://accounts.google.com/o/oauth2/auth?   范围= https://www.googleapis.com/auth/youtube&   状态= 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&安培;   approval_prompt =力