[目次]
LINE Messaging API | Webプログラミング!(2021年度)
予備知識
- SQL
- PDO
Codeanywhere におけるSQLデータベースの準備
- 左コラムのContainer名で右クリック>Infoのいちばん下に載っている phpmyadmin にジャンプします.
- ユーザ名:root, パスワード:「空」でログインします.
- まずユーザ root のパスワードを設定してきます. 一般設定>パスワードを変更する, で. ランダムパスワードの生成はふつうは使いません.
- SQL タブを開き, ここにSQL文をタイプし, 「実行」します.
- ここに書く代わりに, SSH Terminal で
mysql -u root -p
として得られる mysql プロンプトに対して書くこともできます.
SQLテーブルの準備
create database botdb; grant all on botdb.* to botuser@localhost identified by '自分で決めるパスワード';
データベースのユーザ名:botuser, パスワード:自分で決めるパスワード, です.
use botdb; CREATE TABLE log ( id int(11) NOT NULL AUTO_INCREMENT, submittime datetime, lineid char(40), messagetext longtext, PRIMARY KEY (id) );サンプル1
dbconfig.php
<?php
define('DB_USER',"botuser");
define('DB_PASSWORD',"");// 自分で決めたパスワード
define('DB_HOST',"localhost");
define('DB_DATABASE',"botdb");
define('DB_TABLE',"log");
parrot_delayed.php
<?php
require_once("lineconfig.php");
require_once("dbconfig.php");
$received_data = json_decode(file_get_contents('php://input'),TRUE);
$replyToken = $received_data["events"][0]["replyToken"];
$sender_lineid= $received_data["events"][0]["source"]["userId"];
$received_text=$received_data["events"][0]["message"]["text"];
error_log("receved_data: ".print_r($received_data,TRUE));
error_log("sender_lineid: ".$sender_lineid);
// 直前のメッセージを思い出す
$message_text="初めてのメッセージかも?";
try {
$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_DATABASE,DB_USER,DB_PASSWORD);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("SELECT * FROM " . DB_TABLE . " WHERE lineid=:id ORDER BY submittime DESC LIMIT 1");
$stmt->bindParam(':id',$sender_lineid);
if($stmt->execute()){
while( $row = $stmt->fetch(PDO::FETCH_ASSOC)){
$message_text=$row['messagetext'];
}
}
} catch (PDOException $e){
echo "PDO Exception::".$e->getMessage();
} catch (Exception $e){
echo $e->getMessage();
}
$messageData = [[
'type' => 'text',
'text' => $message_text
]];
sendMessage($replyToken,$messageData);
// 今回のメッセージを記録
try {
$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_DATABASE,DB_USER,DB_PASSWORD);
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$stmt = $dbh->prepare("INSERT INTO " . DB_TABLE ." (id, submittime, lineid, messagetext) VALUES ( NULL, NOW(), :id, :text)");
$stmt->bindParam(':id',$sender_lineid);
$stmt->bindParam(':text',$received_text);
if($stmt->execute()){
}
} catch (PDOException $e){
echo "PDO Exception::".$e->getMessage();
} catch (Exception $e){
echo $e->getMessage();
}
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("posr_data:" . print_r($post_data,TRUE));
error_log("ret:". print_r($result,TRUE));
return $result;
}
// Local Variables:
// mode:php
// End:
課題
- ユーザの送信するメッセージの中に「大阪」が含まれていたら大阪の, 「京都」が含まれていたら京都の, 天気を返信しよう.
- 選択肢が10個くらいあったときに, 連想配列できれいに書こう.
- 他の役に立ちそうな Web APIを探してみよう.