用Java从我的web服务器上传视频到Youtube
我的目标是将上传到我的web服务器上的视频上传到我自己频道的Youtube上,而不是用户的Youtube帐户(我的web服务器是代理) 我找到了将视频上传到Youtube的示例代码,并获得了凭据。我在这个示例中遇到的问题是,它将凭据写入磁盘,并打开一个http服务器。由于我的web服务器可能会有许多用户同时上载他们的视频,因此凭据文件位置必须是动态的,并且不可能多个绑定到同一http端口。此外,在搜索了其他关于上传到Youtube的文章后,我认为这种方法适用于上传到Youtube帐户的用户用Java从我的web服务器上传视频到Youtube,java,youtube,youtube-data-api,Java,Youtube,Youtube Data Api,我的目标是将上传到我的web服务器上的视频上传到我自己频道的Youtube上,而不是用户的Youtube帐户(我的web服务器是代理) 我找到了将视频上传到Youtube的示例代码,并获得了凭据。我在这个示例中遇到的问题是,它将凭据写入磁盘,并打开一个http服务器。由于我的web服务器可能会有许多用户同时上载他们的视频,因此凭据文件位置必须是动态的,并且不可能多个绑定到同一http端口。此外,在搜索了其他关于上传到Youtube的文章后,我认为这种方法适用于上传到Youtube帐户的用户 你能
你能为我的场景分享你的经验/代码示例/解决方案吗?简言之,我只是尝试将打开Youtube仪表板并将视频上传到Youtube频道的过程自动化。一般来说,从API V3开始,谷歌更喜欢OAuth2而不是其他机制,上传视频(或修改用户数据的任何其他操作)需要OAuth2 幸运的是,有一种特殊的令牌被称为
refreshtoken
。刷新令牌不像正常访问令牌那样过期,并在需要时用于生成正常访问令牌。因此,我将我的申请分为两部分:
- 第一部分用于生成RefreshToken,这是一个Java桌面应用程序,由用户在计算机上运行。谷歌的示例代码
- 第二部分是我的web应用程序的一部分,它使用给定的刷新令牌创建凭证对象
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服务器的实现过程。 方法如下
- 从认证后从google接收的响应中,从CredentialDataStor创建GoogleAuthorizationCodeFlow对象
- 点击google获取永久刷新令牌,该令牌可用于随时获取用户的accesstoken
- 将诸如accesstoken和refreshtoken之类的令牌作为userid存储在文件名中
<>检查代码实现< /p>,而不是链接代码实现,考虑将来自该代码的必要部分添加到您的答案中。