- 追加された行はこの色です。
- 削除された行はこの色です。
&tag(Twitter,TwitterAPI);
*目次 [#g0703eef]
#contents
*参考情報 [#se8c4cd7]
**オープンソースのクライアント [#tbd31ef3]
-[[NatsuLiphone - Twitter client for iPhone / iPod touch:http://iphone.natsulion.org/]]
-[[NatsuLiphone]]
-[[MGTwitterEngine]]
-[[XAuthTwitterEngine]]
-[[OAuthConsumer]]
-[[yuumi3's TweetNow at master - GitHub:http://github.com/yuumi3/TweetNow]]
-[[オープンソースの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が表示されるのでメモっておく。
**その他情報 [#t2a86a71]
-[[buzztterの裏側とその周辺技術 - dara日記:http://d.hatena.ne.jp/darashi/20071106/1194365071]]
-[[ターミナルで簡単に Twiter API を実行出来る「twurl」が便利 - 強火で進め:http://d.hatena.ne.jp/nakamura001/20121122/1353599165]]…コマンドラインでTwitterAPIを実行することができるツール。
*関連ページ [#nb53f221]
-[[./v1.1]]
-[[./OAuth]]
-[[./xAuth]]
-[[./StreamingAPI]]
-[[./SearchAPI]]
-[[./20120514の変更]]
-[[./Ruby]]
*ユーザータイムラインの取得 [#h5e5cd97]
-次の形式で取得
http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=hima256&count=10
-(公式)リツイートされた分は含まれないらしい
*パラメータ [#d154c930]
**since_id [#f3b957fc]
-[[Twitter APIのsince_idの仕様を勘違いしていた… - 風柳メモ:http://d.hatena.ne.jp/furyu-tei/20100124/1264342029]]…since_id以降の古い方からXX件とるだけじゃなく、最新のほうからとる場合もあるらしい。
**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)
}}