3 posts tagged “tinyurl”
きっかけは MyMiniCity というサービスで,アクセス数に応じて自分の街が発展するという性質から Twitter 上にやたらと MyMiniCity へのリンクが貼られるようになった.個人的には興味がないのでスルーしていたが,そのうち巧妙な釣り文句と共に TinyURL を噛ませたリンクが貼られるようになって,迂闊に踏んでしまうとどうも悔しい.悔しいので対策することにした.
TinyURL のリンクを自動 decode している人は多いと思うが,自分も 自作 decoder を利用しているので,別途ページ中のリンクを走査して MyMiniCity らしきリンクをどうにかする Greasemonkey script を書けば解決するだろう.サクっと書いた.
// myminicity link detector
// (毎回 RegExp をコンパイルしているのは見逃して><)
var anchors = node.getElementsByTagName('a');
for (var n = 0, len = anchors.length; n < len; ++n) {
var anchor = anchors[n];
if (anchor.href.match(/^http:\/\/[^\.]+\.myminicity\.com\b/))
anchor.textContent = '<MyMiniCity Link>';
}
こいつを decoder script の後に動くようにしておけば偽装 MyMiniCity リンクもイチコロだぜ!! と思いきや,どうもうまく動かない.それもそのはずで,TinyURL decoder は tinyurl.com に対して decode 要求を行う際に GM_xmlhttpRequest による非同期通信を利用しており,decoder script が終了して更に myminicity link detector が終了してから実際の decode が行われる可能性もある.後続の処理を確実に動かすためには GM_xmlhttpRequest の onload ハンドラ内で行うしかないが,TinyURL decoder 内部に MyMiniCity 依存の処理を加えるのは気が引ける.
ところで,TinyURL 以外の URL 短縮サービスで MyMiniCity リンクが貼られることもあって,できればこれらも対応したい.最近は xrl.us という URL をよく見かける.他にも urltea.com, qurl.com, z.la など数えるとキリがないが,これらの中には明示的な decode 手段を用意していないものが多い.encode 用 API は用意されているが,decode はブラウザ任せとういか,実際に短縮 URL にリクエストしてみてリダイレクト時の location レスポンスヘッダを参照するしかない場合がある.GM_xmlhttpRequest は (自分の知る限り) リダイレクトに自動追随してしまうのでリダイレクト時の location レスポンスヘッダを参照することは恐らくできない.困ったものだ.
というか,decode API はともかく URL 短縮サービスは TinyURL のような Preview Mode を必ず備えているべきだと思うのだがどうよ.危なくね?
閑話休題,他の URL 短縮サービスに対応するとしても,要はどれもページ内のリンクを走査して何かを処理するというところは同じなので,その部分をうまく plugin 化できないものだろうか.AutoPagerize.addFilter のようにハンドラを登録して順次処理してくれる感じで.問題は前述の通り非同期処理を挟む可能性があるので単純にループでハンドラを回すだけでは目的は達成できない.
ハンドラが 3 つある場合は,このような処理をしたいわけだ:
if (should_do_1) {
GM_xmlhttpRequest({
onload: function(r) {
do_1();
if (should_do_2) {
GM_xmlhttpRequest({
onload: function(r) {
do_2();
if (should_do_3) {
GM_xmlhttpRequest({
onload: function(r) {
do_3();
else の場合も同様に次のハンドラへ処理を渡す.
というわけで,できた.
ページ内のリンクを走査し,登録されたハンドラ群に処理を渡すだけの Link Manipulator と,Link Manipulator の plugin として動作する TinyURL decoder と xrl.us decoder (これらは一つにまとめた),そして MyMiniCity のリンクを検出してアンカーテキストを置き換える detector を作った.detector は Twitter/Favotter 上で動作し,アンカーテキストを置き換えずに post そのものを非表示にすることもできる (今のところ要ソース修正 ;-).decoder は xrl.us → TinyURL といった二重 decode にも一応対応した.もちろん AutoPagerize 対応.
- Link Manipulator (管理用 script. 必須)
- Shorten URL Expander (各種短縮 URL 展開 plugin)
- Anti MyMiniCity (MyMiniCity リンク検出 plugin)
非同期処理が前提なので,スクリプトの実行順序に対して sensitive なのが玉に瑕.AutoPagerize → Link Manipulator → plugin scripts の順で並んでいないと意図通りに動かない (間に別のスクリプトが入るのは問題ないが).MyMiniCity のリンクをどうにかする場合は,事前に decoders を動かしておく必要がある.
TODO:
- decode 結果のキャッシュとクリア
- plugin 毎に処理するノードをカスタマイズできないか
- TinyURL, xrl.us 以外の短縮 URL 展開対応 → z.la に対応した (12/23)
というか,いまさら TinyURL ネタかよ :-(
なんか,自分が AutoPagerize をインストールした数日後 (7/10) に新しいバージョンがリリースされていて,あまつさえ addFilter なんつー機能が増えているジャマイカ.なんてことに二ヶ月くらい気付かなかった.
ので de-tinyurl も追随しました.
- AutoPagerize.addFilter を利用して,力技対応をやめた.
- query string 付き URL の decode がおかしかったのを修正 (なぜ気付かない?
昨日,初めてグリモンを作ってみて,あーこりゃたのしーみたいな状態なわけですよ.
で,TinyUrl をデコードできないかという発言と AutoPagerize 対応しないかなという発言に反応してチトやってみた.現実逃避.グリモン暦二日なので色々とご容赦いただきたい ;D
AutoPagerize 対応部分がチト強引かなぁ.
追加された部分だけ走査すると早いんだろうなー.
- 早速,onscroll の度に getElementsByTagName を実行するという鬼畜仕様を改善.scroll が落ち着くたびに走査.
- 早速,フラグの true と false 間違えてたので修正 (死亡).
追記 (2007-09-15)