SlideShare a Scribd company logo
1 of 19
Download to read offline
今回の狙い
✤   前回作ったChrome拡張機能を
    ベースにして以下テーマについ
    て理解する
    ✤   DOM生成にjQueryを利用す
        る
    ✤   OAuth認証




                           http://www.flickr.com/photos/alanant/4483533096/
Photo by Tech109
           (http://www.flickr.com/photos/craigsd/4687453830/)




前回作った拡張機能をブラッシュアップ
前回作ったChrome拡張機能ファイル一覧

manifest.json                                          main.js
{
                                                       var req = new XMLHttpRequest();
  "name": "My First Extension",
                                                       var url ='https://api.twitter.com/1/statuses/
  "version": "1.0",
                                                       public_timeline.json?count=3&include_entities=true';
  "description": "The first extension that I made.",
                                                       req.open("GET",url,true);
  "browser_action": {
                                                       req.onload = showTweets;
    "popup": "popup.html"
                                                       req.send(null);
  },
  "permissions": ["http://*/*", "https://*/*"]
                                                       function showTweets() {
}
                                                         var tweets = JSON.parse(req.responseText);
                                                         console.log(tweets);
popup.html                                               for(var i=0;tweets.length;i++){
                                                           var elem = document.createElement("p");
<style>                                                    var tweet =
body {                                                 document.createTextNode(tweets[i].text);
    min-width:357px;                                       elem.appendChild(tweet);
    overflow-x:hidden;                                     document.body.appendChild(elem);
}                                                        }
img {                                                  }
    margin:5px;
    border:2px solid black;
    vertical-align:middle;
    width:75px;
    height:75px;
}
</style>
<script src='main.js'></script>
main.jsの一部処理が煩雑

var req = new XMLHttpRequest();
var url ='https://api.twitter.com/1/statuses/public_timeline.json?
count=3&include_entities=true';
req.open("GET",url,true);
req.onload = showTweets;
req.send(null);

function showTweets() {
  var tweets = JSON.parse(req.responseText);
  console.log(tweets);

  for(var i=0;tweets.length;i++){


                                                           }
                                                               HTMLのPタグ作成し、
    var elem = document.createElement("p");
    var tweet = document.createTextNode(tweets[i].text);       タグ内にテキスト要素を
    elem.appendChild(tweet);                                   作成するだけの処理が
    document.body.appendChild(elem);                           ちょっと煩雑
  }
}



→ jQueryの活用するとスッキリと書ける
事前準備

✤   http://jquery.com/download/
    のサイトからファイルをダウン
    ロード


✤   ダウンロードしたjQueryのファ
                                  <style>
    イルを読み込むように                    body {
                                      min-width:357px;
    popup.htmlを編集                     overflow-x:hidden;
                                  }
                                  img {
                                      margin:5px;
                                      border:2px solid black;
                                      vertical-align:middle;
                                      width:75px;
                                      height:75px;
                                  }

        ※ この1行を追加
                                  </style>
                                  <script src='jquery-1.7.2.min.js'></script>
                                  <script src='main.js'></script>
修正後のmain.js

var req = new XMLHttpRequest();
var url ='https://api.twitter.com/1/statuses/public_timeline.json?
count=3&include_entities=true';
req.open("GET",url,true);
req.onload = showTweets;
req.send(null);

function showTweets() {
  var tweets = JSON.parse(req.responseText);
  console.log(tweets);

  for(var i=0;tweets.length;i++){
    $(document.body).append(
      $("<p>").text(tweets[i].text)
    );
  }
}
今回編集した箇所の解説

$(document.body).append(
  $("<p>").text(tweets[i].text)
);

jQueryを利用すると「$()」「append()」という関数が、ドット(.)で繋がって処理されます。(このような処理方
法はメソッドチェーンと言われてます)


•$(..):カッコ内のHTMLのBody要素が取得できます。上記のソースでは$(document.body)の箇所と、$(“<p>”)の
箇所が該当してます
•append(..):カッコ内の..のHTML要素が適用されます。
•text(..):カッコ内の..で指定された文字字が適用されます。
OAuth認証
          http://www.flickr.com/photos/tejedoro_de_luz/3177911908/
twitter連携するアプリ利用時によく見る画面
OAuthとは?

                                                            service
✤   あらかじめ信頼関係を構築したサービス間でユーザ
                                                           providers
    の同意のもとにセキュアにユーザの権限を受け渡し
    する「認可情報の委譲」のための仕様
✤   OAuthに対応したサービスでは,ユーザが外部サー
    ビスにパスワードを教えることなく,認可情報の委
    譲が可能です。また認可情報の適用範囲を指定した
    り,有効期限を設定することができるため,ユーザ
    が外部サービスにすべての権限を渡すこと無く,自
    分が利用したいサービスに最低限必要な権限のみを
    委譲することができます。
                                                  users
    ※http://gihyo.jp/dev/feature/01/oauth/0001よ
    り引用しました

                                                          consumers

                                                          ( Webサービ
                                                          スを利用する
                                                           開発者)
認証と認可の違い

✤   認証
                                                  認証                        認証サーバ
    ✤   英語ではAuthentication
    ✤   平たく言えば本人確認のこと
                                                     1.本人確認                      1.本人確認
✤   認可
    ✤   英語ではAuthorization
    ✤   何らかのサービス/リソースへのアクセスに                                            2.認証結果
        対してアクセスする権限を与えること

                                                 Aさん                                Bさん
                        Aさん:閲覧出来る
                        Bさん:閲覧出来ない                  3.閲覧許可                       3.閲覧不許可




                                                  認可             サービス/リソースなど

                  http://www.itmedia.co.jp/enterprise/articles/0804/22/news044.htmlのサイトをベースに作図
Photo by id-iom
             (http://www.flickr.com/photos/id-iom/6871086722/)




自分のTLを表示するChrome拡張を作成
事前準備①:twitterのアプリケーション登録
申請
✤   アプリケーション登録申請ページ
    (https://dev.twitter.com/apps/
    new)にアクセスします
✤   以下3項目を入力
    ✤ Name:
      twclientby+あなたのtwitter id
      例:twclientby+h5y1m141
    ✤ Description:
      twitter client for chrome
    ✤ WebSite:
      www.facebook.com/pasonatech
✤   利用規約のチェックボックスをonにし
    てCaptchaの文字入力してCreate
    your Twitter appicationをクリック
事前準備②: twitterのアプリケーション登
録申請
✤   アプリケーション登録申請が成功する
    と右記のような画面が表示されます
✤   Consumer keyとConsumer secretは
    後で利用する情報になります
    ✤ twitter側ではこの情報を信頼して
      認可情報の委譲をしているためとて
      も大切な情報になります
    ✤ 取得したConsumer keyと
      Consumer secretは大切に管理し
      ましょう
✤   ※今回はtwitterにログイン&タイムラ
    インを表示するだけの機能を実装する
    ためApplicationのPermissonはRead
    のままにしてます
事前準備③:OAuth認証で必須となるライブ
ラリとCSSの作成
✤   前回までは、スタイルシートの情報をHTML内に記述してましたが、それぞれのファ
    イルで行う処理を明確に分けたいので、style.cssを別途用意してHTMLから読み込む
    ようにしたいと思います
        body {
            width:400px;
            overflow-x:hidden;
        }
        img {
            float:left;

        }
        p {
            font-size:14px;
            vertical-align:top;
        }

✤   先ほどダウンロードしたjQueryに加えてOAuth.jsとSha1.jsというライブラリを以下
    よりダウンロードします
    ✤ http://oauth.googlecode.com/svn/code/javascript/oauth.js
    ✤ http://oauth.googlecode.com/svn/code/javascript/sha1.js
今回作る拡張機能で必要となるファイル一覧


            事前準備作業で   えたファイル群




            前回のものをベースに今回作る
            ファイル群


            (任意)今回はicon.pngを事前
            に準備したので欲しい場合には個
            別にコピーします
manifest.json

 {
  "name":"My Twitter TL",
  "version":"1.0",
  "description":"this is a twitter client",
  "browser_action":{
    "default_icon": "icon.png",
    "popup":"popup.html"
  },
  "permissions":["http://*/*"]
}
popup.html

<!DOCTYPE html>
<html>
<head>
<link type="text/css" rel="stylesheet" href="style.css">
<script src="jquery-1.7.2.min.js"></script>
<script src="oauth.js"></script>
<script src="sha1.js"></script>
<script src="main.js" ></script>
</head>
<body>
</body>
</html>
main.js

var api = 'http://api.twitter.com/1/statuses/     OAuth.setTimestampAndNonce( message ) ;
home_timeline.json' ;                             OAuth.SignatureMethod.sign( message, accessor ) ;
var OAUTH_CONSUMER_KEY    = 'XXX' ;               var target = OAuth.addToURL( message.action,
var OAUTH_CONSUMER_SECRET = 'XXX' ;             message.parameters ) ;
var OAUTH_ACCESS_TOKEN    = 'XXX' ;               var options = {
var OAUTH_ACCESS_SECRET   = 'XXX' ;                 type: message.method,
main();                                             url: target,
                                                    dataType: 'json',
function main() {                                   success: function(data) {
                                                      onText(data);
  var accessor = {                                  },
    consumerSecret: OAUTH_CONSUMER_SECRET,          error: function( a ) {
    tokenSecret: OAUTH_ACCESS_SECRET                  window.alert( a.responseText ) ;
  } ;                                               },
                                                    timeout: 1000 * 50
  var message = {                                 };
    method: "GET",                                $.ajax( options ) ;
    action: api,                                }
    parameters: {
      oauth_signature_method: "HMAC-SHA1",      function onText( data ) {
      oauth_consumer_key: OAUTH_CONSUMER_KEY,     for( var i = 0; i < data.length; i++ ) {
      oauth_token: OAUTH_ACCESS_TOKEN
    }                                               var path = data[i].user.profile_image_url;
  } ;                                               var userName = data[i].user.name;
                                                    var screenName = data[i].user.screen_name;
// 右に続く                                             var tweet = data[i].text ;
                                                    $(document.body).append($("<img>").attr("src", path));
                                                    $(document.body).append($("<br />"));
                                                    $(document.body).append($("<p>").text(tweet));
                                                  }
                                                }

More Related Content

What's hot

5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.com5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.comKenta Tsuji
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tipsyoshikawa_t
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210cmtomoda
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用Yatabe Terumasa
 
Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積
Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積
Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積Takeshi Mikami
 
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)Mariko Goda
 
OAuth 2.0 と ライブラリ
OAuth 2.0 と ライブラリOAuth 2.0 と ライブラリ
OAuth 2.0 と ライブラリKenji Otsuka
 
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするKiyoshi Sawada
 
Knocked out in knockout js
Knocked out in knockout jsKnocked out in knockout js
Knocked out in knockout jsHiroyuki Tashima
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + VuexKei Yagi
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!Shohei Okada
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch dbEiji Kuroda
 
WordPressと外部APIとの連携
WordPressと外部APIとの連携WordPressと外部APIとの連携
WordPressと外部APIとの連携Hidekazu Ishikawa
 
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Yuki Higuchi
 

What's hot (20)

20061125
2006112520061125
20061125
 
5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.com5分でわかったつもりになるParse.com
5分でわかったつもりになるParse.com
 
後期02
後期02後期02
後期02
 
jQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & TipsjQuery Mobile 最新情報 & Tips
jQuery Mobile 最新情報 & Tips
 
Jqm20120210
Jqm20120210Jqm20120210
Jqm20120210
 
ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用ソーシャルアプリ勉強会(第一回資料)配布用
ソーシャルアプリ勉強会(第一回資料)配布用
 
Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積
Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積
Rails3+devise,nginx,fluent,S3構成でのアクセスログ収集と蓄積
 
Web Component概要
Web Component概要Web Component概要
Web Component概要
 
リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)リアルFacebookガジェットを作った(ロングバージョン)
リアルFacebookガジェットを作った(ロングバージョン)
 
OAuth 2.0 と ライブラリ
OAuth 2.0 と ライブラリOAuth 2.0 と ライブラリ
OAuth 2.0 と ライブラリ
 
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/WebサービスにアクセスするEWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
EWD 3トレーニングコース#33 ewd-xpressアプリケーションからREST/Webサービスにアクセスする
 
HTML5 on ASP.NET
HTML5 on ASP.NETHTML5 on ASP.NET
HTML5 on ASP.NET
 
Knocked out in knockout js
Knocked out in knockout jsKnocked out in knockout js
Knocked out in knockout js
 
Vue Router + Vuex
Vue Router + VuexVue Router + Vuex
Vue Router + Vuex
 
PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!PHP 2大 web フレームワークの徹底比較!
PHP 2大 web フレームワークの徹底比較!
 
はじめてのCouch db
はじめてのCouch dbはじめてのCouch db
はじめてのCouch db
 
WordPressと外部APIとの連携
WordPressと外部APIとの連携WordPressと外部APIとの連携
WordPressと外部APIとの連携
 
Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.Android Lecture #04 @PRO&BSC Inc.
Android Lecture #04 @PRO&BSC Inc.
 
20111203
2011120320111203
20111203
 
Pjax1
Pjax1Pjax1
Pjax1
 

Similar to Twitter連携chrome extension作り方

初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -Yuji Takayama
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣Yuji Takayama
 
初めての Data api
初めての Data api初めての Data api
初めての Data apiYuji Takayama
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Yuji Takayama
 
勉強会force#2 HTML5によるモバイルアプリ開発
勉強会force#2 HTML5によるモバイルアプリ開発勉強会force#2 HTML5によるモバイルアプリ開発
勉強会force#2 HTML5によるモバイルアプリ開発Kazuki Nakajima
 
Google App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなことGoogle App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなことa-know
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSAyumi Goto
 
html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた
html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた
html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた Shumpei Shiraishi
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライMasanobu Sato
 
Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hacki7a
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発Akira Inoue
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようずOda Shinsuke
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-EdoYuji Takayama
 
学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)Itsuki Kuroda
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittrkenjis
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~Microsoft Azure Japan
 

Similar to Twitter連携chrome extension作り方 (20)

初めての Data API CMS どうでしょう - 仙台編 -
初めての Data API   CMS どうでしょう - 仙台編 -初めての Data API   CMS どうでしょう - 仙台編 -
初めての Data API CMS どうでしょう - 仙台編 -
 
初めての Data api cms どうでしょう - 大阪夏の陣
初めての Data api   cms どうでしょう - 大阪夏の陣初めての Data api   cms どうでしょう - 大阪夏の陣
初めての Data api cms どうでしょう - 大阪夏の陣
 
初めての Data api
初めての Data api初めての Data api
初めての Data api
 
Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界Data apiで実現 進化するwebの世界
Data apiで実現 進化するwebの世界
 
勉強会force#2 HTML5によるモバイルアプリ開発
勉強会force#2 HTML5によるモバイルアプリ開発勉強会force#2 HTML5によるモバイルアプリ開発
勉強会force#2 HTML5によるモバイルアプリ開発
 
Google App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなことGoogle App Engineでできる、あんなこと/こんなこと
Google App Engineでできる、あんなこと/こんなこと
 
Visualforce + jQuery
Visualforce + jQueryVisualforce + jQuery
Visualforce + jQuery
 
エンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJSエンタープライズ分野での実践AngularJS
エンタープライズ分野での実践AngularJS
 
html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた
html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた
html5j.orgがHTML5+JavaScriptで Metro Style アプリを作ってみた
 
Azure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライAzure で Serverless 初心者向けタッチ&トライ
Azure で Serverless 初心者向けタッチ&トライ
 
Rails and twitter #twtr_hack
Rails and twitter #twtr_hackRails and twitter #twtr_hack
Rails and twitter #twtr_hack
 
jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発jQuery と MVC で実践する標準志向 Web 開発
jQuery と MVC で実践する標準志向 Web 開発
 
Selenium webdriver使ってみようず
Selenium webdriver使ってみようずSelenium webdriver使ってみようず
Selenium webdriver使ってみようず
 
Data api workshop at Co-Edo
Data api workshop at Co-EdoData api workshop at Co-Edo
Data api workshop at Co-Edo
 
学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)学生向けAndroid勉強会(入門編)
学生向けAndroid勉強会(入門編)
 
CodeIgniterによるPhwittr
CodeIgniterによるPhwittrCodeIgniterによるPhwittr
CodeIgniterによるPhwittr
 
Chatterを使ったカスタムソーシャル
Chatterを使ったカスタムソーシャルChatterを使ったカスタムソーシャル
Chatterを使ったカスタムソーシャル
 
20120118 titanium
20120118 titanium20120118 titanium
20120118 titanium
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
進化する Web ~ Progressive Web Apps の実装と応用 ~
進化する Web  ~ Progressive Web Apps の実装と応用 ~進化する Web  ~ Progressive Web Apps の実装と応用 ~
進化する Web ~ Progressive Web Apps の実装と応用 ~
 

More from Hiroshi Oyamada

2016 02-25-crawler-study-01
2016 02-25-crawler-study-012016 02-25-crawler-study-01
2016 02-25-crawler-study-01Hiroshi Oyamada
 
育児を支える技術〜クローラーとかスクレイピング
育児を支える技術〜クローラーとかスクレイピング育児を支える技術〜クローラーとかスクレイピング
育児を支える技術〜クローラーとかスクレイピングHiroshi Oyamada
 
日々の面倒をプログラミングで解決!【入門編】
日々の面倒をプログラミングで解決!【入門編】日々の面倒をプログラミングで解決!【入門編】
日々の面倒をプログラミングで解決!【入門編】Hiroshi Oyamada
 
2014 05-17-titanium hamamatsuvol3
2014 05-17-titanium hamamatsuvol32014 05-17-titanium hamamatsuvol3
2014 05-17-titanium hamamatsuvol3Hiroshi Oyamada
 
20140319 titanium meetupvol17
20140319 titanium meetupvol1720140319 titanium meetupvol17
20140319 titanium meetupvol17Hiroshi Oyamada
 
2014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol162014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol16Hiroshi Oyamada
 
20130910 titanium meetupvol11
20130910 titanium meetupvol1120130910 titanium meetupvol11
20130910 titanium meetupvol11Hiroshi Oyamada
 
勉強会主催者のための勉強会
勉強会主催者のための勉強会勉強会主催者のための勉強会
勉強会主催者のための勉強会Hiroshi Oyamada
 
20130613 titanium meetupvol9
20130613 titanium meetupvol920130613 titanium meetupvol9
20130613 titanium meetupvol9Hiroshi Oyamada
 
2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt2013 06-11-craft beerfanlt
2013 06-11-craft beerfanltHiroshi Oyamada
 
2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedoHiroshi Oyamada
 
20130412 titanium meetupvol7
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7Hiroshi Oyamada
 
2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titaniumHiroshi Oyamada
 
20130126 titanium新年会
20130126 titanium新年会20130126 titanium新年会
20130126 titanium新年会Hiroshi Oyamada
 
20130125 titanium meetupvol5
20130125 titanium meetupvol520130125 titanium meetupvol5
20130125 titanium meetupvol5Hiroshi Oyamada
 
2012 12-17-titanium meetupvol4
2012 12-17-titanium meetupvol42012 12-17-titanium meetupvol4
2012 12-17-titanium meetupvol4Hiroshi Oyamada
 

More from Hiroshi Oyamada (20)

2016 02-25-crawler-study-01
2016 02-25-crawler-study-012016 02-25-crawler-study-01
2016 02-25-crawler-study-01
 
2016 02-09-co-edo lt
2016 02-09-co-edo lt2016 02-09-co-edo lt
2016 02-09-co-edo lt
 
2015 12-19-ruby rails
2015 12-19-ruby rails2015 12-19-ruby rails
2015 12-19-ruby rails
 
2015 07-04-ruby rails
2015 07-04-ruby rails2015 07-04-ruby rails
2015 07-04-ruby rails
 
育児を支える技術〜クローラーとかスクレイピング
育児を支える技術〜クローラーとかスクレイピング育児を支える技術〜クローラーとかスクレイピング
育児を支える技術〜クローラーとかスクレイピング
 
日々の面倒をプログラミングで解決!【入門編】
日々の面倒をプログラミングで解決!【入門編】日々の面倒をプログラミングで解決!【入門編】
日々の面倒をプログラミングで解決!【入門編】
 
2014 05-17-titanium hamamatsuvol3
2014 05-17-titanium hamamatsuvol32014 05-17-titanium hamamatsuvol3
2014 05-17-titanium hamamatsuvol3
 
20140319 titanium meetupvol17
20140319 titanium meetupvol1720140319 titanium meetupvol17
20140319 titanium meetupvol17
 
2014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol162014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol16
 
TitaniumMeetUpVol13
TitaniumMeetUpVol13TitaniumMeetUpVol13
TitaniumMeetUpVol13
 
20130910 titanium meetupvol11
20130910 titanium meetupvol1120130910 titanium meetupvol11
20130910 titanium meetupvol11
 
勉強会主催者のための勉強会
勉強会主催者のための勉強会勉強会主催者のための勉強会
勉強会主催者のための勉強会
 
20130613 titanium meetupvol9
20130613 titanium meetupvol920130613 titanium meetupvol9
20130613 titanium meetupvol9
 
2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt
 
2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo
 
20130412 titanium meetupvol7
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7
 
2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium
 
20130126 titanium新年会
20130126 titanium新年会20130126 titanium新年会
20130126 titanium新年会
 
20130125 titanium meetupvol5
20130125 titanium meetupvol520130125 titanium meetupvol5
20130125 titanium meetupvol5
 
2012 12-17-titanium meetupvol4
2012 12-17-titanium meetupvol42012 12-17-titanium meetupvol4
2012 12-17-titanium meetupvol4
 

Twitter連携chrome extension作り方

  • 1. 今回の狙い ✤ 前回作ったChrome拡張機能を ベースにして以下テーマについ て理解する ✤ DOM生成にjQueryを利用す る ✤ OAuth認証 http://www.flickr.com/photos/alanant/4483533096/
  • 2. Photo by Tech109 (http://www.flickr.com/photos/craigsd/4687453830/) 前回作った拡張機能をブラッシュアップ
  • 3. 前回作ったChrome拡張機能ファイル一覧 manifest.json main.js { var req = new XMLHttpRequest();   "name": "My First Extension", var url ='https://api.twitter.com/1/statuses/   "version": "1.0", public_timeline.json?count=3&include_entities=true';   "description": "The first extension that I made.", req.open("GET",url,true);   "browser_action": { req.onload = showTweets;     "popup": "popup.html" req.send(null);   },   "permissions": ["http://*/*", "https://*/*"] function showTweets() { }   var tweets = JSON.parse(req.responseText);   console.log(tweets); popup.html   for(var i=0;tweets.length;i++){     var elem = document.createElement("p"); <style>     var tweet = body { document.createTextNode(tweets[i].text);     min-width:357px;     elem.appendChild(tweet);     overflow-x:hidden;     document.body.appendChild(elem); }   } img { }     margin:5px;     border:2px solid black;     vertical-align:middle;     width:75px;     height:75px; } </style> <script src='main.js'></script>
  • 4. main.jsの一部処理が煩雑 var req = new XMLHttpRequest(); var url ='https://api.twitter.com/1/statuses/public_timeline.json? count=3&include_entities=true'; req.open("GET",url,true); req.onload = showTweets; req.send(null); function showTweets() {   var tweets = JSON.parse(req.responseText);   console.log(tweets);   for(var i=0;tweets.length;i++){ } HTMLのPタグ作成し、     var elem = document.createElement("p");     var tweet = document.createTextNode(tweets[i].text); タグ内にテキスト要素を     elem.appendChild(tweet); 作成するだけの処理が     document.body.appendChild(elem); ちょっと煩雑   } } → jQueryの活用するとスッキリと書ける
  • 5. 事前準備 ✤ http://jquery.com/download/ のサイトからファイルをダウン ロード ✤ ダウンロードしたjQueryのファ <style> イルを読み込むように body {     min-width:357px; popup.htmlを編集     overflow-x:hidden; } img {     margin:5px;     border:2px solid black;     vertical-align:middle;     width:75px;     height:75px; } ※ この1行を追加 </style> <script src='jquery-1.7.2.min.js'></script> <script src='main.js'></script>
  • 6. 修正後のmain.js var req = new XMLHttpRequest(); var url ='https://api.twitter.com/1/statuses/public_timeline.json? count=3&include_entities=true'; req.open("GET",url,true); req.onload = showTweets; req.send(null); function showTweets() {   var tweets = JSON.parse(req.responseText);   console.log(tweets);   for(var i=0;tweets.length;i++){     $(document.body).append(       $("<p>").text(tweets[i].text)     );   } }
  • 8. OAuth認証 http://www.flickr.com/photos/tejedoro_de_luz/3177911908/
  • 10. OAuthとは? service ✤ あらかじめ信頼関係を構築したサービス間でユーザ providers の同意のもとにセキュアにユーザの権限を受け渡し する「認可情報の委譲」のための仕様 ✤ OAuthに対応したサービスでは,ユーザが外部サー ビスにパスワードを教えることなく,認可情報の委 譲が可能です。また認可情報の適用範囲を指定した り,有効期限を設定することができるため,ユーザ が外部サービスにすべての権限を渡すこと無く,自 分が利用したいサービスに最低限必要な権限のみを 委譲することができます。 users ※http://gihyo.jp/dev/feature/01/oauth/0001よ り引用しました consumers ( Webサービ スを利用する 開発者)
  • 11. 認証と認可の違い ✤ 認証 認証 認証サーバ ✤ 英語ではAuthentication ✤ 平たく言えば本人確認のこと 1.本人確認 1.本人確認 ✤ 認可 ✤ 英語ではAuthorization ✤ 何らかのサービス/リソースへのアクセスに 2.認証結果 対してアクセスする権限を与えること Aさん Bさん Aさん:閲覧出来る Bさん:閲覧出来ない 3.閲覧許可 3.閲覧不許可 認可 サービス/リソースなど http://www.itmedia.co.jp/enterprise/articles/0804/22/news044.htmlのサイトをベースに作図
  • 12. Photo by id-iom (http://www.flickr.com/photos/id-iom/6871086722/) 自分のTLを表示するChrome拡張を作成
  • 13. 事前準備①:twitterのアプリケーション登録 申請 ✤ アプリケーション登録申請ページ (https://dev.twitter.com/apps/ new)にアクセスします ✤ 以下3項目を入力 ✤ Name: twclientby+あなたのtwitter id 例:twclientby+h5y1m141 ✤ Description: twitter client for chrome ✤ WebSite: www.facebook.com/pasonatech ✤ 利用規約のチェックボックスをonにし てCaptchaの文字入力してCreate your Twitter appicationをクリック
  • 14. 事前準備②: twitterのアプリケーション登 録申請 ✤ アプリケーション登録申請が成功する と右記のような画面が表示されます ✤ Consumer keyとConsumer secretは 後で利用する情報になります ✤ twitter側ではこの情報を信頼して 認可情報の委譲をしているためとて も大切な情報になります ✤ 取得したConsumer keyと Consumer secretは大切に管理し ましょう ✤ ※今回はtwitterにログイン&タイムラ インを表示するだけの機能を実装する ためApplicationのPermissonはRead のままにしてます
  • 15. 事前準備③:OAuth認証で必須となるライブ ラリとCSSの作成 ✤ 前回までは、スタイルシートの情報をHTML内に記述してましたが、それぞれのファ イルで行う処理を明確に分けたいので、style.cssを別途用意してHTMLから読み込む ようにしたいと思います body {     width:400px;     overflow-x:hidden; } img {     float:left; } p {     font-size:14px;     vertical-align:top; } ✤ 先ほどダウンロードしたjQueryに加えてOAuth.jsとSha1.jsというライブラリを以下 よりダウンロードします ✤ http://oauth.googlecode.com/svn/code/javascript/oauth.js ✤ http://oauth.googlecode.com/svn/code/javascript/sha1.js
  • 16. 今回作る拡張機能で必要となるファイル一覧 事前準備作業で えたファイル群 前回のものをベースに今回作る ファイル群 (任意)今回はicon.pngを事前 に準備したので欲しい場合には個 別にコピーします
  • 17. manifest.json  {   "name":"My Twitter TL",   "version":"1.0",   "description":"this is a twitter client",   "browser_action":{     "default_icon": "icon.png",     "popup":"popup.html"   },   "permissions":["http://*/*"] }
  • 18. popup.html <!DOCTYPE html> <html> <head> <link type="text/css" rel="stylesheet" href="style.css"> <script src="jquery-1.7.2.min.js"></script> <script src="oauth.js"></script> <script src="sha1.js"></script> <script src="main.js" ></script> </head> <body> </body> </html>
  • 19. main.js var api = 'http://api.twitter.com/1/statuses/   OAuth.setTimestampAndNonce( message ) ; home_timeline.json' ;   OAuth.SignatureMethod.sign( message, accessor ) ; var OAUTH_CONSUMER_KEY = 'XXX' ;   var target = OAuth.addToURL( message.action, var OAUTH_CONSUMER_SECRET = 'XXX' ; message.parameters ) ; var OAUTH_ACCESS_TOKEN = 'XXX' ;   var options = { var OAUTH_ACCESS_SECRET = 'XXX' ;     type: message.method, main();     url: target,     dataType: 'json', function main() {     success: function(data) {       onText(data);   var accessor = {     },     consumerSecret: OAUTH_CONSUMER_SECRET,     error: function( a ) {     tokenSecret: OAUTH_ACCESS_SECRET       window.alert( a.responseText ) ;   } ;     },     timeout: 1000 * 50   var message = {   };     method: "GET",   $.ajax( options ) ;     action: api, }     parameters: {       oauth_signature_method: "HMAC-SHA1", function onText( data ) {       oauth_consumer_key: OAUTH_CONSUMER_KEY,   for( var i = 0; i < data.length; i++ ) {       oauth_token: OAUTH_ACCESS_TOKEN     }     var path = data[i].user.profile_image_url;   } ;     var userName = data[i].user.name;     var screenName = data[i].user.screen_name; // 右に続く     var tweet = data[i].text ;     $(document.body).append($("<img>").attr("src", path));     $(document.body).append($("<br />"));     $(document.body).append($("<p>").text(tweet));   } }