LINE bot APIを利用してあかりbotを作ってみた

シェアする

  • このエントリーをはてなブックマークに追加

こんばんは。

本日偶然「エクスメイデン」というアニメを見つけ、ニコニコチャンネルで全話無料公開されていたので見てみたのですが、なかなか面白かったです。

web限定のショートアニメのようで、時間は各話バラバラです。

趣旨は、人類を脅かす謎の生命体をほったらかしてグダグダやるという、台本無い系アニメです(台本無い系アニメは他に石ダテコー太郎監督の作品がありますね。gdgd妖精s直球表題~てさぐれ!ですね)

LINEスタンプも販売されています。私はDLしました。

さて、LINEといえば今朝、LINEのbot(自動で返事とかするアカウント)を作るためのAPI(LINEの機能を機械的に利用するためのコマンド集みたいなやつ)を利用してbotを作る行為が一般にも開放されたというニュースを耳にしたので、PHPの勉強がてらやってみました。

先着1万人に先行公開されているようですが、今朝9時くらいではまだ登録できました。今はどうなんでしょうか。

下記URLにアクセスして、LINEアカウントにログインして、必要事項を色々入力したらとりあえずアカウントは作れます。

https://business.line.me/services/products/4/introduction

解説する前に、参考にしたサイトを載せておきます。

LINE BOT API Trialでできる全ての事を試してみた(Qiita)

webscript.ioでLINE BOT APIの事始め(はてなブログ)

あかりbotを作ってみた

さて、上記サイトを参考にアカウントを登録するとhttps://developers.line.me/channels/[アカウントのChannel ID]というページに情報が記載されます。

登録時、callback URLというものを設定できますが、これはbotに対する投稿を受け取るときに必要です。

・ユーザーがbotとのトークやbotを含むグループで何かを投稿

→callback URLに設定したファイル(PHPなど)に投稿内容が入力される

→PHPなどのプログラムがAPIを利用して内容を受け取る

→プログラムが受け取った内容に対する返信を作成し、APIを利用してLINEに送信

→LINEがbotの投稿内容を受け取り、botアカウントの投稿として送信し、ユーザーがそれを見る

というような流れです。

callback URLにはセキュアなサーバーを利用しなければなりません(SSL暗号化通信を行うサーバー、すなわちhttps://で始まるURLでないといけません。)

私はVALUE-SERVERのレンタルサーバーを利用しているので

https://ss1.valueserver.jp:443/[自分のID].[サーバータイプ].valueserver.jp/callback.php

みたいになります(VALUE-SERVERでのSSLの利用方法は、よくある質問ページの「共有SSLについて」に書いてあります)。

「:433」というのはポート番号で、私もこのあたりは苦手であまりよく分かってないのですが最初の.jpの後に「:433」を付ける必要があるようです。

さて、callback.phpの内容を書きましょう。

LINE bot APIについては、下記サイトに英語で書かれていますが、分かりにくいです。

https://developers.line.me/bot-api/api-reference

上述の「LINE BOT API Trialでできる全ての事を試してみた」に記載されているコードを思いっきり拝借します。

<?php
// アカウント情報設定
$channel_id = "[Channel ID]";
$channel_secret = "[Channel Secret]";
$mid = "[MID]";

アカウントの情報を設定します。登録したアカウントのBasic Informationのページで確認した内容を[]の部分に書きます。文字列です。

// メッセージ受信
$json_string = file_get_contents('php://input');
$json_object = json_decode($json_string);
$content = $json_object->result{0}->content;
$text = $content->text;
$from = $content->from;
$message_id = $content->id;
$content_type = $content->contentType;

$event_type = "138311608800106203";

メッセージを受信します。

"php://input"に投稿内容が文字列として入力されるので、まずそれを受け取ります。

json形式なので、変形をして、個々の内容を取り出せるようにします。(json形式についてはググってください)

それぞれの項目はhttps://developers.line.me/bot-api/api-referenceに記載されている項目です。

event_typeはよく分かりませんがリファレンスに記載されている固定値です(必ずこの1383...203という文字列です)。

さて、投稿内容を作りましょう。

今回は、入力の受け取りと、それに応じた出力を行うbotを作りたいので「あかりbot」を作ることにしました。

「あかりbot」というのは、漫画・アニメ「ゆるゆり」の主人公である赤座あかりの名言「わぁいうすしお あかりうすしお大好き」をモチーフにしたもので、入力文字列を○○とすると「わぁい○○ あかり○○大好き」と返すようなbotという意味だとします。

$content = <<< EOM
		"contentType":1,
		"text":"わぁい{$text} あかり{$text}大好き"
EOM;

<<<とかEOMとかいうのは、複数行を入力するためのPHPのテクニックです。

contentTypeというのは、投稿がテキストか画像か音声かスタンプか、というのを判別するための数字で、テキスト投稿は1です。リファレンスに書いてあります。

メッセージ受け取りの部分でテキストを$text変数に格納しているので、{$text}の部分が入力内容に置き換わって投稿内容に設定されます。

次に、投稿データを作成します。

$post = <<< EOM
{
	"to":["{$from}"],
	"toChannel":1383378250,
	"eventType":"{$event_type}",
	"content":{
		"toType":1,
		{$content}
	}
}
EOM;

この辺は完全に上述のQiitaのサイトに乗っかっています。詳しくはリファレンスと見比べてみて下さい。

toChannelの数値も固定値です(この値以外は今のところあり得ません)。

toが{$from}になっているのは、送ってきたユーザーに向けて返すという意味です。ある人の入力を用いて別の人に返すとかはしません。

ここを利用すると、「このbotに対して送られた投稿内容を全部自分のアカウントに送信させる」というbotも作れると思います。情報収集などに使えますね。

逆に言うと、bot相手に投稿する内容は全部bot運営者に知られていると思わなければいけませんね。

最後に、この投稿内容を送信します。

api_post_request("/v1/events", $post);

function api_post_request($path, $post) {
	$url = "https://trialbot-api.line.me{$path}";
	$headers = array(
		"Content-Type: application/json",
		"X-Line-ChannelID: {$GLOBALS['channel_id']}",
		"X-Line-ChannelSecret: {$GLOBALS['channel_secret']}",
		"X-Line-Trusted-User-With-ACL: {$GLOBALS['mid']}"
	);

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	$output = curl_exec($curl);
}
?>

こちらもQiitaのサイトをそのまま利用しています。

/v1/eventsというのはLINEのAPIの送信先です。リファレンスにEndpoint URLとして記載されています。

投稿用関数内の{$GLOBALS['channel_id']}などの部分に、最初に設定したアカウント情報が利用されます。

以上をまとめたファイル(callback.php)をサーバーにアップロードし、その場所を(SSL通信を利用する状態で)アカウントのcallback URLに設定すれば、晴れてbotの完成です。

botの情報ページに記載されているQRコードを利用して友達登録し、bot相手に投稿してみると、このようになりました。(反映されるには少し時間がかかるらしいです)

LINEbot

秒速で返ってきます。

以上、あかりbotを作ってみた、でした。

PHPの勉強のためにもうちょっと高度なことをやってみたいのですが、イマイチ目標が見つかりません。どういうbotが需要あるんだろう……

最後に、コード全体を載せておきます。大きく参考にさせていただいた、「LINE BOT API Trialでできる全ての事を試してみた」の著者であるbetchi様には大変感謝いたします。

<?php
// アカウント情報設定
$channel_id = "[Channel ID]";
$channel_secret = "[Channel Secret]";
$mid = "[MID]";

// メッセージ受信
$json_string = file_get_contents('php://input');
$json_object = json_decode($json_string);
$content = $json_object->result{0}->content;
$text = $content->text;
$from = $content->from;
$message_id = $content->id;
$content_type = $content->contentType;

$event_type = "138311608800106203";

$content = <<< EOM
		"contentType":1,
		"text":"わぁい{$text} あかり{$text}大好き"
EOM;

$post = <<< EOM
{
	"to":["{$from}"],
	"toChannel":1383378250,
	"eventType":"{$event_type}",
	"content":{
		"toType":1,
		{$content}
	}
}
EOM;

api_post_request("/v1/events", $post);

function api_post_request($path, $post) {
	$url = "https://trialbot-api.line.me{$path}";
	$headers = array(
		"Content-Type: application/json",
		"X-Line-ChannelID: {$GLOBALS['channel_id']}",
		"X-Line-ChannelSecret: {$GLOBALS['channel_secret']}",
		"X-Line-Trusted-User-With-ACL: {$GLOBALS['mid']}"
	);

	$curl = curl_init($url);
	curl_setopt($curl, CURLOPT_POST, true);
	curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
	$output = curl_exec($curl);
}
?>
スポンサーリンク
レクタングル(大)
レクタングル(大)

シェアする

  • このエントリーをはてなブックマークに追加

フォローする