JavaScriptでページ内イメージリンクを一括抽出

いろんなサイトを巡回してると、画像へのリンクと、他のサイトへのリンクが混在しているのをよく見かける。
単に画像だけ見たい私にはとってもうっとうしい。
なので、とりあえずjpegpng形式だけだけど、こんなブックマークレットを作ってみた。
試作段階なので、単純に150x150サイズに縮小して並べているだけです。
今は、クリックすると別ウィンドウで画像が開くようになっているけど、同一画面で拡大とかできたらいいなぁ・・・

javascript:(
	function(d){
		var a = d.getElementsByTagName("a");
		var n = '';
		for(var i=0;i<a.length;i++){
			if (a[i].href.search(/(.jpg)|(.png)/i) != -1) {
				n += "<div style='float:left;'>" 
				  + "<a href='" + a[i].href + "' target='_blank'>" 
				  + "<img src='" + a[i].href + "' width='150' height='150' /></a></div>"; 
	    	}
		}
		d.body.innerHTML = n;
	}
)(document);

bookmarklet makerで簡単にブックマークレットへの変換ができるようです。

Rubyでページ内イメージリンクをまとめてTumblrにPost

あるページにたくさん画像があって、それをまとめてTumblrにポストしたいなと思って作ってみたスクリプト

require 'rubygems'
require 'tumblr'
require 'mechanize'

#tumblrアカウント
email ='foo@hoge.com'
pass = 'password'

#画像取得サイト
siteurl = 'http://www.hogehoge.com/galleries/index.html'
#相対パス用基準URL
baseurl = 'http://www.hogehoge.com/galleries/'


agent = Mechanize.new
agent.user_agent_alias = 'Windows IE 7'
agent.get(siteurl)

#サイトタイトル取得
title = agent.page.title

links = agent.page.links
links.each do |lnk|
  imgurl = lnk.href
  if imgurl =~ /.jpg/
    caption = lnk.text
    if caption == ''
      #画像にaltが設定されていなかったらページタイトルをCaptionとする
      caption = title
    end
    if imgurl !~ /http/
      #相対URLだったら基準URLを付加する
        if imgurl[0,1] == '/'
          imgurl = imgurl[1]
        end
        imgurl = baseurl + imgurl
    end
    begin
      #念のためmechanizeで取得テスト
      agent.get(imgurl)
      #tumblrにアップロード
      Tumblr::API.write(email, pass) do
        photo(imgurl,caption)
        puts 'uploaded : ' + imgurl
      end
    rescue
    end
  end
end

Tumblr画像をRubyでバックアップ

Tumblr画像をバックアップできないかなぁと思ってツールを探してみたのだけれどMac用しか見つからない。
なのでRubyで組んでみた。
もっとうまい組み方とかあるんだろうけどとりあえず動いたのでこれでいいかと・・・

require 'rubygems'
require 'tumblr'
require 'xmlsimple'
require 'mechanize'

#自分のTumblrアドレス
tmb = 'hoge.tumblr,com'
#保存先フォルダ
savepath = ENV["HOME"] + 'tumblr/'

#すべての登録情報をXMLに保存
Tumblr::API.read(tmb) do |pager|
  data = Tumblr::Data.new
  0.upto(pager.last_page) do |n|
    puts "get #{n}/#{pager.last_page}"
    data << pager.page(n)
  end
  data.save(File.join(ENV["HOME"], "backup.xml"))
end

#保存したXMLから最大画像サイズのjpgのみ保存
agent = Mechanize.new
xml = XmlSimple.xml_in(File.join(ENV["HOME"], "backup.xml"))
xml['posts'].each do|psts|
  psts['post'].each do|pst|
    pst['photo-url'].each do |url|
      #Jpeg画像以外は取得しない
      unless url['content'] =~ /jpg/
        #画像名取得
        jpg_id = url['content'].split('/')
        #最大サイズ画像(width=1280)は拡張子が付いていないので保存ファイル名に付加
        fname =File.join(savepath, jpg_id[jpg_id.length-1]) + '.jpg'
        #ダウンロード済みファイルは上書きしない
        unless File.exist?(fname)
          puts "downloading url : " + url['content']
          jpg_file = open(fname, 'w')
          jpg_file.print agent.get_file(url['content'])
          jpg_file.close
        end
      end
    end
  end
end

こんな感じでとりあえずバックアップができた。
ファイル名取得とかその辺はきっと正規表現とか使えばもっとスマートになるんだろうけど
まだまだ勉強中なので美しくないコードなのです

なお、Tumblrデータ取得部分はruby-tumblrをつくりました - ¬¬日常日記を参照させていただきました。