LINEで自動投稿BOTを作る
- ブログカテゴリー
- システムやプログラムのメモ・雑感
- 投稿日時
急な事情で自習室をお休みにする場合の連絡手段ということで、LINEのAPI BOTに手を出してみた。
LINEで自習室連絡用のグループを作っておき、お休みの際は自動で通知されるという仕組みにする。
仕組み的には、ウェブでお休み通知を作成する⇒自動で同じ文面がLINEグループで送信される、という形。
「別にLINEで直接送ればいいじゃん」という突っ込みもありそうだけど、ウェブとLINEで両方通知するのは面倒だし、ウェブ主導だとLINEの他に先日作成したFacebook APIのグループ通知も使えるし、いまは使ってないTwitterにも通知できるなど、汎用性が高い。
ここまでは前置き。
まぁ作ってみたのはいいけど、なんだか分かりやすい説明が見つからなくて、何だかんだで2時間くらいかかった。
なので、せっかくだからここで手順を整理する。
- 準備 - LINE Developerで設定
- (前提)LINEのアカウントを持っていること、LINEのグループを作成していること。
- LINE Developerにログイン
https://account.line.biz/login?scope=line&redirectUri=https%3A%2F%2Fdevelopers.line.biz%2Flogin%3Fbox%3D%2Fconsole%2F
※ 「LINEアカウントでログイン」と「ビジネスアカウントでログイン」の2種類があるが、どちらでもOK。 - プロバイダーを作成
- 「新規チャネルを作成」に進み、「Messaging APIでチャネル作成する」。
※ アプリ名などの色々な入力項目があるので、必要な情報は埋めておく。 - チャネルに登録されると以下のようになる。
- 新しく作成したチャネルを選択し、「チャネル基本設定」で以下の設定を行う。
- 「アクセストークン」の取得
- 「Webhook送信」を「利用する」に設定
- 「Webhook URL」を設定
※ 自動送信を行うGroup IDを取得するだけなので一時的なURLでOK。ここでは"https://eample.com/webhook.php"とする。 - 「Botのグループトーク参加」を「利用する」に設定
- コードを書く① - Group IDの取得
- LINEはGroup IDを取得するためにWebhookを使うらしい。
上記6-2で作成したhttps://eample.com/webhook.phpにアクセスするようにプログラムを作成。 - webhook.phpに以下のように記述して、webhook.txtにPOSTが保存されるようにする。
※ permissionの設定は忘れないように。
$val = file_get_contents('php://input');
file_put_contents('./webhook.txt', $val);
?> - スマホでLINEを開き、友達としてBOTを登録する(検索すれば出る)。
- BOTをグループに登録する。
- グループで適当な文字列を送信。
そうすると、BOTが自動で返信をしてくるはず。
- webhook.txtを開くと以下のような形で保存されている。
{"events":[{"type":"message","replyToken":"d47b865568624528819aaea1ba843fbc","source":{"userId":"xxxxxxxxxxxxxxx","groupId":"yyyyyyyyyyyyyyy","type":"group"},"timestamp":1574502882728,"message":{"type":"text","id":"10966442340315","text":"test"}}],"destination":"U62e619ded53fb854c6716804a41e59df"}
- 太字にしたgroupId(ここでは「yyyyyyyyyyyyyyy」にしている)を取得完了。
- LINEはGroup IDを取得するためにWebhookを使うらしい。
- コードを書く② - チャットを送信する。
- 実行するプログラムファイルを作成。
- 以下の形でソースを作る。
$access_token = '[準備段階の6-1で取得したアクセストークン]';
$group_id = '[webhook.txtから取得したgroupId]';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.line.me/v2/bot/message/push');
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json', 'Authorization: Bearer ' .$access_token]);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode(['to' => $group_id, 'messages' => [['type' => 'text', 'text' => 'hello world!']]]));
curl_exec($ch);
curl_close($ch);
?> - 以上で完了。
後はこのソースを使って必要に応じてtextの部分に変数を代入するだけです。
Group IDを取得したことでwebhookは不要になるので、そのあたりは基本設定を書き直してもいいかもしれない。
あと、アクセストークンは時間制限があるので、これは自動延長するAPIを作った方がいいと思う。
まぁ、これについてはまた別の機会に書きます。