data:スキームでリファラを消して移動するブックマークレット

itochanさんのてくてく糸巻き - Operaでリファラ消しをパクッてみた。


itochanさんも仰っているとおりに Desktop版の Opera は、簡単な UI から 「 リファラーを無効 」 に設定できるのですが、残念ながら Mobile版の Opera には、リファラーを無効にする機能が有りません。
また、 Desktop版のブラウザならリファラの設定を変更しなくても、コンテキストメニューにある 「 リンクのアドレスをコピー 」 の機能を使って URL を取り出して、その URL をアドレスバーに 「 貼り付けて移動 」 すれば、リファラを残さずにリンク先のサイトに移動することも出来ます。
しかしながら、 Mobile版の Opera には、コンテキストメニュー等の UI からリンクのアドレスを取り出す機能が有りません。*1
したがって、これまで Mobile版の Opera には、ユーザーの意図でリファラーを消す手段が有りませんでした。*2



itochanさんはてくてく糸巻き - Operaでリファラ消しで、せっかく
dataスキーム+javascriptページによるリファラ消し

data:text/html;charset=utf-8,%3Chtml%3E%0D%0A%3Cscript%20%3E%0D%0Alocation.replace(%22http%3A%2F%2Fwww.teria.com%2F~koseki%2Fmemo%2Freferrer%2Fview.php%22)%3B%0D%0A%3C%2Fscript%3E%0D%0A%3C%2Fhtml%3E%0D%0A

を紹介して下さっているにもかかわらず、なぜかブックマークレットでは不可能であるかのような記述でそのエントリを打ち切ってしまっています。
確かに、itochanさんが紹介しているブックマークレット
javascriptスキーム(ブックマークレット)を使ったジャンプ

javascript:location.href='http://www.teria.com/~koseki/memo/referrer/view.php';

ではリファラが出ることは確かなのですが、このブックマークレットの中に記述している 「 ジャンプ先の URL 」 の部分に 先ほど itochanさんが紹介していた data:スキームをそのまま埋め込んでしまえば、リファラを消せるのです。
それが ↓ こちら
javascript:スキームの中に「data:スキーム+javascriptページ」を埋め込んだブックマークレット

javascript:location.href='data:text/html;charset=utf-8,%3Chtml%3E%0D%0A%3Cscript%20%3E%0D%0Alocation.replace(%22http%3A%2F%2Fwww.teria.com%2F~koseki%2Fmemo%2Freferrer%2Fview.php%22)%3B%0D%0A%3C%2Fscript%3E%0D%0A%3C%2Fhtml%3E%0D%0A';

追記  ↑ は、 Desktop版の Opera でしか動かない事が判明しました。 orz
   なので、 Mobile版の Opera や、 Firefox で動くブックマークレットに微調整したのがこちら ↓ *3

javascript:location.href='data:text/html;charset=utf-8,%3Chtml%3E%20%20%3Cscript%20%3E%20%20location.replace(%22http%3A%2F%2Fwww.teria.com%2F~koseki%2Fmemo%2Freferrer%2Fview.php%22)%3B%20%20%3C%2Fscript%3E%20%20%3C%2Fhtml%3E%20%20';





これで、ブックマークレットもリファラを消せる事が確認できたので、一般的なケースで使えるブックマークレットを書いて見ました。



data:スキームでリファラを消して移動するブックマークレット

シンプル版

 (リンクのアドレスをコピペできるように改訂しました)

javascript:(function(){var A=document.activeElement;if(A!=null&&A!=undefined&&(A=prompt('OK?',A))){location='data:text/html;charset=utf-8,'+encodeURIComponent('<HTML><SCRIPT>location="'+A+'";</SCRIPT></HTML>');}})();
一般化版
javascript:(function(){function gSel(D){return D.selection?D.selection.createRange().text:D.getSelection?D.getSelection():getSelection?getSelection():'';}var A=S=L='',d=document;if(d.getElementsByTagName('frame').length==0){A=d.activeElement;S=gSel(d);}if(S==''){for(var i=0;i<frames.length;i++){d=frames[i].document;A=d.activeElement;S=gSel(d);if(S!='')break;}}if(A==null||A==undefined){L=S;}else if(confirm('リンクのアドレス?')){L=A;}else{L=S;}if(L=prompt('OK?',L)){location='data:text/html;charset=utf-8,'+encodeURIComponent('<HTML><SCRIPT>location="'+L+'";</SCRIPT></HTML>');}})();

使い方
「シンプル版」は、携帯端末の 十字キー か カーソル(矢印)キー で目的のリンクを選択(反転表示)した状態でこのブックマークレットを起動します。すると、リファラを出さずにリンク先のページにジャンプします。
「一般化版」は、「シンプル版」の機能に加えて、リンクの貼られていないテキストを選択して、そのテキストを編集した後にジャンプ出来る様にしてあります。リンクされている URL も一部を編集した後にジャンプできます。
また、「シンプル版」は、 iframe(インラインフレーム)や frame(フレーム)の中に貼られたリンクを扱う事が出来ませんが、「一般化版」ならば大丈夫です。*4
追記 モバイル版の Opera には、データスキームにやや厳しい文字数制限があるらしく、例えば こちらのiタウンページ 等のようにリンクのアドレスの URL の文字数が多い場合、正しいジャンプ先に行ってくれません。 この場合は、ブックマージレットを実行した際に表示されるリンクのアドレスをコピーしてアドレスバーに貼り付けて移動すれば、リファラを消して移動できます。*5



対象とするブラウザ
W-ZERO3 などのモバイル版の Opera が主となりますが、デスクトップ版の Opera でも使えます。
「一般化版」は、テキストの URL を選択して使うのであれば、 Firefox でも使えます。


なお、 NetFront は data: スキームに対応していない様子ですので、 NetFront では使えません。尤も NetFront は、 UI からリファラを無効化する機能を持っているので、わざわざブックマークレットを使う必要も有りませんが。


今回のエントリとは別に、京ぽんOpera 7.0 でリファラを消すブックマークレットを、 リファラを消して移動 - borbisの日記 で紹介しています。 そちらのブックマークレットは、W-ZERO3 や Desktop版の Operaもリファラの偽装に使えます。







参考にしたページ
私のブックマークレットは偉大な先人の業績の上に成り立っています。感謝を込めてリンクしておきます。
リファラ実験 - referrer test
てくてく糸巻き - Operaでリファラ消し
Shishimushi - リファラを残さずにリンク先へ移動
qootas.org/blog: referrerを空にするリンクの作成方法
Sailing Notes: Fresh Reader referer remover
朝顔日記 - データスキーム な URL を作るツール
The data: URI kitchen



*1:Opera 8.65 Beta for Windows Mobile では、この機能が追加されています。

*2:ブックマークレットを使えばアクティブリンクの URL を取り出せるので、ブックマークレットで取得した URL をアドレスバーに貼り付けて移動する事はこれまでも可能だった。

*3:修正箇所は 「 %0D%0A 」 を 「 %20%20 」 に換えた所です。 CR LF は削除しても良いのですが文字数に変化が無いことを意識しています。 この修正は今回のエントリの本質的な部分、すなわち、ブックマークレットもリファラが消せる事には変わりありません。 なお、どうやら、 Firefox 等では、 location.href に代入する URL の中に1つでも CR や LF があると動かないようです。 ひょっとして常識?

*4:フレームを構成するページが別々のドメインに配置されている場合は、処理できない事もあります。orz

*5: URL の文字数制限をオーバーしてしまった場合、ジャンプしたページの URL が文字化けしてしまいます。この結果文字化けしたままの URL のページを表示するか、もしくは、そのホームページのトップページにリダイレクトされてしまいます。この場合はブラウザの 「 戻る 」 ボタンを2〜3回連打すれば元のページに戻れます。