マグロは海を泳ぎます。
ならばコードを書く前に海を用意するところから始めるのが道理というものです。
LINE@で海を作る
LINEでMessaging APIを使えるアカウントを追加すると、
LINE@も自動で作成されるので管理画面からボタンの色を海の色に変更します。(背景の色も若干変わります)
サーバの準備
LINEのMessaging API(いわゆるBOT)を使うにはhttps環境がいるので、
PaaSを使うなり、サーバを借りてLet's Encryptで取得するなりする必要があります。
今回はAWSのEC2でLet's Encryptを使用しました。
Messaging APIの仕組み
ユーザが何かアクションを起こすと、
LINEから登録したサーバへJSONがPOSTされます。
その情報をもとに返信内容を構築してLINEへJSONを返すと、
ユーザにメッセージが表示される仕組みです。
line-bot-sdk-◯◯
JSONをゴニョゴニョしたりするのが面倒なので、
色々な言語向けにSDKが用意されています。
今回はPHPのSDKを使用します。
$ composer require linecorp/line-bot-sdk
実装
<?php
require_once __DIR__ . '/vendor/autoload.php';
use LINE\LINEBot;
use LINE\LINEBot\HTTPClient\CurlHTTPClient;
use LINE\LINEBot\MessageBuilder\ImageMessageBuilder;
use LINE\LINEBot\MessageBuilder\MultiMessageBuilder;
$channelSecret = 'ここにシークレット';
$channelToken = 'ここにトークン';
$bot = new LINEBot(new CurlHTTPClient($channelToken), [
'channelSecret' => $channelSecret
]);
$body = file_get_contents('php://input');
$json = json_decode($body);
$event = $json->events[0];
$total = mt_rand(1, 5);
$imageRoot = 'https://s3-ap-northeast-1.amazonaws.com/noplan1989-demo/line';
$messageBuilder = new MultiMessageBuilder();
for ($i = 0; $i < $total; $i++) {
if ($i === 4 && mt_rand(1, 5) === 1) {
$path = 'sushi';
} else {
$path = "alive/{$i}";
}
$messageBuilder->add(new ImageMessageBuilder(
"{$imageRoot}/{$path}/original.png",
"{$imageRoot}/{$path}/preview.png"
));
}
$bot->replyMessage($event->replyToken, $messageBuilder);
シークレットとトークン
シークレットとトークンはLINE Developersから取得できるので、
それを使ってBOTのインスタンスを生成します。
$channelSecret = 'ここにシークレット';
$channelToken = 'ここにトークン';
$bot = new LINEBot(new CurlHTTPClient($channelToken), [
'channelSecret' => $channelSecret
]);
メッセージのパース
ユーザがテキストの送信や友達追加をすると、
bodyにJSONが入ったリクエストがPOSTされるので、それをパースします。
本来であればsignatureを確認して、正しくなかったら例外処理みたいなことが必要ですが、
そういった細かい話はマグロの前では無力なので最小のコードですませます。
$body = file_get_contents('php://input');
$json = json_decode($body);
$event = $json->events[0];
メッセージは events
という配列に格納されています。
replyToken
は返信の際に必要になります。
{
"events": [
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
},
"message": {
"id": "325708",
"type": "text",
"text": "Hello, world"
}
}
]
}
返信するメッセージの構築
通常のBOTでは、***が入力されたから〜を返す、
みたいな処理をするところですが、今回はマグロを放つだけなので、
マグロをメッセージに込めることに集中します。
APIには、通常の画像の他に、イメージマップという画像上にリンクを貼れるもの、
イメージカルーセルという画像が横に並んだものなど色々ありますが、
一番シンプルな画像メッセージにしました。
SDKでは MessageBuilder
インターフェースを実装した、
様々なメッセージが用意されています。
マグロを放つのに必要なのは下記の2つです。
MultiMessageBuilder:複数のメッセージをまとめる
ImageMessageBuilder:画像
$total = mt_rand(1, 5);
$imageRoot = 'https://s3-ap-northeast-1.amazonaws.com/noplan1989-demo/line';
$messageBuilder = new MultiMessageBuilder();
for ($i = 0; $i < $total; $i++) {
if ($i === 4 && mt_rand(1, 5) === 1) {
$path = 'sushi';
} else {
$path = "alive/{$i}";
}
$messageBuilder->add(new ImageMessageBuilder(
"{$imageRoot}/{$path}/original.png",
"{$imageRoot}/{$path}/preview.png"
));
}
画像を送る際の注意
- 画像もhttps必須
- 送りたい画像と別で小さいプレビュー画像(最大240px)を用意する
複数のメッセージを送る際の注意
- 送信するメッセージは最大5件
メッセージ送信
$bot->replyMessage($event->replyToken, $messageBuilder);
マグロ
以上でマグロを海に放つアカウントが完成しました。
ユーザがどんなアクションをしようと、
構わずマグロを放ちます。
運が良ければ、マグロの最期に立ち会えるかもしれません。
友達登録
1日1マグロ
資金不足でサーバーが止まっているため、現在マグロは沈黙しています。
補足
Line@の登録やLine Developersの使い方については、
検索すれば良い記事がたくさんあるので省略しました。
PHP SDKについても、詳しい内容は直接ソースを見たほうが早い(わかりやすい)と思ったので、
ふわっとした内容にとどめています。
参考
Messaging API
https://business.line.me/ja/services/bot
LINE API Reference
https://devdocs.line.me/ja/
line-bot-sdk-php
https://github.com/line/line-bot-sdk-php