首页 > 解决方案 > 了解为什么通过 curl 上传视频会返回身份验证错误

问题描述

我正在尝试通过 API 上传到 YouTube。我正在这样做,curl并且当我运行以下命令时,我收到一条错误消息,说不是未经身份验证,即使我已经填写了身份验证详细信息。

我的代码是:

curl -XPOST -H 'client_id: CLIENT_ID' -H 'client_secret: CLIENT_SECRET' -H 'auth_uri: https://accounts.google.com/o/oauth2/auth' -H 'token_uri: https://oauth2.googleapis.com/token' -H "Content-type: application/json" -d '{
    "snippet": {
        "title": "Test Title",
        "description": "Test description",
        "tags": ["test", "tags"],
        "categoryId": 20
    },
    "status": {
        "privacyStatus": "unlisted"
    }
}' 'https://www.googleapis.com/upload/youtube/v3/videos'

错误信息是401

请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。请参阅https://developers.google.com/identity/sign-in/web/devconsole-project

我已经 100%正确输入client_id了。client_secret

标签: curlgoogle-apigoogle-oauthyoutube-data-api

解决方案


不幸的是,@Mac Hooper,您的代码受到很多问题的严重影响。请容忍我一会儿:

  1. 您必须确认视频上传(即使用Videos.insertAPI 端点)必须经过适当授权:

授权
此请求需要至少具有以下范围之一的授权(阅读有关身份验证和授权的更多信息)。

范围
https://www.googleapis.com/auth/youtube.upload
https://www.googleapis.com/auth/youtube
https://www.googleapis.com/auth/youtubepartner
https://www.googleapis.com/auth/youtube.force-ssl

  1. 使用 YouTube 数据 API 上传视频并不像您尝试的那样简单。虽然没有正式记录,API 支持两种上传过程:

    一个。可恢复的上传,和
    b. 一键上传。

可恢复上传是通过官方记录的可恢复上传协议实现的。

无论实现语言/环境如何,可恢复上传协议都很难正确实现。Google 提供了为多种语言/环境实现协议的开源代码。虽然这是可以实现的,但我建议不要在 shell 脚本中使用curl.

另一方面,如果您希望curl每次视频上传只发出一个调用(不包括获取访问令牌的过程所隐含的调用),则一次性上传视频是您必须要做的。但是这个curl电话需要事先准备一些东西。

我的这个答案curl表明了在一次性上传中采用的路径。

基本上,您的curl电话将如下所示:

$ curl \
--data-binary "@$MULTIPART_RELATED" \
--header "Content-Type: $CONTENT_TYPE" \
--header "Authorization: Bearer $ACCESS_TOKEN" \
'https://www.googleapis.com/upload/youtube/v3/videos?uploadType=multipart&part=snippet,status'

(请注意,上面我假设curlbash命令行提示符下发出。在 Windows 命令行提示符下,情况类似,但上述curl命令应适当调整。)

上面的curl命令有三个参数$MULTIPART_RELATED$CONTENT_TYPE$ACCESS_TOKEN。后者是您传递到 YouTube 服务器的凭据数据,以便您的 API 调用被授权

请阅读官方文档OAuth 2.0 for Mobile & Desktop Apps的获取 OAuth 2.0 访问令牌部分,了解如何在成功完成 OAuth 2 身份验证/授权流程后获取有效(未过期)访问令牌。

该参数是在发出实际调用$MULTIPART_RELATED之前您应该(以编程方式)编写的文件的名称。curl该文件的格式没有正式记录,而是在检查 Google 自己的开源代码后得出的。

该参数$CONTENT_TYPE是一个字符串,它指定Content-TypeHTTP方法需要POST通过curl.

同样,对 SO 问题的回答如何使用 google api 将视频上传到 youtube。如果没有库,则可以提供所有详细信息,以便能够正确生成文件$MULTIPART_RELATED和字符串$CONTENT_TYPE


推荐阅读