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

Time-stamp: "2018-11-22 Thu 19:57 JST hig"

予備知識

  • SQL
  • PDO

Codeanywhere におけるSQLデータベースの準備

  1. 左コラムのContainer名で右クリック>Infoのいちばん下に載っている phpmyadmin にジャンプします.
  2. ユーザ名:root, パスワード:「空」でログインします.
  3. まずユーザ root のパスワードを設定してきます. 一般設定>パスワードを変更する, で. ランダムパスワードの生成はふつうは使いません.
  4. 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を探してみよう.

参考

このサイトのコンテンツ

QRcode to hig3.net

http://hig3.net