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

Time-stamp: "2018-11-08 Thu 20:30 JST hig"

予備知識

  • HTTP, Request, Response
  • POST, GET Methods
  • JSON, XML formats

外部 Web APIの利用

これはLINE Messaging APIを使ったサンプルではありません.

  1. Livedoorお天気Webサービスを使います. このマニュアルページを読めば, 下で実験することは読み取れます.
  2. ブラウザで http://weather.livedoor.com/forecast/webservice/json/v1?city=250010にアクセスしてみましょう.
  3. ブラウザに拡張機能 JSONViewを導入してから, 同じページを見てみましょう.
  4. 250010という数の意味が説明されているのは, http://weather.livedoor.com/forecast/rss/primary_area.xml. ブラウザのお節介機能でそのままは表示されないかも. 少なくとも, Safari で開発を有効にして, ソースを表示すれば見られます.
  5. 下のPHPプログラムで, 天気情報を取得してみましょう.
    • ブラウザでアクセスしてもよい.
    • Terminalで
      php weather.php
      として実行してもよい.
サンプル1

weather.php


    <?php

$ch=curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://weather.livedoor.com/forecast/webservice/json/v1?city=250010');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // curl_execの結果を文字列で返す

$result = curl_exec($ch); // $results に結果(文字列)

curl_close($ch);

echo($result); // JSON をそのまま表示
echo("---\n");
$a=json_decode($result,true); // true=連想配列に変換, false=オブジェクトに変換
print_r($a); // 連想配列の構造を見やすく出力する.
echo("---\n");
// 連想配列の特定の成分を取りだして連結する
$message=$a['location']['city'];
$message.="「の」";
$message.=$a['forecasts'][0]['dateLabel'];
$message.="「は」";
$message.=$a['forecasts'][0]['telop'];
echo($message);

サンプル2

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

サンプル2

response.php


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


$ch=curl_init();

curl_setopt($ch, CURLOPT_URL, 'http://weather.livedoor.com/forecast/webservice/json/v1?city=250010');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  // curl_execの結果を文字列で返す

$result = curl_exec($ch); // $results に結果(文字列)

curl_close($ch);

echo($result); // JSON をそのまま表示
echo("---\n");
$a=json_decode($result,true); // true=連想配列に変換, false=オブジェクトに変換
print_r($a); // 連想配列の構造を見やすく出力する.
echo("---\n");
// 連想配列の特定の成分を取りだして連結する
$message=$a['location']['city'];
$message.="「の」";
$message.=$a['forecasts'][0]['dateLabel'];
$message.="「は」";
$message.=$a['forecasts'][0]['telop'];
$responsemessageData=    [[
    'type' => 'text',
    'text' => $message
]];

sendMessage($replyToken,$responsemessageData);

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

    $sending_data=json_encode(['replyToken' => $replyToken, 'messages' => $messageData]);
    error_log("sending_data=". $sending_data);
    $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, $sending_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("result=". print_r($result,TRUE));
    return $result;
}




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

lineconfig.php


    

課題

  • ユーザの送信するメッセージの中に「大阪」が含まれていたら大阪の, 「京都」が含まれていたら京都の, 天気を返信しよう.
  • 選択肢が10個くらいあったときに, 連想配列できれいに書こう.
  • 他の役に立ちそうな Web APIを探してみよう.

参考

このサイトのコンテンツ

QRcode to hig3.net

http://hig3.net