[目次]
LINE Messaging API | Webプログラミング!(2021年度)
予備知識
- HTTP, Request, Response
- POST, GET Methods
- JSON, XML formats
外部 Web APIの利用
これはLINE Messaging APIを使ったサンプルではありません.
- Livedoorお天気Webサービスを使います. このマニュアルページを読めば, 下で実験することは読み取れます.
- ブラウザで http://weather.livedoor.com/forecast/webservice/json/v1?city=250010にアクセスしてみましょう.
- ブラウザに拡張機能 JSONViewを導入してから, 同じページを見てみましょう.
- 拡張機能を導入する代わりに, 表示されたものをUnicode Espace Sequence | KWONLINE.ORGにペーストして変換してみてもいいかも.
- 250010という数の意味が説明されているのは, http://weather.livedoor.com/forecast/rss/primary_area.xml. ブラウザのお節介機能でそのままは表示されないかも. 少なくとも, Safari で開発を有効にして, ソースを表示すれば見られます.
- 下のPHPプログラムで, 天気情報を取得してみましょう.
- ブラウザでアクセスしてもよい.
- Terminalで
php weather.php
として実行してもよい.
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に登録します. 更新したら, 接続確認します.
サンプル2response.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を探してみよう.