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

用Java从我的web服务器上传视频到Youtube,java,youtube,youtube-data-api,Java,Youtube,Youtube Data Api,我的目标是将上传到我的web服务器上的视频上传到我自己频道的Youtube上,而不是用户的Youtube帐户(我的web服务器是代理) 我找到了将视频上传到Youtube的示例代码,并获得了凭据。我在这个示例中遇到的问题是,它将凭据写入磁盘,并打开一个http服务器。由于我的web服务器可能会有许多用户同时上载他们的视频,因此凭据文件位置必须是动态的,并且不可能多个绑定到同一http端口。此外,在搜索了其他关于上传到Youtube的文章后,我认为这种方法适用于上传到Youtube帐户的用户 你能

我的目标是将上传到我的web服务器上的视频上传到我自己频道的Youtube上,而不是用户的Youtube帐户(我的web服务器是代理)

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


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

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

幸运的是,有一种特殊的令牌被称为
refreshtoken
。刷新令牌不像正常访问令牌那样过期,并在需要时用于生成正常访问令牌。因此,我将我的申请分为两部分:

  • 第一部分用于生成RefreshToken,这是一个Java桌面应用程序,由用户在计算机上运行。谷歌的示例代码
  • 第二部分是我的web应用程序的一部分,它使用给定的刷新令牌创建凭证对象
下面是我在Scala中的实现,您可以轻松地适应Java版本:

要生成刷新令牌,应将授权流的accessType设置为
offline
。注意:如果您的系统上已经存在令牌,即使它没有刷新令牌,它也不会尝试获取新令牌,因此您还必须将审批提示设置为
强制

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)

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

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

    • 从认证后从google接收的响应中,从CredentialDataStor创建GoogleAuthorizationCodeFlow对象
    • 点击google获取永久刷新令牌,该令牌可用于随时获取用户的accesstoken
    • 将诸如accesstoken和refreshtoken之类的令牌作为userid存储在文件名中

  • <>检查代码实现< /p>,而不是链接代码实现,考虑将来自该代码的必要部分添加到您的答案中。