Hatena::ブログ(Diary)

4丁目より このページをアンテナに追加 RSSフィード

2008-10-25

[][]mechanizeを使って、Yahooブリーフケースのファイルを一括ダウンロードする。

yahooブリーフケースを一括でダウンロードするツールを探したのですが、見つからないので作ってみました。

<追記_20081027>

yahooがブリーフケースの有料化によって無料でダウンロードが2009年2月1日までしかできないようです。

Yahoo!プレミアム、Yahoo! BBに会員登録いただいていない方は、2009年2月1日までの間に、お手数ですがYahoo!ブリーフケースにアップロードされているデータを、ご自分のパソコンにダウンロードしていただくか、Yahoo!プレミアム/Yahoo! BBへのご登録をお願いいたします。

プログラムとか苦手な人にでもわかるようにid:t_ash20さんが解説を書いてくれました。rubyが入ってない方はid:t_ash20さんの解説を見てがんばってみてください。Yahoo!ブリーフケースから一括ダウンロード その2 - perspective

</追記_20081027>

少し修正しました。


インターネットストレージとしてのYahooブリーフケース - sshi.Continualでも自動化らしきことが書いていたので少しは需要があるのかな?

自動化ツールを使うことで、IDを抹消されても責任はとれませんのであしからず。

mechanizeを利用しています。

mechanizeの使い方等は、RubyでHTMLとWebを操作するためのライブラリ、HpricotとWWW::Mechanizeや、mecanize.rb で mixi diary を自動取得する - World Wide WalkerWWW::Mechanize による Webアクセスの自動化 | Diaspar Journal等で解説されています。

ソース

class YahooBriefcase

  require 'rubygems'
  require 'mechanize'
  require 'Kconv'
  require 'uri'

  BRIEFCASE_LOGIN_URL = "https://login.yahoo.co.jp/config/login?.src=bc&.done=http%3a//briefcase.yahoo.co.jp/&.intl=jp&.linkdone=http%3a//briefcase.yahoo.co.jp/"
  BRIEFCASE_LOGOUT_URL = "http://login.yahoo.co.jp/config/login?logout=1&.src=bc&.intl=jp&.done=http://briefcase.yahoo.co.jp"
  BRIEFCASE_URL = "http://briefcase.yahoo.co.jp/"

  def initialize(id=nil, password=nil, user_agent='Mechanize')

    @agent = WWW::Mechanize.new
    set_user_agent_alias(user_agent)
    briefcase_login(id,password) if id && password
  end

public

  # @param[in] user_agent ユーザエージェント
  def set_user_agent_alias(user_agent)
    @agent.user_agent_alias = user_agent
  end

  # @param[in] id Yahoo!のID
  # @param[in] password Yahoo!のパスワード
  def briefcase_login(id,password)
    @agent.post(BRIEFCASE_LOGOUT_URL)
    @agent.post(BRIEFCASE_LOGIN_URL, "login" => id, "passwd" => password)
  end


  # @param[in] dir ダウンロード先のディレクトリ
  # @param[in] url ダウンロード元のURL
  def all_get(dir, url=BRIEFCASE_URL)
    FileUtils.mkdir_p(dir)
    briefcase(dir,url,@agent)
  end

private

  def briefcase(name,url,agent)

    #fileが存在するurlの正規表現
    file_regexp = Regexp.new('^http://proxy')
    #ディレクトリのurlの正規表現
    dir_regexp = Regexp.new('&.order=&.view=l&.src=bc&.done=')

    infileArr = Array.new

    #現在の階層に存在するurlを取得
    page = agent.get(url)

    #取得したurlを回す。
    page.links.each do |link|

      #urlがディレクトリの場合
    if link.href =~ dir_regexp

        #ディレクトリの位置をinfileArrに入れる
        dirname = Kconv.tosjis(link.to_s).sub(/\n/,"").sub(/^ */,"")
        infileArr << { dirname => link.href }

        #urlがファイルの場合
        elsif link.href =~ file_regexp

        #ファイルの位置をinfileArrに入れる
        filename = Kconv.tosjis(URI.decode(link.href.to_s.sub(/\n/,"").to_s.sub(/\?.*$/,"").reverse.scan(/^(.*?)\//).to_s.reverse))
        infileArr << { filename => link.href }
      end
    end

    #現在の階層に存在するリンクを回す。
    infileArr.each do |dirhash|
      #リンクに対する名前、urlを取得(1回しか回らない)
      dirhash.each do |name2, url2|

        #urlがディレクトリの場合
        if url2 =~ dir_regexp then

          #ダウンロード先のディレクトリが存在しない場合は作成
          FileUtils.mkdir_p("#{name}/#{name2}")

          #再起呼び出し
          briefcase("#{name}/#{name2}",url2,agent)
          next
        end

        #urlがファイルの場合
        if url2 =~ file_regexp

          #ファイルを取得
          file = agent.get(url2)
          filename = Kconv.tosjis(name2).sub(/\n/,"")
          File.open("#{name}/#{name2}","w+b") do |line|
            line << file.body
          end
  
          #取得したファイル名を出力する。
          puts "#{name}/#{name2}"
        end
      end
    end
  end

end

[usage]使用方法

自分のIDのファイルを一括取得する場合
  id = 'id' #yahooのID
  password = 'pass' #yahooのパスワード
  dir = './briefcase' #ダウンロードする場所
  user_agent = 'Windows IE 6'  #ユーザエージェント

  yahooBriefcase = YahooBriefcase.new(id, password, user_agent)
  yahooBriefcase.all_get(dir)
他の人のファイルを一括取得する場合
  url = "http://briefcase.yahoo.co.jp/******" #公開している人のurl
  dir = './briefcase' #ダウンロードする場所

  yahooBriefcase = YahooBriefcase.new()
  yahooBriefcase.set_user_agent_alias('Windows Mozilla') #ユーザエージェントを変更
  yahooBriefcase.all_get(dir, url)

上記スクリプトはダウンロードのみです。。。

アップロードに関しては、Yahoo!ブリーフケース用のアップロード支援ツールで紹介しているようなツールを使えばいいのかな?


アップロードのツール作りはややこしそう。。。

sumidasumida 2008/12/11 22:19 mitsugi-bb さま、

わざわざブログを見つけてくださって、さらには最新情報もお教えいただき、本当にありがとうございました。
http://sumidatomohisa.ameblo.jp/sumidatomohisa/entry-10161122353.html
(なんか宣伝しているみたいでごめんなさい。)

大事に活用させていただきます。

mitsugi-bbmitsugi-bb 2008/12/13 21:38 sumidaさん。コメントありがとうございます。
宣伝はどんどんしちゃってくださいw

sdsd 2008/12/14 23:28 ツール公開ありがとうございます。

当方、自作の音楽(MP3)を友人とブリーフケースにてやり取りしており
今回の突然のブリーフケース有料化とユーザーによる退避対応要請に当惑しておったところ、
当該ツールを発見し、非常に重宝し使用させて頂いております。

ところで1フォルダ直下に15ファイル以上ある場合、
16ファイル目以降のファイルをダウンロードできないようですが、
このようなケースに対応頂けないでしょうか?

不躾な質問となり、大変申し訳ございませんが、
ご検討の程、宜しくお願いいたします。

mitsugi-bbmitsugi-bb 2008/12/15 23:55 sdさん。コメントとバグの報告ありがとうございます。
残念ながら、当方でバグの再現が難しい為、対応できません。

私のところに画像ファイルを70個置いてあるフォルダがあるのですが、正常にダウンロードできてしまいました。

また、フォルダ名に"("(半角右括弧)が含まれるとダウンロードがとまるという事をid:t_ash20さんにブログにて教えていただいたのですが、こちらでも再現できない(DLできてしまう。)為、対応できていないです。

また、どのような現象が起きているのかを詳しく教えていただけるとありがたいです。
エラーが起きていないか。出力されている文字に異変はないか等です。

よろしくお願いします。

t_ash20t_ash20 2008/12/16 09:45 こんにちは。スクリプト、たいへん重宝させていただいています。

私のアカウントはすでにアップロードができなくなっており、
またすべての当該文字”(”を手作業で置換してしまったので、
再現はできないのですが、当該文字が含まれている場合、
コマンドプロンプトにてエラーが出て、
以降のダウンロードが進みませんでした。
エラーの内容まではちょっと覚えていません。
出力されている文字に異変はなかったと思います。

断片的な情報ですみませんが、よろしくお願いします。

mitsugi-bbmitsugi-bb 2008/12/17 00:15 t_ash20さん初めまして。日記にコメントできないまま勝手にリンク等を貼ってしまったことをお許しください。

当該文字”(”の件なのですが、
エラーがでるのか読み飛ばされるのかすら原因の切り分けができていなかった為、
コマンドプロンプトにてエラーが出たという情報だけでも有益です。
ありがとうございます。

少し修正してみます。

sdsd 2009/01/04 13:33 お久しぶりです。
以前、ツールの件で書き込みさせて頂いた者です。

16ファイル目以降のダウンロードが出来ない件ですが、
ブリーフケースで「全て表示」のページリンクを取得して
リンクの配列に入れてダウンロードをしよう等と
ソースの一部に手を加えてみましたが、うまくいかず断念しました。
(何がうまく行っていないのかも分からない程のセンスの無さで…)
とりあえずurlに「全て表示」で表示されるページのアドレスを直切りして
フォルダ毎にダウンロードしました。

結果は22ID,67フォルダ,661ファイル,836MB,作業日4日程で作業完了しました。
改めましてツール提供ありがとうございました。

mitsugi-bbmitsugi-bb 2009/01/04 20:31 sdさん。お久しぶりです。
661ファイルのダウンロードお疲れ様です。
22IDは凄いですね。ビックリです。
私的に、661ファイルのその後の行方が少し気になりますね。
今後も共有するのであればGmailで共有がオススメと思います。
1ファイルあたりの容量もブリーフケースより大きいですし。
くれぐれも規約違反にはご注意ください。

kk 2009/02/01 15:07 ダウンロードツール作りました。
必要な方はどうぞ。
http://blog.livedoor.jp/pclabo/archives/51548054.html

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


画像認証