PHPとMySQLでボットを作る

ボット(bot)はロボット(robot)を省略したもの。つまり人間の代わりに自動的に実行されるプログラムのこのことです。コンピュータウイルスの「ボット」に感染してしまうと、悪意ある仕掛人の思い通りにコンピュータが操られてしまいます。twitterにも「ボット」の機能があります。これは人間のようなつぶやきを定期的に投稿するプログラム、あるいは特定のキーワードに反応したり、ユーザーの発言に返信(リプライ)したりするプログラムのことです。

ここでは、「つぶやき」に反応する、簡単なボット風の仕組みを作ります。

今回作成するボット

「つぶやき」を送信➡「つぶやき」のキーワードに部分一致するレコードを検索➡

部分一致したレコードのカラム「henzi」を表示

「つぶやき」文字列がテーブル「reply」のカラム「tubuyaki」中にあれば、同じレコードのカラム「henzi」が表示される、といった仕組みです。

 

f:id:mkyosuke:20191203111017p:plain

■テーブル「reply」について

テーブル「reply」に入力されている会話文は、次のようなものです。

tsubuyaki henzi
うれしい やったね
悲しい 頑張れ!なんとかなるさ
こんばんは どうも、こんばんは
うれしい やったね
おはよう おっはー
こんばんは どうも、こんばんは
むずかしいよね
いやだ むずかしいよね
ウザ どうもね...
うれしい 飛び上がっちゃうよね
おそろしい なんとかなるといいよね
恐ろしい なんとかなるといいよね
悲しい だいじょうぶ!なんとかなるさ
キモ どうもね...
きらいだ むずかしいよね
怖い けっこう何とかなるもんだよ
こわい 逃げないで
さわやか いいよね
疲れた 癒されたいよね
仕事 つらい~
疲れた ヨレヨレ~

これを利用すると、たとえば「仕事疲れたよね」という「つぶやき」を送信すると、次のようになります。

仕事疲れたよね ←送信されたつぶやき

癒されたいよね ←プログラムにより返された返答

■テーブル「reply」の作成

ではまずテーブル「reply」の作成です。次のような構造です。

カラム名 tubuyaki henzi
データ型 varchar(256) varchar(1024)
内容 つぶやきの文字列 返信する文字列

■つぶやきを送信するHTMLの作成

テーブル「reply」が作れたら、次は「つぶやき」を送信するHTML、そして「対応する文字列」を表示するプログラムの作成です。

まず、「つぶやき」送信は次のようになります。これは単に「データを識別する名前」を「a」としてPOST送信しているだけです。

tubu.html

<html>
<head><title>つぶやき</title></head>
<body>
<form action="tubu2.php" method="POST">
<input type="text" name="a"><br>
<input type="submit" value="送信">
</form>
</body>
</html>

name="a"のテキストボックスに「つぶやき」を入力。「送信」ボタンをクリックすると「tubu2.php」に向けてPOST送信するPHPスクリプトです。

 ■リプライの処理側プログラムの作成

「tubu.html」からの送信を受けるのが次の「tubu2.php」です。

tubu2.php

<?php
$t = $_POST["a"];①
print $t;
print "<br>.....<br>";
$d = mysqli_connect("localhost","root","");
mysqli_select_db($d,"db");
$r = mysqli_query($d,"SELECT * FROM reply WHERE '$t' LIKE CONCAT('%',tubuyaki,'%')");②
$n = 1;
while($row = mysqli_fetch_array($r)){
print $row['henzi']."<br>";③
$n++;
}
print($n == 1)?"なんかおもしろいことないかな?":"";④
mysqli_close($d);
?>

 送信された「つぶやき」データを$_POST["a"]で受け、さらに変数$tに代入します①。この「つぶやき文字列」$tに、テーブル「replay」のカラム「tubuyaki」の文字列が含まれているか検索します。発行するSQL部分は②のようになります。

②の部分は工夫があります。

今回はカラム「tubuyaki」には「悲しい」「うれしい」などのキーワード部分だけが入力されています。「つぶやき文字列」$tはこのキーワードと完全に一致せず、また「つぶやき文字列」$tのほうが多くの場合、カラム「tubuyaki」の文字列より長くなります。つまり次のような検索が必要になります。

「つぶやき文字列」$tの中に、カラム「tubuyaki」の文字が含まれていたら...

「WHERE tubuyaki LIKE $t」ではありません。逆にWHERE '$t' LIKE~tubuyaki~」となる点に注意です。あいまい検索なので、tubuyakiの前後に「%」を付ける必要があります。文字列を結合するのはMySQLではCONCAT関数ですので、CONCAT('%',tubuyaki,'%')は「%tubuyaki%」を返します。もしカラム「tubuyaki」が「

悲しい」なら「%悲しい%」となるため

SELECT * FROM reply WHERE '$t' LIKE'%悲しい%'

を実行していることになります。

 

このSQL文を変数$rに代入しています。

なお、上記では発行するSQL文の中でPHPの変数を使用しています。

このようにPHPのプログラムからSQLを発行する場合、SQL文の中にPHPの変数を埋め込むことも可能です。上記の例では、$tは文字列ですので、「””」や「’’」で囲わなければなりません。

●検索で一致した文字列の書き出し

③のwhile文では、テーブル「reply」のカラム「tubuyaki」のキーワードをすべて検索し、一致するたびにprintします。このため、複数のキーワードで一致して対応する場合、改行して複数のhenziが書き込まれます。

●一致するキーワードがなかった時の記述

④では三項演算子を使用して、もし一致するキーワードがなかった場合、$nが1のままなので、「なんかおもしろいことないかな?」と表示します。

練習問題

3つのカラム「cd」,「nm」,「pr」からなるテーブル「tb」に対し、クエリを発行することでDATETIME型のカラム「ima」を追加してください。

さらにテーブル「tb」のカラム「nm」に「マウス」,カラム「ima」にNOW関数を挿入し、現在日時が入力されることを確認してください。

カラムを追加する場合、

ALTER TABLE テーブル名 ADD カラム名 データ型

<?php
$d = mysqli_connect("localhost","root","") or die("接続失敗");
mysqli_select_db($d,"db");
$k =mysqli_query($d,"ALTER TABLE tb ADD ima DATETIME");

 

$k =mysqli_query($d,"INSERT INTO tb(nm,ima)VALUES('マウス',NOW())");
mysqli_close($d) or die("切断失敗<br>");
print"切断成功";
?>

実行結果

f:id:mkyosuke:20191203155108p:plain