OAuth認証を使ってtwitterのhome TL(friends TL)を表示するgoogle chrome extensionを作ってみた

はじめに

前回のエントリではtwitterのpublic TLを取得するgoogle chrome extensionを作成しました。
今回はhome TL(friends TL)を取得するextensionを作成してみました。そのソースを公開しておきます。

大変だった点

方針

とりあえず、アプリーション登録とaccess tokenを前もって手動で取得し、それらを直接コード中に埋め込むことにしました。

参考にしたサイト

参考どころか、ソースのほとんどを流用させてもらっています。感謝。

使用ライブラリ

googlecodeに置かれている、javascriptのoauthライブラリを使用します。
oauth.jsとsha1.jsを使用します。

jQueryも使用します。

スナップショット

見た目は前回のエントリと同じなので割愛。

ソースコード

manifest.json
{
  "name": "twitter client",
  "version": "1.0",
  "description": "display friends timeline.",
  "background_page": "background.html",
  "permissions": [ "http://twitter.com/*", "http://api.twitter.com/*" ],
  "content_scripts": [
    {
      "matches": [ "http://*/*" ],
      "js": [ "content.js" ]
    }
  ]
}
content.js
var statuses = new Array( ) ;
var index = 0 ;
var oldChild = null ;

function onText( data ) {

    for( var i = 0; i < data.length; i++ ) {
      statuses[ i ] = data[ i ].user.name + ' : ' + data[ i ].text ;
    }
    display( ) ;

    startTimer( ) ;

}

function display( ) {

    var timeline_dom    = document.createElement('div') ;
    var title_dom       = document.createElement('strong') ;
    var text_dom        = document.createTextNode( statuses[ index ] ) ;
    timeline_dom.appendChild( text_dom ) ;
    timeline_dom.style.background = '#36b' ;
    timeline_dom.style.color      = '#fff' ;
    timeline_dom.style.padding    = '10px' ;
    timeline_dom.style.position   = 'relative' ;
    timeline_dom.style.zIndex     = '123456' ;
    timeline_dom.style.font       = '14px Arial' ;

    if( oldChild )
      document.body.removeChild( oldChild ) ;
    document.body.insertBefore( timeline_dom, document.body.firstChild ) ;
    oldChild = timeline_dom ;

    index++ ;
    if( index >= statuses.length )
      index = 0 ;

}


function startTimer( ) {
  setInterval( "display( )", 5000 ) ;
}

chrome.extension.sendRequest( { 'action' : 'timeline' }, onText ) ;

前回のエントリと同じコードです。

background.html
<!DOCTYPE html>
<html>
  <head>
    <script src="jquery-1.4.3.min.js"></script>
    <script src="oauth.js"></script>
    <script src="sha1.js"></script>
  </head>
  <body>
    <script type="text/javascript">

      var api = 'http://api.twitter.com/1/statuses/home_timeline.json' ;
      var OAUTH_CONSUMER_KEY    = 'dummy_consumer_key' ;
      var OAUTH_CONSUMER_SECRET = 'dummy_consumer_secret' ;
      var OAUTH_ACCESS_TOKEN    = 'dummy_access_token' ;
      var OAUTH_ACCESS_SECRET   = 'dummy_access_secret' ;

      function access( callback ) {
        var accessor = {
          consumerSecret: OAUTH_CONSUMER_SECRET,
          tokenSecret: OAUTH_ACCESS_SECRET
        } ;

        var message = {
          method: "GET", 
          action: api, 
          parameters: { 
            oauth_signature_method: "HMAC-SHA1", 
            oauth_consumer_key: OAUTH_CONSUMER_KEY, 
            oauth_token: OAUTH_ACCESS_TOKEN
          }
        } ;

        OAuth.setTimestampAndNonce( message ) ;
        OAuth.SignatureMethod.sign( message, accessor ) ;
        var target = OAuth.addToURL( message.action, message.parameters ) ;
        var options = {
          type: message.method,
          url: target,
          dataType: 'json',
          success: function( d, dt ) { 
            callback( d ) ;
          },
          error: function( a ) {
            window.alert( a.responseText ) ;
          },
          timeout: 1000 * 50
        };

        $.ajax( options ) ;

      }

      function onRequest( request, sender, callback ) {
        if( request.action == 'timeline' ) {
          access( callback ) ;
        }
      }

      chrome.extension.onRequest.addListener( onRequest ) ;

    </script>
  </body>
</html>

ソースのほとんどはこちらから流用させてもらいました。

    <script src="jquery-1.4.3.min.js"></script>
    <script src="oauth.js"></script>
    <script src="sha1.js"></script>

上記3つのライブラリは、extensionと同じディレクトリに置いておきます。

終わりに

OAuthライブラリのおかげで、比較的簡単にOAuth認証をクリアできました。
つぶやきの投稿や、一定時間毎にtwitterにアクセスし直す機能を入れるだけで、それなりのものになりそうな予感です。

次回のエントリではextension中でaccess tokenを取得する機能を入れる予定です。