Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

LINEBOTを作るに当たって参考にしたもの

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例を参考にしました。

LINE BOTを作ろう! Messaging APIを使ったチャットボットの基礎と利用例.jpg

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

また、Messaging APIの公式ドキュメントも参考になりました。

環境構築について

LINEBOTに関しては多くの記事が出ていて、GASを使ってサーバーレスでLINEBOTを作成する例が多いですが、Herokuを使ってみたかったので、Herokuを使用するようにしました。
 

実行環境について

  • Macbook Air Early 2014
  • メモリ 8GB
  • プロセッサ intel Core i5
  • macOS Sierra

Herokuアカウントを開設する

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

まずはアカウントを作成します。
登録画面.png
登録画面に必要な項目を入力します。今回は先述したようにPHPを使用するので、ここで主な開発言語はPHPを選択します。
これでアカウントの作成は完了です。

Heroku CLIのインストール

LINEBOTを作成するのに直接的には不要ですが、今後の開発時にHerokuのlogを確認したり、ツールを導入する際にローカルから操作を行う際に必要になるため、インストールをしておきます。
The 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までを参考に進めました。

今回は以下のように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をインストールしてみた
を参考にインストールします。

先ほど作成した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にアクセスします。
ログイン.png
右上のログインまたは、画面中央のログインをクリックします。

入力.png
この画面で、自分のLINEアカウントに登録しているメールアドレスとパスワードを入力してログインします。

プロバイダー.png
ログインしたら新規のプロバイダーを作成します。今回はmasaki-ogawaという名前のプロバイダーを作成しました。

チャンネル.png
真ん中のMessaging APIでチャンネルを作成します。

画面.png
この画面から各種情報を入力します。

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

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

こちらのドキュメントからも作成の方法が確認できます。

おうむ返しをするLINEBOTを作成する

IMG_B7444740210C-1.jpeg
こんなのを作成します。

必要になるデータを確認する

ユーザーからBOTに向けてメッセージが送信されるとその内容が、JSON形式でWebhook URLに指定したURLに渡されます。
例えば、ユーザーから「こんにちは」というテキストメッセージが送信された場合以下の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に以下のコードを記述します。

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がとにかく便利でした。

masaki-ogawa
新卒一年目のエンジニアです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした