Yahoo!フォトの画像を一括ダウンロードするためのGMスクリプト

なにをするもの?

Yahoo!フォトの画像一覧ページ(例えばココ)で実行すると、サムネイルのリンク先をオリジナルサイズの画像に変える。


このスクリプトによってリンクが書き換えられたら、flashgetなどのダウンローダにぶっこめばいい。
なお、非同期なので画像の数が多かったりサーバの応答が遅いとリンク書き換えに数秒かかるかも。


flashgetはちゃんとリンク先を画像ファイルと認識するので、まとめてダウンロードが可能。

必要なもの

どうやってるか

Yahoo!フォトの画像のアドレスは拡張子のあとに呪文がついてないと開けないようになっている。
http://proxy.f3.ymdb.yahoofs.jp/users/48b5e2e1_3dd5/bc/dc7b/__hr_/e5bd.jpg?bcuMJLJBHYYK79F9
オリジナルサイズにアクセスできる呪文は一覧のページにはない。
通常サムネイルをクリックすると、小さめの画像を表示したページが開かれる。
そこで、一覧のページからGM_xmlhttpRequestでオリジナルサイズのページへアクセスして、
画像の呪文を取得し、サムネイルのリンクを書き換えている。

新しいソースコード

Array.forEach(document.querySelectorAll('img[src*="yahoofs"]'), function(e) {
  var ep = e.parentNode;
  GM_xmlhttpRequest({
    method: "GET",
    url: ep.href + "&.hires=t",
    onload: function(res) {
      var re = RegExp(e.src.replace(/__tn_.+/, '(?:__hr_|__sr_)[^"]+'));
      var newHref = re.exec(res.responseText)[0];
      ep.href = newHref;
    }
  });
});

古いソースコード

// ==UserScript==
// @name           yahoo_photos_link_original_images
// @namespace      http://cherenkov.vox.com
// @include        http://photos.yahoo.co.jp/ph/*
// ==/UserScript==

(function(){

var img = document.evaluate('//img[contains(@src,"yahoofs")]', document, null, 7, null);
for(var i=0;i<img.snapshotLength;i++){
  var yp = (function(i){
   var href = img.snapshotItem(i).parentNode.href+'&.hires=t';

    GM_xmlhttpRequest({
        method:"GET",
        url: href,
        headers:{
           "User-Agent":"Mozilla/5.0",
           "Accept":"text/xml"
        },
        onload:function(res) {
             var zzz = img.snapshotItem(i).src.replace('__tn_','__hr_').split(/\?/,1);
             var p1 = res.responseText.indexOf(zzz[0]);
             var tmp = res.responseText.substring(p1+zzz[0].length);
             var p2 = tmp.indexOf('"');
             var id = tmp.substring(0,p2);

             if(id[0]=='?'){   //id check
                 img.snapshotItem(i).parentNode.href = zzz[0]+id;
             }else{
                 var qqq = img.snapshotItem(i).src.replace('__tn_','__sr_').split(/\?/,1);
                 var p1 = res.responseText.indexOf(qqq[0]);
                 var tmp = res.responseText.substring(p1+qqq[0].length);
                 var p2 = tmp.indexOf('"');
                 var id = tmp.substring(0,p2);
                 img.snapshotItem(i).parentNode.href = qqq[0]+id;
             }
          }
    });
  })(i);
}
})();
もごもごしている

responseTextからidを抽出するところをすっきりさせたい。

近いもの

[Perl]Yahoo!フォトから画像一括ダウンロードするスクリプトを組んでみた
http://d.hatena.ne.jp/ikikko/20080410/1207845525