gpt4 book ai didi

java - 如何在 java 中使用 refreshtoken 在 Youtube 中上传视频

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:13:52 25 4
gpt4 key购买 nike

我正在尝试使用授权码将视频上传到 Youtube。

    
public Credential authorize(List scopes, String credentialDatastore) throws IOException, URISyntaxException {
// Load client secrets.
URI filePath = new URI (GOOGLE_APIKEY);
Reader clientSecretReader =new InputStreamReader(new FileInputStream(filePath.toString()));

//Reader clientSecretReader = new InputStreamReader(Auth.class.getResourceAsStream(GOOGLE_APIKEY));
GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, clientSecretReader);



// Checks that the defaults have been replaced (Default = "Enter X here").
if (clientSecrets.getDetails().getClientId().startsWith("Enter")
|| clientSecrets.getDetails().getClientSecret().startsWith("Enter ")) {
System.out.println(
"Enter Client ID and Secret from https://console.developers.google.com/project/_/apiui/credential "
+ "into src/main/resources/client_secrets.json");
System.exit(1);
}

// This creates the credentials datastore at ~/.oauth-credentials/${credentialDatastore}
FileDataStoreFactory fileDataStoreFactory = new FileDataStoreFactory(new File(System.getProperty("user.home") + "/" + CREDENTIALS_DIRECTORY));
DataStore datastore = fileDataStoreFactory.getDataStore(credentialDatastore);

GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, scopes).setCredentialDataStore(datastore).build();

// Build the local server and bind it to port 8080
LocalServerReceiver localReceiver = new LocalServerReceiver.Builder().setPort(8080).build();

// Authorize.
return new AuthorizationCodeInstalledApp(flow, localReceiver).authorize("user");
}

这是有效的,每次上传视频时用户都必须进行身份验证。现在我想要使用从我已经拥有的刷新 token 生成的访问 token 上传视频。但需要集成到我的 Auth 文件中,该文件具有 LocalServerReceiver,因为在内部使用 Jetty 服务器。

我已经编写了从刷新 token 中获取访问 token 的代码。请帮助我集成它。

 
public GoogleCredential getCredentials(String clientId,String clientSecret,JsonFactory jsonFactory,HttpTransport transport,String refreshToken) throws IOException{

GoogleCredential credential = new GoogleCredential.Builder()
.setClientSecrets(clientId, clientSecret)
.setTransport(transport)
.setJsonFactory(jsonFactory)
.build();
credential.setRefreshToken(refreshToken);

// Do a refresh so we can fail early rather than return an unusable credential

credential.refreshToken();
String authCode=credential.getAccessToken();
return credential;

}

最佳答案

在使用 google-java-api 上传 Youtube 视频时,我特别遇到了两个问题

  1. 一个 jetty 服务器 实例,它将持续监听,直到响应来自 Google,如重定向 url 中所述。
  2. 虽然在 new LocalServerReceiver.Builder() 类中有一个名为 setHost() 的函数负责创建本地 jetty 服务器实例,但它通过一个 每次给出主机名时都无法分配请求的地址错误,无论端口如何,这无关紧要。

整个授权过程在AuthorizationCodeInstalledApp类的authorize方法中完成,主要功能如下

  1. 创建一个 url,要求用户授予对应用程序的访问权限。
  2. 身份验证成功后,将收到一个代码( jetty 服务器实例会持续监听直到收到代码)。
  3. 将刚刚收到的代码与 accesstoken 和 refreshtoken 交换以进行离线上传。
  4. 存储我们刚从 google 收到的凭据。

为了分离整个过程,我创建了一个新类ExtendedAuthorizationCodeInstalledApp,它扩展了原始的AuthorizationCodeInstalledApp,并为类中的每个函数创建了每个方法。方法如下

  1. getAuthorizationFromStorage:从存储的凭据中获取访问 token 。
  2. getAuthorizationFromGoogle :使用来自 Google 的凭证获取身份验证,创建将引导用户进入身份验证页面的 url,并在 state 参数中创建自定义的名称-值对。该值应使用 base64 编码器进行编码,以便我们可以在身份验证后收到从 google 重定向的相同代码。
  3. saveAuthorizationFromGoogle:保存我们从 google 获得的凭据。
    • 从credentialDatastor 来自 google 之后收到的响应身份验证。
    • 点击谷歌获取可用于获取的永久刷新 token 用户的访问 token 。
    • 将文件名中的 accesstoken 和 refreshtoken 等 token 存储为用户名

代码实现是here

感谢@KENdi 的建议...

关于java - 如何在 java 中使用 refreshtoken 在 Youtube 中上传视频,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39575017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com