dari88's diary

これから趣味にするプログラミング/PHP/javascript/kohana/CMS/web design/

MacにRuby1.9.3をインストールしてヤマレコダウンローダーを実行する手順

 Mac(マック)にRuby 1.9.3 をインストール(アップデート)する手順と、ヤマレコダウンローダーを実行する手順です。

 

<手順>
・全てroot権限で実行しています。
・コンソール(端末?)を開いて、以下のコマンドを入力して実行します。
・先ずはRVMをインストールします。
 [root@localhost ~]# \curl -L https://get.rvm.io | bash

・rootのホームにある .bashrc に以下の行を追加します。

# RVM
[ -s ${HOME}/.rvm/scripts/rvm ] && source ${HOME}/.rvm/scripts/rvm

   注意: .bashrc は隠しファイルなっているかもしれないので、[表示]-[隠しファイルを表示する]で表示します。で、これを選択して[geditで開く]みたいなので開いて編集して保存します。

・.bashrcを度読み込ませます。
 [root@localhost ~]# source ~/.bash_profile

・RVMを最新にします
 [root@localhost ~]# rvm get head
 [root@localhost ~]# rvm get latest

Ruby1.9.3をインストールします。
 [root@localhost ~]# rvm install 1.9.3

・インストールを確認します。
 [root@localhost ~]# ruby -v

・山行記録を保存するフォルダーを作成し、ダウンロードした YamarecoDownloader.rb をそこに移動します。

・コンソールにて
 [root@localhost ~]# cd Yamareco
 みたいにして、山行記録を保存するフォルダーに移動します。

・YamarecoDownloader.rbを実行します。
 [root@localhost Yamareco]# ruby YamarecoDownloader.rb


 以上で手順は終わりです。これで完璧に動作し、山行記録をダウンロードすることが出来ました。
 

ヤマレコダウンローダー V1.5

 ヤマレコの山行記録を一括でダウンロードするプログラム YamarecoDownloader のバージョンアップはV1.5まで進みました。枯れてきた感じがしますので、Rubyのコードを公開しておきます。

主な改善点

 V1.0以降の主な改善点は以下の通りです。

・HTTPヘッダに"User-Agent"を追加した。
・サイトにファイルが無いとopen(url)がエラーを発生することの対策。
・エラー時に空ファイルが書き込まれるので、open(file)とopen(url)の順番を入れ替え。
・コンソールに日本語表示。
・サーバーの負荷軽減対策。取得済みの山行記録は飛ばす、取得済みのパーツ画像は飛ばす。結果的に少し高速化。
・特定の山行記録だけを取得するコマンドを追加。
・src = " abc/def " などの記述におけるスペース" "有無等の配慮で、正規表現を見なおした。
・山行記録が1ページ分に満たない場合の対策。

ヤマレコダウンローダー V1.5

 コードです。

#! ruby -Ku
#
# YamarecoDownloader V1.5 (c)dari88@yamareco 2013/11/21
#

require "open-uri"


# proxyを使う場合は2個目のoptionsの頭に#を
proxy_host = "http://your.proxy.jp:8080"
proxy_user = "username"
proxy_passwd = "password"
options = {:proxy_http_basic_authentication => [proxy_host,proxy_user,proxy_passwd],
  "User-Agent" => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0" }
options = {:proxy => nil,"User-Agent" => "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:25.0) Gecko/20100101 Firefox/25.0"}

def fget(url,dirName,filePath,options,ow=0)
  if File.exist?(filePath)&&(ow==0)
    print "."
  else
    FileUtils.mkdir_p(dirName) unless File.exist?(dirName)
    begin
      open(url,options) do |data|
        open(filePath, 'wb') do |output|
          output.write(data.read)
        end
      end
      print "*"
    rescue
      print "x"
    end
  end
end

def yamaget(yamaid,options)
  test=0

  # yamaidのHTML取得
  if (test==1) ; print "HTML start","\n" ; end
  fid = yamaid[0..(yamaid.length-5)]
  url = "http://www.yamareco.com/modules/yamareco/detail-" + yamaid + ".html"
  html = open(url,options).read

  # 原画取得とパスの変更
  if (test==1) ; print "原画 start","\n" ; end
  html = html.gsub(/(http:\/\/yamareco.info\/modules\/yamareco\/include\/tmp_imgresize.*?fname=)(\w*\.jpg|\w*\.JPG)/) do |match|
    url="http://yamareco.info/modules/yamareco/upimg/"+fid+"/"+yamaid+"/"+$2
    fileName = File.basename(url)
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # サムネイル原画取得とパスの変更
  if (test==1) ; print "サムネイル start","\n" ; end
  html = html.gsub(/(http:\/\/yamareco.info\/modules\/yamareco\/upimg\/#{fid}\/#{yamaid}\/)(t_\w*\.jpg|t_\w*\.JPG)/) do |match|
    url="http://yamareco.info/modules/yamareco/upimg/"+fid+"/"+yamaid+"/"+$2
    fileName = File.basename(url)
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # 元サイズへのパスの変更
  html = html.gsub(/(http:\/\/yamareco.info\/modules\/yamareco\/upimg\/\d+\/\d+\/)(\w*\.jpg|\w*\.JPG)/) do |match|
    dirName = "yama"+yamaid
    "./" + dirName +"/"+ $2
  end

  # js取得とパスの変更
  if (test==1) ; print "JS start","\n" ; end
  html = html.gsub(/(http:\/\/www\.yamareco\.com\/|http:\/\/yamareco\.info\/)([^"']*\/([^"']*?\.js))/) do |match|
    url="http://yamareco.info/"+$2
    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options,ow=1)
    "./" + filePath
  end
  html = html.gsub(/src *= *" *(include\/cheer.js) *"/) do |match|
    url="http://yamareco.info/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options,ow=1)
    'src="./' + filePath + '"'
  end
  print "\n"

  # swf取得とパスの変更
  if (test==1) ; print "SWF start","\n" ; end
  html = html.gsub(/(include\/ofc\/open-flash-chart.swf)/) do |match|
    url="http://yamareco.info/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # css及びその画像取得とパスの変更
  if (test==1) ; print "CSS start","\n" ; end
  html = html.gsub(/http:\/\/yamareco\.info[^"']*?\/(.*?\.css)/) do |match0|
    url0=match0
    if (test==1) ; print url0,"\n" ; end
    fileName0 = File.basename(url0)
    dirName0 = "script"
    filePath0 = dirName0 +"/"+ fileName0
    FileUtils.mkdir_p(dirName0) unless File.exist?(dirName0)
    open(filePath0, 'wb') do |output|
      open(url0,options) do |data|
        css = data.read
        output.write(css)

        css.scan(/url *\( *( *[^)]+?\.(png|gif))/) do |match|
          url2=$1.gsub(/["' ]/,"")
          url=File.dirname(url0)+"/"+url2
          fileName = File.basename(url)
          dirName = "script/"+File.dirname(url2)
          filePath = dirName +"/"+ fileName
          fget(url,dirName,filePath,options)
        end
        
      end
    end
    print "\n"
    "./" + filePath0
  end

  # gif,png取得1とパスの変更
  if (test==1) ; print "GIF/PNG1 start","\n" ; end
  before=""
  html = html.gsub(/src *= *["'] *([^"':]*?\.(gif|png)) *(["'])/) do |match|
    url="http://yamareco.info/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "src=" + $3 + "./" + filePath + $3
  end
  print "\n"

  # gif,png取得2とパスの変更
  if (test==1) ; print "GIF/PNG2 start","\n" ; end
  before=""
  html = html.gsub(/(http:\/\/yamareco\.info\/|http:\/\/www\.yamareco\.com\/)([^"']*?\.(gif|png))/) do |match|
    url="http://yamareco.info/"+$2
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # jpg取得とパスの変更
  if (test==1) ; print "JPG start","\n" ; end
  html = html.gsub(/http:\/\/www.yamareco[^"']*?\.(jpg|JPG)/) do |match|
    url=match
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # gpx,xml取得とパスの変更
  if (test==1) ; print "GPX/XML start","\n" ; end
  html = html.gsub(/= *["'] *([^"':]*?\.(gpx|xml)) *["']/) do |match|
    url="http://www.yamareco.com/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options,ow=1)
    '="./' + filePath + '"'
  end
  print "\n"

  # グラフ用ファイル取得とパスの変更
  if (test==1) ; print "グラフデータ start","\n" ; end
  html = html.gsub(/include%2Fofc%2Fofc_gendata_line.php%3Fdid%3D(\d+?)%26xmode%3Ddistance/) do |match|
    url="http://yamareco.info/modules/yamareco/include/ofc/ofc_gendata_line.php?did="+$1+"&xmode=distance"
    fileName = "gendata"+$1+".dat"
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options,ow=1)
    "./" + filePath
  end
  print "\n"

  # 添付ファイル取得とパスの変更
  if (test==1) ; print "添付ファイル start","\n" ; end
  html = html.gsub(/(showfile\.php\?fid=(\d+?)) *(["']) *> *([^<]+?(\.\w+?)) *</) do |match|
    url="http://www.yamareco.com/modules/yamareco/"+$1
    fileName = $4
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ "file"+$2+$5
    fget(url,dirName,filePath,options,ow=1)
    "./" + filePath + $3 + ">"+$4+"<"
  end
  print "\n"

  # HTML書き込み
  fileName = "yama"+yamaid+".html"
  dirName = "."
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless File.exist?(dirName)
  open(filePath, 'wb') do |output|
    output.write(html)
  end

  # jsの書き換え
  if File.exist?(filePath="script/highslide.config.js")
    open(filePath,"r") do |output|
      js = output.read.encode("EUC-JP","EUC-JP")
      js=js.sub(/include\/highslide\/graphics\//,"script/graphics/")
      open(filePath,"w") do |output|
        output.write(js)
      end
    end
  end

  if File.exist?(filePath="script/highslide-with-gallery_mod.js")
    open(filePath,"r") do |output|
      js = output.read
      js=js.sub(/highslide\/graphics\//,"script/graphics/")
      open(filePath,"w") do |output|
        output.write(js)
      end
    end
  end

  # その他パーツの取得
  if (test==1) ; print "その他パーツ start","\n" ; end
  def partget(url,dirName,options)
    fileName = File.basename(url)
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
  end

  url = "http://yamareco.info/modules/yamareco/include/highslide/graphics/outlines/custom.png"
  dirName = "script/graphics/outlines"
  partget(url,dirName,options)

  url = "http://yamareco.info/modules/yamareco/include/highslide/graphics/zoomin.cur"
  dirName = "script/graphics"
  partget(url,dirName,options)

  url = "http://yamareco.info/modules/yamareco/include/highslide/graphics/zoomout.cur"
  dirName = "script/graphics"
  partget(url,dirName,options)

  print "\n"

end
# defの終わり

def allget(mode,options)
  test=0

  print "ユーザー番号を入力して下さい: "
  uid = STDIN.gets.match(/\d+/)
  uid = uid[0]
  print "UID: "+uid,"\n"

  url = "http://www.yamareco.com/modules/yamareco/userinfo-"+uid+"-data.html"

  # WEBサイト取得
  if (test==1) ; print "ALL start","\n" ; end
  index = open(url,options).read
  $lastpage=1
  index.match(/href=userinfo.php\?pnum=(\d+?)&[^>]+?go to last page/) do |match|
    $lastpage=$1.to_i
  end

  $table=""
  for pnum in 1..$lastpage do
    url = "http://www.yamareco.com/modules/yamareco/userinfo.php?pnum=#{pnum}&act=data&req_uid=#{uid}"
    index = open(url,options).read
    index.match(/<table>.*?<\/table>/m) do |match|
      $top=$`
      $table+=$&
      $bottom=$'
    end
  end
  index=$top+$table+$bottom

  # サムネイル原画取得とパスの変更
  if (test==1) ; print "サムネイル start","\n" ; end
  index = index.gsub(/(http:\/\/www\.yamareco\.com\/include\/imgresize\.php[^"']*?)(t_\w*\.jpg|t_\w*\.JPG)/) do |match|
    url=URI.decode(match.sub(/amp;/,""))
    fileName = File.basename(url)
    dirName = "index"+uid
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # yamaへのパスの変更及びyamagetの呼び出し
  index = index.gsub(/http:\/\/www\.yamareco\.com\/modules\/yamareco\/detail-(\d+?)\.html/) do |match|
    "./yama" + $1 + ".html"
  end
  index = index.gsub(/detail-(\d+?)\.html/) do |match|
    yamaid=$1
    if (mode=="all")
      print "GET: yama" + yamaid , "\n"
      yamaget(yamaid,options)
    else
      fileName = "yama" + yamaid +".html"
      if (File.exist?(fileName))
        #do nothing
      else
        print "GET: yama" + yamaid , "\n"
        yamaget(yamaid,options)
      end
    end
    "./yama" + yamaid + ".html"
  end

  # css及びその画像取得とパスの変更
  if (test==1) ; print "CSS start","\n" ; end
  index = index.gsub(/http:\/\/yamareco\.info[^"']*?\/(.*?\.css)/) do |match0|
    url0=match0
    if (test==1) ; print url0,"\n" ; end
    fileName0 = File.basename(url0)
    dirName0 = "script"
    filePath0 = dirName0 +"/"+ fileName0
    FileUtils.mkdir_p(dirName0) unless File.exist?(dirName0)
    open(filePath0, 'wb') do |output|
      open(url0,options) do |data|
        css = data.read
        output.write(css)

        css.scan(/url *\( *( *[^)]+?\.(png|gif))/) do |match|
          url2=$1.gsub(/["' ]/,"")
          url=File.dirname(url0)+"/"+url2
          fileName = File.basename(url)
          dirName = "script/"+File.dirname(url2)
          filePath = dirName +"/"+ fileName
          fget(url,dirName,filePath,options)
        end
        
      end
    end
    print "\n"
    "./" + filePath0
  end

  # gif,png取得1とパスの変更
  if (test==1) ; print "GIF/PNG1 start","\n" ; end
  before=""
  index = index.gsub(/src *= *["'] *([^"':]*?\.(gif|png)) *(["'])/) do |match|
    url="http://yamareco.info/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "src=" + $3 + "./" + filePath + $3
  end
  print "\n"

  # gif,png取得2とパスの変更
  if (test==1) ; print "GIF/PNG2 start","\n" ; end
  before=""
  index = index.gsub(/(http:\/\/yamareco\.info\/|http:\/\/www\.yamareco\.com\/)([^"']*?\.(gif|png))/) do |match|
    url="http://yamareco.info/"+$2
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    fget(url,dirName,filePath,options)
    "./" + filePath
  end
  print "\n"

  # HTML書き込み
  fileName = "index"+uid+".html"
  dirName = "."
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless File.exist?(dirName)
  open(filePath, 'wb') do |output|
    output.write(index)
  end

end
# defの終わり

print "<YamarecoDownloader V1.5 (c)dari88@yamareco>","\n","\n"
print "Enterキーでダウンロードを開始します(標準は未取得の山行記録のみ)","\n"
print "・全ての山行記録を取得する場合は all と入力して下さい","\n"
print "・特定の山行記録だけを取得する場合は山行記録の番号を入力して下さい","\n"
print "Enter> "
mode = STDIN.gets.match(/\w*/)
mode = mode[0]
print "\n"

if (mode == "")
  allget(mode,options)
end

mode.match(/all/) do |match|
  allget(mode,options)
end

mode.match(/\d+/) do |match|
  yamaid = mode
  yamaget(yamaid,options)
end

exit=0
while (exit==0)
  print "プログラムを終了する場合はEnterキーを押して下さい","\n"
  print "・再度特定の山行記録だけを取得する場合は山行記録の番号を入力して下さい","\n"
  print "Enter> "
  mode = STDIN.gets.match(/\d*/)
  mode = mode[0]
  print "\n"
  if (mode=="")
    exit=1
  else
    yamaid = mode
    yamaget(yamaid,options)
  end
end
print "終了します","\n"
sleep(1)

 

 

ヤマレコ山行記録のダウンローダーをRubyで書いてみた

 登山の記録はヤマレコに投稿しています。既に100件以上投稿していますが、何らかの理由で記録が使えなくなったら問題です。そこでヤマレコ専用のダウンローダーを作ってみました。

 言語はお手軽に書けそうなRubyを選択。初めてのRubyプログラミングですが、やりたい事をネットのリファレンスとかで調べて書いたら動きました。非常に敷居が低い言語ですね、驚きました。

 

Rubyの導入

 RubyRuby Installer のページから Ruby 1.9.3-p448 をゲットしてインストールしました。あとはテキストエディターでコードを書いて実行するだけ。簡単ですね~。

 

ヤマレコダウンローダ

 ヤマレコはxoopsをベースにし、PHPjavascriptによる動的なサイトです。汎用のダウンローダーでは動作の再現が困難です。firebugを使って構造を丹念に調べてダウンロードする必要があります。今回はバージョン1.0ということで、完全な再現はできていませんが公開してみます。

・YamarecoDownloader V1.0

#
# YamarecoDownloader V1.0 (c)dari88@yamareco 2013/11/16
#

require "open-uri"


# proxyを使う場合は2個目のoptionsの頭に#を
proxy_host = "http://your.proxy.jp:8080"
proxy_user = "username"
proxy_passwd = "password"
options = {:proxy_http_basic_authentication => [proxy_host,proxy_user,proxy_passwd] }
options = {:proxy => nil}


def yamaget(yamaid,options)

  # yamaidのHTML取得
  fid = yamaid[0..(yamaid.length-5)]
  url = "http://www.yamareco.com/modules/yamareco/detail-" + yamaid + ".html"
  html = open(url,options).read

  # 原画取得とパスの変更
  html = html.gsub(/(http:\/\/yamareco.info\/modules\/yamareco\/include\/tmp_imgresize.*fname=)(\w*\.jpg|\w*\.JPG)/) do |match|

    url="http://yamareco.info/modules/yamareco/upimg/"+fid+"/"+yamaid+"/"+$2
    # print url,"\n"

    # ready filepath
    fileName = File.basename(url)
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName

    # create folder if not exist
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)

    # write data
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end

    print "*"
    "./" + filePath
  end
  print "\n"

  # サムネイル原画取得とパスの変更
  html = html.gsub(/(http:\/\/yamareco.info\/modules\/yamareco\/upimg\/#{fid}\/#{yamaid}\/)(t_\w*\.jpg|t_\w*\.JPG)/) do |match|
    url="http://yamareco.info/modules/yamareco/upimg/"+fid+"/"+yamaid+"/"+$2
    fileName = File.basename(url)
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"

  # 元サイズへのパスの変更
  html = html.gsub(/(http:\/\/yamareco.info\/modules\/yamareco\/upimg\/\d+\/\d+\/)(\w*\.jpg|\w*\.JPG)/) do |match|
    dirName = "yama"+yamaid
    "./" + dirName +"/"+ $2
  end


  # js取得とパスの変更
  html = html.gsub(/(http:\/\/[^"']*?\.js)/) do |match|
    url=$1
    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"
  html = html.gsub(/src="(include\/cheer.js)"/) do |match|
    #  url="http://www.yamareco.com/modules/yamareco/"+$1
    url="http://yamareco.info/modules/yamareco/"+$1

    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    'src="./' + filePath + '"'
  end
  print "\n"

  # swf取得とパスの変更
  html = html.gsub(/(include\/ofc\/open-flash-chart.swf)/) do |match|
    url="http://yamareco.info/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"

  # css及びその画像取得とパスの変更
  html = html.gsub(/http:\/\/[^"']*?\.css/) do |match|
    url=match
    fileName = File.basename(url)
    dirName = "script"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        css = data.read
        output.write(css)

        css.scan(/url\*1/) do |match2|
          url2 = $1.gsub('"',"")
          fileName2 = File.basename(url2)
          dirName2 = "script/"+File.dirname(url2)
          filePath2 = dirName2 +"/"+ fileName2
          FileUtils.mkdir_p(dirName2) unless FileTest.exist?(dirName2)
          url3=File.dirname(url)+"/"+url2
          open(filePath2, 'wb') do |output2|
            begin
              open(url3,options) do |data2|
                output2.write(data2.read)
              end
            rescue
              print "x"
              next
            end
          end
        end
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"


  # gif,png取得とパスの変更
  html = html.gsub(/(http:\/\/yamareco|http:\/\/www\.yamareco)[^"']*?\.(gif|png)/) do |match|
    url=match
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"


  # さらにgif,png取得とパスの変更
  html = html.gsub(/src=["']([^:\.]*?\.(gif|png))(["'])/) do |match|
    url="http://yamareco.info/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      begin
        open(url,options) do |data|
          output.write(data.read)
        end
      rescue
        print "Not found: ",url,"\n"
        next
      end
    end
    print "*"
    "src=" + $3 + "./" + filePath + $3
  end
  print "\n"


  # jpg取得とパスの変更
  html = html.gsub(/http:\/\/www.yamareco[^"']*\.(jpg|JPG)/) do |match|
    url=match
    fileName = File.basename(url)
    dirName = "images"
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"

  # gpx,xml取得とパスの変更
  html = html.gsub(/= *?["']([^"':]*?\.(gpx|xml))["']/) do |match|
    url="http://www.yamareco.com/modules/yamareco/"+$1
    fileName = File.basename(url)
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    '="./' + filePath + '"'
  end
  print "\n"

  # グラフ用ファイル取得とパスの変更
  html = html.gsub(/include%2Fofc%2Fofc_gendata_line.php%3Fdid%3D(\d+?)%26xmode%3Ddistance/) do |match|
    url="http://yamareco.info/modules/yamareco/include/ofc/ofc_gendata_line.php?did="+$1+"&xmode=distance"
    fileName = "gendata"+$1+".dat"
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath
  end
  print "\n"


  # 添付ファイル取得とパスの変更
  html = html.gsub(/(showfile\.php\?fid=(\d+?))(["'])>(.+?(\.[^.]+?))</) do |match|
    url="http://www.yamareco.com/modules/yamareco/"+$1
    fileName = $4
    dirName = "yama"+yamaid
    filePath = dirName +"/"+ "file"+$2+$5
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
    "./" + filePath + $3 + ">"+$4+"<"
  end
  print "\n"


  # HTML書き込み
  fileName = "yama"+yamaid+".html"
  dirName = "."
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
  open(filePath, 'wb') do |output|
    output.write(html)
  end

  # jsの書き換え
  open("script/highslide.config.js","r") do |output|
    js = output.read.encode("EUC-JP","EUC-JP")
    js=js.sub(/include\/highslide\/graphics\//,"script/graphics/")
    open("script/highslide.config.js","w") do |output|
      output.write(js)
    end
  end

  open("script/highslide-with-gallery_mod.js","r") do |output|
    js = output.read
    js=js.sub(/highslide\/graphics\//,"script/graphics/")
    open("script/highslide-with-gallery_mod.js","w") do |output|
      output.write(js)
    end
  end

  # その他パーツの取得
  def partget(url,dirName,options)
    fileName = File.basename(url)
    filePath = dirName +"/"+ fileName
    FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
    open(filePath, 'wb') do |output|
      open(url,options) do |data|
        output.write(data.read)
      end
    end
    print "*"
  end

  url = "http://yamareco.info/modules/yamareco/include/highslide/graphics/outlines/custom.png"
  dirName = "script/graphics/outlines"
  partget(url,dirName,options)

  url = "http://yamareco.info/modules/yamareco/include/highslide/graphics/zoomin.cur"
  dirName = "script/graphics"
  partget(url,dirName,options)

  url = "http://yamareco.info/modules/yamareco/include/highslide/graphics/zoomout.cur"
  dirName = "script/graphics"
  partget(url,dirName,options)

  print "\n"

end #++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++defの終わり



#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++indexの始まり

print "Enter your yamareco user number.: "
uid = STDIN.gets.match(/\d+/)
uid = uid[0]
print "UID: "+uid,"\n"


url = "http://www.yamareco.com/modules/yamareco/userinfo-"+uid+"-data.html"

# WEBサイト取得
index = open(url,options).read

index.match(/href=userinfo.php\?pnum=(\d+?)&[^>]+?go to last page/) do |match|
  $lastpage=$1.to_i
end

$table=""
for pnum in 1..$lastpage do
  url = "http://www.yamareco.com/modules/yamareco/userinfo.php?pnum=#{pnum}&act=data&req_uid=#{uid}"
  index = open(url,options).read
  index.match(/<table>.*?<\/table>/m) do |match|
    $top=$`
    $table+=$&
    $bottom=$'
  end
end
index=$top+$table+$bottom


# サムネイル原画取得とパスの変更
index = index.gsub(/(http:\/\/www\.yamareco\.com\/include\/imgresize\.php.*?)(t_\w*\.jpg|t_\w*\.JPG)/) do |match|
  
  url=URI.decode(match.sub(/amp;/,""))
  fileName = File.basename(url)
  dirName = "index"+uid
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
  open(filePath, 'wb') do |output|
    open(url,options) do |data|
      output.write(data.read)
    end
  end
  print "*"
  "./" + filePath
end
print "\n"

# yamaへのパスの変更及びyamagetの呼び出し
index = index.gsub(/http:\/\/www\.yamareco\.com\/modules\/yamareco\/detail-(\d+?)\.html/) do |match|
  "./yama" + $1 + ".html"
end
index = index.gsub(/detail-(\d+?)\.html/) do |match|
  yamaid=$1
  "./yama" + yamaid + ".html"
  yamaget(yamaid,options)
  print "GET: yama" + yamaid , "\n"
end

# css及びその画像取得とパスの変更
index = index.gsub(/http:\/\/[^"']*?\.css/) do |match|
  url=match
  fileName = File.basename(url)
  dirName = "script"
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
  open(filePath, 'wb') do |output|
    open(url,options) do |data|
      css = data.read
      output.write(css)

      css.scan(/url\*2/) do |match2|
        url2 = $1.gsub('"',"")
        fileName2 = File.basename(url2)
        dirName2 = "script/"+File.dirname(url2)
        filePath2 = dirName2 +"/"+ fileName2
        FileUtils.mkdir_p(dirName2) unless FileTest.exist?(dirName2)
        url3=File.dirname(url)+"/"+url2
        open(filePath2, 'wb') do |output2|
          begin
            open(url3,options) do |data2|
              output2.write(data2.read)
            end
          rescue
            print "x"
            next
          end
        end
      end
    end
  end
  print "*"
  "./" + filePath
end
print "\n"


# gif,png取得とパスの変更
index = index.gsub(/(http:\/\/yamareco|http:\/\/www\.yamareco)[^"']*?\.(gif|png)/) do |match|
  url=match
  fileName = File.basename(url)
  dirName = "images"
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
  open(filePath, 'wb') do |output|
    open(url,options) do |data|
      output.write(data.read)
    end
  end
  print "*"
  "./" + filePath
end
print "\n"


# さらにgif,png取得とパスの変更
index = index.gsub(/src=["']([^:\.]*?\.(gif|png))(["'])/) do |match|
  url="http://yamareco.info/modules/yamareco/"+$1
  fileName = File.basename(url)
  dirName = "images"
  filePath = dirName +"/"+ fileName
  FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)
  open(filePath, 'wb') do |output|
    begin
      open(url,options) do |data|
        output.write(data.read)
      end
    rescue
      print "Not found: ",url,"\n"
      next
    end
  end
  print "*"
  "src=" + $2 + "./" + filePath + $2
end
print "\n"


# HTML書き込み
fileName = "index"+uid+".html"
dirName = "."
filePath = dirName +"/"+ fileName

FileUtils.mkdir_p(dirName) unless FileTest.exist?(dirName)

open(filePath, 'wb') do |output|
  output.write(index)
end

print "YamarecoDownloader: Mission accomplished.","\n\n"


 

 500行に満たないコードですが、作るのに一週間ほど要しました。HighSlideによる写真のスライドショーが動かず、これの解析に相当時間を費やしました。現時点では標高グラフの描画が全くできていないので、これから解析してみたいと思います。

 

 

*1:.+?\.(png|gif

*2:.+?\.(png|gif

ヤマレコの山行記録を一括ダウンロードするプログラム ヤマレコダウンローダー

 Rubyをインストールしなくても動作するexe版を公開しました。ダウンロードページは こちら です。(2013/11/30 追記)


 

 ヤマレコの山行記録を一括ダウンロードするプログラムを作ってみました。インストールの手順と注意点を説明します。

 

<インストール>

・このプログラムはRubyで書いてあるので、Rubyの実行環境をインストールする必要があります。

Rubyのインストールページから、特に理由がない限り Ruby 1.9.3-p448をダウンロードして下さい。(15MBくらいと軽量です)

・これを実行してインストールしますが、次のページでチェックボックスを全てチェックしてください。

f:id:dari88:20131116174142g:plain

 

・次にプログラムをダウンロードします。
 (プログラムはテキストエディターで読むことができます)

  YamarecoDownloader.rb  V1.7  2013/11/29

・ヤマレコの記録を保存するファオルダーを決めて、そこにこのプログラムを移します。

・ヤマレコのユーザー番号を調べてください。これはユーザーIDではありません。
 マイページの山行記録を開きます。ブラウザの上部にURLが表示されているはずです。URLが http://www.yamareco.com/modules/yamareco/userinfo-12345-data.html であれば、ユーザー番号は12345です。

・YamarekoDownloader.rb を実行するとユーザー番号を聞かれますので、数値を入力してください。(番号が4桁の人は4桁で入力します。)

・プログラムが終了したら、フォルダーに作成された index12345.html みたいな名前のファイルを開いてください。

 

<注意事項等>

・プログラムはログインしません。従って、一般公開されていない山行記録があるとこれを取得できません。全て一般公開してから実行してください。

・ヤマレコのサイト側で仕様変更が行われると山行記録の再現性が悪化する可能性があります。

・ユーザーが投稿した内容は確実にフォルダーに保管されます。
  記事本文
  写真の原画とサムネイル
  GPXデータ
  添付ファイル

・サイト側が提供している機能面の再現は不完全です。ブラウザで開くだけでは標高グラフが表示されませんが、PCに簡易サーバーを立てて山行記録にアクセスすればちゃんと標高グラフも表示されます。

・山行記録の量によりますが、光回線で100件あたり1時間くらいはかかると思います。

・取得済の山行記録は再取得しません。取得済みの記録を修正した場合は特定の山行記録のみを取得する機能を利用してください。

・ブラウザによってマップ等の見え方が違います。firefoxだとYahooマップ上にルートの赤線も表示されます。chromeだと赤線が表示されません。IEだと、Yahooマップすら表示されません。

・簡易サーバーを導入してサーバー経由でアクセスするとどのブラウザでも全部OKになります。簡易サーバーとしては 04WebServer をオススメします。

 

<Macの場合>

・Macには標準でRubyがインストールされていますが、バージョン1.9.3以上にアップデートして下さい。(1.8系だと正常に動きません)

 手順はここを参照して下さい。

 

<履歴>

V1.7:2013/11/29 マップページの再現等
 ・3D地図、Google Maps、Yahoo!地図、地形図、標高グラフのページを再現
 ・サイト側の過剰アクセス対策に対する対策を追加
 ※ 取得済みの山行記録に反映させるには1回 all モードを実行して下さい。

V1.6:2013/11/25 拍手の再現等
 ・拍手とお気に入りをを再現
 ・マップ上の写真と地名情報を再現
 ・Google AdWords 広告を非表示にした
 ※ 取得済みの山行記録に反映させるには1回 all モードを実行して下さい。

V1.5:2013/11/21 表示の日本語化
 ・デフォルトでは完全取得済みの山行記録をパスする仕様に変更
 ・特定の山行記録のみを再取得する機能を追加
 ・サーバーの負荷を最小限にする対策
 ・山行記録の数が1ページ満たないとエラーとなる点の対策

V1.4:2013/11/18 大勢に影響のない修正

V1.3:2013/11/17 サイト側の変更に伴う修正

V1.2:2013/11/17 Not foudが発生するケースを対策

V1.1:2013/11/17 HTTPヘッダの対策を行なった

V1.0:2013/11/16 初版公開

 

<備考>

 表示している記号の意味は以下のとおりです。

* 今回ファイルを取得した
x サーバーにファイルが無い
. 既にファイルを取得済み

 

XAMPだけでは片手落ち?・・・LAMPも構築してみる

 

 これまで Windows の XAMP 環境で PHP の勉強をしてきたんですけど、何か片手落ちな感じがしてきたので LAMP 環境も構築してみました。

 概要:Windoes7 64bit+VMware+CentOS+Apache+MySQL+PHP5.3

 30年前に Sun の OS を使ったことがあるので、Linux に対しても多少は勘があるとはいえ、慣れ親しんだ Windows とは随分と違うので違和感があります。AMP 部分は yum コマンドでパッケージインストールを使いましたが、どのバージョンがインストールされるのか予め分からない状態で作業を進めたので変な感じがします。

 それでもまあ、比較的簡単に kohana+test12 が動きました。Linax 環境での各種設定も理解できたし大変勉強になったので、メモしておきます。

 

VMware Player のインストール

 VMwareのサイトからソフトをダウンロードしてインストールするだけです。仮想マシンが簡単に作れるのには驚いちゃいますね。

 

CentOS のインストール

  1. CentOSのミラーサイトリストから例えば IIJ の HTTP を選んでバージョン6.2のisosのx86_64へ進みます。ここから CentOS-6.2-x86_64-LiveDVD.iso をダウンロードします。
  2. VMware を起動して、新規仮想マシンの作成をクリックしてインストーラディスクイメージファイルを選択して参照ボタンでダウンロードした .iso ファイルを指定します。
  3. 次へ進んでいき、OSの種類とか指定していきます。
  4. CentOSの仮ログインの画面が出ます。自動ログインまで30秒くらいでしょうか。この時に言語を日本語に指定します。もたもたしていると自動ログインしてしまいますが、この場合は最初からやり直しです。
  5. デフォルトの管理者として root が作られますが、通常のユーザーとして admin とか登録します。

 

LAMP 環境の構築

 CentOS ではフォルダーアイコンを右クリックすると端末の中に開くというメニューがあります。作業はこの端末で行います。

 端末では yum というコマンドを使って、パッケージインストールと呼ばれる手法で LAMP 環境を構築します。

 パッケージを持ってくる先は CentOS にて予めセットしてありますが、不足なので最初にリポジトリを追加しておきます。こうすると、どこから何を拾ってくるのか分からない点が難点です。この点は初心者なので、とりあえず良しとしましょう。

 CentOS では SELinux というセキュリティー強化の仕組みが組み込まれています。よく理解できるまでは使わない設定にした方が分かりやすいと思います。

 では、手順です。作業は root で行います。

・yumのリポジトリ追加
# wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-7.noarch.rpm
# wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
# wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
# rpm -Uvh epel-release-6-7.noarch.rpm remi-release-6.rpm rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

・追加リポジトリは指定しなければ使われないようにする
# gedit /etc/yum.repos.d/epel.repo
enabled=0 ← 1を0に変更
# gedit /etc/yum.repos.d/rpmforge.repo
enabled=0 ← 1を0に変更

Apache,MySQL,PHP,PEAR,phpMyAdminのインストール
# yum --enablerepo=remi,epel,rpmforge install httpd-devel php-devel php-pear mysql-server phpmyadmin -y
# yum --enablerepo=remi,epel,rpmforge install mcrypt
# yum --enablerepo=remi,epel,rpmforge install php-gd
mcryptが無いとphpMyAdminが文句を言う。GDはどうせ使うから追加)

Apacheの設定は、/etc/httpd/conf/httpd.conf
PHPの設定は /etc/php.ini
MySQLの設定は /etc/my.cnf

MySQLのユーザー登録
# service httpd start
# /usr/bin/mysql_secure_installation

phpMyAdminの設定は /usr/share/phpmyadmin/config.inc.php
/etc/httpd/conf.d/phpmyadmin.conf

Apacheの再起動
# service httpd reload

ApacheMySQLを自動起動にする
# chkconfig --list|grep -E "httpd|mysql"
httpd 0:off 1:off 2:off 3:off 4:off 5:off 6:off
mysqld 0:off 1:off 2:off 3:off 4:off 5:off 6:off
# chkconfig httpd on
# chkconfig mysqld on
# chkconfig --list|grep -E "httpd|mysql"
httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
mysqld 0:off 1:off 2:on 3:on 4:on 5:on 6:off

.htaccessを有効にするために、Apacheを設定する
# gedit /etc/httpd/conf/httpd.conf
<Directory "/var/www/html">
Options Indexes FollowSymLinks Includes ExecCGI
AllowOverride All
Order allow,deny
Allow from all
</Directory>

SELinuxを無効にする
# getenforce ← SELinux状態確認
Enforcing ← SELinux有効
# setenforce 0 ← SELinux無効化
# getenforce ← SELinux状態確認
Permissive ← SELinux無効
# gedit /etc/sysconfig/selinux ← SELinux設定ファイル編集
SELINUX=disabled ← システム起動時にSELinuxを無効化

ImageMagickとimagickを追加
# yum --enablerepo=remi,epel,rpmforge install ImageMagick
# convert -version ← ImageMagickの動作確認
# yum --enablerepo=remi,epel,rpmforge install php-pecl-imagick

NetBeansを導入する場合
# yum --enablerepo=remi,epel,rpmforge install php-pecl-xdebug
# gedit /php.d/xdebug.ini
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_host=localhost
xdebug.remote_port=9000

// jdk-7u5-linux-x64.rpm をダウンロードしてくる
# rpm -Uvh jdk-7u5-linux-x64.rpm
# gedit /etc/profile
export JAVA_HOME=/usr/java/default
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

// netbeans-7.1.2-ml-php-linux.sh をダウンロードしてくる
# sh netbeans-7.1.2-ml-php-linux.sh

MySQLSQL文の最大長を拡大する
# gedit /etc/my.cnf
# max_allowed_packet = 20M

ftpサーバーを導入する
# yum --enablerepo=remi,epel,rpmforge install vsftpd
CentOSのファイアウォールを無効にするか、ftpを通すようにする。
VMwareのネットワークアダプタの設定をブリッジにする。
CentOSのシステム設定のネットワーク接続を固定アドレスにする。

 

動作確認

 ドキュメントルート以下に kohana とアプリケーションを入れてサイトを立ち上げました。最初は SELinux がじゃまして ftp は動かないし、フォルダの権限設定も訳の分からない状態でした。当面は SELinux を無効にすることにします。

 フォルダの書き込み設定などで多少引っかかりましたが、kohana のテスト12が無事動くようになりました。

 今後はターゲットファイルのバージョンとかも選択してインストールできるように勉強したいと思います。

Zend Paginator を kohana のモジュールにして使う

 kohana 3.2 にはページネーターの機能がありません。ブログシステムとか作るときにはページネーターが必要ですよね。で、今までは ZF(Zend Framework)を併用していたのですが、Pagenator と Mail しか利用していないのに ZF 全体をインストールしている状態に違和感を感じていました。

 そこで、Paginator を kohana のモジュールにする検討をしてみたのですが、これが相当簡単であることが分かりました。

 そもそも ZF もフォルダ名とファイル名とクラス名に一定の規則を持たせた構造になっています。この構造は kohana と全く同じなんですね。歴史的経緯からすると ZF が先生なんでしょうけど。この構造のお陰で、オートロードが簡単になっているわけです。

 

Zend Paginator を kohana のモジュールにする手順

  1. kohana/modules/zend/classes/zend フォルダを作成する。
  2. ZF の Paginator.php と Paginator/ フォルダをここにコピーする。
  3. NetBeans などで全ファイルに対して下記の置換を行う。
      require_once  →  // require_once
  4. 続いて下記の置換を行う。今度は正規表現
      new Zend_.+Exception  →  new Exception
  5. Paginator.php をちょっといじります。
    ・view関係、db関係の機能は使わないので、削除したり改造する。
    ・ページネーションのスタイルをオートロードしている部分を改造する。
    詳細はこちらを参照。

 尚、Mail の方は次のファイルとフォルダーに対して、上記1~4と同様の作業だけで動きました。

  Mail.php と Mail/
  Mime.phpMime/

 SMTP サーバーへの送信テストしかしていません。require_once しているファイルを見れば理解できますが、使えない機能があるはずです。

 

7月7日追記:

 Windows では上記でOKですが、Linux の場合は全てのフォルダとファイルの名前を小文字にしないと動きません。

 

kohanaPressを無料レンタルサーバーで動かしてみました

 kohanaPress を @pages という無料レンタルサーバーで動かしてみました。このチャレンジは実に面白かったし、勉強になりました。このサイトは PHP がセーフモードであるという難点がありますが、そもそも PHPMySQL が使えるし、Imagick を介して ImageMagick も使えます。これって無料にしては凄いんじゃないかと思います。

  で、作った kohanaPress のブログはこちら → http://bit.ly/KSJ8Hc

  オリジナルのサンプルコードはgitHub → http://bit.ly/KiUSjw

 この手の共用サーバーではサンプルコードの通りでは動きません。サーバーから見たドキュメントルートとユーザーに与えられたドキュメントルートが違っていたり、フォルダの所有権に関して気難しかったりして、簡単には動いてくれないんですね。この難関を克服する努力をすると、相当勉強になると思います。

 kohanaPress を公開するに当たり自宅サーバーを運用しようかとも思いましたが、電気代ももったいないし、このご時世ですから節電のために無料レンタルサーバーを採用させて頂きました・・・(^^;;;