Help us understand the problem. What is going on with this article?

LINE BOTでマグロを海に放つ

More than 1 year has passed since last update.

スクリーンショット 2017-09-15 03.14.08.png

マグロは海を泳ぎます。
ならばコードを書く前に海を用意するところから始めるのが道理というものです。

LINE@で海を作る

LINEでMessaging APIを使えるアカウントを追加すると、
LINE@も自動で作成されるので管理画面からボタンの色を海の色に変更します。(背景の色も若干変わります)

スクリーンショット 2017-09-15 03.14.08.png

サーバの準備

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

https://devdocs.line.me/ja/#messaging-api

実装

tuna.php
<?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"
          }
      }
  ]
}

https://devdocs.line.me/ja/#webhooks

返信するメッセージの構築

通常の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)を用意する

https://devdocs.line.me/ja/#send-message-object

複数のメッセージを送る際の注意

  • 送信するメッセージは最大5件

https://devdocs.line.me/ja/#reply-message

メッセージ送信

$bot->replyMessage($event->replyToken, $messageBuilder);

マグロ

以上でマグロを海に放つアカウントが完成しました。
ユーザがどんなアクションをしようと、
構わずマグロを放ちます。

運が良ければ、マグロの最期に立ち会えるかもしれません。

スクリーンショット 2017-09-15 03.14.08.png

友達登録

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

いらすとや
http://www.irasutoya.com/

nishinoshake
AWSと映画のサイトを作ってます。
https://noplan.cc
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした