🎃

RailsとUnsplash APIで画像のサンプルデータを挿入したい

2023/03/28に公開

こんばんは
ラブホテルの掲載、レビューができるWebアプリを制作しているのですが、一つのホテルに5~9枚くらい * 100枚の画像が必要になりました。
ポチポチダウンロードするわけにもいかないので、無料のAPIを活用して一括でダウンロード&アップロードすることにしました。
私の場合は、AWSのS3にアップロードしたファイルを、Factory.createで挿入して使いたいので、ローカルにダウンロードする必要がありました。しかし、URLを表示するだけの場合はもう少し簡単にできるかと思います。

ドキュメント

https://unsplash.com/documentation

Ruby用のSDKがありますので、そちらを使います。

ソースコード

https://github.com/unsplash/unsplash_rb

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