没有用户 OAuth 过程的 YouTube API

Posted

技术标签:

【中文标题】没有用户 OAuth 过程的 YouTube API【英文标题】:YouTube API without user OAuth process 【发布时间】:2016-09-13 16:29:26 【问题描述】:

我正在尝试使用 YouTube Data API (v3) 从 YouTube 视频中获取字幕 https://developers.google.com/youtube/v3/guides/implementation/captions

所以,首先我尝试使用以下网址检索字幕列表: https://www.googleapis.com/youtube/v3/captions?part=snippet&videoId=KK9bwTlAvgo&key=我的 API 密钥

我可以从上面的链接中检索我想下载的字幕 ID (jEDP-pmNCIqoB8QGlXWQf4Rh3faalD_l)。

然后,我按照以下说明下载标题: https://developers.google.com/youtube/v3/docs/captions/download

但是,即使我正确输入了字幕 ID 和我的 api 密钥,它也会显示“需要登录”错误。

我想我需要 OAuth 身份验证,但我想做的与我的用户帐户无关,而只是自动下载公共字幕数据。

我的问题是:有什么方法可以只处理一次 OAuth 身份验证以获取我自己的 YouTube 帐户的访问令牌,然后在我的应用程序中需要它时重复使用它?

【问题讨论】:

我也遇到了这个问题。让我很恼火的是,API 允许您通过密钥执行几乎所有其他操作,但随后自发地期望用户也将侧载 OAuth2 凭据,只是因为出于某种原因,他们可怕的机器翻译需要您的驾照号码、护照、3 个最近的电话账单、证明您的地址,高分辨率照片。顺便说一句,API 页面似乎没有在任何地方提到这种提升的安全要求...... 【参考方案1】:

我无法具体说明字幕 API 所需的权限,但总的来说,是的,您可以使用自己的帐户对您的应用进行 OAuth,并使用访问和刷新令牌发出后续 OAuth 请求到 API。您可以在此处找到生成令牌的详细信息:

https://developers.google.com/youtube/v3/guides/auth/server-side-web-apps#Obtaining_Access_Tokens

手动执行这些步骤(幸运的是,您只需执行一次):

    如果已授予应用访问权限,则需要将其删除,以便建立新的身份验证凭据。转到https://security.google.com/settings/security/permissions(登录您的帐户时)并删除对应用程序的访问权限。如果客户端 ID 或密钥发生更改(或者您需要创建一个),请在 API Manager 下的 https://console.developers.google.com 找到它们。

    要授予访问权限并接收临时代码,请在浏览器中输入此 URL:

    https://accounts.google.com/o/oauth2/auth?
    client_id=<client_id>&
    redirect_uri=http://www.google.com&
    scope=https://www.googleapis.com/auth/youtube.force-ssl&
    response_type=code&
    access_type=offline&
    approval_prompt=force
    

    按照提示授予对应用的访问权限。

    这将使用 code 参数重定向到 google.com(例如, https://www.google.com/?code=4/ux5gNj-_mIu4DOD_gNZdjX9EtOFf&gws_rd=ssl#)。保存代码。

    发送一个 POST 请求(例如,通过Postman Chrome plugin)到https://accounts.google.com/o/oauth2/token,请求正文中包含以下内容:

    code=<code>&
    client_id=<client_id>&
    client_secret=<client_secret>&
    redirect_uri=http://www.google.com&
    grant_type=authorization_code
    
    响应将包含访问令牌和刷新令牌。保存两者,尤其是刷新令牌(因为访问令牌将在 1 小时后过期)。

然后,您可以使用访问令牌手动发送 OAuth 请求,遵循选项here 之一,本质上是:

curl -H "Authorization: Bearer ACCESS_TOKEN" https://www.googleapis.com/youtube/v3/captions/<id>

curl https://www.googleapis.com/youtube/v3/captions/<id>?access_token=ACCESS_TOKEN

(但是,当我尝试第二个字幕选项时,我收到消息:“在查询字符串中收到了 OAuth 令牌,此 API 禁止 JSON 或 XML 以外的响应格式。如果可能,请尝试发送而是在 Authorization 标头中的 OAuth 令牌。")

您还可以在代码中使用刷新令牌来创建构建 YouTube 对象时所需的凭据。在 Java 中,这如下所示:

String clientId = <your client ID>
String clientSecret = <your client secret>
String refreshToken = <refresh token>

HttpTransport transport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();

GoogleCredential credential = new GoogleCredential.Builder()
    .setTransport(transport)
    .setJsonFactory(jsonFactory)
    .setClientSecrets(clientId, clientSecret)
    .build()
    .setRefreshToken(refreshToken);

try 
    credential.refreshToken();
 catch (IOException e) 
    e.printStackTrace();


youtube = new YouTube.Builder(transport, jsonFactory, credential).build();

我想你可以使用API Client Libraries 在 Python 中做类似的事情,尽管我没有尝试过 Python。

【讨论】:

感谢@Tyler C. 的这篇文章,你让我免于遭受巨大的痛苦! 在第二步,我得到了一个“错误 400:redirect_uri_mismatch”(我使用了客户端 ID 和服务器端 Web 应用程序的密码)。当我尝试获取 android 应用程序的客户端 ID 时,我没有获得第 4 步的秘密。有什么解决方案? @Elia12345 我不确定是什么导致了您的问题,但这里的讨论可能会有所帮助:***.com/questions/11485271。您可能需要在 Google Developers Console (console.developers.google.com) 中为您的客户端 ID 添加“授权重定向 URI”。

以上是关于没有用户 OAuth 过程的 YouTube API的主要内容,如果未能解决你的问题,请参考以下文章

YouTube API v3 - 我真的需要使用 OAuth 进行基本的读取操作吗?

使用 Youtube Api v3 和 oauth2 将视频上传到我的 Youtube 频道,无需用户身份验证

重复使用 Oauth2 凭据来访问 YouTube api [关闭]

Google OAuth2 登录 - 获取 YouTube 昵称和真实电子邮件地址

YouTube API - Oauth2 流程(OSGI 捆绑包)

Google Sign in API OAuth2 错误:youtube 范围内的“invalid_request”