YouTube API 被 Google 破坏。 '谷歌身份验证失败。原因:NoLinkedYouTubeAccount'

Posted

技术标签:

【中文标题】YouTube API 被 Google 破坏。 \'谷歌身份验证失败。原因:NoLinkedYouTubeAccount\'【英文标题】:YouTube API broken by Google. 'Authentication with Google failed. Reason: NoLinkedYouTubeAccount'YouTube API 被 Google 破坏。 '谷歌身份验证失败。原因:NoLinkedYouTubeAccount' 【发布时间】:2013-09-25 01:49:22 【问题描述】:

** 更新 **

看来,Google 确实通过绝对要求用户交互来上传视频,把地球上的每一个人都搞砸了。我当然知道,它们是免费的。正是我几年前警告客户的内容,所以我不需要被提醒。谢谢。

因此,我想尝试将其引向不同的方向,并找到一个漏洞和解决方法,以继续做我们正在做的事情,尽管 Google 完全缺乏支持或以任何方式关心开发人员和什么他们必须处理。

如果您实际上可以拨打电话号码并与人谈论 YouTube 合作伙伴访问权限,情况会有所不同,但您可以更快地访问 Illuminati。

OAuth 2.0 现在是唯一受支持的身份验证方法期。它确实需要用户交互。

但是那个令牌呢?有人知道令牌的有效期吗?

如果我可以使用用户交互只获得一次令牌并将其放入数据库中,那么之后我可以自动化可能数百或数千次交互。

换句话说,我试图将用户交互变成减速带而不是混凝土墙。

如果有人有任何获取该令牌、缓存它并在之后使用它的示例,那现在对我来说将是天赐之物。

感谢 cmets 和帮助。 YouTube 开发者论坛刚刚折叠并说要来这里,我并不感到惊讶 :)


Google 似乎已经完全取消了现有仪表板的插头。

https://code.google.com/apis/youtube/dashboard/gwt/index.html

该链接现在是 404'd。尝试了不同系统上的几种不同浏览器。

已在新的 Google API 控制台下注册,但仍然遇到问题。

// Set the authentication URL for this connection object
$authenticationURL= 'https://www.google.com/youtube/accounts/ClientLogin';

// Try to connect to YouTube with the channel credentials passed
try  
  $httpClient = 
      Zend_Gdata_ClientLogin::getHttpClient(
      $username = $channelfields['EMAIL_ADDRESS'],
      $password = $channelfields['PASSCODE'],
      $service = 'youtube',
      $client = null,
      $source = 'Redacted Data',
      $loginToken = $channelfields['CACHED_TOKEN'],
      $loginCaptcha = '',
      $authenticationURL);  
 catch (Zend_Gdata_App_HttpException $httpException) 
    $update_error['response_body'] = $httpException->getRawResponseBody();
    $update_error['error'] = 1;
 catch (Zend_Gdata_App_Exception $e) 
    $update_error['message'] = $e->getMessage();
    $update_error['error'] = 1;
 

此代码之前运行良好,但不适用于较旧的 API 密钥,或在 Google API 控制台中生成的较新密钥。

我正在尝试简单的上传,这让我非常担心:

“服务帐户流程支持不访问用户信息的服务器到服务器交互。但是,YouTube 数据 API 不支持此流程。由于无法将服务帐户链接到 YouTube 帐户,请尝试使用此流程授权请求将生成 NoLinkedYouTubeAccount 错误。"

从所有报告来看,Google 似乎已强制 YouTube 上传在所有情况下都具有交互性,从而完全排除了自动上传生成内容的平台的所有可能性。

感谢您对该过程的任何帮助或见解。

P.S - 哦,我已经有一段时间没有查看那个系统了,Google 关闭了 YouTube 开发者论坛并说“你”现在负责他们的支持 :)

【问题讨论】:

要访问:code.google.com/apis/youtube/dashboard/gwt/index.html 打开私人标签并登录。 【参考方案1】:

OAuth2 确实支持通过离线访问类型参数(即,使用 access_type=offline)避免用户交互的能力。详情请查看Google documentation。

【讨论】:

我也阅读了该文档。哪里说不支持?用户交互一次,然后刷新用于获取访问令牌的令牌。 OAuth2 确实支持非用户交互(这正是我回答的重点)。我在之前的评论中提供了有关如何使用 access_type=offline 来避免用户交互的详细信息……现在它已经消失了……【参考方案2】:

解决方案非常简单。您的应用需要使用 oauth 来请求离线访问。它将获得一个访问 cide,您将其转换为刷新令牌,这是您存储在数据库中的内容。这不会过期。实际上它有时确实如此,但那是另一回事了。每当您需要访问 api 时,请使用存储的刷新令牌来请求您包含在每个 api 调用中的访问令牌。

详情请见https://developers.google.com/accounts/docs/OAuth2WebServer。

【讨论】:

【参考方案3】:

我不知道你做了什么,但https://code.google.com/apis/youtube/dashboard/gwt/index.html 对我来说非常好用。也许这是一个暂时的问题。如果您不希望用户交互,您必须使用 YouTube API v2 或者您必须将 v3 与不需要身份验证的方法一起使用,或者您必须提供自己的 youtube 帐户凭据,这不推荐并且可能不适合您的情况。

【讨论】:

现在的主要问题似乎是 OAUTH 流。大约 48 小时前,ClientLogin 确实已完全弃用。您知道哪些 v3 方法不需要所示流程的用户同意部分?就 YouTube 帐户凭据而言,我们已经通过了所有这些。我们代表其他客户在内部管理许多频道,以使用自动 BI 生成视频并上传。他们提供所有用户凭据,我们通过这些步骤获取开发者密钥 至于链接,到处都是死机。我很惊讶你可以使用它。 你能关闭浏览器并按 CTRL-F5 吗?我现在要在多个数据中心、多个浏览器、多个版本中进行远程桌面会话,在所有情况下它什么都不返回或返回 404 我刚刚从它那里得到了一个新的开发者密钥,所以它不会死掉。有很多方法不需要 OAuth:您可以在developers.google.com/youtube/v3/docs 上找到您想要的操作,然后单击“立即尝试”。你可以指定你需要的信息,如果你得到“权限被拒绝”,你就知道它不起作用。您甚至可以在那里激活 OAuth2。当然,这些只是一般的获取信息操作,与信息操作无关。 在我尝试的第 20 台机器上,我终于让仪表板弹出。非常奇怪。希望是短暂的。我查看了文档,我的主要问题是 OAuth。所有这些流程都需要用户交互。因此,虽然 YouTube 本身可能不会,但 OAuth 流程会。我的问题仍然存在。我会看看 OAuth2,看看我是否可以在没有用户交互的情况下使用它【参考方案4】:

我认为这里有几个问题需要回答。

1) 较旧的 API 控制台尚未删除,但我注意到在 Google 推出新的“云控制台”时,它和较新的 API 控制台出现间歇性中断。

2) ClientLogin 已于 2012 年 4 月正式弃用,而不仅仅是 48 小时前。 Jeff Posnick 在他的博客 (apiblog.youtube.com) 上详细介绍了这几个月的所有变化(以及相关的变化,例如 AuthSub、Youtube Direct 等)。

3) 没错,使用 API 的 v3,您无法全面自动上传,因为 oAuth2 流程需要用户交互。但是,鉴于您的用例描述有限,使用刷新令牌可能是您最好的选择。如果内容是用户生成的,那么他们必须在某个地方登录到您的应用程序,对吗? (以便您的应用知道要利用哪些凭据进行上传)。在他们登录到您的应用程序时,您正在启动 oAuth2 流程,您只需点击第一个 oAuth 端点并将参数 access_type=offline (以及任何其他参数)传递给它。这将确保当他们授予该初始权限时,您将返回一个刷新令牌而不是访问令牌。使用该刷新令牌,您可以根据需要将其交换为多个访问令牌(访问令牌可以使用大约一个小时。我不知道刷新令牌可以使用多长时间,但我从来没有在我自己的登录 cookie 之前过期做了,然后当我的用户重新登录我的应用程序时,我就得到了一个新的)。

这里有更多关于如何使用刷新令牌的信息;另请注意,各种 google api 客户端库使其非常流畅。

https://developers.google.com/accounts/docs/OAuth2WebServer#refresh

此外,几个月前来自 Google Developers 直播的这段视频教程可能有助于说明这一点:http://www.youtube.com/watch?v=hfWe1gPCnzc -- 它使用的是 oAuth 游乐场而不是客户端库,但概念是相同的。

【讨论】:

感谢您的详细回复。这是我两年前做的,没有得到我的支持。我没有为此付钱。正如您所说,ClientLogin 已被弃用,但根据应用程序日志直到最近才正式关闭。我警告客户,如果没有支持,该平台将无法永久运行。没有供用户生成内容的登录门户。它是生成和上传内容的全自动 BI。用户只为自己的频道提供可选频道信息。这确实是基于后端提要和“CRM”数据的全自动。 啊……这更有意义。好吧,如果迫在眉睫,总是可以选择在后端运行的“已安装”应用程序。它使用 gApi 客户端并具有一个 Storage 类,用于保存 Credentials 对象并在需要执行 oAuth2 流时检索它们。我只将它用于服务帐户(正如您所说,您已经知道,它不能链接到 YouTube 帐户),但文档似乎表明它们也可以存储常规帐户凭据。似乎与 YouTube 授权的方向有点违反直觉,但可能值得研究。【参考方案5】:

答案是使用 google-api-php-client,创建交互式身份验证页面,并使用新的 API 控制台正确设置 YouTube API v3。

您可以创建一个非常简单的页面,该页面将对提供的频道进行身份验证,然后将正确的令牌存储在您的数据库中。已经在一个频道上工作并上传了数百个视频。您确实需要记住在新的 API 控制台下完全激活自己并添加所需的服务。只需继续验证并添加它说它需要的服务。之后,常规的 v3 上传过程就可以正常工作了。失败时向群组发送电子邮件,他们可以在 10 秒内获得新令牌。

不是最优雅的解决方案,但 Google 的文档远非优雅,Stack Overflow 现在是他们的一线支持。

坚持下去,总会找到解决办法的。不要放弃!

我也不是自己到这里的,这个页面上的其他答案帮助我一直走到了这一步。谢谢大家。

P.S - 不要忘记范围

$client->setScopes("https://www.googleapis.com/auth/youtubehttps://www.googleapis.com/auth/youtube.upload");

【讨论】:

以上是关于YouTube API 被 Google 破坏。 '谷歌身份验证失败。原因:NoLinkedYouTubeAccount'的主要内容,如果未能解决你的问题,请参考以下文章

YouTube API - 使用 Google 管理员帐户访问多个 youtube 频道(品牌帐户)

Youtube Data API V3 - 使用google.youtube.videos.list()获取视频时出错

未发送 Google YouTube API 刷新令牌

为啥 Youtube/Google API 不返回超过 5 个回复?

Youtube Data API V3 - 使用 google.youtube.videos.list() 获取视频时出错

youtube-upload 和 google youtube api - 更深入地控制上传过程