【PHP】LINE Messaging APIをつかってオウム返し BOT つくってみた


# つくりたいもの
<img width="200" alt="オウム返し.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/175122/7ede23d7-f980-9da6-c661-203be564731e.png">

Messaging APIをつかって、こんなふうに自分がメッセージを送ったら
その内容をオウム返ししてくるBOTをつくってみようとおもいます！

# Messaging APIの仕組み
> Messaging APIを使うと、ボットアプリのサーバーとLINEプラットフォームの間でデータを交換できます。ユーザーがボットにメッセージを送るとwebhookがトリガーされ、LINEプラットフォームからボットアプリのサーバーのwebhook URLにリクエストが送信されます。すると、ボットアプリのサーバーからLINEプラットフォームに、ユーザーへの応答リクエストが送信されます。リクエストは、JSON形式でHTTPSを使って送信されます。
引用：[Messaging API - LINE Developers](https://developers.line.me/ja/docs/messaging-api/overview/)

![MessagingAPI仕組み.png](https://qiita-image-store.s3.amazonaws.com/0/175122/f591cc5b-ec78-e377-ec99-d2d9e4a3f842.png)


webhookがわからなかったのでこちらでお勉強させていただきました:bow_tone1:
https://qiita.com/soarflat/items/ed970f6dc59b2ab76169

# 準備するもの
1. LINEアカウント（今回はもっているものとして進めていきます）
2. Messaging API
3. ボットアプリのサーバ（Heroku）

## Messaging API
### 1. [LINE Developers](https://developers.line.me/ja/)へアクセスし、「Messaging API（ボット）を始める」でアカウントをつくる

<img width="600" alt="LINE Developers.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/b6c78061-c1df-3d55-fde5-fae290d397c0.png">

### 2. 個人のLINEアカウントのメールアドレス・パスワードでログイン

### 3. 開発者登録

<img width="600" alt="開発者登録.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/dfd76cd9-5782-20fd-4cf9-0a02f904217b.png">

名前とメールアドレスを入力し、登録完了です！

### 4. プロバイダを作成

<img width="600" alt="プロバイダ.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/a6a27bfe-a834-a73a-56a9-2621b4094c17.png">

### 5. チャネルを作成
 
<img width="600" alt="チャネル.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/190b6ac5-d493-a4af-7129-1b6a4cfe6185.png">

#### プラン
調べてみたところ、Developer Trialとフリーの大きな違いとしては以下の通りでした。

<img width="600" alt="プラン.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/f71037aa-3510-01af-776a-816d0f882c2e.png">

どちらも無料のプランですが、
・Developer Trialは友達登録が50人まで
・フリーはPush API(ボットからの自発的なメッセージ送信)ができない
とそれぞれ制限があります。

今回は友達は50人登録できれば十分なので、Developer Trialを選択しました。


その他プランなど詳しい情報はこちらをご覧ください:information_desk_person_tone1:
[LINE@プラン・料金](https://at.line.me/jp/plan)

#### 大業種・小業種
　ファッションについての情報を発信するならばファッション、
　食べ物についての情報を発信するのであればグルメ・食料品　など
　かなりざっくり決めてしまっていいようです！
　わたしは芸人が好きなのでとりあえず有名人・コメディアンにしました。

---
入力をすべて終え、確認をおすと作成したチャネルを確認することができます。

<img width="449" alt="確認.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/e7986cbb-6516-40e1-aeac-275d7f4b3e74.png">

つくられています！
ですが、「設定が完了していません」とあります...クリックしましょう。

<img width="600" alt="メッセージ送受信設定.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/bbe2f66e-1a20-a17e-db9e-61b4a3caec08.png">
 
・アクセストークン：再発行
・Webhook送信：利用する
・自動応答メッセージ：利用しない
と設定してください。

Webhook URLにはボットアプリのサーバのURLがはいるのでまだ空欄で大丈夫です。
いったんこちらはこのままで、次にボットアプリのサーバを用意していきます。

## ボットアプリのサーバ（Heroku）
Herokuを利用してボットアプリのサーバを用意します。
### Herokuとは？
>heroku（ヘロク）とは、PaaS（Platform as a Service）と呼ばれるサービスで、アプリケーションを実行するためのプラットフォームです。もう少しわかりやすく説明すると、サーバやOS、データベースなどの「プラットフォーム」と呼ばれる部分を、インターネット越しに使えるようにしてくれるサービスの一つです。
引用：[【5分でわかる】herokuとは？概要や特徴をわかりやすく解説](https://www.sejuku.net/blog/7858)

### 1. Herokuのアカウント作成
アカウントをまだ持っていない方は[こちら](https://www.heroku.com/)から作成してください！

### 2.サーバ（アプリ）を作成
<img width="600" alt="サーバ.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/4ba9cf26-9936-33d3-6c84-ec9d59362bb2.png">

「Create New App」をクリックし、アプリ作成画面へ移動します。

<img width="600" alt="CreateNewApp.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/bae587ae-f02c-2a79-6f24-20ffd80d2e3a.png">

「App Name」はさきほどのWebhook URLのドメインとなります。
わたしは`linebot0325`と設定しましたが、ここはユニークなものにならなければいけないので、違うものを登録してください。

アプリができたところで、次にプログラムを書いていきます。

### 3. [Messaging API SDK for PHP](https://github.com/line/line-bot-sdk-php)をインストール

``` console:terminal
$ mkdir line-bot-sdk-php
$ cd line-bot-sdk-php
$ composer require linecorp/line-bot-sdk
```

### 4. 別のディレクトリを作成し、インストールしたSDKから必要なファイルのみ移動

今回必要となるファイルは以下の2つです。
`line-bot-sdk-tiny/echo_bot.php`
`line-bot-sdk-tiny/LINEBotTiny.php`

``` console:terminal
$ cd ..
$ mkdir linebot0325
$ mv line-bot-sdk-php/vendor/linecorp/line-bot-sdk/line-bot-sdk-tiny/echo_bot.php linebot0325
$ mv line-bot-sdk-php/vendor/linecorp/line-bot-sdk/line-bot-sdk-tiny/LINEBotTiny.php linebot0325
```
### 5. 空の`index.php`ファイルを作成
`index.php`がないと怒られてしまうようなので、空のファイルを作成しておきます。

``` console:terminal
$ cd linebot0325
$ vi index.php
```
lsコマンドできちんと移動・作成できているか確認してみましょう！

``` console:terminal
$ cd linebot0325
$ ls
```
### 6. `echo_bot.php`のファイル名を`webhook.php`へ変更し、内容も一部書きかえる

``` console:terminal
$ mv echo_bot.php webhook.php
$ vi webhook.php
```
viコマンドではなく、テキストエディタでひらいて変更でも問題ありません。

``` php:webhook.php
<?php
/**
 * Copyright 2016 LINE Corporation
 *
 * LINE Corporation licenses this file to you under the Apache License,
 * version 2.0 (the "License"); you may not use this file except in compliance
 * with the License. You may obtain a copy of the License at:
 *
 *   https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations
 * under the License.
 */
require_once('./LINEBotTiny.php');
$channelAccessToken = '<your channel access token>';
$channelSecret = '<your channel secret>';
$client = new LINEBotTiny($channelAccessToken, $channelSecret);
foreach ($client->parseEvents() as $event) {
    switch ($event['type']) {
        case 'message':
            $message = $event['message'];
            switch ($message['type']) {
                case 'text':
                    $client->replyMessage(array(
                        'replyToken' => $event['replyToken'],
                        'messages' => array(
                            array(
                                'type' => 'text',
                                'text' => $message['text']
                            )
                        )
                    ));
                    break;
                default:
                    error_log("Unsupporeted message type: " . $message['type']);
                    break;
            }
            break;
        default:
            error_log("Unsupporeted event type: " . $event['type']);
            break;
    }
};

?>
```
変更するべきところは18, 19行目です！

``` php:webhook.php変更点
$channelAccessToken = '<your channel access token>';
$channelSecret = '<your channel secret>';
```

`<your channel access token>`はチャネルをつくったときに再発行したアクセストークンに、
`<your channel secret>`は同じくチャネルの基本設定にあるChannel Secretに
それぞれかきかえます。

これで送ったメッセージに対しオウム返ししてくるプログラムは完成です:confetti_ball:
あとはHerokuにデプロイしていきます。

```
$ heroku login
```
gitのリポジトリを新たに作成する

```
$ cd linebot0325
$ git init
```

Herokuの接続先を変更する

```
$ heroku git:remote -a linebot0325
```

ディレクトリ配下のすべてのファイルをコミットの対象とする。

```
$ git add .
```
コミット・プッシュする

```
$ git commit -am "make it better"
$ git push heroku master
```
これにてデプロイも完了です！

最後に空欄にしてあったチャネル基本設定の「Webhook URL」を
`https://<アプリ名>.herokuapp.com/webhook.php`
と設定すればアカウントが動いてくれるはずです！

さっそく友達登録をして試してみましょう！

## 謎
<img width="791" alt="謎.png" src="https://qiita-image-store.s3.amazonaws.com/0/175122/ac996316-5434-1f10-d757-3ed6ca9e9419.png">

接続確認でこのようなエラーがでているのにもかかわらず、BOTはしっかりと動いてくれているという・・・
今日は体力と頭の限界なので後日調査し追記したいと思います:sob:

# 最後に
ある記事に「わずか5分で」とかかれていたため、気軽な気持ちでやってみましたが、
わたしでは実装2時間+この記事作成22時間、計24時間かかってしまいました:baby:

ですがやっぱり手軽にBOTをつくれるというのは楽しく、
もっといろんな仕様のBOTをつくってみたくなりました！

アドバイス、指摘事項などいただけるとうれしいです:bow: