LINE で勤怠アプリ制作に挑戦しました。エックスサーバーを借りているので、データの保存場所を MySQL にしようと思い試行錯誤した手順をこちらに記録しておきます。
目次
なぜ LINE BOT を使ってみようと思ったのか?
いちご園では10名ほどのパートさんの給与計算を担当しています。作業場所が市内に分散しており、屋外のため、Wifi は使えません。そこで、紙ベースで作業記録をつけてもらっています。毎月、給与を計算するときは、作業記録表を元に入力作業が発生してしまい効率が悪いです。
別件で、業務用の連絡を Eメールから LINE グループに変更することになりました。「台風が来ているので作業を中止します」「明日は〇〇に8時集合です」といった連絡が LINE でできるようになり便利になりました。
そこで、もしかしたら LINE BOT で勤怠管理ができるかもしれないと思い、研究することにしました。
エックスサーバーと PHP でLINE BOT を開発
ネット上には、LINE BOT に関する情報は結構たくさんあったので簡単にできると思ったのですが、以下の二つの問題があって、丸二日ぐらいかかってしまいました。
ネット上の情報が古い
2016年の LINE BOT トライアル版が公開された直後は試してみる方が多かったためか、解説しているブログがいくつか出てくるのですが、正規版になってから仕様が変わったらしく、2016年のブログに書かれている手順ではうまくいきませんでした。例えば、「MID」というものがトライアル版にはあったらしいですが、現在の LINE BUSINESS CENTER の管理画面には見当たらず、戸惑いました。
エックスサーバーそのものの問題
LINE BOT SDK をインストールするのに、COMPOSER が必要になるのですが、COMPOSER がなかなか動いてくれず困りました。エックスサーバーの PHP のバージョンが悪いということに気がつくのに 2~3時間かかりました。分かってしまえば簡単なことなんですが、些細なことでも解決できないと異常に時間を使ってしまうのが恐ろしいところ。同じ問題で過去にもつまずいたことがあったのに、記録を残しておかなかったので、同じ間違いを繰り返してしまいました。。。
エックスサーバー側の準備
今回は忘れないように、こちらにしっかり書いておきます。
SSL を使えるようにする
LINE BOT は、SSL で運用しますので、SSL を設定しておきましょう。
エックスサーバーは独自SSLが無料で使えます。太っ腹ですね! エックスサーバーはこちらから契約できます。使ってない方は是非ご利用ください。
月額900円(税抜)から、高速・多機能・高安定レンタルサーバー『エックスサーバー』
エックスサーバーで 無料の独自SSL を使えるようにするためには、サーバーパネルからの設定が必要です。詳細はこちらで書きました。
SSLはネットショップでお買い物する人にとっても、運営するお店にとっても大切です
SSH を使えるようにする
LINE でトークが始まった時、文字のメッセージだけを受け取るのであれば簡単なのですが、メッセージを発信した相手の名前など、LINE の持っている情報にアクセスするためには、LINE が提供しているソフトをサーバーにインストールしなければなりません。レンタルサーバーは運営会社の方針により、ソフトウェアのインストールはさせてくれないことの方が多いのですが、エックスサーバーでは SSH 接続で Linux のコマンドを使って、サーバーにLINE BOT SDK をダウンロードすることができます。
エックスサーバーで SSH を使えるようにするには、管理画面の設定が必要です。まずトップ画面から「SSH 設定」をクリックします。
「変更」欄の「ONにする」をクリックします。
「公開鍵認証用鍵ペアの生成」タブをクリックし、パスワードを入力して「公開鍵認証用の鍵ペア生成(確認)」ボタンをクリックします。
公開鍵ファイルが生成されるので、いったんダウンロードしておきます。
ターミナルソフトを使って SSH 接続する
SSH 接続のためのターミナルソフトを用意します。ここでは、TeraTerm を例に説明します。TeraTerm は、窓の杜からダウンロードできます。
起動したら、ホストを入力し、TCP ポートを「10022」にします。SSH バージョンは SSH2 を選び、「OK」をクリックします。
ユーザー名、パスワード、公開鍵ファイルを設定し、「OK」をクリックします。
公開鍵は拡張子が「key」なので、「すべてのファイル」にしないと表示されません。
無事接続されました。
PHP のバージョンを確認
LINE BOT SDK を入れるためには、COMPOSER を入れる必要があるのですが、COMPOSER は、PHP5.3 以上でないと動かないらしいです。ターミナルで、「php -v」と入力して、PHP のバージョンを確認してみましょう。
エックスサーバーは、契約当初、PHP のバージョンが 5.1.6 になっていました。サーバーパネルでも PHP のバージョンを切り替えることはできるのですが、SSH で接続すると反映されていませんでした。
PHP のバージョンアップ
まず、ターミナルで以下のように入力し、利用できるバージョンを検索します。コマンドの意味は考えず、このまま打てばOKです。
1 |
find /opt/php-*/bin -type f -name 'php' |
HOME の下に bin ディレクトリを作ります。「mkdir」は ディレクトリを作るコマンドです(make directory)
1 |
mkdir $HOME/bin |
先ほど確認したPHPのバージョンから適当なものを選び、作成したディレクトリ内に PHPシンボリックを作成します。以下は、PHP のバージョン 7.1.2 の場合
1 |
ln -s /opt/php-7.1.2/bin/php $HOME/bin/php |
「.bash_profile」という設定ファイルを FTPクライアントソフトなどでダウンロードし、HOME/bin ディレクトリが優先されるように書き換えます。「.bash_profile」ファイルは最上位の階層にあります。
テキストエディタで開き、「PATH=$PATH:$HOME/bin」を「PATH=$HOME/bin:$PATH」に変更する。
1 2 3 4 5 6 7 8 9 10 11 12 |
# .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi # User specific environment and startup programs PATH=$HOME/bin:$PATH export PATH |
ターミナルの接続を「exit」でいったん切ってから、再接続します。「php -v」コマンドを入力し、PHP のバージョンが切り替わっていることを確認しましょう。
COMPOSER のインストール
COMPOSER をインストールします。LINE BOT 用に、何も入っていない公開ディレクトリを作りましょう。ディレクトリは、TeraTerm で mkdir コマンドを打って作っても良いですしFTPクライアントソフトで作ってもOKです。今回は、public_html の直下に「bottest」というディレクトリを作りました。
TeraTerm で、cd コマンドを打って、作成した bottest ディレクトリの中に移動します。
1 |
cd bottest |
TeraTerm の bottest ディレクトリの中で、次のコマンドを入力します。
1 |
curl -sS https://getcomposer.org/installer | php |
少し時間をおいて、successfully と表示されたらインストール完了です。
ls コマンドで、フォルダの中を見ると、composer.phar ファイルが1個できています。
LINE BOT SDK のインストール
LINE BOT SDK をインストールするためのファイルを作ります。適当なテキストエディタで、次の内容のファイルを作成し、composer.json という名前で、先ほど composer をインストールしたディレクトリに FTPソフトでアップロードします。
1 2 3 4 5 |
{ "require": { "linecorp/line-bot-sdk": "^1.1" } } |
再び、TeraTerm に戻り、bottest ディレクトリ内で、以下のコマンドを入力します。
1 |
php composer.phar require linecorp/line-bot-sdk |
ちょっと時間をおいて、line-bot-sdk が、bottest ディレクトリ内にダウンロードされます。
LINE BOT アカウントの取得
LINE BOT は、LINE BUSINESS CENTER で 管理できましたが、2017年9月21日でサービスを終了するそうです。詳細はこちら。今後、運用方法が変わってくるようですが、今のところは、まず、こちらで LINE@ アカウントを取得します。LINE@ アカウントを取得するには、個人のアカウントで認証する必要があります。
LINE@ アカウントを取得したら、こちらでログインします。
アカウント名を入力し、業種を選び、確認をクリックします。確認画面が表示され、申し込むをクリックすると、アカウントが作成されます。APIを利用するをクリックすると、次の設定画面が表示されます。Webhook送信を「利用する」、自動応答メッセージを「利用しない」にして、「保存」をクリックします。
保存されたら、上にある「LINE Developers で設定する」リンクをクリックします。
一番下に「EDIT」という緑色のボタンがあるのでクリックします。
LINE BOT を作成するファイル名を決めて、 Webhook URL欄に入力します。今回は、line.php というファイル名にしました。ドメインの後ろには、「:443」を付けるのがお約束です。
ドメインが「sample.com」、LINE BOT 用ディレクトリが「bottest」、LINE BOT のプログラムが 「callback.php」の場合は、
1 |
https://sample.com:443/bottest/callback.php |
となります。
URL を入力したら、「SAVE」ボタンをクリックします。
LINE Developers 設定画面に戻ります。この画面はこれから使うので、とりあえず、このまま開いておきます。
PHPの記述
いよいよ、プログラムを作成します。テキストエディタで以下を入力して、callback.php という名前で保存し、先ほど LINE BOT SDK をダウンロードしたディレクトリにアップロードします。アップロードしたら、開いておいた LINE Developers 設定画面 の中央の Webhook URL の横にある「VERIFY」ボタンをクリックしましょう。Webhook URL が正しく設定されていると、緑色で Success. と表示されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
<?php require_once __DIR__ . '/vendor/autoload.php'; $accessToken = 'アクセストークンを入れる'; $channelSecret = 'チャンネルシークレットを入れる'; $httpClient = new \LINE\LINEBot\HTTPClient\CurlHTTPClient( $accessToken ); $bot = new \LINE\LINEBot($httpClient, ['channelSecret' => $channelSecret ]); //メッセージ取得 $json_string = file_get_contents('php://input'); $json_object = json_decode($json_string); $replyToken = $json_object->{"events"}[0]->{"replyToken"}; $message_type = $json_object->{"events"}[0]->{"message"}->{"type"}; $message_text = $json_object->{"events"}[0]->{"message"}->{"text"}; //ユーザー情報取得 $user_id = $json_object->{"events"}[0]->{"source"}->{"userId"}; $response = $bot->getProfile( $user_id ); if ($response->isSucceeded()) { $profile = $response->getJSONDecodedBody(); $user_name = $profile['displayName']; //echo $profile['pictureUrl']; //echo $profile['statusMessage']; } //メッセージタイプが text じゃないときはとりあえず終了する if($message_type != "text") exit; //返信メッセージ if($message_text == "おはよう") { $return_message_text = $user_name . "さん おはようございます。出勤時間" . date('Y/m/d H:i:s') . "を記録しました。"; } elseif($message_text == "おつかれ") { $return_message_text = $user_name . "さん おつかれさまでした。退勤時間" . date('Y/m/d H:i:s') . "を記録しました。"; } else { $return_message_text = $user_name . "さん " . $message_text . "は登録されていません"; } //返信実行 $response_format_text = [ "type" => $message_type, "text" => $return_message_text ]; $post_data = [ "replyToken" => $replyToken, "messages" => [$response_format_text] ]; $ch = curl_init("https://api.line.me/v2/bot/message/reply"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post_data)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8', 'Authorization: Bearer ' . $accessToken )); $result = curl_exec($ch); curl_close($ch); ?> |
コード内にある「アクセストークン」「チャンネルシークレット」は、先ほど開いておいた LINE Developers の設定画面から参照できます。
アクセストークンは、設定画面下の方にある長い文字列です。
チャンネルシークレットは、設定画面上の方にあります。「SHOW」ボタンをクリックすると表示されます。
ここまでできたら、設定画面中央の QRコードをスマホで読んで友達になり、テストしてみましょう!
あとは、データベースに出勤時間、退勤時間が記録できるようにすれば完成ですね!
「今月」と話すと、今月の勤務時間が一覧で表示されたり、修正や削除もできるようにしないといけないので、まだまだ完成まではほど遠いですが。。。
長野県駒ヶ根市在住。ネットショップ構築とネットショップ運営サポートをしています。このサイトでは、ユーザーさん向けに役立つIT情報や、技術情報のメモを公開しています。詳しいプロフィール