*目次 [#g0703eef] #contents *参考情報 [#se8c4cd7] **オープンソースのクライアント [#tbd31ef3] -[[NatsuLiphone - Twitter client for iPhone / iPod touch:http://iphone.natsulion.org/]] -[[オープンソースのTwitterクライアント纏め - Tomute’s Notes:http://d.hatena.ne.jp/tomute/20090824/1251161729]] **ライブラリ [#ke9c934f] -[[Tweepy]] -[[RubyTwitterGem]] **Objective-Cで使う [#ldd94db9] -[[Objective-CでTwitter APIを使う 色々 - すぎゃーんメモ:http://d.hatena.ne.jp/sugyan/20100422/1271879805]]が詳しい。 -[[jdg's oauthconsumer at master - GitHub:http://github.com/jdg/oauthconsumer]]を使っているが、[[aral's XAuthTwitterEngine at master - GitHub:http://github.com/aral/XAuthTwitterEngine]]を使った方がいいのかも? *OAuth対応 [#ed1342aa] **参考リンク [#f1bc763e] -[[PHPでTwitter APIのOAuthを使う方法まとめ - 頭ん中:http://www.msng.info/archives/2010/01/twitter_api_oauth_with_php.php]]…PHP用。コールバックベース。 -[[[ヅラド] Twitter4Jを使ったTwitterのOAuth認可サンプル:http://www.nilab.info/zurazure2/001125.html]]…Java用。PINベース。 -[[System.Exit – ruby で OAuth を使ってみる実験:http://jugyo.org/blog/3349]] **基本の流れ [#o9ec6076] -Twitterにアプリケーション登録を登録し、Consumer Key と Consumer Secret を取得。 -Access TokenとAccess Token Secretを取得する。以下のどちらかの方法を使う。 --認証用URLを自前で用意しユーザーがログオン。コールバックで取得。…めんどくさい。 --Twitterの認証画面を表示。PIN番号が表示されるのでそれを入れてもらう。…簡単。 -Consumer Key / Consumer Secret / Access Token / Access Token Secretを使ってAPIを使う。 **Twitterにアプリケーション登録 [#b5b80b1b] -Twitterに自分のアカウントでログオン。http://twitter.com/ -https://twitter.com/apps→新しいアプリケーションを追加。 -アプリケーション登録申請を行う(あとから変更可能)。 ,項目,必須,説明 ,アプリケーションのアイコン,×,認証時に表示される? ,アプリケーション名,○,tweetのfrom XXXのXXXの部分に使われる。 ,アプリケーションの説明,○,適当 ,アプリケーションのウェブサイトURL,○,アプリケーション名からリンクが張られる? ,所属会社/団体,×,適当 ,サイト,×,適当 ,アプリケーションの種類,○,クライアントはbotやその他の用途。ブラウザアプリケーションはWebアプリ。 ,コールバックURL,×,ブラウザアプリのときだけ入力 ,Default Access type,○,つぶやきたいときは、Read & Write。表示だけの場合は、Read-only ,Use Twitter for login,×,不明 -登録が完了するとConsumer keyとConsumer secretが表示されるのでメモっておく。 **Access TokenとAccess Token Secretを取得する(PINベース) [#w8515668] -BOTのように一つのアカウントに関連づけられるクライアントアプリケーションの場合、PINベース認証でAccess TokenとAccess Token Secretを取得して保存するだけでOK。 -ブラウザで認証画面を表示する前に関連づけたいアカウントであらかじめログオンしておくと間違えない。 ***Javaで実装 [#e2648e33] [[[ヅラド] Twitter4Jを使ったTwitterのOAuth認可サンプル:http://www.nilab.info/zurazure2/001125.html]]を参考にさせていただく。 #pre{{ public class TwitterOAuthAccessTokenGetter { public static void main(String[] args) throws Exception { //Twitterにアプリケーションを登録したときに表示されるConsumerKey ConsumerSecretをセットする。 String consumerKey = "XXXXXXXXXXXXX"; String consumerSecret = "YYYYYYYYYYYYY"; //認証用URLが表示されるのでブラウザでアクセスし表示されるPINコードを読み込む。 //アカウントが複数ある場合あらかじめ関連づけたいアカウントでログオンしておくと良い TwitterFactory factory = new TwitterFactory(); Twitter twitter = factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret); RequestToken requestToken = twitter.getOAuthRequestToken(); String authorizationURL = requestToken.getAuthorizationURL(); System.out.println(authorizationURL + " にウェブブラウザでアクセスして認証を許可してください。"); System.out.println("認証を許可したらウェブブラウザにPINコードが表示されます。"); System.out.println("PINコードを入力して[Enter]キーを押してください。"); BufferedReader r = new BufferedReader(new InputStreamReader(System.in)); String pin = r.readLine(); AccessToken accessToken; if (pin.length() > 0) { accessToken = twitter.getOAuthAccessToken(requestToken, pin); } else { accessToken = twitter.getOAuthAccessToken(); } //AccessToken AccessTokenSecretを表示。アプリケーションでこれを使う。 int userId = twitter.verifyCredentials().getId(); String token = accessToken.getToken(); String tokenSecret = accessToken.getTokenSecret(); System.out.println("UserId=" + userId); System.out.println("Token=" + token); System.out.println("TokenSecret=" + tokenSecret); } } }} ***Rubyで実装 [#b0ce8dcf] あらかじめoauthライブラリはインストールしておく。 sudo gems install oauth 使い方はJava版と同じ。 #pre{{ require 'rubygems' require 'oauth' CONSUMER_KEY = 'XXXXXXXXX' CONSUMER_SECRET = 'YYYYYYY' consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site=>'http://tw\ itter.com') request_token = consumer.get_request_token print "次のURLにアクセスしてください: #{request_token.authorize_url}\n" print "PINコードを入力して[ENTER]を押してださい\n" pin = STDIN.gets.chomp print "PIN CODE=#{pin}\n" access_token = request_token.get_access_token(:oauth_token => request_token.tok\ en, :oauth_verifier => pin) print "Token=#{access_token.token}\n" print "Secret=#{access_token.secret}\n" }} **トラブルシューティング [#qbcb7a1b] ***認証ページでエラー(おっと…) [#k24bf4af] 意味不明な以下のメッセージが表示された場合、認証用のURLのコピペ間違いなどが考えられる(MacのターミナルからURLをコピーしようとしたとい、折り返し部分にバックスラッシュが含まれていてこのメッセージが表示されたことがあった)。 #pre{{ おっと!このページはもう有効ではありません。あなたと同じトークン情報を誰かがすでに利用してしまったようです。元のサイトに戻ってもう一度試してみてください。たぶん単純なミスでしょう。 }} * Streaming API [#x2a7806a] **参考リンク [#y3bb4c2c] -[[Streaming API Documentation | dev.twitter.com:http://dev.twitter.com/pages/streaming_api]]。公式ドキュメント。 -[[Twitter Streaming APIをRubyで試してみる - しばそんノート:http://d.hatena.ne.jp/shibason/20090816/1250405491]] -[[RubyからTwitterStreamingAPIを使うgem作ったよ! - yayuguのにっき:http://d.hatena.ne.jp/yayugu/20091230/1262183478]] **基本 [#b89d8901] -BASIC認証で使える。一つのアカウントで一つのみ。 **Rubyのサンプルコード [#zeca8442] #pre{{ #!/usr/bin/env ruby # coding: utf-8 require 'net/http' require 'uri' require 'rubygems' require 'json' USERNAME = '_USERNAME_' # ここを書き換える PASSWORD = '_PASSWORD_' # ここを書き換える # URLが変更になってるみたい(2010/07/22) #uri = URI.parse('http://stream.twitter.com/spritzer.json') uri = URI.parse('http://stream.twitter.com/1/statuses/sample.json') Net::HTTP.start(uri.host, uri.port) do |http| request = Net::HTTP::Get.new(uri.request_uri) # Streaming APIはBasic認証のみ request.basic_auth(USERNAME, PASSWORD) http.request(request) do |response| raise 'Response is not chuncked' unless response.chunked? response.read_body do |chunk| # 空行は無視する = JSON形式でのパースに失敗したら次へ status = JSON.parse(chunk) rescue next # 削除通知など、'text'パラメータを含まないものは無視して次へ next unless status['text'] user = status['user'] puts "#{user['screen_name']}: #{status['text']}" end end end }} **Tweepy(Python)のサンプルコード [#r2370c91] #pre{{ #!/usr/bin/python # -*- coding: utf-8 -*- import sys import tweepy import simplejson #from pit import Pit class StreamListener(tweepy.StreamListener): def on_data(self, data): data = simplejson.loads(data) if data.has_key('text'): print data['text'] def main(): user = 'xxxxx' passwd = 'yyyyy' stream = tweepy.Stream(user, passwd, StreamListener()) stream.filter(track=('#nhk',)) if __name__ == "__main__": main() }} streaming.pyで処理が行われている。 #pre{{ def filter(self, follow=None, track=None, async=False): params = {} self.headers['Content-type'] = "application/x-www-form-urlencoded" if self.running: raise TweepError('Stream object already connected!') self.url = '/%i/statuses/filter.json?delimited=length' % STREAM_VERSION if follow: params['follow'] = ','.join(map(str, follow)) if track: params['track'] = ','.join(map(str, track)) self.body = urllib.urlencode(params) self._start(async) }}