PHPで作成したLINEBOTをHerokuで動かしてみた

# はじめに
[ユアマイスターアドベントカレンダー2018](https://qiita.com/advent-calendar/2018/yourmystar) の8日目の記事です。
現在絶賛卒業研究中の大学インターンのmasaki-ogawaです。
今回はユアマイスター8日目の記事ですが、個人的にこの一年を通して取り組んでいる`LINEBOT`について書いておこうと思います。

## LINEBOTを作るに当たって参考にしたもの
[LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例](https://www.amazon.co.jp/LINE-BOT%E3%82%92%E4%BD%9C%E3%82%8D%E3%81%86-Messaging-API%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%83%9C%E3%83%83%E3%83%88%E3%81%AE%E5%9F%BA%E7%A4%8E%E3%81%A8%E5%88%A9%E7%94%A8%E4%BE%8B-%E7%AB%8B%E8%8A%B1/dp/4798150738/ref=sr_1_1?ie=UTF8&qid=1543761954&sr=8-1&keywords=LineBot)を参考にしました。

![LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例.jpg](https://qiita-image-store.s3.amazonaws.com/0/221678/01433143-1a6c-a7d5-b550-68333e8badf9.jpeg)

非常に参考になったのでおすすめです。環境構築の部分やサンプルコードが非常にわかりやすく参考になりました。

また、[Messaging API](https://developers.line.biz/ja/docs/messaging-api/)の公式ドキュメントも参考になりました。

## 環境構築について
LINEBOTに関しては多くの記事が出ていて、GASを使ってサーバーレスでLINEBOTを作成する例が多いですが、Herokuを使ってみたかったので、Herokuを使用するようにしました。
　
### 実行環境について
- Macbook Air Early 2014
- メモリ 8GB
- プロセッサ intel Core i5
- macOS Sierra

### Herokuアカウントを開設する
まずは[Heroku](https://jp.heroku.com/)にアクセスしてトップページに行きます。
herokuでは
- PHP
- Node
- Java
- Ruby
- Python
- Go
- Scala
といった言語に対応しています。
今回は、参考にした書籍がPHPで記述されていたことやユアマイスターではPHPを使用しており馴染みのある言語だったためPHPを選択しました。

まずはアカウントを作成します。
![登録画面.png](https://qiita-image-store.s3.amazonaws.com/0/221678/3eadb569-ef35-b805-340c-82954fb97088.png)
登録画面に必要な項目を入力します。今回は先述したようにPHPを使用するので、ここで主な開発言語は`PHP`を選択します。
これでアカウントの作成は完了です。

### Heroku CLIのインストール
LINEBOTを作成するのに直接的には不要ですが、今後の開発時にHerokuのlogを確認したり、ツールを導入する際にローカルから操作を行う際に必要になるため、インストールをしておきます。
[The Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli)にアクセスしてOS別にインストールします。

インストールがうまくいって入れば

```
ogawa:lineBot$ heroku
CLI to interact with Heroku

VERSION
  heroku/7.18.10 darwin-x64 node-v11.1.0
```

のように現在のバージョン等の情報が帰ってきます。

### Herokuで新規プロジェクトの作成
[【herokuコマンド】createからdestroyまで](https://qiita.com/chihiro/items/5c3ff400f6cb99deb945)を参考に進めました。

今回は以下のように`lineBot`というディレクトリを作成し、その中にソースファイルを置いていこうと思います。

```
$ mkdir lineBot

$ cd lineBot

$ touch index.php 
```

とすれば、`lineBot`ディレクトリ内に空のphpファイル`index.php`が作成されます。

```
$ git add.

$ git commit -m 'first commit'

$ git push heroku master
```

とすれば、空のファイルをpushできました。

※loginしなさいと言われた場合は`heroku logn`をして、登録時のメールアドレスとパスワードを入力してからpushしてみてください。

### LINE BOT SDKを導入する
ただオウム返しをするだけのBOTでは必要ありませんが、今後LINEBOTを開発するにあたって便利になるので、インストールをおすすめします。
Composerを使って簡単にインストールします。

Composerがインストールされていない場合は
[Composerをインストールしてみた](https://qiita.com/kakijin/items/02364adacf36410f449e)
を参考にインストールします。

先ほど作成した`lineBot`ディレクトリで

```
$ composer require linecorp/line-bot-sdk
```

を実行すると導入が完了です。

```
$ git add.

$ git commit -m 'require line-bot-sdk'

$ git push heroku master
```

といった感じでHeroku上にpushします。

### LINE Developersで登録する
[LINE Developers](https://developers.line.biz/ja/)にアクセスします。
![ログイン.png](https://qiita-image-store.s3.amazonaws.com/0/221678/966e37e9-8bd5-8d7f-34a2-24a97e0861eb.png)
右上のログインまたは、画面中央のログインをクリックします。

![入力.png](https://qiita-image-store.s3.amazonaws.com/0/221678/ea84b1de-991b-4f7f-4b4b-c46facec4298.png)
この画面で、自分のLINEアカウントに登録しているメールアドレスとパスワードを入力してログインします。

![プロバイダー.png](https://qiita-image-store.s3.amazonaws.com/0/221678/65d052be-db1a-b1d2-c8f9-f59d45439a5f.png)
ログインしたら新規のプロバイダーを作成します。今回は`masaki-ogawa`という名前のプロバイダーを作成しました。

![チャンネル.png](https://qiita-image-store.s3.amazonaws.com/0/221678/4bf5cb2f-c292-782a-82bf-0197ce98d4dc.png)
真ん中の`Messaging API`でチャンネルを作成します。

![画面.png](https://qiita-image-store.s3.amazonaws.com/0/221678/a7dfae5a-6a64-a600-3b37-5b771a33f989.png)
この画面から各種情報を入力します。

このLINE　Developersの管理画面ですが、結構頻繁にリニューアルされるので他の方の記事と画面が違うかもしれませんが、入力する内容は変わりません。**2018年12月現在**はこの画面になります。

**登録完了したら、作成したチャンネルの、Webhook URLに先ほど作成したHerokuアプリのURLを指定し、Channel Secret Channel Access Tokenを控えておきます。**

[こちら](https://developers.line.biz/ja/docs/messaging-api/building-bot/)のドキュメントからも作成の方法が確認できます。

## おうむ返しをするLINEBOTを作成する
<img width="414" alt="IMG_B7444740210C-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/221678/346dd183-9221-6308-9cd6-90c241205e6a.jpeg">
こんなのを作成します。

### 必要になるデータを確認する
ユーザーからBOTに向けてメッセージが送信されるとその内容が、JSON形式でWebhook URLに指定したURLに渡されます。
例えば、ユーザーから「こんにちは」というテキストメッセージが送信された場合以下のJSONを受け取ります。

```json

{
  "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
  "type": "message",
  "timestamp": 1462629479859,
  "source": {
    "type": "user",
    "userId": "U4af4980629..."
  },
  "message": {
    "id": "325708",
    "type": "text",
    "text": "こんにちは"
  }
}
```

Messaging APIを使用してメッセージを送る際に必要になるのは`replyToken`なので、このトークンを使用してユーザーにメッセージ等を送信することができます。また、`UserId`も受け取るので、ここからユーザーの情報を取得できたり、誰からメッセージを受け取ったのかという情報をDBに保存することも可能です。

おうむ返しをするに当たっては、受け取ったテキストの情報を取得できれば良いので、messageの中のtextを取得して、その中身を返信すれば可能になります。

### おうむ返しをするBOTのコードを作成する
先ほど作成した`index.php`に以下のコードを記述します。

```php:index.php
<?php
    // Composerでインストールしたライブラリを一括読み込み
    require_once __DIR__ . '/vendor/autoload.php';

    // アクセストークンを使いCurlHTTPClientをインスタンス化
    $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient('Channel Access Token');

    //CurlHTTPClientとシークレットを使いLINEBotをインスタンス化
    $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => 'Channel Secret']);

    // LINE Messaging APIがリクエストに付与した署名を取得
    $signature = $_SERVER["HTTP_" . \LINE\LINEBot\Constant\HTTPHeader::LINE_SIGNATURE];

    //署名をチェックし、正当であればリクエストをパースし配列へ、不正であれば例外処理
    $events = $bot->parseEventRequest(file_get_contents('php://input'), $signature);

    foreach ($events as $event) {
        // メッセージを返信
        $response = $bot->replyMessage(
            $event->getReplyToken(), new \LINE\LINEBot\MessageBuilder\TextMessageBuilder($event->getText())  
        );
    }
```

SDKを導入すると、ものすごく簡単に実装できます。`$event->getReplyToken()`でトークンを取得し、`$event->getText()`で今回発生したイベントのtextを取得します。
今回で言えば`replyMessage`にトークンとテキストを渡してあげれば、おうむ返しをするBOTを作成できます。

## 終わりに
今回は序盤なので、これからDBを追加してユーザーから送信されたテキストを保存したりしたいと思います。
現在作成しているLINEBOTは避難所向けの被災者要望受付LINEBOTなので必要な物資を入力できるようにしたり、避難所に対する要望を保存できるようなBOTを作成しています。
作ってみた感想としては、本当にアイディア次第でどんなBOTでも作成できる夢のあるものだと思います。公式のSDKがとにかく便利でした。