php使ってLINEボット作ってみた
php使ってLINEボット作ってみた
ちょっと興味があってLINEボットをPHP使って書いてみました。LINEのボットを動かす方法として、herokuを使ってる人が多かったようだけど、面倒臭かったし、試してみたかっただけなので、サーバーはPHPのビルトインウェブサーバーを使い、ngrokを使用してローカルサーバーをインターネットに公開した状態でボットを動かしました。詳しくはgitlabにまとめ他のでクローンして使ってみてね。
LINEのボットが動く仕組み
コードは上記のgitlabを見れば多分分かると思うし、短いから読めると思うんだけど、どういう理屈でLINEのボットが動くのか分かった方がいいと思うんだよね。簡単に理解してほしいんだけど、まず下記の画像を見てほしい。これはLINEデベロッパーで作ったChannel基本設定の項目の一つ、
例えば、ユーザーから受け取ったテキストをおうむ返しさせるLINEボットを作ろうと思ったとき、ボットは上記で設定されたPHPファイルを実行することになる。上記のPHPでは下記のようなコードの部分でLINEが提供しているAPIを叩いて情報を取得する
//====================================================================== // APIを色々リクエストして色々取ってくる。お約束みたいな感じ // I request various APIs and get various things. It feels like an appointment //====================================================================== private function httpPost($api,$body){ $ch = curl_init($api); 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($body)); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json; charser=UTF-8', 'Authorization: Bearer '.$this->channelAccessToken)); $result = curl_exec($ch); curl_close($ch); return $result; }
それら取得した情報の中から、下記のようなコード(ここではユーザーのテキスト情報)で必要な情報を受け取り
//====================================================================== // ユーザーが入力されたテキストを受け取る // The user receives the input text //====================================================================== public function getMessageText(){ $webhook = $this->webhookEventObject; $messageText = $webhook->{"events"}[0]->{"message"}->{"text"}; return $messageText; }
下記のようなコードでユーザーにリプレイを返す
//====================================================================== // ユーザーから受け取ったテキストをおうむ返ししてる // I am returning the text received from the user //====================================================================== public function reply($text){ $api = $this->apiReply; $webhook = $this->webhookEventObject; $replyToken = $webhook->{"events"}[0]->{"replyToken"}; $body["replyToken"] = $replyToken; $body["messages"][0] = array( "type" => "text", "text"=>$text ); $result = $this->httpPost($api,$body); return $result; }
上記のURLに接続し、PHPを実行するには、発行されらアクセストークンと、チャンネルのシークレットが必要になるので、下記のような部分に入力し通信を可能にする
class Setting { public function getChannelAccessToken(){ $channelAccessToken = ""; return $channelAccessToken; } public function getChannelSecret(){ $channelSecret = ""; return $channelSecret; } public function getApiReply(){ $api = "https://api.line.me/v2/bot/message/reply"; return $api; } }
実際に動かして見れば早いかも
理屈がわかれば理解が早いと思う。実際に動くコードをgitlabに上げたので動かしてみてください。
ssl通信環境じゃないと動かないので、あなたがもしhttpsがついたウェブサーバーを持ってれば、上記のソースをそのまま設置して、LINEデベロッパーで作ったChannel基本設定の「Webhook URL ※SSLのみ対応 」の箇所に、index.phpのあるurlを書き込めばそれでいいし、httpsがついたウェブサーバーを持ってなければ、多くの人と同じようにherokuを使うか、phpのビルドインサーバーでローカルサーバーを作ってngrockでネットに公開すれば、ngrockはhttpsサーバーが出来るので、それでためせるかと思います。