Creazy!

WEBエンジニア・ヤガーのテック・ガジェットブログ

JavaScript WebService 小技集

第5回:twitter の JavaScript Badge を改造する

投稿日:


しつこく twitter ネタでまいります。
前回の記事で JavaScript の Badge がちゃんと動くようになりました。これで CSS を使えば自由にレイアウトできるようにはなったんだけど、もうちょっと詳しくコードを分析する事でより柔軟なカスタマイズができるようになりたいところ。
ってか、自分で使うにはもう一つなので本気で自分が作るようのカスタマイズをしてみます。

1)まずは、標準の JavaScript Badge +日付バグの修正の内容をおさらい

Badge は twitter にログインしたあと、上メニューの Badge にあります。
http://twitter.com/account/badge
それを改造したのが前回の記事です。

<script type="text/javascript">
function relative_time(time_value) {
time_values = time_value.split(" ");
time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3];
var parsed_date = Date.parse(time_value);
var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
delta = delta + (relative_to.getTimezoneOffset()*60);
if(delta < 60) {
return 'less than a minute ago';
} else if(delta < 120) {
return 'about a minute ago';
} else if(delta < (45*60)) {
return (parseInt(delta / 60)).toString() + ' minutes ago';
} else if(delta < (90*60)) {
return 'about an hour ago';
} else if(delta < (24*60*60)) {
return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
} else if(delta < (48*60*60)) {
return '1 day ago';
} else {
return (parseInt(delta / 86400)).toString() + ' days ago';
}
}
function twitterCallback(obj) {
var id = obj[0].user.id;
document.getElementById('my_twitter_status').innerHTML = obj[0].text;
document.getElementById('my_twitter_status_time').innerHTML = relative_time(obj[0].created_at);
}
</script>
<span id="my_twitter_status"></span> <span id="my_twitter_status_time"></span>
<script type="text/javascript" src="http://www.twitter.com/statuses/user_timeline/{YourID}.json?callback=twitterCallback&count=1"></script>

色の付いているところが前回のカスタマイズ分です。
それ以外はデフォルトなので詳しく分析してみましょう。
・relative_time(time_value)関数
 引数で渡された発言日時をもとに表示用文字列を生成しています。
・twitterCallback(obj)関数
 script タグで JSON 呼び出しをした後のコールバック関数です。
 引数 obj には JSON 形式で発言データがセットされます。
 渡された発言データを getElementById で指定した HTML オブジェクトに流し込んでいます。
・<span id=”my_twitter_status”></span> <span id=”my_twitter_status_time”></span>
 twitterCallback 関数で取得した発言データを表示するための HTML オブジェクトです。
・<script type=”text/javascript” src=”http://www.twitter.com/statuses/user_timeline/4296581.json?callback=twitterCallback&count=1″></script>
 scriptタグにより JSONP を呼び出しています。
 呼び出しのURLの詳細は下記の通り(あくまで動作結果からの推測です)
 ◇4296581.json:4296581はyagerのIDなのでそれぞれ自分のIDに読み替えて下さい。
 ◇callback=twitterCallback:コールバックする関数を指定しています。(って事は別の関数も指定できるの?)まあ、そのままで。
 ◇count=1:JSONが返す発言データの数です。意外と知られていませんが1以上を指定するとちゃんと複数件返ってきます。

2)複数の発言を表示したい

「What are you doing?」と聞かれているので今現在のステータスを1件表示できれば良いっちゃ良いんだけど、何件か表示して発言の流れも追えたらな…と思ったのでやってみます。
まず、1)で分析した通り、JSONP の呼び出しパラメータである count によって、callback 関数に返す発言データの数を変更できます。例として5件の発言データを取得しましょう。

<script type="text/javascript" src="http://www.twitter.com/statuses/user_timeline/4296581.json?callback=twitterCallback&count=5"></script>

これで twitterCallback には obj.length=5 の配列になっているJSONオブジェクトがセットされます。
で、デフォルトでは下記のように1件だけを取得するようになっているのですが、

function twitterCallback(obj) {
var id = obj[0].user.id;
document.getElementById('my_twitter_status').innerHTML = obj[0].text;
document.getElementById('my_twitter_status_time').innerHTML = relative_time(obj[0].created_at);
}

これをちゃんと件数分表示するために配列をループで回して展開します。
下の例ではリスト形式に並べる感じにしています。

function twitterCallback(obj) {
var t = document.getElementById('twitter');
t.innerHTML += '<ul>';
for ( i=0; i<obj.length; i++) {
t.innerHTML += '<li>'+obj[i].text+' : '+relative_time(obj[i].created_at)+'</li>';
}
t.innerHTML += '</ul>';
}
・・・
<div id="twitter"></div>

表示するとこんな感じになります。

・なんじゃらほい : less than minutes ago
・どんな感じに表示されるの? : about 3 minutes ago
・えっ? : about 5 minutes ago
・出社しましたー : about 3 hours ago
・帰宅 : about 12 hours ago

3)外部 JS ファイルにまとめよう

ごちゃごちゃ長いので JS ファイルにまとめちゃいましょう。
・twitter.js

function relative_time(time_value) {
time_values = time_value.split(" ");
time_value = time_values[1]+" "+time_values[2]+", "+time_values[5]+" "+time_values[3];
var parsed_date = Date.parse(time_value);
var relative_to = (arguments.length > 1) ? arguments[1] : new Date();
var delta = parseInt((relative_to.getTime() - parsed_date) / 1000);
delta = delta + (relative_to.getTimezoneOffset()*60);
if(delta < 60) {
return 'less than a minute ago';
} else if(delta < 120) {
return 'about a minute ago';
} else if(delta < (45*60)) {
return (parseInt(delta / 60)).toString() + ' minutes ago';
} else if(delta < (90*60)) {
return 'about an hour ago';
} else if(delta < (24*60*60)) {
return 'about ' + (parseInt(delta / 3600)).toString() + ' hours ago';
} else if(delta < (48*60*60)) {
return '1 day ago';
} else {
return (parseInt(delta / 86400)).toString() + ' days ago';
}
}
function twitterCallback(obj) {
var t = document.getElementById('twitter');
for ( i=0; i<obj.length; i++) {
t_top = document.createElement("img");
t_top.setAttribute("src","/img/twitter_balloon_top.gif");
t_top.setAttribute("class","twitter_top");
t.appendChild(t_top);
t_mdl = document.createElement("div");
t_mdl.setAttribute("class","twitter_middle");
t_text = document.createElement("span");
t_text.setAttribute("class","twitter_text");
t_text.innerHTML = obj[i].text;
t_mdl.appendChild(t_text);
t_time = document.createElement("span");
t_time.setAttribute("class","twitter_time");
t_time.innerHTML = relative_time(obj[i].created_at);
t_mdl.appendChild(t_time);
t.appendChild(t_mdl);
t_btm = document.createElement("img");
t_btm.setAttribute("src","/img/twitter_balloon_bottom.gif");
t_btm.setAttribute("class","twitter_bottom");
t.appendChild(t_btm);
}
}
document.write(
'<scr'+'ipt '
+'type="text/javascript" '
+'src="http://www.twitter.com/statuses/user_timeline/4296581.json?callback=twitterCallback&count=5">'
+'</scr'+'ipt>'
);

この場合の twitterCallback 関数はこのサイトのレイアウト用に DOM 関数を使って IMG とか読み込んでますがその辺は各位頑張って理解して下さい(だんだん乱暴になってきた)。
で、あとはこんな感じで呼び出せばOK。

<div id="twitter"></div>
<script type="text/javascript" src="/js/twitter.js"></script>

4)twitter のサーバが重い時のための対処

twitter 流行り過ぎかしらんけど結構レスポンス遅い時があるけど、 JSONP が返ってこなくて画面が固まっちゃう事があるので script タグは body の一番最後に置いとくと影響が少ない。

<div id="twitter"></div>
・・・色々HTML・・・
<script type="text/javascript" src="/js/twitter.js"></script>
</body>
</html>

やっと完成です。ご苦労様でした。

関連エントリー

 ・第6回:TinyURL の遷移先が怖くて開けない場合の対処法
 ・第4回:twitter の JavaScript Badge をIEで表示するとおかしい件に対応してみる ::: creazy photograph

参考

 ・Going My Way: Twitter の Status を自分のブログに貼り付け可能な Javascript Badge
 ・Going My Way: Twitter のステータスを自分のブログの 2 ヶ所に貼り付ける際に気をつけること
 ・Twitter Badge を貼ってみる — Baldanders.info
 ・subtech – otsune's SnakeOil – Simple twitter status JavaScript

-JavaScript, WebService, 小技集

執筆者:


  1. Twitter Badges の貼り方変更

    「Twitterはじめてみました。」でブログに貼り付けた Twitter Badges。
    ブログのヘッダー部分に貼り付けていると、Twitterが重…

  2. 第4回:twitter の JavaScript Badge をIEで表示するとおかしい件に対応してみる

    twitter 流行ってますね。みなさんも使っていますか? オレはというと…ポツ…

  3. 第6回:TinyURL の遷移先が怖くて開けない場合の対処法

    twitter や、mixi でよく使われている、 TinyURL というWEB…

  4. Topics より:

    Friend’s Timelineブログパーツ配布開始ー

    一文字さんに『ユー、配布しちゃいなよ!』と言われたので、各種素材を自作のものに切り替えて配布することにしますた(^_^;)
    Download
    Twit…

  5. ペスの禁煙Twitter

    どうも、マジスカバンドのトランペットのペスです。
    禁煙に向けて頑張っています。
    というわけで、
    ペスの禁煙Twitterをはじめました。
    http://t

comment

メールアドレスが公開されることはありません。

関連記事

FlickrExがWordPressのLazy Load Pluginに対応しました!

先月このブログにも導入し、Lazy Loadとの共存のための修正などで協力させていただいたFlickrExですが、どうもWordPressでうまくいかないという声が聞こえてきていたので、なんとなくやり …

Social Bookmark Graph : ソーシャル・ブックマーク・グラフを作りました

見える化シリーズ第2弾。ん?2弾だっけ? SBMのRSSをマッシュアップして見える化してみました。 日毎/時間毎の被ブックマーク数を集計して棒グラフで表示してくれます。 ・Social Bookmar …

どれだけMacを開いていたかが丸わかり!?Macでスリープ・解除の履歴を確認するコマンド

どもども、お疲れ気味のヤガー@yagerです。 忙殺されていると、なかなか自分がどのくらい働いているかも分からなくなってくる場合がありますが、月末月初は勤怠報告などで自分の稼働時間を泣きながらまとめて …

TwitGIFでブログパーツを作った人が200人を超えました!

TwitGIFを公開して2日ほどですが、すでに多くの方にご利用頂いているようです。先ほど確認してみるとTwitterアカウント数にして200人を超えていました!アザース! で、トップページにカウンター …

MyMiniCityをもっと楽しむためのAPI色々

Twitterを中心にMyMiniCityがすごい人気ですね。 オレも作ってみました。 ・http://yager.myminicity.com/ アクセスが増えると街が発展するというゲームなのでクリ …

スポンサードリンク

スポンサードリンク