Yahoo!フォトの画像を一括ダウンロードするためのGMスクリプト
なにをするもの?
Yahoo!フォトの画像一覧ページ(例えばココ)で実行すると、サムネイルのリンク先をオリジナルサイズの画像に変える。
このスクリプトによってリンクが書き換えられたら、flashgetなどのダウンローダにぶっこめばいい。
なお、非同期なので画像の数が多かったりサーバの応答が遅いとリンク書き換えに数秒かかるかも。
必要なもの
- firefox(アドオンのflashgotも?)
- greasemonkeyと今回のyahoo_photos_link_original_images.user.js
- flashgetなどのダウンローダ(一括DLするため)
どうやってるか
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