当前位置:Java -> 使用 X API v2 创建推文

使用 X API v2 创建推文

你想学习如何使用X(Twitter)API v2从Java应用程序创建Tweets吗?这篇博客将会给你一步一步的指南,告诉你如何做到。享受吧!

介绍

X(Twitter)提供了一个API,允许你从应用程序中与你的账号进行交互。目前有两个版本。在这篇博客中,你将会使用最新的X API v2。尽管有很多信息可以找到关于如何设置你的环境以及如何与API进行交互,但在Java应用程序中做这件事花费了我相当多的时间。在这篇博客中,你将会学习如何设置你的账号以及如何从Java应用程序中创建推文。

关于博客的来源可以在GitHub上找到。

先决条件

本博客的先决条件包括:

  • Java基础知识,使用Java 21;
  • X账号;
  • 你拥有的一个网站(不是必须的,但出于安全考虑更好)。

设置开发者账号

首先要做的事情是设置一个开发者账号。

  1. 跳转到注册页面
  2. 需要注意的是,存在多种类型的账户:免费账户、基本账户、专业账户和企业账户。
  3. 滚动到页面底部,通过点击注册免费账号按钮进行免费账号的创建。
  4. 你需要用至少250个字符来描述你的用例。
  5. 注册完后,你会进入开发者门户

创建项目和应用

使用免费档,你可以创建一个项目和一个应用。创建项目和应用。

身份验证

由于你将要为用户创建推文,你需要使用OAuth 2.0授权码流和PKCE来设置身份验证。然而,重要的是你已经正确地配置了你的应用程序。前往开发者门户中的你的应用程序,点击编辑按钮,进入用户身份验证设置

authentication

这里有不同的部分需要提供信息和选择选项。

应用权限

这些权限启用了OAuth 1.0a身份验证。令人困惑的是,你需要选择这些项目中的一个,因为你的用例中不会使用OAuth 1.0a身份验证。然而,因为你将要创建推文,选择读取和写入,确保一切正确。

app permissions

应用类型

应用类型将启用OAuth 2.0身份验证,这是你将要使用的。你将会从一个应用程序中调用API。因此,选择Web应用程序、自动化应用程序或机器人

type of app

应用信息

应用信息部分,你需要提供一个回调URI和一个网站URL。这个回调URI很重要,因为它稍后将用于提供给你访问令牌,所以最好使用你拥有的网站的URL。

app info

点击保存按钮以保存你的更改。一个客户端ID客户端密钥将被生成并保存。

创建推文

在开发者门户中一切都已准备就绪。现在是时候创建Java应用程序,以便能够创建一条推文。

Java的Twitter API客户端库

为了创建推文,您将使用 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 并生成新的 客户端密钥

authorization

main 方法执行以下步骤:

  1. 设置正确的凭据作为环境变量:
    • TWITTER_OAUTH2_CLIENT_ID: OAuth 2.0 客户端ID
    • TWITTER_OAUTH2_CLIENT_SECRET: Oauth 2.0 客户端密钥
    • TWITTER_OAUTH2_ACCESS_TOKEN: 留空
    • TWITTER_OAUTH2_REFRESH_TOKEN: 留空
  2. 授权应用程序并检索访问和刷新令牌。
  3. credentials 对象中设置新收到的访问和刷新令牌。
  4. 调用 X API 以创建推文。
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 方法执行以下步骤:

  1. 创建 Twitter 服务对象:
    • 回调URI 设置为您在开发者门户中指定的URI。
    • 设置您想要授权的范围(允许的内容)。通过使用 offline.access,您将收到一个刷新令牌,它允许您在不通过刷新令牌流提示用户的情况下检索新访问令牌。这意味着您可以持续创建推文,而无需用户交互。
  2. 向您提供了一个授权应用程序所需范围的授权URL。
  3. 您将被重定向到 回调URI,在URL中将会显示授权码。
  4. getAccessToken 方法会等待您复制授权码并按Enter键。
  5. 访问令牌和刷新令牌将打印到控制台并从该方法返回。
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设置中看到您已经完成了这一步。

  1. 转到您 X 帐户中的 设置和隐私
  2. 导航至 安全性和帐户访问权限
  3. 导航至 应用程序和会话
  4. 导航至 已连接的应用程序
  5. 在这里,您将找到已授权的应用程序及其授权内容。

callApi 方法执行以下步骤:

  1. 使用提供的凭据创建 TwitterApi 实例。
  2. 创建一个 TweetRequest
  3. 创建推文。
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 方法执行以下步骤:

  1. 设置包括在前面部分获取的访问和刷新令牌在内的凭据。
  2. 添加回调到 TwitterApi 实例,以便检索新的访问和刷新令牌。
  3. 请求刷新令牌,回调方法 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 创建推文