RailsとUnsplash APIで画像のサンプルデータを挿入したい
こんばんは
ラブホテルの掲載、レビューができるWebアプリを制作しているのですが、一つのホテルに5~9枚くらい * 100枚の画像が必要になりました。
ポチポチダウンロードするわけにもいかないので、無料のAPIを活用して一括でダウンロード&アップロードすることにしました。
私の場合は、AWSのS3にアップロードしたファイルを、Factory.createで挿入して使いたいので、ローカルにダウンロードする必要がありました。しかし、URLを表示するだけの場合はもう少し簡単にできるかと思います。
ドキュメント
Ruby用のSDKがありますので、そちらを使います。
ソースコード
gem 'unsplash'
Unsplash APIに登録してキーを発行し、initializerに設定しています。
Unsplash.configure do |config|
config.application_access_key = "ACCESS KEY"
config.application_secret = "SECRET KEY"
config.utm_source = "hoge"
end
全体コードは下記の通りです。
require "open-uri"
photos = Unsplash::Photo.search("hotel", page = 4, per_page = 30, orientation = "landscape")
photos.each_with_index do |photo, index|
url = photo.urls.regular
URI.parse(url).open do |image|
File.binwrite("images/hotel-#{index}.jpg", image.read)
end
end
下記はURLを開いてjpgとしてローカルに保存したいのでopen-uriをrequireしています。
require "open-uri"
クエリはhotelで、4ページ目を指定して、30個のlndscape(横)の画像を検索してphotosに入れています。per_pageは最大30までしか指定できません。また、画像サイズはlndscape(横)の他にportrait(縦)、squarish(四角)が指定できます。
photos = Unsplash::Photo.search("hotel", page = 4, per_page = 30, orientation = "landscape")
そして、画像サイズがregularのURLを取り出して、imagesディレクトリ以下にhotel-1.jpg, hotel-2.jpg, hotel-3.jpgのように保存されるようにします。
photos.each_with_index do |photo, index|
url = photo.urls.regular
URI.parse(url).open do |image|
File.binwrite("images/hotel-#{index}.jpg", image.read)
end
end
ランダムに画像を指定したい場合は下記のようになります。
クエリはhotelで、画像を横向きにして、30個ランダムに取得しています。
photos = Unsplash::Photo.random(count: 30, query: "hotel", orientation: "landscape")
photos.each_with_index do |photo, index|
url = photo.urls.regular
URI.parse(url).open do |image|
File.binwrite("images/hotel-#{index}.jpg", image.read)
end
end
s3にaws cliでアップロードします。
imagesディレクトリ以下の画像全てを、指定したバケットのフォルダ内にアップロードしています。
aws s3 sync ./images s3://hotel-image-list/uploads/hotel/4732342d5-a290-4849-929f-sdwfe/
最後に、rand()メソッドを使って、5枚から9枚の画像かつ、ファイル名末尾が0から30の画像をランダムに挿入してFactory.createでデータを挿入します。
rand(5..9).times do
create(:hotel_image , hotel_id: hotel.id, file_url: "https://hotel-image-list.s3.ap-northeast-1.amazonaws.com/uploads/hotel/4732342d5-a290-4849-929f-sdwfe/hotel-#{rand(0..30)}.jpg")
end
なにか間違いがある場合、ご指摘いただければ幸いです
何卒、よろしくお願い申し上げます!
Discussion