用 Java 将视频从我的网络服务器上传到 Youtube

Posted

技术标签:

【中文标题】用 Java 将视频从我的网络服务器上传到 Youtube【英文标题】:Upload videos to Youtube from my web server in Java 【发布时间】:2015-10-22 15:11:13 【问题描述】:

我的目标是将上传到我的网络服务器的视频上传到 我自己的频道上的 Youtube,不是用户的 Youtube 帐户(我的网络服务器充当代理)。

我找到了将视频上传到 Youtube here 的示例代码,并获得了 this way 的凭据。我在这个示例中遇到的问题是它将凭证写入磁盘,并打开了一个 http 服务器。由于我的网络服务器可能有很多用户同时上传他们的视频,凭证文件的位置必须是动态的,并且多个绑定到同一个 http 端口是不可能的。此外,在搜索了其他关于上传到 Youtube 的文章后,我认为这种方法是针对用户上传到他们的 Youtube 帐户的。

您能否分享您针对我的场景的经验/代码示例/解决方案?简而言之,我只是想自动化我打开 Youtube 仪表板并将视频上传到我的 Youtube 频道的过程。

【问题讨论】:

【参考方案1】:

一般来说,从 API V3 开始,Google 更喜欢 OAuth2 而不是其他机制,上传视频(或任何其他修改用户数据的操作)需要 OAuth2。

幸运的是,有一种称为refresh token 的特殊令牌可以提供帮助。刷新令牌不会像普通访问令牌一样过期,用于在需要时生成普通访问令牌。所以,我将我的申请分为两部分:

第一部分用于生成刷新令牌,这是一个 Java 桌面应用程序,旨在由用户在计算机上运行。 See here 获取来自 Google 的示例代码。 第二部分是我的 Web 应用程序的一部分,它使用给定的刷新令牌来创建凭据对象。

这是我在 Scala 中的实现,您可以轻松地适应 Java 版本:

要生成刷新令牌,您应该将授权流程的 accessType 设置为 offline。注意:如果系统中已经存在token,即使没有刷新token,也不会尝试获取新token,所以还需要设置approval prompt为force

def authorize(dataStoreName: String, clientId: String, clientSecret: String): Credential = 

    val builder = new GoogleAuthorizationCodeFlow.Builder(
      HTTP_TRANSPORT,
      JSON_FACTORY,
      clientId,
      clientSecret,
      Seq(YouTubeScopes.YOUTUBE_UPLOAD)
    )

    val CREDENTIAL_DIRECTORY = s"$System.getProperty("user.home")/.oauth-credentials"
    val fileDataStoreFactory = new FileDataStoreFactory(new java.io.File(CREDENTIAL_DIRECTORY))
    val dataStore: DataStore[StoredCredential] = fileDataStoreFactory.getDataStore(dataStoreName)

    builder.setCredentialDataStore(dataStore).setAccessType("offline").setApprovalPrompt("force")

    val flow = builder.build()

    val localReceiver = new LocalServerReceiver.Builder().setPort(8000).build()

    new AuthorizationCodeInstalledApp(flow, localReceiver).authorize("user")


val credential = authorize(dataStore, clientId, clientSecret)
val refreshToken = credential.getRefreshToken

要在服务器上使用刷新令牌,您可以从刷新令牌构建凭据:

def getCredential = new GoogleCredential.Builder()
    .setJsonFactory(JSON_FACTORY)
    .setTransport(HTTP_TRANSPORT)
    .setClientSecrets(clientId, clientSecret)
    .build()
    .setRefreshToken(refreshToken)

【讨论】:

【参考方案2】:

我已经绕过了整个 AuthorizationCodeInstalledApp authorize() 方法并创建了一个新的子类,它绕过了码头服务器的实现过程。 方法如下

    getAuthorizationFromStorage :从存储的凭据中获取访问令牌。 getAuthorizationFromGoogle :使用来自 Google 的凭据获取身份验证创建将引导用户进入身份验证页面的 url,并在 state 参数中创建自定义的名称-值对。该值应使用 base64 编码器进行编码,以便我们可以在身份验证后接收从 google 重定向的相同代码。

    saveAuthorizationFromGoogle :保存我们从 google 获得的凭据。

    根据身份验证后从 google 收到的响应,从 credentialDatastor 创建 GoogleAuthorizationCodeFlow 对象。 点击google获取永久刷新令牌,可用于随时获取用户的accesstoken。 将 accesstoken 和 refreshtoken 等令牌作为用户 ID 存储在文件名中

查看代码实现here

【讨论】:

考虑将代码中的基本部分添加到您的答案中,而不是链接代码实现。

以上是关于用 Java 将视频从我的网络服务器上传到 Youtube的主要内容,如果未能解决你的问题,请参考以下文章

让用户将视频从我的站点服务器上传到他们的 youtube 频道

如何将视频从我的应用程序流式传输到网络?

将图像从我的网络服务器显示到我的 iPhone 应用程序

使用 WordPress 将视频上传到 YouTube

从我的云存储中自动创建和上传 Youtube 视频

将实时视频从我的 c# 应用程序流式传输到 ASP.NET 网页