はじめに
Spring Social Twitterというプロジェクトがあります。このプロジェクトはSpring-bootでTwitterとOpenID Connectしたり、Twitterのアプリを作ったりするときに使える便利なライブラリです。今回はこちらのプロジェクトを使って、Twitterとアプリ連携をしてみます。
「はじめに」の補足
Janetterなどのツイッタークライアントでやれることは全部できるようになります。プロセスとしては、ユーザーにアプリを認可(Oauth1.0)してもらいアクセストークンを発行します。このアクセストークンを使って、ユーザーのアカウントでツイートを投稿したり、ツイートを収集したりします。今回は以前投稿した、Spring SecurityにFacebookでOpenID Connectする方法、とは違ってOpenID Connectするわけではありません。が、ほぼOpenID Connectするようなもんです(認証への組み込みは簡単だけど、Twitterはアカウントを簡単に作れてしまうので認証に使いたくない)。 なお、今回はSpring Bootについては解説しません。なので本記事のターゲットはSpring Bootで既にアプリケーションを立ち上げている人向けです。
Twitterでアプリ登録をする
Twitter Application Managementへ行って、アプリ登録をします。下の図では既に以前作ったアプリが表示されていますが、今回は別のアプリを作るので新しく登録します。「Create New App」をクリックします。 アプリケーションの情報を入力します。必須項目はアプリケーション名、アプリケーションの説明、ウェブサイトです。 場合によってはPermissionを変更します。デフォルトはRead and Writeになっていて、ツイートをしたりツイートを取得したりできます。今回は将来の発展を見越してDMも送受信できるようにしておきます。
重要なアナウンス
近々ApitoreからTwitter関係のAPI(ツイートの取得、分析など)をリリースしますが、そこでアプリ連携をします。このアプリ連携によってApitoreがお客様のDMを勝手に送受信することは一切ありませんし、別の場所に保存することも一切ありません。ツイートについても同様です。お客様のリクエストに応じて情報を取得し、分析結果を返す、という用途でのみ用います。Twitterとのアプリ連携はApitoreからも切る(トークンを削除する)ことができますが、Twitterのお客様のアカウントで直接アプリ連携を切ることもできます。
続いてコールバックの設定です。ここは必須ではありませんが、よりセキュアに運用したいのであれば設定推奨です。「Enable Callback Locking」にチェックを入れれば、ここで設定したコールバック以外にはコールバックしないように制御できます。 アプリ連携に必要なのは「Consumer Key」と「Consumer Secret」です。アクセストークンは発行しなくてよいです。Consumer KeyとSecretは後で使うのでメモしておいてください。 以上で下準備は終了です。
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にでも保存しておけば、今後の運用がラクになるでしょう。