我的目标是将上传到我的网络服务器的视频上传到我自己的频道上的Youtube,不是用户' Youtube帐户(我的网络服务器充当代理)。
我找到了将视频上传到Youtube here并获取凭据this way的示例代码。我对此示例的问题是它将凭据写入磁盘,并打开一个http服务器。由于我的网络服务器可能会有很多用户同时上传他们的视频,因此凭证文件位置必须是动态的,并且不可能多次绑定到同一个http端口。此外,在搜索了关于上传到Youtube的其他文章之后,我认为这种方法适用于上传到Youtube帐户的用户。
您能否为我的方案分享您的经验/代码示例/解决方案?简而言之,我只是尝试自动化我打开Youtube仪表板,并将视频上传到Youtube中的频道。
答案 0 :(得分:4)
一般情况下,从API V3开始,Google优先于其他机制使用OAuth2,上传视频(或修改用户数据的任何其他操作)需要OAuth2。
幸运的是,有一种特殊的令牌称为refresh token
来救援。刷新令牌不会像普通访问令牌一样过期,并在需要时用于生成普通访问令牌。所以,我将我的申请分为两部分:
这是我在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)
答案 1 :(得分:0)
我绕过了整个 AuthorizationCodeInstalledApp authorize()方法并创建了一个绕过jetty服务器实现过程的新子类。 方法如下
saveAuthorizationFromGoogle:保存我们从谷歌获取的凭据。
查看代码实施here