Twitter API をJava(twittered)で実行する

# はじめに

TwitterAPIのv2が発表され、キャッチアップのために触ってみることにした。
その際にAPIクライアントを [twittered](https://github.com/redouane59/twittered) を利用するようにした。

# twittered

Java製のTwitter API用のAPIクライアント。
[公式サイト](https://developer.twitter.com/en/docs/twitter-api/tools-and-libraries)でも利用を促している。

試したバージョンは `2.6` 。

v1.x も v2 も両方対応している。
更新頻度については高めですが、日本語の解説などは特に、見つからない。

## 導入方法

Readmeの `Code samples` を参考にした。

## サンプルコード

```java
@Component
public class Twitter {

  private static final String OAUTH_AUTHENTICATE_URL = "https://twitter.com/oauth/authenticate?oauth_token={{oauth_token}}";
  private static final String PLACE_HOLDER_OAUTH_TOKEN = "{{oauth_token}}";

  @Value("${client.twitter.api-key:}")
  private String apiKey;
  @Value("${client.twitter.api-secret-key:}")
  private String apiSecretKey;
  @Value("${client.twitter.callback-url:}")
  private String callbackUrl;

  /**
   * TwitterClientを生成する<br>
   *
   * @return TwitterClient
   */
  public TwitterClient createClient() {
    return
        this.createClient(
            new TwitterAccessToken(""),
            new TwitterAccessTokenSecret(""));
  }

  /**
   * TwitterClientを生成する<br>
   *
   * @param accessToken       Twitterのアクセストークン
   * @param accessTokenSecret Twitterのアクセストークンシークレット
   * @return TwitterClient
   */
  public TwitterClient createClient(
      TwitterAccessToken accessToken,
      TwitterAccessTokenSecret accessTokenSecret) {
    return
        new TwitterClient(
            this.createCredentials(
                accessToken.value(),
                accessTokenSecret.value()));
  }

  /**
   * RequestTokenを取得する<br>
   *
   * @return RequestToken
   */
  public RequestToken getRequestToken() {
    var client = this.createClient();
    return client.getOauth1Token(this.callbackUrl);
  }

  /**
   * 認証URLを取得する<br>
   *
   * @param requestToken RequestToken
   * @return 認証URL
   */
  public String oauthAuthenticate(RequestToken requestToken) {
    return OAUTH_AUTHENTICATE_URL.replace(PLACE_HOLDER_OAUTH_TOKEN, requestToken.getOauthToken());
  }

  /**
   * RequestTokenを取得する<br>
   *
   * @param requestToken RequestToken
   * @param pinCode
   * @return RequestToken
   */
  public RequestToken getOAuth1AccessToken(RequestToken requestToken, String pinCode) {
    var client = this.createClient();
    return client.getOAuth1AccessToken(requestToken, pinCode);
  }

  /**
   * Twitterへ投稿する<br>
   * <pre>POST statuses/update</pre>を実行し、Twitterの投稿IDを返却します<br>
   *
   * @param client  TwitterClient
   * @param message Twitterへの投稿内容
   * @return Twitterの投稿ID
   */
  @Async
  public CompletableFuture<String> postTweet(TwitterClient client, String message) {
    return
        CompletableFuture
            .supplyAsync(() -> client.postTweet(message))
            .thenApply(Tweet::getId);
  }

  private TwitterCredentials createCredentials(String accessToken, String accessTokenSecret) {
    return
        TwitterCredentials.builder()
            .accessToken(accessToken)
            .accessTokenSecret(accessTokenSecret)
            .apiKey(this.apiKey)
            .apiSecretKey(this.apiSecretKey)
            .build();
  }

}
```

# おわりに

Twitter APIの利用の申請方法などは割愛したが、1日で利用できた。
twitterdの書き味も特に不便はなかった。