OAuth
最初の障害「OAuth」
Twitterのタイムラインを取得したり送信するためには、当然ながらユーザ認証が必要です。
Basic認証というIDとPassをアプリから入力する方も有ったのですが、2010/08にTwitter側でBasic認証を廃止。
よりセキュアな認証方式として、OAuthが必要になりました。
OAuthにより、クライアントはIDとPassを直接保存する必要がないため、セキュリティを独自に作りこむ必要がなくなりました。
ユーザ視点でも、クライアントにPasswordを入力しなくてよいため、心理的に安心という利点があります。
では、OAuthをどうやって実装するのか?
必要な工程は3つです。
Twitterに、事前に作成するアプリの登録を行う。
プログラムにOAuthを組み込む準備(APIの登録)
OAuthのサンプルを修正する場合(getOAuthAuthorizedInstance)
ちなみに、OAuthについての仕組みを知りたい人は、こちらのHPが良さそうです(私は読み切っていません)
ゼロから学ぶOAuth
http://gihyo.jp/dev/feature/01/oauth
OAutheは、簡単にいうと次のような手順でアプリに使用権限を許諾します。すでに、Twitterのユーザさんなら経験済みな仕組みだと思います。未経験の人は、何かClientをダウンロードして使ってみてください。
アプリからTwitterサーバのWeb画面へアクセスする。
TwitterのWeb上でユーザがアプリを許可する。
Twitterサーバから、許可情報(トークン)をアプリが受け取る。
1. Twitterに、事前に作成するアプリの登録を行う。
OAuthで認証するためには必須な手続きである。アプリを作る前に登録しておくことも可能。
登録は、Twitterのこのページへ(Register a new appをクリック)
登録内容についての解説は、下記の2つのHPのページがおススメ。
Tech Booster
http://techbooster.jpn.org/andriod/mashup/4525/
HishidamaさんのHP
http://www.ne.jp/asahi/hishidama/home/tech/twitter/auth.html
この登録の中で、Callback URLに何を登録すればいいのか迷いました。
結論は、何でもいいです。私は下記にしました。何でもいい理由は、プログラム解説の中で触れたいと思います。
http://twitter.com/
2. プログラムにOAuthを組み込む準備(APIの登録)。
さて、OAuthを組み込むのに最も情報が多いのが、Twitter4jというAPIを用いた実装方法なので、勉強を兼ねてトライしてみました。
まず、Twitter4jの入手。公式HPのダウンロードから入手。私は、「(Android向けのスリムバージョン)」を落としました。
eclipse環境でのtwitter4jの組み方は、下記のHPが参考になりました。
ただし、これはAndroid以外での組み込みなので、ライブラリの追加(D.プロジェクトの作成・T4Jの追加)を参考にします。
陽昇れども地の底に光届かず
http://sites.google.com/site/elekmole/twitter4jtop
私は、jarファイルを1個ずつ登録するのではなく、「外部クラス、フォルダーの追加」で、解凍したtwitter4jのlibディレクトリを登録しました。
ダメでした。「外部 jar 追加」で、twitter4jのjarファイル全部を登録しました。
ちなみにjavadocとsourceをeclipsに登録することで参考にできる情報を増やすことができます。
下記のHPが参考になりました。各jar毎に登録するのはちょっと大変でしたけど。一気に登録する手段があればなぁ。
Tech Booster
http://techbooster.jpn.org/andriod/environment/4897/
3.OAuthのサンプルを修正する場合(getOAuthAuthorizedInstance)
各 自で入手したサンプルが、TwitterFactory()のgetOAuthAuthorizedInstance()を用いていた場合、 Twitter4jの2.0.0からgetOAuthAuthorizedInstanceが廃止されたため修正する必要があります。
修正は簡単です。
new TwitterFactory()でインスタンスを作っているところを、new ConfigurationBuilder()に変更。
getOAuthAuthorizedInstance(CONSUMER_KEY,CONSUMER_SECRET) としているところを、setOAuthConsumerKey(CONSUMER_KEY)と setOAuthConsumerSecret(CONSUMER_SECRET)の2行で記述する。
2の下に、Configuration configuration = confbuilder.build();を追加する。
private OAuthAuthorization myOauthを、クラスの先頭に追加(各メソッドで共通に使う)
4 で定義したインスタンスにnew OAuthAuthorization(configuration)を入れる。この方法を行わないと、getOAuthRequestTokenで IllegalStateException: OAuth consumer key/secret combination not suppliedというエラーが発生する。
twitter4jのversionによっては、4のインスタンスに対して、myOauth.setOAuthAccessToken(null)を行う。IllegalStateExceptionになるらしい。2.2.2では発生せず。
こちらの記事が参考になります。
YUJimny備忘録
http://d.hatena.ne.jp/yujimny/20110204
OAuthのサンプルコードは、こちらを参考にしました。
Kyosuke Yoshimura さんのandroid日記
http://blog.kyosuke25.com/2010/08/twitter4joauth.html
// TODO TwitterのHPに登録したCallback URLが何でもいい理由を書くかも。
「OAuth」で取得した物を使って、タイムラインの取得
OAuthでトークンらしいものを取得したら一気に満足したわけですが、ここからがやっと本番です。
Twitter4jを用いて、タイムラインの取得から。
要素としては、次のステップになります。
1.不揮発領域(preferenceなど)に保存したAccess TokenとAccess Token Secretを読みだします。
Twitter4jでは、取得したAccess TokenとAccess Token Secretを合わせた4つを登録したインスタンスで操作します。
2.ConfigurationBuilderを用いてtwitter4j用のconfをBuildします。
下記のページの使い方が参考になります。
陽昇れども地の底に光届かず(ConfigurationBuilder)
http://sites.google.com/site/elekmole/twitter4jtop/configurationbuilder
3.認証情報を登録したtwitter4jのインスタンスを生成する。下記のページに答えがあります。
YUJimny備忘録
http://d.hatena.ne.jp/yujimny/20110204
4.作ったインスタンスで、getHomeTimeline()のメソッドを用いて取得する。
簡単すなー。
ちなみに、Twitter4jでは、Statusというクラスで取得した情報を使用できるようになっています。
Statusは、List型なのでget(location)で好きな位置のStatusを取得できます。
Status settingData = twitter_statuses.get(0);
settingData.getText()
Statusの中の構造は、こちらがわかりやすいです。
陽昇れども地の底に光届かず(Status)
http://sites.google.com/site/elekmole/twitter4jtop/02-status-class
また、Statusのmethodは、公式Java docがおススメです。