LINE Messaging API | Webプログラミング!(2021年度)

Time-stamp: "2018-11-02 Fri 17:13 JST hig"

LINE Messaging API

前提知識

  • POSTリクエスト
  • 連想配列 (またはクラス)
  • JSON
  • logging

準備

  • (初回のみ)ドキュメントに従って, LINE Developersコンソールにログインします. 開発者登録します. プロバイダーを作ります.

典型的プログラム作成-デバッグサイクル

  • Bot 1個に対応して, チャンネルを作ります. Developer Trial を選びます. アクセストークンを再発行し, Channel ID, Channel Secret, AccessToken を記録します.
  • LINEモバイルアプリで, QRコードを使ってBotを友だち登録します.
  • lineconfig.php に Channel ID, Channel Secret, AccessToken を書く
  • ca.comのContainerとして PHP7 を選ぶ
  • ca.comにスクリプト なんとか.php を書く
  • LINE Developers コンソールで Webhook 送信を利用すると設定し, Webhook URLに https://ca.com/なんとか.php を Webhook URL として登録する.
  • 更新し, 接続確認する.
  • 必要に応じて, LINE Developers コンソールで自動応答メッセージ, 友だち追加時あいさつの利用の有無を設定する.
  • (test)LINEモバイルアプリからBotにメッセージを送る. 期待した反応が返ってきたら終了.
  • ca.com の SSH Terminal で(Ubuntuの場合) sudo tail /var/log/apache2/error.log, (CentOSの場合) sudo tail /var/log/httpd/error_log してエラーメッセージを確認する.
    • PHPプログラム内で, 自分の望む文字列(例えば, postされた, postする連想配列全体)をエラーメッセージとして出力し, そのまま実行を続けさせることができる.
      error_log(文字列);
      error_log(print_r(連想配列,true));
      		
  • エラーメッセージに応じて, なんとか.php を書き直す.
  • (test)にもどる

サンプル1

メッセージを送信(返信)する方法です.

URL(https://...../ojiro.php)をWebhookに登録します. 更新したら, 接続確認します.

サンプル1

ojiro.php


    <?php
require_once("lineconfig.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];

error_log(print_r($post_data,TRUE));

$messageData = [[
    'type' => 'text',
    'text' => 'バケラッタ!'
                ]];

//error_log(print_r($messageData,TRUE));
//error_log(print_r("afo".$replyToken,TRUE));
sendMessage($replyToken,$messageData);

function sendMessage($replyToken,$messageData){
    global $accessToken;

    $post_data=json_encode(['replyToken' => $replyToken, 'messages' => $messageData]);

    $ch = curl_init('https://api.line.me/v2/bot/message/reply');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
    ));
    $result = curl_exec($ch);
    curl_close($ch);
    error_log(print_r($post_data,TRUE));
    error_log(print_r($result,TRUE));
    return $result;
}

// Local Variables:
// mode:php
// End:

lineconfig.php


    <?php
$channelid=''; // a.k.a. client_id
$channelsecret=''; // a.k.a. client_id

$accessToken = '';// 

サンプル1'

LINE Messaging APIへのリクエスト/からのレスポンスはJSONでやってるのだが, 上ではなるべくPHPの連想配列に変換してやっている. JSONで直に書くこともできる→サンプル4

サンプル2

サンプル2

イベントが起きた際に返信することができます. いちばん単純なイベントは, メッセージの受信です.

URL(https://...../parrot.php)をWebhookに登録します.

parrot.php


    <?php
require_once("lineconfig.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];
$text=$post_data["events"][0]["message"]["text"];

error_log(print_r($post_data,TRUE));

$messageData = [[
    'type' => 'text',
    'text' => "「".$text."」だって〜"
                ]];

sendMessage($replyToken,$messageData);

function sendMessage($replyToken,$messageData){
    global $accessToken;

    $post_data=json_encode(['replyToken' => $replyToken, 'messages' => $messageData]);

    $ch = curl_init('https://api.line.me/v2/bot/message/reply');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
    ));
    $result = curl_exec($ch);
    curl_close($ch);
    error_log(print_r($post_data,TRUE));
    error_log(print_r($result,TRUE));
    return $result;
}

// Local Variables:
// mode:php
// End:

課題

  • 数nをテキストメッセージで受け取って, 2*nをテキストメッセージとして返す bot を作ろう.
  • 数nをテキストメッセージで受け取って, 1からnまでの九九表をテキストメッセージとして返す bot を作ろう.

サンプル3

サンプル2

様々なメッセージタイプがあり, それを複数個組み合わせて, 1個のレスポンスとして返信することができます.

URL(https://...../multi.php)をWebhookに登録します.

multi.php


    <?php
require_once("lineconfig.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];

error_log(print_r($post_data,TRUE));

$messageData = [
    [
    'type' => 'text',
    'text' => 'バケラッタ!'
    ],
    [
    'type' => 'sticker',
    'packageId' => '2',
    'stickerId' => '144'
    ],
    [
    'type' => 'image',
    'originalContentUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png',
    'previewImageUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png'
    ]
];

//error_log(print_r($messageData,TRUE));
//error_log(print_r("afo".$replyToken,TRUE));
sendMessage($replyToken,$messageData);

function sendMessage($replyToken,$messageData){
    global $accessToken;

    $post_data=json_encode(['replyToken' => $replyToken, 'messages' => $messageData]);

    $ch = curl_init('https://api.line.me/v2/bot/message/reply');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
    ));
    $result = curl_exec($ch);
    curl_close($ch);
    error_log($post_data,TRUE);
    error_log(print_r($result,TRUE));
    return $result;
}

// Local Variables:
// mode:php
// End:

課題

  • テキストメッセージを受け取って, 先頭5文字を5個のメッセージで1文字ずつ返信するbot を作ろう.

サンプル4

サンプル2

返信メッセージを, PHPの連想配列でなく, JSONで書いた例. いいところも悪いところも…

URL(https://...../multi2.php)をWebhookに登録します.

multi2.php


    <?php
require_once("lineconfig2.php");
$post_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $post_data["events"][0]["replyToken"];

error_log(print_r($post_data,TRUE));

$messageDataArray = [
    [
    'type' => 'text',
    'text' => 'バケラッタ!'
    ],
    [
    'type' => 'sticker',
    'packageId' => '2',
    'stickerId' => '144'
    ],
    [
    'type' => 'image',
    'originalContentUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png',
    'previewImageUrl' => 'https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png'
    ]
];

$messageDataJSON="[
    {
     \"type\":\"text\",
     \"text\":\"\u30d0\u30b1\u30e9\u30c3\u30bf!\"},
    {\"type\":\"sticker\",
     \"packageId\":\"2\",
     \"stickerId\":\"144\"
    },
    {
     \"type\":\"image\",
     \"originalContentUrl\":\"https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png\",
     \"previewImageUrl\":\"https://www.data.math.ryukoku.ac.jp/img/probstat-icon.png\"
    }
  ]";

//sendMessage($replyToken,$messageDataArray);
sendMessageJSON($replyToken,$messageDataJSON);

function sendMessage($replyToken,$messageData){
    global $accessToken;

    $post_data=json_encode(['replyToken' => $replyToken, 'messages' => $messageData]);
    $ch = curl_init('https://api.line.me/v2/bot/message/reply');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
    ));
    $result = curl_exec($ch);
    curl_close($ch);
    error_log($post_data);
    error_log(print_r($result,TRUE));
    return $result;
}

function sendMessageJSON($replyToken,$messageData){
    global $accessToken;

    $post_data="{
 \"replyToken\":\"$replyToken\",
 \"messages\":$messageData
}";
    $ch = curl_init('https://api.line.me/v2/bot/message/reply');
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Content-Type: application/json; charser=UTF-8',
        'Authorization: Bearer ' . $accessToken
    ));
    $result = curl_exec($ch);
    curl_close($ch);
    error_log($post_data);
    error_log(print_r($result,TRUE));
    return $result;
}



// Local Variables:
// mode:php
// End:

参考

このサイトのコンテンツ

QRcode to hig3.net

https://hig3.net