LINE BOTをPHPで作る - BOT本体作成
公式SDK
LINE BOTを作るために公式PHP版SDKを利用しました。https://github.com/line/line-bot-sdk-php
それをサーバーにインストールします。
インストール方法については、別途記載します。
つくるもの
メッセージを打つとそのままオウム返ししてくれるBOTを作ります。また、BOTからのスタンプ、地図、ダイアログ型メッセージ、カルーセル型メッセージなどを返信できるようなので、それらも試してみました。- スタンプを送るとスタンプを返す(送信できるスタンプには制限があるようです。)
- 「位置」という文字を打つと、地図を返す
- 「確認」という文字を打つと、ダイアログ型メッセージを返す
- 「選択」という文字を打つと、カルーセル型メッセージを返す
- それ以外はオウム返し
BOT本体 PHPソース
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | use \LINE\LINEBot\HTTPClient\CurlHTTPClient; use \LINE\LINEBot; use \LINE\LINEBot\Constant\HTTPHeader; use LINE\LINEBot\MessageBuilder\TextMessageBuilder; use LINE\LINEBot\MessageBuilder\MultiMessageBuilder; use LINE\LINEBot\MessageBuilder\StickerMessageBuilder; use LINE\LINEBot\MessageBuilder\LocationMessageBuilder; use LINE\LINEBot\MessageBuilder\TemplateMessageBuilder; use LINE\LINEBot\MessageBuilder\TemplateBuilder\ConfirmTemplateBuilder; use LINE\LINEBot\TemplateActionBuilder\MessageTemplateActionBuilder; use LINE\LINEBot\TemplateActionBuilder\UriTemplateActionBuilder; use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselColumnTemplateBuilder; use LINE\LINEBot\MessageBuilder\TemplateBuilder\CarouselTemplateBuilder; use LINE\LINEBot\Event\MessageEvent; use LINE\LINEBot\Event\MessageEvent\AudioMessage; use LINE\LINEBot\Event\MessageEvent\ImageMessage; use LINE\LINEBot\Event\MessageEvent\LocationMessage; use LINE\LINEBot\Event\MessageEvent\StickerMessage; use LINE\LINEBot\Event\MessageEvent\TextMessage; use LINE\LINEBot\Event\MessageEvent\UnknownMessage; use LINE\LINEBot\Event\MessageEvent\VideoMessage; use LINE\LINEBot\Event\UnfollowEvent; use LINE\LINEBot\Event\FollowEvent; //SDK読込み require_once __DIR__. '/vendor/autoload.php' ; //トークン const ACCESS_TOKEN = "hvwJKvQlP08O2yY8MSARjwjutjbjwqDOla/LWtemrCyUMyvEwZCydvriZKtqWDq0BXSzctAtmCbSyKDW+t6DWkTBKBXhnVrIP+45quO0i9SjpSyhAXAuK88iIIEUTeXZ25oZD++pPfw5nr2ZcZOiJgdB04t89/1O/w1cDnyilFU=" ; const SECRET_TOKEN = "e146218623f6b8dca65bf07af3bd5776" ; //LINEからのメッセージを確認 if (isset( $_SERVER [ "HTTP_" .HTTPHeader::LINE_SIGNATURE])){ //LINEBOTにPOSTで送られて来た生データ取得 $inputdata = file_get_contents ( 'php://input' ); //LINEBOTSDKの設定 $httpclient = new CurlHTTPClient(ACCESS_TOKEN); $bot = new LineBot( $httpclient , [ 'channelSecret' => SECRET_TOKEN]); $signature = $_SERVER [ "HTTP_" .HTTPHeader::LINE_SIGNATURE]; try { $events = $bot ->parseEventRequest( $inputdata , $signature ); } catch (\LINE\LINEBot\Exception\InvalidSignatureException $e ) { error_log ( 'parseEventRequest failed. InvalidSignatureException => ' .var_export( $e , true). "\n" , 3, "./php_error.log" ); } catch (\LINE\LINEBot\Exception\UnknownEventTypeException $e ) { error_log ( 'parseEventRequest failed. UnknownEventTypeException => ' .var_export( $e , true). "\n" , 3, "./php_error.log" ); } catch (\LINE\LINEBot\Exception\UnknownMessageTypeException $e ) { error_log ( 'parseEventRequest failed. UnknownMessageTypeException => ' .var_export( $e , true). "\n" , 3, "./php_error.log" ); } catch (\LINE\LINEBot\Exception\InvalidEventRequestException $e ) { error_log ( 'parseEventRequest failed. InvalidEventRequestException => ' .var_export( $e , true). "\n" , 3, "./php_error.log" ); } //大量にメッセージが送られると複数分のデータが同時に送られてくるため、foreachをしている。 foreach ( $events as $event ) { //クライアント名取得 $userId = $event ->getUserId(); $response = $bot ->getProfile( $userId ); if ( $response ->isSucceeded()) { $profile = $response ->getJSONDecodedBody(); $displayName = $profile [ 'displayName' ]; $user = $displayName ; $_SESSION [ "USER_ID" ] = $profile [ 'userId' ]; $_SESSION [ "USER_NM" ] = $profile [ 'displayName' ]; } //イベントタイプ判別 $return_type = "" ; $message_text = "" ; if ( $event instanceof MessageEvent) { //メッセージイベント取得 if ( $event instanceof TextMessage) { if ( $event -> getText ()== "位置" ) { $return_type = "location" ; } elseif ( $event -> getText ()== "確認" ) { $return_type = "confirm" ; } elseif ( $event -> getText ()== "選択" ) { $return_type = "carousel" ; } else { $return_type = "text" ; $message_text = "「" . $event -> getText (). "」ですね?「" . $user . "」さん" ; } } elseif ( $event instanceof StickerMessage) { $return_type = "sticker" ; } } else { $message_text = 'メッセージイベント以外は無効です' ; } //返信 if ( $return_type == "text" ) { //オウム返し $SendMessage = new MultiMessageBuilder(); $TextMessageBuilder = new TextMessageBuilder( $message_text ); $SendMessage ->add( $TextMessageBuilder ); $bot ->replyMessage( $event ->getReplyToken(), $SendMessage ); } elseif ( $return_type == "sticker" ) { //スタンプ送信 $bot ->replyMessage( $event ->getReplyToken(), new StickerMessageBuilder( '1' , '2' )); } elseif ( $return_type == "location" ) { //地図送信 $bot ->replyMessage( $event ->getReplyToken(), new LocationMessageBuilder( "位置情報" , "チトワンソウラハ村" , 27.576718, 84.493928)); } elseif ( $return_type == "confirm" ) { //確認ダイアログ送信 $bot ->replyMessage( $event ->getReplyToken(), new TemplateMessageBuilder( 'Confirm alt text' , new ConfirmTemplateBuilder( 'Do it?' , [ new MessageTemplateActionBuilder( 'Yes' , 'Yes!' ), new MessageTemplateActionBuilder( 'No' , 'No!' ),] ) ) ); } elseif ( $return_type == "carousel" ) { //カルーセル型メッセージ送信 $columns = []; // カルーセル型カラムを3つ追加する配列 for ( $i =0; $i <3; $i ++) { // カルーセルに付与するボタンを作る $action = new UriTemplateActionBuilder( "クリックしてね" , "http://hiroasake.blogspot.com/" ); // カルーセルのカラムを作成する $column = new CarouselColumnTemplateBuilder( "タイトル(40文字以内)" , "ブログです" , 'https://57c57cef.ngrok.io/linebot/image/PICT0065.JPG' , [ $action ]); $columns [] = $column ; } // カラムの配列を組み合わせてカルーセルを作成する $carousel = new CarouselTemplateBuilder( $columns ); // カルーセルを追加してメッセージを作る $carousel_message = new TemplateMessageBuilder( "メッセージのタイトル" , $carousel ); $bot ->replyMessage( $event ->getReplyToken(), $carousel_message ); } } } |
SECRET_TOKEN はチャネル基本設定にある「Channel Secret」の値をセットします。
1 2 | const ACCESS_TOKEN = "hvwJKvQlP08O2yY8MSARjwjutjbjwqDOla/LWtemrCyUMyvEwZCydvriZKtqWDq0BXSzctAtmCbSyKDW+t6DWkTBKBXhnVrIP+45quO0i9SjpSyhAXAuK88iIIEUTeXZ25oZD++pPfw5nr2ZcZOiJgdB04t89/1O/w1cDnyilFU=" ; const SECRET_TOKEN = "e146218623f6b8dca65bf07af3bd5776" ; |
※ただし、使用できるスタンプには制限があるようです。
1 2 | //スタンプ送信 $bot ->replyMessage( $event ->getReplyToken(), new StickerMessageBuilder( '1' , '2' )); |
1 2 | // カルーセルのカラムを作成する $column = new CarouselColumnTemplateBuilder( "タイトル(40文字以内)" , "ブログです" , 'https://57c57cef.ngrok.io/linebot/image/PICT0065.JPG' , [ $action ]); |
設定
- 作ったBOTのphpファイルをサーバーにアップします。
- Line Developersページのチャネル基本設定にあるWebhook URLに上記のファイルがあるURLを指定します。
今回はローカルマシンの仮想サーバーにアップしました。ngrokを利用して公開しています。
結果
チャネル基本設定画面にあるQRコードで友達追加します。
追加されました。
「こんにちは~」を打つとそのまま返してくれます。(後ろにユーザー名も表示していますが)
「位置」で地図
「選択」でカルーセル型
「確認」でダイアログ(ダイアログ選択後の処理は未実装)
スタンプも返してくれました。
LINEから返信できる様々なメッセージを確認できました。
ラッパークラスを作ったり、メッセージの分岐等についてはこれから勉強していきます。
コメント
コメントを投稿