【Rails】Active Storage環境下でGoogle Cloud Visionのセーフサーチを実装

個人開発のWebアプリまちかどルートv5.42への実装メモです。

まえがき

Rails 5.2のファイルアップローダーであるActive Storage環境下だとGoogle Cloud Visionのセーフサーチがうまく動かなかったので下記のように工夫しました。

具体的には画像ファイルを /public にいったん配置して、そのパスを指定して画像分析にかけ、終わったら /public から削除するという流れです。

# 画像の選択の有無を判断  
if post_params[:image] != nil  
 # 画像を uploaded_file に格納  
 uploaded_file = post_params[:image]  
 # /public へのパスを指定  
 output_path = Rails.root.join('public', uploaded_file.original_filename)  
 # ファイルを開いて image_file に格納  
 image_file = File.open(output_path)  

 # Google Cloud VisionのAPIを使う  
 image_annotator = Google::Cloud::Vision::ImageAnnotator.new  
 response = image_annotator.safe_search_detection image: image_file  
 response.responses.each do |res|  
  safe_search = res.safe_search_annotation  
  # if文では公式ドキュメントと違って .to_s を付ける必要がありました  
  if safe_search.adult.to_s == "VERY_LIKELY" || safe_search.adult.to_s == "LIKELY"  
    flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"  
    redirect_to root_path  
    return  
  elsif safe_search.violence.to_s == 'VERY_LIKELY' || safe_search.violence.to_s == 'LIKELY'  
    flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"  
    redirect_to root_path  
    return  
  elsif safe_search.medical.to_s == 'VERY_LIKELY' || safe_search.medical.to_s == 'LIKELY'  
    flash[:error] = "不適切な画像と判断されました powered by Google Cloud Vision"  
    redirect_to root_path  
    return  
  end  
 end  
# 最後に /public の画像ファイルを削除します  
File.delete(output_path)  
end  

上記のコードを適所に書けばGoogle Cloud Visionのセーフサーチが機能します。そこでVERY_LIKELYまたはLIKELYと判断されればroot_pathにリダイレクトされるようになります。

あとがき

Active Storage環境下だと公式ドキュメントどおりにやってもうまくいきませんでした。また、事前にgem 'google-cloud-vision', '~> 0.32.2'bundle installしたあとに「protobufが見つかりません」という内容のエラーが出ました。そこでGemfilegem 'google-protobuf', '~> 3.7.0.rc.2'を追記のうえgem update google-protobufを実行することで回避できました。

こちらの記事も合わせてどうぞ。

【Rails】Active Storage + S3 + Active JobでGoogle Cloud Visionセーフサーチ