当前位置:Java -> 使用 X API v2 创建推文
你想学习如何使用X(Twitter)API v2从Java应用程序创建Tweets吗?这篇博客将会给你一步一步的指南,告诉你如何做到。享受吧!
X(Twitter)提供了一个API,允许你从应用程序中与你的账号进行交互。目前有两个版本。在这篇博客中,你将会使用最新的X API v2。尽管有很多信息可以找到关于如何设置你的环境以及如何与API进行交互,但在Java应用程序中做这件事花费了我相当多的时间。在这篇博客中,你将会学习如何设置你的账号以及如何从Java应用程序中创建推文。
关于博客的来源可以在GitHub上找到。
本博客的先决条件包括:
首先要做的事情是设置一个开发者账号。
由于你将要为用户创建推文,你需要使用OAuth 2.0授权码流和PKCE来设置身份验证。然而,重要的是你已经正确地配置了你的应用程序。前往开发者门户中的你的应用程序,点击编辑按钮,进入用户身份验证设置。
这里有不同的部分需要提供信息和选择选项。
这些权限启用了OAuth 1.0a身份验证。令人困惑的是,你需要选择这些项目中的一个,因为你的用例中不会使用OAuth 1.0a身份验证。然而,因为你将要创建推文,选择读取和写入,确保一切正确。
应用类型将启用OAuth 2.0身份验证,这是你将要使用的。你将会从一个应用程序中调用API。因此,选择Web应用程序、自动化应用程序或机器人。
在应用信息部分,你需要提供一个回调URI和一个网站URL。这个回调URI很重要,因为它稍后将用于提供给你访问令牌,所以最好使用你拥有的网站的URL。
点击保存按钮以保存你的更改。一个客户端ID和客户端密钥将被生成并保存。
在开发者门户中一切都已准备就绪。现在是时候创建Java应用程序,以便能够创建一条推文。
为了创建推文,您将使用 Twitter API Java 客户端库。需要注意的是,在撰写本文时,该库仍处于测试版。该库仅支持 X API v2端点,但这正是您将要使用的端点,因此这不是问题。
将依赖项添加到 pom 文件中:
<dependency>
<groupId>com.twitter</groupId>
<artifactId>twitter-api-java-sdk</artifactId>
<version>2.0.3</version>
</dependency>
为了能够代表您的帐户创建推文,您需要授权该应用程序。下面的源代码基于 SDK 中提供的 示例。
您需要之前保存的 客户端ID 和 客户端密钥。如果您丢失了它们,可以在开发者门户中生成新的密钥。转到您的应用程序,并单击 Keys and Tokens 选项卡。滚动查找 客户端ID 并生成新的 客户端密钥。
main
方法执行以下步骤:
credentials
对象中设置新收到的访问和刷新令牌。public static void main(String[] args) {
TwitterCredentialsOAuth2 credentials = new TwitterCredentialsOAuth2(System.getenv("TWITTER_OAUTH2_CLIENT_ID"),
System.getenv("TWITTER_OAUTH2_CLIENT_SECRET"),
System.getenv("TWITTER_OAUTH2_ACCESS_TOKEN"),
System.getenv("TWITTER_OAUTH2_REFRESH_TOKEN"));
OAuth2AccessToken accessToken = getAccessToken(credentials);
if (accessToken == null) {
return;
}
// Setting the access & refresh tokens into TwitterCredentialsOAuth2
credentials.setTwitterOauth2AccessToken(accessToken.getAccessToken());
credentials.setTwitterOauth2RefreshToken(accessToken.getRefreshToken());
callApi(credentials);
}
getAccessToken
方法执行以下步骤:
offline.access
,您将收到一个刷新令牌,它允许您在不通过刷新令牌流提示用户的情况下检索新访问令牌。这意味着您可以持续创建推文,而无需用户交互。getAccessToken
方法会等待您复制授权码并按Enter键。private static OAuth2AccessToken getAccessToken(TwitterCredentialsOAuth2 credentials) {
TwitterOAuth20Service service = new TwitterOAuth20Service(
credentials.getTwitterOauth2ClientId(),
credentials.getTwitterOAuth2ClientSecret(),
"<Fill in your Callback URI as configured in your X App in the developer portal>",
"offline.access tweet.read users.read tweet.write");
OAuth2AccessToken accessToken = null;
try {
final Scanner in = new Scanner(System.in, "UTF-8");
System.out.println("Fetching the Authorization URL...");
final String secretState = "state";
PKCE pkce = new PKCE();
pkce.setCodeChallenge("challenge");
pkce.setCodeChallengeMethod(PKCECodeChallengeMethod.PLAIN);
pkce.setCodeVerifier("challenge");
String authorizationUrl = service.getAuthorizationUrl(pkce, secretState);
System.out.println("Go to the Authorization URL and authorize your App:\n" +
authorizationUrl + "\nAfter that paste the authorization code here\n>>");
final String code = in.nextLine();
System.out.println("\nTrading the Authorization Code for an Access Token...");
accessToken = service.getAccessToken(pkce, code);
System.out.println("Access token: " + accessToken.getAccessToken());
System.out.println("Refresh token: " + accessToken.getRefreshToken());
} catch (Exception e) {
System.err.println("Error while getting the access token:\n " + e);
e.printStackTrace();
}
return accessToken;
}
现在您已经对应用程序进行了授权,可以在您的X设置中看到您已经完成了这一步。
callApi
方法执行以下步骤:
TwitterApi
实例。TweetRequest
。private static void callApi(TwitterCredentialsOAuth2 credentials) {
TwitterApi apiInstance = new TwitterApi(credentials);
TweetCreateRequest tweetCreateRequest = new TweetCreateRequest(); // TweetCreateRequest |
tweetCreateRequest.setText("Hello World!");
try {
TweetCreateResponse result = apiInstance.tweets().createTweet(tweetCreateRequest)
.execute();
System.out.println(result);
} catch (ApiException e) {
System.err.println("Exception when calling TweetsApi#createTweet");
System.err.println("Status code: " + e.getCode());
System.err.println("Reason: " + e.getResponseBody());
System.err.println("Response headers: " + e.getResponseHeaders());
e.printStackTrace();
}
}
在仓库的根目录添加一个 sdk.properties
文件,否则将引发 Exception
(此 Exception
不会阻断,但会破坏输出)。
如果一切顺利,您现在已经创建了您的第一个推文!
您只需要执行上面的源代码一次。但是,检索到的访问令牌仅有效两小时。在此时间后(或更早),您需要使用刷新令牌检索新的访问令牌。下面的源代码基于 SDK 中提供的 示例。
main
方法执行以下步骤:
TwitterApi
实例,以便检索新的访问和刷新令牌。MainToken
将设置新的令牌,然后可以再次创建推文。public static void main(String[] args) {
TwitterApi apiInstance = new TwitterApi(new TwitterCredentialsOAuth2(System.getenv("TWITTER_OAUTH2_CLIENT_ID"),
System.getenv("TWITTER_OAUTH2_CLIENT_SECRET"),
System.getenv("TWITTER_OAUTH2_ACCESS_TOKEN"),
System.getenv("TWITTER_OAUTH2_REFRESH_TOKEN")));
apiInstance.addCallback(new MaintainToken());
try {
apiInstance.refreshToken();
} catch (Exception e) {
System.err.println("Error while trying to refresh existing token : " + e);
e.printStackTrace();
return;
}
callApi(apiInstance);
}
MaintainToken
方法仅设置新的令牌。
class MaintainToken implements ApiClientCallback {
@Override
public void onAfterRefreshToken(OAuth2AccessToken accessToken) {
System.out.println("access: " + accessToken.getAccessToken());
System.out.println("refresh: " + accessToken.getRefreshToken());
}
}
在本篇博客中,你学会了如何在开发者门户中配置一个应用程序。你学会了如何从Java应用程序授权你的应用,以及如何创建一条推文。
推荐阅读: 2. JAVA语言特点
本文链接: 使用 X API v2 创建推文