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の導入
Rubyは Ruby Installer のページから Ruby 1.9.3-p448 をゲットしてインストールしました。あとはテキストエディターでコードを書いて実行するだけ。簡単ですね~。
ヤマレコダウンローダー
ヤマレコはxoopsをベースにし、PHPとjavascriptによる動的なサイトです。汎用のダウンローダーでは動作の再現が困難です。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による写真のスライドショーが動かず、これの解析に相当時間を費やしました。現時点では標高グラフの描画が全くできていないので、これから解析してみたいと思います。
ヤマレコの山行記録を一括ダウンロードするプログラム ヤマレコダウンローダー
Rubyをインストールしなくても動作するexe版を公開しました。ダウンロードページは こちら です。(2013/11/30 追記)
ヤマレコの山行記録を一括ダウンロードするプログラムを作ってみました。インストールの手順と注意点を説明します。
<インストール>
・このプログラムはRubyで書いてあるので、Rubyの実行環境をインストールする必要があります。
・Rubyのインストールページから、特に理由がない限り Ruby 1.9.3-p448をダウンロードして下さい。(15MBくらいと軽量です)
・これを実行してインストールしますが、次のページでチェックボックスを全てチェックしてください。
・次にプログラムをダウンロードします。
(プログラムはテキストエディターで読むことができます)
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 のインストール
- CentOSのミラーサイトリストから例えば IIJ の HTTP を選んでバージョン6.2のisosのx86_64へ進みます。ここから CentOS-6.2-x86_64-LiveDVD.iso をダウンロードします。
- VMware を起動して、新規仮想マシンの作成をクリックしてインストーラディスクイメージファイルを選択して参照ボタンでダウンロードした .iso ファイルを指定します。
- 次へ進んでいき、OSの種類とか指定していきます。
- CentOSの仮ログインの画面が出ます。自動ログインまで30秒くらいでしょうか。この時に言語を日本語に指定します。もたもたしていると自動ログインしてしまいますが、この場合は最初からやり直しです。
- デフォルトの管理者として 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
・ApacheとMySQLを自動起動にする
# 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
・MySQLのSQL文の最大長を拡大する
# 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 のモジュールにする手順
- kohana/modules/zend/classes/zend フォルダを作成する。
- ZF の Paginator.php と Paginator/ フォルダをここにコピーする。
- NetBeans などで全ファイルに対して下記の置換を行う。
require_once → // require_once - 続いて下記の置換を行う。今度は正規表現。
new Zend_.+Exception → new Exception - Paginator.php をちょっといじります。
・view関係、db関係の機能は使わないので、削除したり改造する。
・ページネーションのスタイルをオートロードしている部分を改造する。
詳細はこちらを参照。
尚、Mail の方は次のファイルとフォルダーに対して、上記1~4と同様の作業だけで動きました。
Mail.php と Mail/
Mime.php と Mime/
SMTP サーバーへの送信テストしかしていません。require_once しているファイルを見れば理解できますが、使えない機能があるはずです。
7月7日追記:
Windows では上記でOKですが、Linux の場合は全てのフォルダとファイルの名前を小文字にしないと動きません。
kohanaPressを無料レンタルサーバーで動かしてみました
kohanaPress を @pages という無料レンタルサーバーで動かしてみました。このチャレンジは実に面白かったし、勉強になりました。このサイトは PHP がセーフモードであるという難点がありますが、そもそも PHP と MySQL が使えるし、Imagick を介して ImageMagick も使えます。これって無料にしては凄いんじゃないかと思います。
で、作った kohanaPress のブログはこちら → http://bit.ly/KSJ8Hc
オリジナルのサンプルコードはgitHub → http://bit.ly/KiUSjw
この手の共用サーバーではサンプルコードの通りでは動きません。サーバーから見たドキュメントルートとユーザーに与えられたドキュメントルートが違っていたり、フォルダの所有権に関して気難しかったりして、簡単には動いてくれないんですね。この難関を克服する努力をすると、相当勉強になると思います。
kohanaPress を公開するに当たり自宅サーバーを運用しようかとも思いましたが、電気代ももったいないし、このご時世ですから節電のために無料レンタルサーバーを採用させて頂きました・・・(^^;;;