2012年3月8日木曜日

BingAPIを使用した画像検索(2)_Rubyでかく自動ZIPでくれスクリプト

ゆーすけべーさんのおっぱい収集スクリプトに触発された
自動ZIPでくれスクリプト第2回。

画像検索APIを叩いて帰ってきたJSONデータの例が↓(公式ドキュメントより)
-------------------------------------------------------------------------------------------------
{
   "SearchResponse":{
      "Version":"2.0",
      "Query":{
         "SearchTerms":"xbox site:microsoft.com"
      },
      "Image":{
         "Total":92,
         "Offset":0,
         "Results":[
            {
               "Title":"Microsoft Deutschland GmbH auf der CeBIT 2006.",
               "MediaUrl":"http:\/\/www.microsoft.com\/germany\/presseservice\/images\/pressemappen\/cebit2006\/Xbox-360_5.jpg",
               "Url":"http:\/\/www.microsoft.com\/germany\/presseservice\/service\/pressemappen\/cebit2006.mspx",
               "DisplayUrl":"http:\/\/www.microsoft.com\/germany\/presseservice\/service\/pressemappen\/cebit2006.mspx",
               "Width":3259,
               "Height":3264,
               "Thumbnail":{
                  "Url":"http:\/\/ts2.images.live.com\/images\/thumbnail.aspx?q=2847678867077&id=b3ba5b922c04d322d937275335c8cf75",
                  "ContentType":"image\/jpeg",
                  "Width":159,
                  "Height":160,
                  "FileSize":2624
               }
            },
...

getしたい画像データがどこに入っているかというと
"MediaUrl" ここ。

というわけでMediaUrlが.jpg or .jpegだったらDLしてきてローカルに保存。200件終わったらまとめてzipにする。
zipに固める為gem install rubyzipしておく
rubyでの実装は 橋本商会 いかにしておっぱい画像をダウンロードするか〜2012 をRubyで書いた様をパクリ参考にさせて頂きました。
--------------------------------------------------------------------------------------------------------------------
# -*- encoding: utf-8 -*-
require 'rubygems'
require 'open-uri'
require 'json'
require 'uri'
require 'kconv'
require 'zip/zipfilesystem'

APP_ID = '' #APPIDは別途取得
API_URI = 'http://api.bing.net/json.aspx'


dir = './img/'
Dir.mkdir dir unless File.exists? dir

page_count = 0
dl_count = 0
query = "Yukie Nakama"

loop do 
 if page_count == 4 #50 * 4 DLしたら打ち止め
  break
 end
 url = API_URI + '?' + 
  "AppId=" + APP_ID + "&" +
  "Version=2.2&Market=ja-JP&Sources=Image&Image.Count=50&Image.Offset=" + URI.encode((page_count * 50).to_s) +
  "&Adult=off&Query="+ URI.encode(query.to_s)

 search_result = JSON.parse(open(url).read.toutf8)

 search_result['SearchResponse']['Image']['Results'].each do |entry|

  if /\.jpe?g$/ =~ entry['MediaUrl'] then #jpg or jpegを拾う
   dl_count += 1
   file_name = dl_count.to_s + ".jpg" #ファイル名は 数字 + jpg
   path = "#{dir}/#{file_name}" 
   puts "No #{dl_count}:Start"

   begin #imgをDLしてローカルに保存
    img = open(URI.encode entry['MediaUrl']) 
    img.close
    puts "DL Success"
    File.rename(img.path, path)
   rescue
    puts "DL Fail"
    next
   end
  else
   next
  end
 end
 page_count += 1
end
#画像DLここまで
#zipで圧縮
Zip::ZipFile.open("./#{query}.zip", Zip::ZipFile::CREATE) do |zip|
 Dir.open(dir).each{|f|
  next if f == "." or f == ".." #ディレクトリの下のみが対象
  f = File.expand_path(f,dir)
  zip.add(File.basename(f), f)
 }
end
#DLしたファイルの削除
Dir.open(dir).each{|f|
 next if f == "." or f == ".." #ディレクトリの下のみが対象
 f = File.expand_path(f,dir)
 File.unlink(f)
}
Dir.rmdir(dir)



これでYukie Nakama.zipができて生活がはかどった。

クエリを変えれば壁紙収集ぐらいはできるのかな。

0 件のコメント:

コメントを投稿