LINE BOTをPHPで作る - BOT本体作成



LINE BOT本体をPHPで作る方法をメモします。

公式SDK

LINE BOTを作るために公式PHP版SDKを利用しました。

https://github.com/line/line-bot-sdk-php

それをサーバーにインストールします。
インストール方法については、別途記載します。

つくるもの

メッセージを打つとそのままオウム返ししてくれるBOTを作ります。また、BOTからのスタンプ、地図、ダイアログ型メッセージ、カルーセル型メッセージなどを返信できるようなので、それらも試してみました。
  • スタンプを送るとスタンプを返す(送信できるスタンプには制限があるようです。)
  • 「位置」という文字を打つと、地図を返す
  • 「確認」という文字を打つと、ダイアログ型メッセージを返す
  • 「選択」という文字を打つと、カルーセル型メッセージを返す
  • それ以外はオウム返し
という形で作ってみます。

BOT本体 PHPソース

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);
  }
 }
}
ACCESS_TOKEN はチャネル基本設定にある「アクセストークン」の値をセットします。
SECRET_TOKEN はチャネル基本設定にある「Channel Secret」の値をセットします。
PHPソース
1
2
const ACCESS_TOKEN = "hvwJKvQlP08O2yY8MSARjwjutjbjwqDOla/LWtemrCyUMyvEwZCydvriZKtqWDq0BXSzctAtmCbSyKDW+t6DWkTBKBXhnVrIP+45quO0i9SjpSyhAXAuK88iIIEUTeXZ25oZD++pPfw5nr2ZcZOiJgdB04t89/1O/w1cDnyilFU=";
const SECRET_TOKEN = "e146218623f6b8dca65bf07af3bd5776";
StickerMessageBuilderでは、パッケージIDとステッカーIDを設定して任意のスタンプを送信しています。
※ただし、使用できるスタンプには制限があるようです。
PHPソース
1
2
//スタンプ送信
$bot->replyMessage($event->getReplyToken(), new StickerMessageBuilder('1', '2'));
カルーセルに写真を表示していますが、絶対パスにする必要があるようです。(確か…)
PHPソース
1
2
// カルーセルのカラムを作成する
$column = new CarouselColumnTemplateBuilder("タイトル(40文字以内)", "ブログです", 'https://57c57cef.ngrok.io/linebot/image/PICT0065.JPG', [$action]);

設定

  1. 作ったBOTのphpファイルをサーバーにアップします。
  2. Line Developersページのチャネル基本設定にあるWebhook URLに上記のファイルがあるURLを指定します。


今回はローカルマシンの仮想サーバーにアップしました。ngrokを利用して公開しています。

結果

チャネル基本設定画面にあるQRコードで友達追加します。
追加されました。
「こんにちは~」を打つとそのまま返してくれます。(後ろにユーザー名も表示していますが)
「位置」で地図
「選択」でカルーセル型
「確認」でダイアログ(ダイアログ選択後の処理は未実装)
スタンプも返してくれました。














LINEから返信できる様々なメッセージを確認できました。
ラッパークラスを作ったり、メッセージの分岐等についてはこれから勉強していきます。

コメント

人気の投稿