[ Rails ] 個人アプリのユーザーに公式LINEを友達追加してもらい、LINEでメッセージを送信する

<h3>はじめに</h3>
こんにちは！<br>
個人開発アプリにLINE通知機能を実装する際の備忘録です。<br>
通知機能の完了まで結構内容が重たいので、実装内容ごとにまとめていく予定です。<br>
今回は個人アプリのユーザーに公式LINEを友達追加してもらい、LINEでメッセージを送信するところまでをまとめました。

個人アプリの詳細な説明についてはこちらの記事をご参照ください。

https://qiita.com/CarBoss1996/items/63c14260fc7fe65da78e

<h3>開発環境</h3>
・Ruby on Rails 7.1<br>
・Ruby 3.2.3

<h3>完成目標</h3>
・ 作成したアプリのアカウントとLINEアカウントのIDを連携させる。<br>
以下は私が作成したアプリのLINE画面ですが、通知設定をすることで連携ができるようにしています。

![IMG_4673.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/1bf60fae-c218-0f59-e1ba-8b5ceaa11157.jpeg)



<h3>手順</h3>
1. LINE Developerに登録し、プロバイダを作成<br>
2. 公式LINEを作成<br>
3. チャネルID、チャネルシークレットを登録<br>
4. line-bot-apiをインストール<br>
5. ルーティング、MVCを作成<br> 


<h3>1. LINE Developerに登録し、プロバイダを作成</h3>
<h4>1-1. LINE Business ID を登録</h4>
以下よりLINE Developer にアクセスして、アカウントを作成します。

https://developers.line.biz/ja/

アクセスしたら以下の画面が出てくるので、右上のコンソールにログインをクリックしてください。

![068d7c0e113c6834e06e95e5d77625de.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/f188488a-756e-0251-79ac-257982c10a3d.jpeg)

クリックすると以下の画面になるので、アカウントを作成をクリックしてください。

![589e632ab194db9a424b5608d9fb030b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/c669c4a2-d4fa-693c-8e46-0f4e3a4f34c1.png)

クリックすると以下の画面に遷移するので、お好きな方法でアカウントを作成してください。

![ddd57bd49c8c87772ed448d193ac8d30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/0a4430e3-7ea0-bbf5-0231-93af433f5bfc.png)

<h4>1-2. プロバイダーを作成</h4>
アカウントが作成できたら以下の画面に遷移するので、プロバイダーを作成をクリックします。

![793a797c451cab6162c98087d912f611.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/29849ce7-803d-9df8-64dc-e8b52b7f656b.png)

クリックすると以下の画面が出てきます。
好きなプロバイダー名を入力して、作成をクリックします。

![e8b08ec35c29404381627ec2ad16730c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/1cbf3ba5-f5e9-bad6-eabd-7b14654b4cfd.png)

以上でプロバイダーの作成が完了しました！
<h3>2. アプリの公式LINEを作成</h3>
<h4>2-1. アプリの公式LINEを作成する</h4>

line bot を使用するためのチャネルを作成していきます。
左から２番目の Messaging APIをクリックします。
![8b9db9a3d472bbe7d3892bd543cda572.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/7bfc4628-619f-1d23-1862-c4bcdfcefdc0.png)

クリックすると以下の画面に遷移します。
赤丸の緑ボタンをクリックして、LINE公式アカウントを作成します。

![3a876fc696e0dddf66e5ccc764bb2789.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/d756ddfe-2c85-5d85-56a4-21f9fba0b97e.png)

クリックするとログイン画面になるので、ログインをクリックします。

![58b3897a3f88cb1b7b0a1c08110f02f5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/359ad8da-2da9-b0c3-0de7-db6db837115a.png)

ログインすると以下の入力画面に遷移するので、以下の必要事項を入力していきます。
・ アカウント名
・ メールアドレス
・ 会社・事業者の所在国・地域
・ 業種
・ 運用目的
・ 主な使い方
個人開発の趣味アプリやポートフォリオの場合の業種は、大業種を「個人」にして、小業種を「学生」でいいと思います。
運用目的や主な使い方はどれでもいいと思います！
私は「サイトに人を集めたい、登録してもらいたい」「未定」を選択しました。

![29b16d9891c08fcc84ef665c15d4bde4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/f9a7a8e7-8fd0-05e1-4d3f-668418e48948.png)


![2a8784ed0a1fc07ba8a99c60dd9f5dd7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/716604ac-da6f-ee0d-f73a-272aee974bfb.png)

入力ができたら確認をクリックします。
その後確認画面に遷移するので、内容を確認して間違いがない場合は完了をクリックします。

![f38c0bba59817dfe4966b9767d855c26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/e6ea4bd9-135f-5a7d-032f-be737d7308ec.png)

同意画面が２回表示されますが、両方とも同意してください。

![f0d532c4e49ec79f03ff623f125bb84b (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/fce42cc7-5c44-f1f5-fb9f-bfdc94a67b06.png)

同意したら、LINE公式アカウントが作成されます。

![0c16b12573206bfe8be4877eedfb29c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/03ea1503-a11f-3de4-224f-c8b45169ffea.png)

画面中央の LINE Official Account Managerへ をクリックして、Messaging API の設定をしていきます。

<h4>2-2. あいさつメッセージの設定</h4>

LINE Official Account Managerへ遷移したら以下の画面が出てくるので、× で消してもらって大丈夫です。
![7bddfabc39b95d8b1abe3ca7accd0a3b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/5863069a-eb93-5a2d-1da6-2e96b543d8c5.png)

サイドバーからあいさつメッセージを選択します。

![694f03287942aa083ebcb3cf5f0ea763.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/2e4a00e2-d08c-5f76-e8c5-51c54d6accf6.png)

以下赤枠の部分をクリックして編集していきます。

![6288526035c0124ab37c4fb669b45616.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/ce49b489-1b89-db0d-82e7-d2e73d84ce59.png)

今回はこんな感じのメッセージを作成しようと思います。
作成できたら変更を保存します。

![81897b7019871baa29c288acf625c1c0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/9a174f7c-9791-6b48-915d-1709d09a4f1b.png)

これであいさつメッセージの変更は完了しました！
現状ブロックされてから再度友達追加された時もあいさつメッセージがいくようになっているので、やめたい場合はメッセージ設定上部の送信設定にチェックを入れてください。

<h4>2-3. 友達追加ボタンを設置</h4>
再度サイドバーから下の方にある「友達追加ガイド」をクリックします。

![694f03287942aa083ebcb3cf5f0ea763.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/314c8522-0653-2678-f548-8eec6e7a351f.png)

以下の画面になるので、赤枠のボタンボタンを作成をクリックします。

![106e5b5b12f38e05f555e79325fd10e8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/277514f0-108c-33bb-e5af-84bdf5f7c7a5.png)

そして以下の画面が出てくるので、コピーをクリックして連携を実装したい画面に貼り付けます。

![122471d8cf14589ed9d75afe6c542fb6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/866d43be-3ce3-2ee3-cd80-bc4392564373.png)

やり方だけ覚えておいて、とりあえず置いといて後で貼り付けてもOKです！
これでアプリの公式ラインの友達追加への動線が確保できました。

<h3>3. チャネルID、チャネルシークレットを登録</h3>
<h4>3-1. チャネルID、チャネルシークレットを登録</h4>

画面右上の設定をクリックします。

![5a0f02c1dccbfee9743d69a4e3e32227.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/b256b7e7-7571-5ebb-64b7-ba4a436c5b6f.png)

アカウント設定の画面に移動するので、赤丸の Messaging API をクリックします。
ちなみに黄色丸のプロフィール編集から画像の変更ができます。
![ecf4b70fda0c0ea35a807bb4177e21cd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/acc82c04-5b5c-7f9e-36ad-8552e9cf5f10.png)

赤丸の Messaging API を利用するをクリックします。
![1ef1e4b0a8dfe410be6ed17e6ddd9ca5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/34636edc-7ab0-a8e4-da5e-d707bd468a63.png)

先程作成したプロバイダー名を選択して、同意するをクリックしてください。

![152aa067205638678cab802e21cf1a68.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/d2fef8e7-f50b-d746-428d-5c51e5b34d67.png)

プライバシーポリシー都利用規約を作成している場合はURLを記入していただいて、ない場合はそのまま「OK」をクリックしてください。

![3744e087d14867f571b5e38fda9432ca.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/c31851fe-7753-968c-23d1-05f92d281ef8.png)

OKをクリックします。

![fa20989593e3c7103268cc0337eb6552.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/d4d7e5c2-baba-0318-2675-fd3cf7706719.png)


これで登録が完了したので、チャネルIDとチャネルシークレットが発行されました！
![8852f60a669ca84cdcf7e2e14700ba24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/4b367984-f12a-5e26-932e-abb222974376.png)

このIDとシークレットは .env ファイルに記述します。
デプロイ先の環境変数にも記述を忘れないでください。

```.env
CHANNEL_ID=00000
CHANNEL_SECRET=0000000
```

このIDとシークレットは他人に知られないように注意してください！
ではここで LINE Developers の方に戻ります。

<h4>3-2. チャネルアクセストークンを発行</h4>

Messaging API を使用するために、チャネルアクセストークンが必要になります。
LINE Developers のサイドバーから、先程作成したプロバイダーを選択します。
プロバイダーを選択したら以下の画面になるので、Messaging API のチャネルをクリックします。

![427606350c73823c8d9a48639c2f9da6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/d993c379-62fe-f75e-ba2e-9b00f3d4f0ef.png)

クリックしたらこの画面になるので、赤丸の「Messaging API設定」をクリックします。

![2f208096ec9cd7c83494d89f376cf02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/a43cad69-0000-bfe3-f47e-f0f6cabd5b2b.png)

Messaging API設定画面に遷移したら一番下までスクロールして、最下部にあるチャネルアクセストークンを発行します。

![c646125c1495cff4910736d6d4d1f50f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/bde15725-6c47-eb88-fda8-de0b27f09f99.png)

そして発行されたチャネルアクセストークンも .env ファイルに記述します。
デプロイ先の環境変数にも記述を忘れないでください。

```.env
CHANNEL_TOKEN=000000000000
```
これで一旦LINE側での設定は終了したので、アプリに戻って作業をします。

<h3>4. line-bot-apiをインストールする</h3>
Gemfile に line-bot-api を記述して bundle install します。

```Gemfile.
gem 'line-bot-api'
```
bundle install したら再起動します。
今回、.env ファイルを使用するので、gem 'dotenv-rails' をインストールしていない方はここでインストールしてください。

<h3>5. Webhook URLの設定</h3>
<h4>5−1. テーブルレスモデルの作成</h4>
今回はアプリのユーザーIDとそのユーザーのLINEアカウントIDを連携したいだけなので、特にマイグレーションファイルの作成は必要ないです。<br>
ただLINEのメッセージ送信などの記述をユーザーテーブルなどにまとめてしまうと、記述が多くなってゴチャついてしまうので、テーブルレスモデルを作成します。<br>
RailsではActiveModelモジュールを使用してテーブルレスモデルを作成できます。<br>
これはデータベーステーブルにバインドされず、バリデーション、コールバック、その他のActiveRecordが提供する機能を利用できます。<br>
つまり、データベースに保存しない情報を扱いつつも、モデル、ビュー、コントローラー（MVC）のパターンを維持することができるので、コードの組織化と再利用性が向上します。<br>

今回は通知機能のための連携なので、 notification.rb を作成します。
モデルを作成したら、編集をします。
```notification.rb
class Notification < ApplicationRecord
 # 上記の記述を以下に修正、先頭にrequire 'line/bot'を記述
 
 require 'line/bot'

class Notification
  include ActiveModel::Model
```
こうすることで、line-botを使用することができ、テーブルレスモデルへの変更も完了しました。
<h4>5-2. notification.rb の作成</h4>
line-botの作成をしていきます。

```notification.rb
require 'line/bot'

class Notification
  include ActiveModel::Model
  def self.send_line_notification(line_user_id, message)
    # LINE bot APIのクライアントを初期化
    client = Line::Bot::Client.new do |config|
      config.channel_secret = ENV["LINE_CHANNEL_SECRET"]
      config.channel_token = ENV["LINE_CHANNEL_TOKEN"]
    end

    # メッセージを作成
    message = {
      type: 'text',
      text: message
    }

    # メッセージを送信
    response = client.push_message(line_user_id, message)

    # エラーハンドリング
    unless Net::HTTPSuccess == response
      Rails.logger.error("Error sending LINE message: #{response.message}")
    end
  end
end
```

<h4>5-3. notifications_controllerを作成</h4>

次にコントローラを作成します。

```notifications_controller.rb
require 'net/http'
require 'uri'
require 'json'

class NotificationsController < ApplicationController
  protect_from_forgery except: :callback
  before_action :authenticate_user!, only: [:link_line_account]

  def callback
    body = request.body.read
    signature = request.env['HTTP_X_LINE_SIGNATURE']
    unless client.validate_signature(body, signature)
      return head :bad_request
    end

    events = client.parse_events_from(body)
    events.each do |event|
      case event
      when Line::Bot::Event::Message
        handle_message_event(event)
      end
    end

    head :ok
  end

  private

  def handle_message_event(event)
    received_text = event['message']['text']
    line_user_id = event['source']['userId']

    unless received_text == '連携'
      message = {
        type: 'text',
        text: "アカウント連携をしたい場合は、「連携」とメッセージを送ってください。"
      }
      return client.reply_message(event['replyToken'], message)
    end

      messages = {
        type: 'text',
        text: "認証を完了するには、次のリンクをクリックしてください。"
      }
  end

  def client
    @client ||= Line::Bot::Client.new { |config|
      config.channel_secret = ENV["CHANNEL_SECRET"]
      config.channel_token = ENV["CHANNEL_TOKEN"]
    }
  end
end
```
<h4>5-4. ルーティングを作成</h4>
次にルーティングを作成します。

```routes.rb
Rails.application.routes.draw do
  post '/callback', to: 'notifications#callback'
end
```
これで LINE からのコールバックを受けられるようになったので、アプリのURLに /callback を追記したURLを Webhook に記述します。

<h4>Webhook URLを設定</h4>
LINE Developers と LINE Official Account Manager を行ったり来たりするので、少し複雑に感じるかもしれませんが、順を追って進めれば問題ありません。

まずはLINE Official Account Manager に戻ります。
設定から Messaging API の設定を開きます。
Webhook URL の欄にアプリのURLを入力して、最後に　/callback を追記します。
記述できたら保存をクリックします。

![ab112f270ccdd90a1746865be8ea8d00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/4acee36e-fd3b-adc7-feab-57f298c05093.png)

そして LINE Developers を開きます。
Messaging API設定の画面を開いて下にスクロールすると、Webhook設定という項目が出てきます。
その Webhook URL の編集ボタンをクリックして、先程記述した /callback の記述を入れたURLをもう一度記述します。
![e238bdf63f394ad64a60a1f3d23a4f3a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/66c61de3-9e75-f60e-f5e6-69f8c99d5635.png)

入力が完了したら下記のような画面に変化します。
検証を押すと実際にcallbackができているかをテストすることができます。
成功という文字が出ればOKです。

![50eafe07982b926c2c46ffa573b540c5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/b20b563c-ef47-abb4-a978-8b480ca313d1.png)

<a href="https://gyazo.com/326f0ac115cdafcdb0b1dc377cab1ce7"><img src="https://i.gyazo.com/326f0ac115cdafcdb0b1dc377cab1ce7.png" alt="Image from Gyazo" width="413"/></a>

この表示が出ない場合は、URLの記述ミスやLINE Developersの設定漏れを確認してください。

そして Webhook の利用をクリックして緑色にして有効にします。

![8d7b628a236fc56efb0119283e5f3b95.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3871424/71ba1e8c-5657-e719-2f20-4257b20389e8.png)

これで公式LINEからユーザーにメッセージを送信できるようになりました！
お疲れ様でした！

公式LINEに「連携」とそれ以外の文字を送って確認してみてください^^

<h3>最後に</h3>
最後までお読みいただきありがとうございます！<br>
この続きとしてアプリのユーザーIDとLINEアカウントIDの連携をしていきたいのですが、長くなったのでこれはまた別記事にまとめたいと思います。<br>
備忘録ですが、参考になれば幸いです。<br>
初学者ゆえ、誤解や説明不足があるかもしれませんが、ご指摘いただければ幸いです。

<h3>参考文献</h3>

以下同じスクールの先輩の記事、大変参考にさせていただきました！感謝です！！
https://qiita.com/kohki_takatama/items/e19960e479a712d63408
こちらの記事はngrokの設定も細かく解説されているので、デプロイ環境で何回もテストするの嫌って方はぜひngrok使ってみてください！
https://qiita.com/kohki_takatama/items/278b1f47e355e08df43a