railsでGCP Natural Language APIを使ってクソアプリを作ってみた。

## アプリの見た目
![スクリーンショット 2021-07-30 21.40.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/62b16c2d-815a-da4a-f72c-8355ad6e9054.png)
試しに「上京しました。」と入力して送信すると。　↓
![スクリーンショット 2021-07-30 21.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/7d3c4b90-b909-7711-66b1-9d66ed851b49.png)
こんな感じのviewが帰ってきます。パーソナリティはポンコツbabyだそうです。

##　APIの利用手順

下記ページへ移動

https://cloud.google.com/

![スクリーンショット 2021-07-31 21.10.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/e2c7caf7-473b-9c12-12b6-e93bb7756fa5.png)
「コンソールへ移動」をクリック
*GCPへの登録をしていない方は、「無料で開始」というボタンが表示されるので、
手順に従って利用を開始してください。確かクレジットカードの登録が必要だったと思いますが、
有料サービスを使用しなければ基本無料で使用できます。
![スクリーンショット 2021-07-31 21.15.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/8262e0b0-3465-2316-eb80-1a64702d4b47.png)
![スクリーンショット 2021-07-31 21.27.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/0d9b353c-080d-59cf-98e6-09d314094b25.png)
「APIとサービス」にカーソルを合わせて、ライブラリをクリックします。
![スクリーンショット 2021-07-31 21.50.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/8439e2ea-9c87-17af-3e9f-30e922249600.png)
検索フォームが出てくるので「Natural Language API」等で検索して、
「Cloud Natural Language API」をクリック
![スクリーンショット 2021-07-31 21.55.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/e492adb2-03b8-febb-967c-c97ff977bdd4.png)
「有効にする」をクリックしAPIの使用を有効にします。
![スクリーンショット 2021-07-31 22.08.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/46111538-1683-d23f-0430-55f32ac18f40.png)
画面遷移ができれば有効化は完了です。
＊左側の「割り当て」からAPIの発行回数を制限できます。心配な人は制限を付けておきましょう。

続いてAPIを発行します。
![スクリーンショット 2021-07-31 22.13.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/a79c4acf-01e7-5d0a-b78e-0bda27e441ad.png)
先ほどの手順でクリックしたライブラリの下に「認証情報」というリンクがあるので、クリックします。
![スクリーンショット 2021-07-31 22.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/d5256e60-1944-1fb3-f3f1-2a20a9ef131a.png)
![スクリーンショット 2021-07-31 22.22.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/abeb06a1-64a7-49ad-b382-06ac1785225d.png)

「認証情報を作成」をクリックするとタブが出てくるので、「APIキー」をクリック。

![スクリーンショット 2021-07-31 22.44.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/526facab-254e-3705-142d-687c1ce44586.png)
APIキーが作成されます。作成されたキーを使用します。
APIキーは大事に扱ってください。github等のパブリックスペースに公開すると悪用される可能性があります。
（今回の画像で使用した僕のAPIキーは念のため削除済みです。）

![スクリーンショット 2021-07-31 22.34.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1287520/17763c38-6abc-b148-3b20-3607ab194311.png)
「キーの制限」から使用するAPIを指定できます。

## 実装コード

APIを使用している部分　↓

```ruby:post.rb
def get_sentiment
    require 'net/http'
    require 'uri'
    require 'json'
  # textに入れた文章が評価されます。
    text = self.post

  # ENV["GOOGlE_API_KYE"]に取得したAPIキーを入れます。
    uri = URI.parse("https://language.googleapis.com/v1beta1/documents:analyzeSentiment?key=#{ENV["GOOGlE_API_KYE"]}")
    request = Net::HTTP::Post.new(uri)
    request.content_type = "application/json"
    request.body = ""
    request.body = {
                      document:{
                        type:'PLAIN_TEXT',
                        content: text
                      }
                    }.to_json

    req_options = {
      use_ssl: uri.scheme == "https",
    }

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end

    json = JSON.parse(response.body)
  # scoreに文章のポジティブ度が入ります。
    score =  json['documentSentiment']['score']*100
  # magnitudeに文章の感情の強さみたいなものが入ります。
    magnitude = json['documentSentiment']['magnitude']*100
    sentiment = {score: score.to_i, magnitude: magnitude.to_i}
  end
```

dotenv-rails等を使用して、ENV["GOOGlE_API_KYE"]に値を設定して使用。

最終的なコード　　↓

```ruby:post.rb
class Post < ApplicationRecord
  validates :post, presence: true, length: { minimum: 3, maximum: 20 }

  def set_sentiment_with_title
    sentiment = self.get_sentiment
    self.magnitude = sentiment[:magnitude]
    if sentiment[:score] > 50
      title = ["ポンコツbaby", "ハッピー能天気バカ","so funy", "おしゃべりクソ野郎", "無駄話うそ太郎", "元気の押し売り", "言い訳クソメガネ", "ラッキー幸せ人間", "好感度おばけ"]
      self.sentiment = "ポジティブ"
      self.score = sentiment[:score]
    elsif sentiment[:score] > 0
      title = ["おたんこなすび", "おまぬけ勘違いさん","おたんこなすび", "おしゃべりクソ野郎", "無駄話うそ太郎", "あほ", "言い訳クソメガネ", "クレイジー日本代表", "優しき偽善者"]
      self.sentiment = "ポジティブ"
      self.score = sentiment[:score]
    elsif sentiment[:score] >= -50
      title = ["ポンコツbaby", "インテリくそ陰キャ","人間性皆無自己中人間", "おたんこなすび", "詐欺師", "ぴえん越えてぱおん", "だめだこりゃ", "元気出せよ💓", "あほ"]
      self.sentiment = "ネガティブ"
      self.score = sentiment[:score]*-1
    else
      title = ["ポンコツbaby", "インテリくそ陰キャ","人間性皆無自己中人間", "後ろ向きネガティブごみ人間", "ダイアモンド不愉快", "ぴえん越えてぱおん", "人間失格", "元気出せよ💓", "堕天使"]
      self.sentiment = "ネガティブ"
      self.score = sentiment[:score]*-1
    end
    self.personality_title = title[rand(10)-1]
  end

  def set_bournus
    return if self.random_int2 < 100

    if self.personality2 == "香ばしさ"
      self.personality_title = "香ばしき漢"
    elsif self.personality2 == "神に愛され度"
      self.personality_title = "神に愛されし者"
    elsif self.personality2 == "尊さ"
      self.personality_title = "愛され地下アイドル"
    elsif self.personality2 == "足の臭さ"
      self.personality_title = "足クサおじさん"
    elsif self.personality2 == "強者の風格"
      self.personality_title = "範馬勇次郎"
    else
      self.personality_title = "パーリィーぴーぽー"
    end
  end

  def set_int_with_personality
    index1 = ["センス", "知性", "努力", "主人公度", "地頭力", "おもしろさ"]
    index2 = ["香ばしさ", "神に愛され度", "尊さ", "足の臭さ", "強者の風格", "人望"]
    self.random_int1 = rand(rand(200))
    self.personality1 = index1[rand(7)-1]
    self.random_int2 = rand(rand(200))
    self.personality2 = index2[rand(7)-1]
  end

  def get_sentiment
    require 'net/http'
    require 'uri'
    require 'json'

    text = self.post

    uri = URI.parse("https://language.googleapis.com/v1beta1/documents:analyzeSentiment?key=#{ENV["GOOGlE_API_KYE"]}")
    request = Net::HTTP::Post.new(uri)
    request.content_type = "application/json"
    request.body = ""
    request.body = {
                      document:{
                        type:'PLAIN_TEXT',
                        content: text
                      }
                    }.to_json

    req_options = {
      use_ssl: uri.scheme == "https",
    }

    response = Net::HTTP.start(uri.hostname, uri.port, req_options) do |http|
      http.request(request)
    end

    json = JSON.parse(response.body)
    score =  json['documentSentiment']['score']*100
    magnitude = json['documentSentiment']['magnitude']*100
    sentiment = {score: score.to_i, magnitude: magnitude.to_i}
  end

end
```
```ruby:hitokoto_controller.rb
class HitokotoController < ApplicationController
  def new
    @post = Post.new
  end

  def create
    @post = Post.new(post_params)
    @post.set_sentiment_with_title
    @post.set_int_with_personality
    @post.set_bournus
    if @post.save
      redirect_to hitokoto_path(@post)
    else
      flash[:notice] = "ばぶばぶ（３文字以上２０文字以下でちゅよ)"
      render "hitokoto/new"
    end
  end

  def index
    @posts = Post.all.limit(7).order(id: "DESC")
  end

  def show
    @post = Post.find(params[:id])
  end

  def post_params
    params.require(:post).permit(:post)
  end
end
```
設定した値を使って条件分岐によって、色々な値が出るように記述。
製作期間２〜３日の文字通りクソアプリです。
コントローラーの名前はちょっと失敗しています。可読性悪くて申し訳ないです。

公式の使用方法で実装した方が、APIからより詳細な値が帰ってきます。
https://cloud.google.com/natural-language/docs/quickstart-client-libraries?hl=ja
今回はgithubに公開しつつ、デプロイするという手順を時間をかけずに実装したため、簡易的な実装になっております。


## アプリの詳細
viewを含めたコードはgithubに公開してます。
https://github.com/kosimaru1997/hitokoto
今回作成したクソアプリ
https://ohitokoto.herokuapp.com/