当前位置: 首页 > 知识库问答 >
问题:

适用于 YouTube API 上传的非交互式 OAuth

苏昊英
2023-03-14

我想使用YouTubeAPI将视频上传到非交互式程序中的公司帐户。我试图在不提示身份验证和授权的情况下实现上传(因为没有交互式html" target="_blank">用户)。如果有人能验证以下断言,我将不胜感激:

>

  • 无法使用Simple API Access上传视频。

    对于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登录过程,保存刷新令牌,然后在将来使用该刷新令牌来获取新的访问令牌?我知道我可以做到这一点,但这似乎很尴尬。如果我沿着这条路走下去,有什么需要注意的吗?

    更多问题:

    1. 是否有任何计划的未来支持允许服务帐户 OAuth 与 YouTube API 一起使用?
    2. 我的程序可以使用“移动上传”功能通过电子邮件将视频发送到其 YouTube 帐户吗?

    提前感谢您的参与。

  • 共有2个答案

    秦楚
    2023-03-14

    服务客户是一个移动目标。但你是对的,如果你能得到一个刷新令牌,那么你应该可以去了。

    公冶子琪
    2023-03-14

    目前,您无法使用服务帐户。从文档中:

    https://developers.google.com/youtube/v3/docs/errors

    错误/未经授权/youtube需要注册

    如果尝试使用OAuth 2.0服务帐户流,则通常会出现此错误。YouTube不支持服务帐户,如果您尝试使用服务帐户进行身份验证,您将收到此错误。

    YouTube API博客帖子:

    http://apiblog.youtube.com/2011/10/introducing-google-account-support-and.html

    介绍Google帐户支持还更详细地讨论了youtubeSignupRequired错误。虽然博客文章解释了API 2.1版的错误,但错误的含义仍然适用。

    通过电子邮件发送视频的“移动上传”功能似乎有效

     类似资料:
    • 如何非交互式生成上述证书?

    • Navicat 让你从一个数据库或模式传输对象到另一个数据库或模式,或者到一个 SQL 文件(RDBMS)或一个 Javascript 文件(MongoDB)。目标数据库和/或模式可以与源数据库和/或模式的服务器相同或在其他服务器中。若要打开数据传输窗口,请从菜单栏选择“工具”->“数据传输”。 你可以将设置保存为一个配置文件以供将来使用或用作设置自动运行任务。若要打开一个已保存的配置文件,请点击

    • Navicat 让你从一个数据库或模式传输对象到另一个数据库或模式,或者到一个 SQL 文件(RDBMS)或一个 Javascript 文件(MongoDB)。目标数据库和/或模式可以与源数据库和/或模式的服务器相同或在其他服务器中。若要打开数据传输窗口,请从菜单栏选择“工具”->“数据传输”。 你可以将设置保存为一个配置文件以供将来使用或用作设置自动运行任务。若要打开一个已保存的配置文件,请点击

    • Navicat 让你从一个数据库或模式传输对象到另一个数据库或模式,或者到一个 SQL 文件(RDBMS)或一个 Javascript 文件(MongoDB)。目标数据库和/或模式可以与源数据库和/或模式的服务器相同或在其他服务器中。若要打开数据传输窗口,请从菜单栏选择“工具”->“数据传输”。 你可以将设置保存为一个配置文件以供将来使用或用作设置自动运行任务。若要打开一个已保存的配置文件,请点击

    • 原文:Interactive navigation 所有图形窗口都带有导航工具栏,可用于浏览数据集。 以下是工具栏底部的每个按钮的说明: Home(首页)、Forward(前进)和Back(后退)按钮: 这些类似于 Web 浏览器的前进和后退按钮。 它们用于在之前定义的视图之间来回浏览。 它们没有意义,除非你已经使用平移和缩放按钮访问了其他地方。 这类似于尝试在访问新页面之前单击 Web 浏览器上

    • 我正在使用Java和Selenium来自动化我的测试。我的一个测试需要从计算机上传图像。我使用Robot对象来识别上传窗口并设置文件的路径。通过IntelliJ运行测试时,一切正常,因为浏览器位于前面,包括上传窗口。当我通过Jenkins运行测试时,浏览器和上传窗口仍然位于后面,无法上传文件。 我尝试了几种方法将窗口放在最前面,它们只有在通过IntelliJ直接运行时才能工作,但詹金斯仍然存在问题