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

标签 java youtube youtube-data-api

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

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

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

最佳答案

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

幸运的是,有一种叫做refresh token 的特殊 token 可以解决这个问题。刷新 token 不会像普通访问 token 一样过期,用于在需要时生成普通访问 token 。因此,我将我的应用程序分为两部分:

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

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

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

要在服务器上使用刷新 token ,您可以从刷新 token 构建凭证:

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

关于java - 用 Java 从我的网络服务器上传视频到 Youtube,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31737699/

相关文章:

Youtube Data API v3,创建多个流后收到403

java - Spring 数据 JPA @EnableJpaRepositories TypeNotPresentExceptionProxy

java - 如何在不显示java中的值的情况下为每一行设置一个值

java - application.properties 中当前项目位置引用变量

java - 以相互方式交织 Jersey 的资源

html - 无法嵌入YouTube将视频加载到我的网站上(按 channel 最新上传)

youtube - 如何计算YouTube channel 的观看总数?

android - 将 youtube 集成到 fragment

search - 无法在 YouTube 搜索 API v3 上使用 nextPageToken 翻阅所有结果

ios - 集成 YouTube 数据 API v3 iOS