Hatena::ブログ(Diary)

Cherenkovの暗中模索にっき RSSフィード Twitter

2008-08-28

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

なにをするもの?

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

f:id:Cherenkov:20081028080714g:image


このスクリプトによってリンクが書き換えられたら、flashgetなどのダウンローダにぶっこめばいい。

なお、非同期なので画像の数が多かったりサーバの応答が遅いとリンク書き換えに数秒かかるかも。

f:id:Cherenkov:20081028080715j:image

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


必要なもの


どうやってるか

Yahoo!フォトの画像のアドレスは拡張子のあとに呪文がついてないと開けないようになっている。

http://proxy.f3.ymdb.yahoofs.jp/users/48b5e2e1_3dd5/bc/dc7b/__hr_/e5bd.jpg?bcuMJLJBHYYK79F9

オリジナルサイズにアクセスできる呪文は一覧のページにはない。

通常サムネイルをクリックすると、小さめの画像を表示したページが開かれる。

そこで、一覧のページからGM_xmlhttpRequestでオリジナルサイズのページへアクセスして、

画像の呪文を取得し、サムネイルのリンクを書き換えている。


インストール

yahoo_photos_link_original_images.user.js

yahoo photos - direct link for Greasemonkey


新しいソースコード

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

JJ 2010/11/05 16:16 これまで非常に重宝させて頂いて来ました。
PCリカバリの為、再インストールをさせて頂こうと思い伺った所403エラーになりました(リンク先が10月31日で閉鎖?)ので、誠にお手数ですが別の場所に再UPして頂けるととても助かりますので、よろしくご検討ください。

CherenkovCherenkov 2010/11/06 00:05 ご利用ありがとうございます!書き直しました。
こちらからインストールしてください。
yahoo photos - direct link to original images for Greasemonkey
http://userscripts.org/scripts/show/89744

JJ 2010/11/06 16:54 素早い対応に感謝致します。ありがとうございました。

timecapturetimecapture 2011/05/22 16:09 はじめまして。実はご挨拶が遅くなって恐縮ですが、以前こちらのスクリプトを私のサイトで紹介させていただいたものです。その節は大変お世話になりました。しばらく検証もさぼっておりましたので気がつかなかったのですが、いつの間にか新しいソースコードだと機能しなくなっているようなのですが、私の環境だけでしょうか。試しに古いソースコードで確認したところ大丈夫でした。一度ご確認いただけると幸いです。

CherenkovCherenkov 2011/05/25 20:43 確認したところ正常動作しました。
http://userscripts.org/scripts/show/89744
から再インストールしてみてください。

それでもだめな場合はURLを教えてください。

timecapturetimecapture 2011/05/27 23:30 お忙しいところお手間をおかけして申し訳ありません。ご指示のURLから再度インストールして試してみましたが、変化ありません。実は最初、このブログのコメントの書き込みも画像認証が何度もうまくいかなかったので、もしやと思ってFirefoxを3.6に戻してみたところ、ご指定のスクリプトは見事に動作しました。もしかするとFirefox4だとうまく動作しないのかもしれません。的外れでしたら恐らく私の環境のせいだと思いますので、どうかスルーしてください。失礼しました。

CherenkovCherenkov 2011/05/28 00:52 ご報告ありがとうございます。仰るとおり3.6でのみ動作確認をしていました。
Firefox4のE4Xの仕様変更( http://efcl.info/2011/0326/res2406/ 参照)が原因でした。
修正してアップデートしましたので、お手数ですが再インストールしてご確認頂ければ幸いです。

timecapturetimecapture 2011/05/28 12:28 先ほど再インストールして動作確認しました!
早々に修正していただき、ありがとうございました。
今後ともどうぞよろしくお願いします。

kkkk 2011/08/22 07:21 お世話になります。次の2点教えていただきたくよろしくお願いいたします。
?”yahoo_photos_link_original_images.user.js”の代わりに
”yahoo photos - direct link to original images」 for Greasemonkey”
をインストールすればよろしいのでしょうか?
?yahoo photos - direct link to original images for GreasemonkeyをFirefox6で使用しましたが、
アルバムの抽出ができません。Firefox6では動作しないのでしょうか?

CherenkovCherenkov 2011/08/22 14:44 http://userscripts.org/scripts/show/89744
ここから「yahoo photos - direct link to original images」をインストール。


Firefox6で動作確認できました。
http://gyazo.com/499aabe6569c6a63b099b6b70d991fba.png
このようにサムネイル一覧のページでしか動作しません。

kkkk 2011/08/26 06:43 お忙しいところありがとうございました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト

コメントを書くには、なぞなぞ認証に回答する必要があります。

トラックバック - http://d.hatena.ne.jp/Cherenkov/20080828/p1