LINE BOT에서 참치를 바다로 발사



참치는 바다를 수영합니다.
그렇다면 코드를 작성하기 전에 바다를 준비하는 곳에서 시작하는 것이 도리라는 것입니다.

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

구현



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"
          }
      }
  ]
}

회신할 메시지 작성



통상의 BOT에서는, ***가 입력되었기 때문에~를 돌려주는,
같은 처리를 하는 곳입니다만, 이번은 참치를 발할 뿐이므로,
참치를 메시지에 담을 수있는 것에 집중합니다.

API에는 일반 이미지 외에 이미지 맵이라는 이미지에 링크를 붙일 수 있는 것,
이미지 회전 목마라는 이미지가 옆에 늘어선 것 등 여러가지 있습니다만,
가장 간단한 이미지 메시지로 만들었습니다.

SDK에서는 MessageBuilder 인터페이스를 구현한,
다양한 메시지가 준비되어 있습니다.
참치를 발하는 데 필요한 것은 다음 두 가지입니다.

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참치

    자금 부족으로 서버가 멈추기 때문에 현재 참치는 침묵하고 있습니다.

    보충



    Line@의 등록이나 Line Developers의 사용법에 대해서는,
    검색하면 좋은 기사가 많이 있으므로 생략했습니다.

    PHP SDK에 대해서도, 자세한 내용은 직접 소스를 보는 편이 빠르다(알기 쉽다)라고 생각했으므로,
    푹신한 내용에 머물러 있습니다.

    참고



    Messaging API
    htps : // 부시넷 s. 네. 메 / 자 / 세 r ゔ ぃ 세 s / 보

    LINE API Reference
    htps : //에서 v cs. 네. 메/그럼/

    line-bot-sdk-php
    htps : // 기주 b. 코 m / ぃね / ぃねーぼ tsdk php

    이라 스토야
    h tp // w w. 가자. 코m/

    좋은 웹페이지 즐겨찾기