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サーバーが出来るので、それでためせるかと思います。

藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事