curl - 了解为什么通过 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
解决方案
不幸的是,@Mac Hooper,您的代码受到很多问题的严重影响。请容忍我一会儿:
- 您必须确认视频上传(即使用
Videos.insert
API 端点)必须经过适当授权:
授权
此请求需要至少具有以下范围之一的授权(阅读有关身份验证和授权的更多信息)。范围
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
使用 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'
(请注意,上面我假设curl
在bash
命令行提示符下发出。在 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-Type
HTTP方法需要POST
通过curl
.
同样,我对 SO 问题的回答如何使用 google api 将视频上传到 youtube。如果没有库,则可以提供所有详细信息,以便能够正确生成文件$MULTIPART_RELATED
和字符串$CONTENT_TYPE
。
推荐阅读
- ruby - Sinatra 初始化命名空间控制器
- png - 如果您在打开图像时修改图像会发生什么?
- javascript - 我无法让我的 HERE Map javascript 代码在 Thingsboard 小部件中工作
- python - 无法读取行中有分号的 CSV 文件。无法在 pandas 中使用 drop 函数删除行
- git - 如何仅远程修复 git 重复文件夹名称
- tensorflow - 多个 MultiRNNCell 的行为?
- google-sheets - 用 FALSE 替换 0,用 TRUE 替换 1
- reactjs - 检测容器内 div 的点击
- c# - 什么存档文件格式有利于分布式处理期间的随机访问?
- rust - 方法 for_each 存在,但使用 StreamDeckSocket 时不满足 trait bound