たごもりすメモ

コードとかその他の話とか。

iTunes Connectで各国のレビューを全部読み込んで表示するブックマークレットを書いた

AppStoreでアプリを公開するときには公開する国を選べる。自分はUIは英語で書いて、あとは英語UIでも使える人に使ってもらえれば、というスタンスなので、基本的に出せる国すべてに対して出している。例外なし。
で、各国のユーザはアプリに対してレビューを書けるんだが、それを見る開発者の側にはロクなインターフェイスがない。iTunes Connectの真っ白な画面の中にどかんとセレクトボックスがあり、そこで選んだ国のレビューが画面遷移ののちに表示される、という仕組みだ。

89カ国も選んでられるかボケ!!!!!

選んでみないとレビューがあるかどうかすら分からん。これはひどいUIですね。コンシューマデバイスのUIはあんなにいいのに、開発者向けのはなんでこんなに最悪なのAppleさん……。。。

bookmarkletを作った

やってられないので、全部読み込むためのbookmarkletを作った。 (スクロールバーつきで右に飛び出さないように、あとCtrl+Aで選択できるようにしたいんだけど、どうすりゃいいんだ? textarea + rows="1"も指定してみたけどうまくいかない……。)

javascript:(function(){var loadjquery = function(callback){var jquery_script_tag = document.createElement('script');jquery_script_tag.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js";document.body.appendChild(jquery_script_tag);setTimeout(callback, 1000);};var loadreview = function(options, hostname, action, referer, fieldname, chain){if (options.size() < 1) {return false;};var one = options.eq(0);var other = options.slice(1);var country_name = one.html();var param = {};param[fieldname] = one.attr('value');var uri = 'https://' + hostname + action;jQuery.ajax({data: param,success: function(html, type){var reviews_html = html.substring(html.indexOf('<center>') + 8, html.indexOf('</center>'));jQuery('div#reviews_backet').after('<div id="review"' + one.attr('value') + '><h3>' + country_name + '</h3>' + reviews_html + '</div>');var new_action = 'https://' + hostname + jQuery(html).find('form#mainForm').attr('action');chain(other, hostname, new_action, uri, fieldname, chain);},url: action,xhr: function(xhr){xhr.setRequestHeader('Referer', referer);},});};var loadreviews = function(loadreview){var action = jQuery('form#mainForm').attr('action');var selections = jQuery('div.app-reviews fieldset ul li').filter(':has(label:contains("Country :"))').children('div select').eq(0).contents();var fieldname = selections.attr('name');jQuery('div.app-reviews').after('<div id="reviews_backet"></div>');loadreview(selections.contents().slice(1), location.hostname, action, location.href, fieldname, loadreview);};loadjquery(function(){loadreviews(loadreview)});})();

これをbookmarkletとして保存(コピー、ブックマークの新規作成、URL欄に貼り付け)し、iTunes Connectのレビュー表示画面("Manage Your Applications" → アプリケーション選択 → "Versions"から対象バージョン選択 → "Customer Reviews")にてブックマークレットを実行。
これで選択肢にある各国のレビューが全部読み込まれます。
自分のアプリ(ひとつしかない)の現行バージョン(ひとつしかない)でしか試せてないので、他の人が試してみてどうなるか、できれば誰か教えてください。

Firefox 3.6 で書いて、いちおうSafari 5でも動作を確認。Chromeでも動くんじゃないかなー。IE? 知らん。まあみんなMac持ってるはずだし、IEは別にいいでしょ。
もちろん現行iTunes Connectに合わせて書いたもの(2010/10/3現在)で、将来的にページ構造などが変われば動かなくなると思います。

細かいこと

サーバ側でユーザが読み込んだページの動線を記録しているせいで、ブックマークレット使用後は 'Done' のボタンその他がいっさい効かなくなっています("You backtracked too far." とか言われてログイン画面に飛ばされる)。これに対処するのもちょっと面倒そうだったので、スルーしました。ログイン画面から入り直してください。*1

iTunes Connectの画面はprototype.jsを使ってますが、このスクリプトは唐突にjQueryを読み込んでます。自分が最近jQueryづいていて、かつprototype.jsの使い方を学ぶのがめんどくさかったためです。誰かprototype.js版を作ってください。自分もそっち使いたいです。w
jQueryの読み込み(&ブラウザ側でのローディング)のために setTimeout(func, 1000) してますが、遅い回線からだとこれでは不十分かもしれません。その場合は適当にこの数値を増やしてみてください。

バックアップのためも含めて、bookmarklet化する前のjsを全文ここに貼り付けておきます。githubにも上げた

(function(){
    var loadjquery = function(callback){
        var jquery_script_tag = document.createElement('script');
        jquery_script_tag.src = "http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js";
        document.body.appendChild(jquery_script_tag);
        setTimeout(callback, 1000);
    };
    var loadreview = function(options, hostname, action, referer, fieldname, chain){
        if (options.size() < 1) {
            return false;
        }
        var one = options.eq(0);
        var other = options.slice(1);
        var country_name = one.html();
        var param = {};
        param[fieldname] = one.attr('value');
        var uri = 'https://' + hostname + action;
        jQuery.ajax({
            data: param,
            success: function(html, type){
                var reviews_html = html.substring(html.indexOf('<center>') + 8, html.indexOf('</center>'));
                jQuery('div#reviews_backet').after('<div id="review"' + one.attr('value') + '><h3>' + country_name + '</h3>' + reviews_html + '</div>');
                var new_action = 'https://' + hostname + jQuery(html).find('form#mainForm').attr('action');
                chain(other, hostname, new_action, uri, fieldname, chain);},
            url: action,
            xhr: function(xhr){xhr.setRequestHeader('Referer', referer);},
        });
    };
    var loadreviews = function(loadreview){
        var action = jQuery('form#mainForm').attr('action');
        var selections = jQuery('div.app-reviews fieldset ul li').filter(':has(label:contains("Country :"))').children('div select').eq(0).contents();
        var fieldname = selections.attr('name');
        jQuery('div.app-reviews').after('<div id="reviews_backet"></div>');
        loadreview(selections.contents().slice(1), location.hostname, action, location.href, fieldname, loadreview);
    };
    loadjquery(function(){loadreviews(loadreview)});
})();

Javascriptむずかしいなー。

*1:正確には、ログイン後のiTunes Connectのページにいきなりアクセスすれば認証はやり直さなくて良いです。