Class: Ameblogazo::Gazo

Inherits:
Object
  • Object
show all
Defined in:
lib/ameblogazo.rb

Defined Under Namespace

Classes: Driver, GazoException, SeleniumDriver, WebkitDriver

Instance Method Summary collapse

Instance Method Details

#_check_options(options) ⇒ Object

オプションチェック



33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/ameblogazo.rb', line 33

def _check_options(options)
  if options.nil? or !options.is_a?(Hash)
    raise GazoException, "オプションがnil、もしくはハッシュじゃないです"
  end
  if options[:dir].nil?
    raise GazoException, "ディレクトリ(:dir)を指定してください"
  end
  if options[:num]
    options[:num] = options[:num].to_s
    if (/^\d+$/ =~ options[:num]).nil?
      raise GazoException, "数値じゃないです"
      return
    end
    options[:num] = options[:num].to_i
  end
  options
end

#_find_image_url(ameba_id) ⇒ Object

一番最初の画像のURLを取得する



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/ameblogazo.rb', line 61

def _find_image_url(ameba_id)
  puts "検索中..."
  image_url = nil
  catch :image_found do
    100.times do |i|
      page = i+1
      url = "http://ameblo.jp/#{ameba_id}/page-#{page}.html"
      begin
        html = open(url)
      rescue
        raise GazoException, "画像が見つからなかったです"
      end
      doc = Nokogiri::HTML(html)
      
      # 有効なameba_idか確認
      sorry = doc.xpath("//body[@class='sorry']")
      unless sorry.empty?
        raise GazoException, "存在しないIDです"
      end
      
      a = doc.xpath("//a")
      a.each do |node|
        if /http:\/\/ameblo.jp\/#{ameba_id}\/image-\d{11}-\d{11}.html/ =~ node[:href]
          image_url = node[:href]
          throw :image_found
        end
      end
      sleep(0.1)
    end
  end
  # 念のためチェック
  if image_url.nil?
    raise GazoException, "画像がみつからなかったです"
  end
  image_url
end

#_get_info(dir, categorize) ⇒ Object

ダウンロード対象のURLや保存先を取得



99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/ameblogazo.rb', line 99

def _get_info(dir, categorize)
  img = @driver.find(:xpath, '//img[@id="imgItem"]')
  download_url = img[:src]
  filename = File.basename(download_url)
  title = @driver.find("#entryLink").text
  date = download_url[/\d{8}/]
  
  # カテゴリー分け(タイトルとか日付)
  if categorize == "title"
    dir = "#{dir}/#{title}"
  elsif categorize == "date"
    if date
      dir = "#{dir}/#{date}"
    else
      puts "うまく日付がとれなかったのでカテゴライズせずに保存します"
    end
  end
  
  # ディレクトリが存在しなければ作成する
  unless File.directory?(dir)
    print "ディレクトリを作成します #{dir}\n"
    FileUtils.mkdir_p(dir)
  end
  download_file = "#{dir}/#{filename}"
  {:url=>download_url, :file=>download_file, :title=>title, :date=>date}
end

#_init_driver(selenium) ⇒ Object

driver初期化



52
53
54
55
56
57
58
# File 'lib/ameblogazo.rb', line 52

def _init_driver(selenium)
  if selenium
    @driver = SeleniumDriver.new
  else
    @driver = WebkitDriver.new
  end
end

#_next_pageObject

次にダウンロードするべき画像を開く



127
128
129
# File 'lib/ameblogazo.rb', line 127

def _next_page()
  @driver.find("#nextNavi").click
end

#_save_img(url, file) ⇒ Object

画像をダウンロードして保存



132
133
134
135
136
137
138
139
140
# File 'lib/ameblogazo.rb', line 132

def _save_img(url, file)
  open(url) do |doc|
    open(file, 'w') do |fp|
      fp.print doc.read
    end
  end
  filename = File.basename(file)
  puts "#{filename} を保存しました"
end

#fetch(options) ⇒ Object

画像を保存する :ameba_id => アメーバID :dir => 保存先ディレクトリ :categorize => タイトル毎などに分類する(デフォルト無効)[nil, “title”, “date”] :num => 取得する枚数(新しいものから順番に)



147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/ameblogazo.rb', line 147

def fetch(options)
  options = _check_options(options)
  ameba_id = options[:ameba_id]
  categorize = options[:categorize]
  dir = options[:dir]
  num = options[:num]
  
  # driver初期化
  _init_driver(options[:selenium])
  
  # 画像ページに移動
  @driver.visit(_find_image_url(ameba_id))
  
  # 最初にみつけた画像から次の画像へと順番にたどってく
  info_list = []
  loop.with_index do |_, i|
    break if i == num # 指定枚数で終了
    info = _get_info(dir, categorize)
    break if !info_list[0].nil? and info_list[0][:file] == info[:file]
    info_list.push(info)
    
    if File.exists?(info[:file])
      if num
        puts "既にダウンロードされている画像です"
      else
        puts "ダウンロード済みの画像が見つかったので終了します"
        break
      end
    else
      _save_img(info[:url], info[:file])
    end
    _next_page
    sleep(0.5)
  end
end

#info(options) ⇒ Object

画像の情報を取得する



184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
# File 'lib/ameblogazo.rb', line 184

def info(options)
  options = _check_options(options)
  ameba_id = options[:ameba_id]
  categorize = options[:categorize]
  dir = options[:dir]
  num = options[:num]
  
  # driver初期化
  _init_driver(options[:selenium])
  
  # 画像ページに移動
  @driver.visit(_find_image_url(ameba_id))
  
  # 最初にみつけた画像から次の画像へと順番にたどってく
  info_list = []
  loop.with_index do |a, i|
    break if i == num # 指定枚数で終了
    info = _get_info(dir, categorize)
    break if !info_list[0].nil? and info_list[0][:file] == info[:file]
    info_list.push(info)
    _next_page
    sleep(0.5)
  end
  info_list
end