32
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

PHP×LINE Messaging APIで作るチャットボット

Last updated at Posted at 2018-04-14

#1)はじめに

概要は公式のページで確認しましょう。

Messaging APIの概要はこちら
https://developers.line.me/ja/docs/messaging-api/overview/

#2)チャネルを作成する
Messaging APIを利用するには
https://developers.line.me/ja/docs/messaging-api/getting-started/

公式のドキュメント(上記)を読みながら、

  • コンソールへのログイン
  • 開発者登録
  • 新規プロバイダー作成
  • チャネル作成

まで進めます。

■アクセストークン(ロングターム)
後ほどプログラム内で使うのでコピーしておきましょう。

■Web hook URL
実際に作ったプログラムを設置するURLです。※SSL必須

#3)プログラムを作る
今回は簡単に仕組みを理解するため、PHPを使います。

##イベント種別
イベント種別にはメッセージ・フォロー・フォロー解除・参加・退出・ポストバック・ビーコン・アカウント連携など様々ありますが、今回は

  • メッセージイベント(メッセージが送信されると発生)
  • ポストバックイベント(ポストバックオプションに返事されると送信)

のみを使います。

Botに対してテキストなどを送信すると、下記のようなJSON形式でWeb hook URLにデータが送られるので、更にJSON形式でデータを送り返すことで、ユーザーに反応が帰ります。

テキストメッセージの例
{
    "replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
    "type": "message",
    "timestamp": 1462629479859,
    "source": {
        "type": "user",
        "userId": "U4af4980629..."
    },
    "message": {
        "id": "325708",
        "type": "text",
        "text": "Hello, world!"
    }
}
ポストバックイベントの例
{
    "replyToken": "b60d432864f44d079f6d8efe86cf404b",
    "type": "postback",
    "timestamp": 1513669370317,
    "source": {
        "userId": "U91eeaf62d...",
        "type": "user"
    },
    "postback": {
        "data": "storeId=12345",
        "params": {
            "datetime": "2017-12-25T01:00"
        }
    }
}

実際にPHPでコールバックするプログラムを組んでみます。
今回は仕組みの理解が目的なので、公式のSDKは使わずにやってみたいと思います。

今回作るのは、下記のような仕様とします。

ユーザーの動作 Botの動作
テキストを送ると テキストを返す(オウム返し)
スタンプを送ると スタンプを返す
画像を送ると 画像を返す
位置情報を送ると 皇居の位置情報を返す

※ ユーザーに送信する画像のURLはHTTPSでないといけません
※ 元からアプリに入っている、LINEの基本的なスタンプ(PDF)のみ使えます

ユーザーの動作 Botの動作
「予約」と送ると 選択メニューを出す

▼選択メニューの動作

ユーザーの動作 Botの動作
「予約しない」 「何もしませんでした。」
「期日を指定」 「【2018-01-01】にご予約を承りました。」

##フォルダ構成
/line/
 ├ callback.php
 ├ original_image.png
 └ prev_image.png

##完成イメージ

callback.php
$access_token = '[取得したアクセストークン]';

// APIから送信されてきたイベントオブジェクトを取得
$json_string = file_get_contents('php://input');

// 受け取ったJSON文字列をデコード
$json_obj = json_decode($json_string);

// このイベントへの応答に使用するトークン
$reply_token = $json_obj->{'events'}[0]->{'replyToken'};

// イベント種別(今回は2種類のみ)
// message(メッセージが送信されると発生)
// postback(ポストバックオプションに返事されると送信)
$type = $json_obj->{'events'}[0]->{'type'};

// メッセージオブジェクト(今回は4種類のみ)
// text(テキストを受け取った時)
// sticker(スタンプを受け取った時)
// image(画像を受け取った時)
// location(位置情報を受け取った時)
$msg_obj = $json_obj->{'events'}[0]->{'message'}->{'type'};

if($type === 'message') {
	// メッセージ受け取り時
	if($msg_obj === 'text') {
		// テキストを受け取った時
		$msg_text = $json_obj->{'events'}[0]->{'message'}->{'text'};
		if($msg_text === '予約') {
			$message = array(
				'type' => 'template',
				'altText' => 'いつのご予約ですか?',
				'template' => array(
					'type' => 'confirm',
					'text' => 'いつのご予約ですか?',
					'actions' => array(
						array(
							'type' => 'postback',
							'label' => '予約しない',
							'data' => 'action=back'
						), array(
							'type' => 'datetimepicker',
							'label' => '期日を指定',
							'data' => 'datetemp',
							'mode' => 'date'// date:日付を選択します。time:時刻を選択します。datetime:日付と日時を選択します。
						)
					)
				)
			);
		} else {
			$message = array(
				'type' => 'text',
				'text' => '【'.$msg_text.'】とは何ですか?'
			);
		}
	} elseif($msg_obj === 'sticker') {
		// スタンプを受け取った時
		$message = array(
			'type' => 'sticker',
			'packageId' => '1',
			'stickerId' => '3'
		);
	} elseif($msg_obj === 'image') {
		// 画像を受け取った時
		$message = array(
			'type' => 'image',
			// オリジナル画像(タップしたら表示される画像)
			'originalContentUrl' => 'https://XXXXXXXXXX/line/original_image.png',
			// サムネイル画像(トーク中に表示される画像)
			'previewImageUrl' => 'https://XXXXXXXXXX/line/preview_image.png'
		);
	} elseif($msg_obj === 'location') {
		// 位置情報を受け取った時
		$message = array(
			'type' => 'location',
			'title' => '皇居',
			'address' => '〒100-8111 東京都千代田区千代田1−1',
			'latitude' => 35.683798,
			'longitude' => 139.754182
		);
	}
} else if($type === 'postback') {
	// ポストバック受け取り時

	// 送られたデータ
	$postback = $json_obj->{'events'}[0]->{'postback'}->{'data'};

	if($postback === 'datetemp') {
		// 日にち選択時
		$message = array(
			'type' => 'text',
			'text' => '【'.$json_obj->{'events'}[0]->{'postback'}->{'params'}->{'date'}.'】にご予約を承りました。'
		);
	} elseif($postback === 'action=back') {
		// 戻る選択時
		$message = array(
			'type' => 'text',
			'text' => '何もしませんでした。'
		);
	}
}

$post_data = array(
	'replyToken' => $reply_token,
	'messages' => array($message)
);

// CURLでメッセージを返信する
$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 ' . $access_token
));
$result = curl_exec($ch);
curl_close($ch);
32
37
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
37

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?