Firebugクックブック #2

前回に引き続き、自分がよくあるブラウザ上での単純作業をFirebugコンソールで片付けている方法の紹介です。前回はブラウザに表示されているデータをこっち側に持ってくる作業をどうやっやるかでした。今回はブラウザの向こう側のデータをFirebugで操作するにはどうするかです。

ボタンをクリックさせる

ウェブのサービスを使っていて、今までに投稿したものを全部消したくなったり(でもアカウントは消したくないとか)することがあります。管理画面で投稿を消すことはできるけど、いちいちクリックしていかないといけなくて面倒.... という時にはFirebugでフェイクのクリックイベントを作って送れば、自動でクリックさせることができます。 Twitterのfavoritesを全部外したい、というのを例としてあげます。TwitterのfavoritesはAPIがあるのでAPIを使う手もありますが、サービスによってはAPIが使えないこともよくありますよね。まずFirebugでHTMLを調べると
こういう構造になっています。favoriteを外すためのリンクを持っているaタグは div.status_actions a というCSSセレクタで表すことができるので
$$('div.status_actions a').map ( function (a, i) {
    setTimeout( function () {
      var e = document.createEvent('MouseEvent');
      e.initMouseEvent("click", 1,1, null,null,0,0,0,0,0,0,0,0,0,null);
      a.dispatchEvent(e)
    }, i * 1000);
} );
document.createEventとevent.initMouseEventを使ってaタグにクリックイベントを送信すれば、自分でクリックしないでfavoriteを外すことができます。この方法だとFirefoxに表示されているだけのfavoritesしか外せません。1ページに表示されている量よりも多い量を対象にしたい時はAutoPagerizeを使って、対象にしたい量だけ読み込んでから実行すると、1ページに収まらない量を対象にすることができます。

setTimeoutの中で実行しているのは、一度に大量のリクエストをサーバに送って迷惑をかけたりしないようにするためです。大量にリクエストを送ることになるときには必ず入れましょう。

クリックしたあと確認のダイアログが出るとき

twitterのfavoriteのように、クリックしたら即操作が反映されるものは比較的少数です。削除のように元に戻せない操作のときにはjavascriptで確認が表示されることが多いです。Flickrで写真を削除しようとしたときには確認画面が出てきて、けっきょくまたクリックしないといけなくなったりします。
そういうときにはこの確認画面を出しているconfirm関数を上書きしてしまいましょう。Firebugコンソールで
window.confirm = function () {
  return true;
}
と書いて一度実行しておけば、confirmは出てこなくなって、常にOKを押したことにすることができます。(参考: Googleマップのアラートを消す最悪の方法 - p0t)

HTTPリクエストを送る

クリッイベントを作るだけじゃうまくいかない、クリックしたあと別のページに遷移してしまってスクリプトの実行が中断されてしまう、そういうときはもうXMLHttpRequestを使ってリクエストを作って送ります。

wassr で全 follow するブックマークレット - IT戦記がちょうどそれをやっているので、まねしてFriendFeed - Recommended Friendsでお勧めされているひとをsubscribeするというFriendFeedバージョンを作るのを例にします。

まずLive HTTP Headers :: Firefox Add-onsを使って、送信されているリクエストを確認します。
POST /account/newfriends HTTP/1.1

Host: friendfeed.com

Content-Type: application/x-www-form-urlencoded; charset=UTF-8

X-Requested-With: XMLHttpRequest

Referer: http://friendfeed.com/settings/recommended


id=06c27bf8-2cfd-11dd-be28-003048343a40&at=12419835770643829971_1218795910
subscribeボタンを押すとこういうリクエストがPOSTで送信されています。まずはPOSTのパラメータになっているidとatをページの中から探してきましょう。 ユーザのIDを示しているGUIDみたいなidはtdタグにuseridという属性で示されていました。
Picture 5-20
atは調べてみたらcookieの中に入っている値でHTMLには入ってないのですがgetCookie('AT')で得ることができました。材料が揃ったところで、あとはコードを書けばいいだけです。
$x('//td[@userid]').map ( function (e, i) {
  setTimeout( function () {
    var body = [
     "id=" + e.getAttribute("userid"),
     "at=" + getCookie("AT")
    ].join("&");
    var r = new XMLHttpRequest();
    r.open("POST", "/account/newfriends", false);
    r.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    r.send(body);
  }, i * 1000);
} )

XMLHttpRequestは同じドメインにしかリクエストを送れないので、同じドメインであるFriendFeed - Recommended Friendsを開いて、Firebugでこのスクリプトを実行すると、おすすめされたひとをみんなsubscribeすることができます。

あとがき

Firebugを使うと、クッキーで認証がかかっていて、ほかのスクリプト言語でコードを書くにはめんどくさい、というときにも、作業そのもののコードを書くだけですませられるので簡単です。最近はJSONやJSONPで結果を返してくれるAPIも増えたので、ますますFirebugは細かい作業をこなすのに使いやすくなっています。

tags

  • Firefox
  • javascript
  • 「Firebugクックブック #2」のはてなブックマーク数
  • 「Firebugクックブック #2」deliciousブックマーク数
  • 「Firebugクックブック #2」をはてなブックマークに追加
  • save "Firebugクックブック #2" to del.icio.us
  • 「Firebugクックブック #2」をリアルタイムブログ検索
  • permalink
  • Firebugクックブック #1

comments

TypeKey Enabled
スタイル用のHTMLタグが使えます。
*required

trackbacks

トラックバック元エントリにこのエントリへのリンクがない場合はトラックバックを受け付けません。

http://labs.gmo.jp/mt/mt-tb.cgi/229
©2010 Kentaro Kumagai, GMO Internet Labs., GMO Internet, inc.
bits and bytes
2008 .08. 29 13:11

tagcloud

  • API3
  • C/C++3
  • E4X1
  • FUSE2
  • Firefox32
  • HTML4
  • IE1
  • MySQL1
  • OSX4
  • Opera2
  • PHP5
  • Safari1
  • UI2
  • WebKit1
  • XML2
  • XPCOM4
  • XPath5
  • apache2
  • binary2
  • book1
  • data14
  • debug5
  • design2
  • experiments4
  • extension14
  • geo1
  • google gears2
  • google maps API1
  • greasemonkey4
  • httpd5
  • javascript27
  • linux1
  • logging2
  • mobile4
  • perl7
  • tips6
  • tool11
  • vim2
  • visualization4
  • widget1
  • wii3
  • windows7
  • サービス8
  • 和訳1

Archives

  • 2008.08 (4)
  • 2008.07 (4)
  • 2008.06 (4)
  • 2008.05 (5)
  • 2008.04 (4)
  • 2008.03 (4)
  • 2008.02 (6)
  • 2008.01 (3)
  • 2007.12 (4)
  • 2007.11 (5)
  • 2007.10 (4)
  • 2007.09 (4)
  • 2007.08 (4)
  • 2007.07 (8)
  • 2007.06 (7)
  • 2007.05 (4)
  • 2007.04 (5)
  • 2007.03 (6)
  • 2007.02 (4)
  • 2007.01 (6)

about

  • bits and bytesのXML
  • 「bits and bytes」のCreative Commons
  • Powered by Movable Type
  • イベントと地図 - モグ
  • Use ecto to blog!
  • bits and bytesのはてなブックマーク数
  • bits and bytesをMy Yahoo!に追加
  • Subscribe with Bloglines