我想使用 YouTube API 在非交互式程序中将视频上传到公司帐户。我试图在不提示身份验证和授权的情况下实现上传(因为没有交互式用户)。如果有人可以验证以下断言,我将不胜感激:
无法使用简单 API 访问来上传视频。
对于 OAuth,不能使用“使用服务帐户代表您的应用程序而不是最终用户调用 Google API ”。如贾斯汀史密斯的博客文章中所述。这将是我想要的解决方案。这是我尝试使用的代码。它执行,但总是返回“未经授权”(401):
public async Task AnnounceAsync(Recording recording) { const string emailAddress = "xxxxxxx.gserviceaccount.com"; const string keyFile = @"C:\Temp\xxxxxxx-privatekey.p12"; var key = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.Exportable); var client = new AssertionFlowClient(GoogleAuthenticationServer.Description, key) { ServiceAccountId = emailAddress, Scope = YoutubeService.Scopes.Youtube.GetStringValue() }; var auth = new OAuth2Authenticator<AssertionFlowClient>(client, AssertionFlowClient.GetState); var youtube = new YoutubeService(new BaseClientService.Initializer {Authenticator = auth}); var video = new Video { Snippet = new VideoSnippet { Title = recording.Title, Description = recording.Description, CategoryId = "22" }, Status = new VideoStatus { PrivacyStatus = "public", } }; using (var fileStream = new FileStream(recording.Path, FileMode.Open)) { var videosInsertRequest = youtube.Videos.Insert(video, "snippet,status", fileStream, "video/*"); videosInsertRequest.ProgressChanged += videosInsertRequest_ProgressChanged; videosInsertRequest.ResponseReceived += videosInsertRequest_ResponseReceived; await Task.Run(() => videosInsertRequest.Upload()); } }
因此,我得出的结论是,我需要使用“已安装的应用程序”API 访问方法来交互地完成 OAuth 登录过程至少一次,保存刷新令牌,然后在将来使用该刷新令牌来获取新的访问令牌?我知道我可以完成这项工作,但这似乎很尴尬。如果我走这条路,有什么需要注意的地方吗?
进一步的问题:
- 未来是否计划支持服务帐户 OAuth 与 YouTube API 一起使用?
- 我的程序可以使用“移动上传”功能将视频通过电子邮件发送到其 YouTube 帐户吗?
提前感谢您的意见。