目次

参考情報

オープンソースのクライアント

ライブラリ

Objective-Cで使う

OAuth対応

参考リンク

基本の流れ

Twitterにアプリケーション登録

Access TokenとAccess Token Secretを取得する(PINベース)

Javaで実装

[ヅラド] Twitter4Jを使ったTwitterのOAuth認可サンプルを参考にさせていただく。

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で実装

あらかじめoauthライブラリはインストールしておく。

sudo gems install oauth

使い方はJava版と同じ。

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"

トラブルシューティング

認証ページでエラー(おっと…)

意味不明な以下のメッセージが表示された場合、認証用のURLのコピペ間違いなどが考えられる(MacのターミナルからURLをコピーしようとしたとい、折り返し部分にバックスラッシュが含まれていてこのメッセージが表示されたことがあった)。

おっと!このページはもう有効ではありません。あなたと同じトークン情報を誰かがすでに利用してしまったようです。元のサイトに戻ってもう一度試してみてください。たぶん単純なミスでしょう。

Streaming API

参考リンク

基本

Rubyのサンプルコード

#!/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)のサンプルコード

#!/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で処理が行われている。

    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)


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS