Apitore blog

Apitoreを運営していた元起業家のブログ

Spring socialでTwitterとアプリ連携する

はじめに

Spring Social Twitterというプロジェクトがあります。このプロジェクトはSpring-bootでTwitterとOpenID Connectしたり、Twitterのアプリを作ったりするときに使える便利なライブラリです。今回はこちらのプロジェクトを使って、Twitterとアプリ連携をしてみます。 amarec (20170105-203753)

「はじめに」の補足

Janetterなどのツイッタークライアントでやれることは全部できるようになります。プロセスとしては、ユーザーにアプリを認可(Oauth1.0)してもらいアクセストークンを発行します。このアクセストークンを使って、ユーザーのアカウントでツイートを投稿したり、ツイートを収集したりします。今回は以前投稿した、Spring SecurityにFacebookでOpenID Connectする方法、とは違ってOpenID Connectするわけではありません。が、ほぼOpenID Connectするようなもんです(認証への組み込みは簡単だけど、Twitterはアカウントを簡単に作れてしまうので認証に使いたくない)。 なお、今回はSpring Bootについては解説しません。なので本記事のターゲットはSpring Bootで既にアプリケーションを立ち上げている人向けです。

Twitterでアプリ登録をする

Twitter Application Managementへ行って、アプリ登録をします。下の図では既に以前作ったアプリが表示されていますが、今回は別のアプリを作るので新しく登録します。「Create New App」をクリックします。 amarec (20170105-203817) アプリケーションの情報を入力します。必須項目はアプリケーション名、アプリケーションの説明、ウェブサイトです。 amarec (20170105-204011) 場合によってはPermissionを変更します。デフォルトはRead and Writeになっていて、ツイートをしたりツイートを取得したりできます。今回は将来の発展を見越してDMも送受信できるようにしておきます。 amarec (20170105-204857)

重要なアナウンス
近々ApitoreからTwitter関係のAPI(ツイートの取得、分析など)をリリースしますが、そこでアプリ連携をします。このアプリ連携によってApitoreがお客様のDMを勝手に送受信することは一切ありませんし、別の場所に保存することも一切ありません。ツイートについても同様です。お客様のリクエストに応じて情報を取得し、分析結果を返す、という用途でのみ用います。Twitterとのアプリ連携はApitoreからも切る(トークンを削除する)ことができますが、Twitterのお客様のアカウントで直接アプリ連携を切ることもできます。

続いてコールバックの設定です。ここは必須ではありませんが、よりセキュアに運用したいのであれば設定推奨です。「Enable Callback Locking」にチェックを入れれば、ここで設定したコールバック以外にはコールバックしないように制御できます。 amarec (20170105-205115) アプリ連携に必要なのは「Consumer Key」と「Consumer Secret」です。アクセストークンは発行しなくてよいです。Consumer KeyとSecretは後で使うのでメモしておいてください。 amarec (20170105-204915) 以上で下準備は終了です。

SpringからTwitterと連携する

ライブラリはMavenから取得します。公式サイトでは最新バージョンが1.1.0とされていますが、Maven Centralには1.1.2が出ているのでこちらを使います。

<dependency>
  <groupId>org.springframework.social</groupId>
  <artifactId>spring-social-twitter</artifactId>
  <version>1.1.2.RELEASE</version>
</dependency>

続いて、コードを書きます。Spring Socialの公式サイトに連携方法の情報が載っていますが、不十分&不正確なためアプリ連携はできません。下記のコードを参考にしてください。 まずはTwitterにOauth1.0の認可を貰いにいきます。

private String CONSUMER_KEY = "YOUR_CONSUMER_KEY";
private String CONSUMER_SECRET = "YOUR_CONSUMER_SECRET";
private String CALLBACK_URL = "YOUR_CALLBACK_URL";
@RequestMapping(value="/step1", method=RequestMethod.POST)
public ModelAndView step1()
{
  TwitterConnectionFactory connectionFactory = new TwitterConnectionFactory(CONSUMER_KEY,CONSUMER_SECRET);
  OAuth1Operations oauthOperations = connectionFactory.getOAuthOperations();
  OAuthToken requestToken = oauthOperations.fetchRequestToken(CALLBACK_URL, null);
  String authorizeUrl = oauthOperations.buildAuthorizeUrl(requestToken.getValue(), OAuth1Parameters.NONE);
  return new ModelAndView("redirect:"+authorizeUrl,new HashMap<String, Object>());
}

続いて、Twitterからのコールバックを受けて、ユーザーのアクセストークンを取得します。以下のコードではTwitterからのコールバックは/step2と仮定しています。

@RequestMapping(value="/step2", method=RequestMethod.GET)
public ModelAndView step2(
    @RequestParam(value="oauth_token", required=false)
    String oauth_token,
    @RequestParam(value="oauth_verifier", required=false)
    String oauth_verifier)
{
  if (oauth_token == null) {
    return new ModelAndView("redirect:/cancel",new HashMap<String, Object>());
  }
  TwitterConnectionFactory connectionFactory = new TwitterConnectionFactory(CONSUMER_KEY,CONSUMER_SECRET);
  OAuth1Operations oauthOperations = connectionFactory.getOAuthOperations();
  OAuthToken requestToken = new OAuthToken(oauth_token,oauth_verifier);
  AuthorizedRequestToken authorizedRequestToken = new AuthorizedRequestToken(requestToken, oauth_verifier);
  OAuthToken accessToken = oauthOperations.exchangeForAccessToken(authorizedRequestToken, null);
  System.out.println("Access Token:"+accessToken.getValue());
  System.out.println("Access Token Secret:"+accessToken.getSecret());
  return new ModelAndView("redirect:/success",new HashMap<String, Object>());
}

以上でアクセストークンの取得は終わりです。あとは「Consumer Key」「Consumer Secret」「Access Token」「Access Token Secret」を使って、ユーザーのアカウントでアレコレするだけです。アレコレするときは公式のこちらが参考になります。ユーザーのアクセストークンはDBにでも保存しておけば、今後の運用がラクになるでしょう。

参考文献