当前位置: 代码迷 >> java >> 使用Java从我的Web服务器上传视频到Youtube
  详细解决方案

使用Java从我的Web服务器上传视频到Youtube

热度:29   发布时间:2023-07-25 19:11:06.0

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

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

您可以分享我的方案的经验/代码示例/解决方案吗? 简而言之,我只是尝试自动化我打开Youtube仪表板,并将视频上传到Youtube中的频道。

通常,从API V3开始,Google优先于其他机制使用OAuth2,并且上传视频(或修改用户数据的任何其他操作)需要OAuth2。

幸运的是,有一种特殊的令牌叫做refresh token来救援。 刷新令牌不会像普通访问令牌一样过期,并在需要时用于生成普通访问令牌。 所以,我将我的应用程序分为两部分:

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

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

要生成刷新令牌,应将accessType设置为offline以获取授权流。 注意:如果您的系统上已存在令牌,即使它没有刷新令牌,它也不会尝试获取新令牌,因此您还必须设置批准提示以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)

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

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

    • 从身份验证后从谷歌收到的响应中的凭据数据创建GoogleAuthorizationCodeFlow对象。
    • 点击google获取永久刷新令牌,该令牌可用于随时获取用户的accessstoken。
    • 将诸如accesstoken和refreshtoken之类的标记存储在文件名中作为userid

在查看代码实现