我想在没有用户参与的情况下自动将视频上传到 YouTube,因此我创建了一个服务帐户,跳过了这些麻烦,一切看起来都很棒,然后尝试上传,块之一,我的代码因 Google_Exception 异常而崩溃:
“无法启动断点续传(HTTP 401:youtube.header,未经授权)”
然后我在YouTube API v3上挖掘并发现了错误信息:
https://developers.google.com/youtube/v3/docs/errors
“如果您尝试使用 OAuth 2.0 服务帐户流程,通常会出现此错误。YouTube 不支持服务帐户,如果您尝试使用服务帐户进行身份验证,则会收到此错误。”
这是正确的吗?我无法使用服务帐户自动将视频上传到 YouTube?
(浪费了几天的努力!)
是的,这是正确的。
前进的方向是进行手动授权并获取生成的“刷新令牌”,然后将其用于任何自动上传。
确保在执行任何其他操作之前将刷新令牌添加到 PHP Google_Client 对象。
我现在自动上传到 YouTube。
对于今天尝试执行此操作的任何人,请注意,如果使用 API 上传,则任何上传都将被设置为“私人(锁定)”,除非/直到应用程序提交验证并获得批准。
https://github.com/porjo/youtubeuploader/issues/86
YouTube 需要验证用于上传的 OAuth 应用程序/凭据,否则视频将被锁定为私有。
应用程序获得批准是有可能的,但如果您正在做个人项目,则可能性较小。
是的,您可以使用 Youtube 的服务帐户。一种方法是将服务帐户添加到内容所有者所属的 CMS。当您检索服务帐户的 access_token 时,您可以使用内容所有者的视频。
看起来像这样,使用 Javascript 和 npm 包:
import { google } from 'googleapis';
const youtube = google.youtube('v3');
const fetchYoutubeData = async (keyfile, scopes) => {
const auth = new google.auth.GoogleAuth({
credentials: keyfile,
scopes,
});
const accessToken = await auth.getAccessToken();
const { data } = await youtube.videos.list({
part: ['snippet'],
id: 'YOUR_VIDEO_ID',
access_token: accessToken
});
return data;
}
请注意,
keyfile
是您在创建服务帐户密钥时从 Gcloud 下载的 JSON。不是指向文件的路径!如果你想使用路径,请使用这个:
const auth = new google.auth.GoogleAuth({
keyFile: 'PATH_TO_KEYFILE_IN_FILE_SYSTEM',
scopes: ['READ_STUFF', 'WRITE_STUFF'],
});