ubiquityで、twitter機能を網羅させるぞ1
EeePC s101を買ったので、ubiquityでいろいろしたくて、twitter apiを使って、作ってみました。
以下のページ等を参考にしました。
■参考ページ
https://wiki.mozilla.org/Labs/Ubiquity/Ubiquity_0.1_Author_Tutorial
Labs/Ubiquity/Ubiquity 0.1 Author Tutorial
http://apiwiki.twitter.com/
Twitter Api Wiki
http://www.itmedia.co.jp/enterprise/articles/0808/31/news003_2.html
ブラウザの新境地? Ubiquityが変える衝撃のブラウザ体験 (2/2)
■ubiquityのインストール
http://labs.mozilla.com/2008/08/introducing-ubiquity/
Get Involvedの下にある"Download Ubiquity 0.1"をクリックする。
■twitter-pochiの登録
http://elazyrest.net/twitter-pochi/
http://elazyrest.net/ubiquity/twitter.html
http://gist.github.com/32967
画面を開くと上部にsubscribeボタンが表示されるので、クリックする。
■使い方
1.firefox起動中に"Ctrl+Space"で、コンソールが起動
2."twitter-pochi"と入力する
3.デフォルトでは、フレンドタイムラインが表示される。
4.twitterからベーシック認証が要求されるので、twitterid, passwordを入力する必要がある。
5.twitter-pochitにつづいて、以下のコマンドを入力する。
・list
フレンドタイムラインの取得
・@@
フレンドタイムラインの取得
・@ユーザ名
@指定したユーザのタイムラインの取得
・fav
お気に入り一覧の取得
・reply
自分宛のつぶやき一覧の取得
・following
自分がフォローしているユーザ一覧の取得
・follower
自分がフォローされているユーザ一覧の取得
・search 文字列
twitter検索
■ソース
ubiquityで、"command-editor"コマンドを利用して、テストを行う。
サンプルソースが表示されているので、わかりやすい。
previewで、プレビュー画面に表示する内容を実装する。
executeで、Enter押下時の処理を実装する。
特徴的には、jqueryが使えることと、CmdUtilsで、テンプレートを利用できることでしょうか。
CmdUtils.CreateCommand({ icon: "http://twitter.com/favicon.ico", name: "twitter-pochi", homepage: "http://elazyrest.net/twitter-pochi/", author: {name: "kazkicks"}, license: "GPL", description: "twitter", takes: {"'update','list','@@','@','fav','reply','following','follower','search', 'browse', 'source', 'rank'": noun_arb_text}, preview: function(pblock, directObject){ var status = directObject.text; var page = 1; var disp_num = 7; if(status.length < 1 || status == "list") { jQuery.get("http://twitter.com/statuses/friends_timeline.json", {count:disp_num, page:page}, parse_timeline, "json"); return; } else if (status == "@@") { jQuery.get("http://twitter.com/statuses/user_timeline.json", {count:disp_num, page:page}, parse_timeline, "json"); return; } else if (status.match(/^@(.+)/)) { var id = RegExp.$1; jQuery.get("http://twitter.com/statuses/user_timeline.json", {count:disp_num, page:page,id:id}, parse_timeline, "json"); return; } else if (status == "fav") { jQuery.get("http://twitter.com/favorites.json", {page:page}, parse_timeline, "json"); return; } else if (status == "reply") { jQuery.get("http://twitter.com/replies.json", {page:page}, parse_timeline, "json"); return; } else if (status == "follower") { jQuery.get("http://twitter.com/statuses/followers.json", {page:page}, parse_users, "json"); return; } else if (status == "following") { jQuery.get("http://twitter.com/statuses/friends.json", {page:page}, parse_users, "json"); return; } else if (status.match(/^search\b(.+)/)) { var query = RegExp.$1; jQuery.get("http://search.twitter.com/search.json", {rpp:disp_num, page:page, q:query}, parse_result, "json"); } function parse_timeline(data) { var prevTemplate = '<div style="font-size:11px">{for status in statuses}<div><table><tr><td><img src="${status.user.profile_image_url}" style="width:30px;height:30px"/></td><td><span style="color:#FFFF33"><a href="http://twitter.com/${status.user.screen_name}">${status.user.screen_name}</a></span><br/>${status.text}</td></tr></table></div>{/for}</div>'; pblock.innerHTML = CmdUtils.renderTemplate(prevTemplate, {statuses:data.splice(0, disp_num)}); } function parse_users(data) { var prevTemplate = '<div style="font-size:11px">{for user in users}<div><table><tr><td><img src="${user.profile_image_url}" style="width:30px;height:30px"/></td><td><span style="color:#FFFF33"><a href="http://twitter.com/${user.screen_name}">${user.screen_name}(${user.name})</a></span><br/>${user.description}</td></tr></table></div>{/for}</div>'; pblock.innerHTML = CmdUtils.renderTemplate(prevTemplate, {users:data.splice(0, disp_num)}); } function parse_result(data) { var prevTemplate = '<div style="font-size:11px">{for result in results}<div><table><tr><td><img src="${result.profile_image_url}" style="width:30px;height:30px"/></td><td><span style="color:#FFFF33"><a href="http://twitter.com/${result.from_user}">${result.from_user}</a></span><br/>${result.text}</td></tr></table></div>{/for}</div>'; pblock.innerHTML = CmdUtils.renderTemplate(prevTemplate, data); } }, execute: function(){ } });
次回以降の予定(未定)
・改ページ(ページ指定 or 前へ、次へ)
・投稿
・今見ているページの投稿
・APIが安定していれば、最新400件中で、投稿数の多い順に並べる
・APIが安定していれば、最新400件中で、人気クライアントの抽出
etc