読者です 読者をやめる 読者になる 読者になる

Portal:siro

ダイレクトマーケティングブログ

ちぃサイラスBOT制作:発言リストを作り、その中からランダムで喋る

前回:
ちぃサイラスBOT制作:とりあえず喋るところまで - Portal:siro
http://d.hatena.ne.jp/siro_xx/20110515/1305434537


でもやっぱりこういう抽象的な記事は性に合わないのでもう少し具体的に書くことにします。

今現在のちぃサイラスBOTソースコード

セキュリティ的にアレなところは伏せてます。

<?php
// 外部ファイル読み込み
require_once "Services/Twitter.php";
require_once "Services/twitteroauth.php";

// 基本部分
$st =& new Services_Twitter(
"*******************", // Consumer key
"***********************************",	// Consumer secret
"*********************************************", // access token
"********************************",	// access token secret
TRUE );


// ランダム発言部
// 発言はDBから取得

// DBに接続
$talk_conn = mysql_connect("MySQLの鯖名","ID","パスワード");  // データベースに接続します
if($talk_conn !== false){  // データベースへの接続が成功したら
	mysql_select_db("DB名",$talk_conn);   // データベースを選びます(データベースが複数ある場合は必要)
	mysql_query("SET NAMES UTF8");    // 文字コードを指定します(指定しないと環境によっては文字化けが発生します)
	mysql_query("set @talk_id = floor(rand()*(SELECT COUNT(*) FROM chi_silas_randomList))+1");  // ややこしいので後述
	$talk_query = mysql_query("select string from chi_silas_randomList where id = @talk_id");   // ここも後述
	$talk_obj = mysql_fetch_object($talk_query);   // 後述
	$st->setUpdate($talk_obj->string);  // とってきたものを発言します
	mysql_close($talk_conn);  // データベースへの接続を終了します
}

?>

分かる人向け:
「なんでwwwwwwwwwwIDとパスべた書きしてるのちょおまwwwwwwwww」→そのうちDB接続用のfunction作るから待って!ちょっと待って!!


前回記事と違うところは、
・発言内容をデータベースから取得している
ところだけです。
データベースはid(int)とstring(varchar)からなる非常にシンプルなものを使っています。*1
発言内容は予め別手段でINSERTしておきましょう。

	mysql_query("set @talk_id = floor(rand()*(SELECT COUNT(*) FROM chi_silas_randomList))+1");  // ややこしいので後述
	$talk_query = mysql_query("select string from chi_silas_randomList where id = @talk_id");   // ここも後述
	$talk_obj = mysql_fetch_object($talk_query);   // 後述

そしてこの部分では何をしているのか。

まず1行目のSQL(query)を直訳すると、
MySQL側に@talk_idという仮変数を作り(set)ます。talk_idの値は、1〜ちぃサイラスBOTの発言リスト件数までのランダムな数です」となります。
もうちょっと詳しく説明しますと、

rand():0<=x<1の範囲でランダムな数字xを取得(0.3とか0.9とか)
SELECT COUNT(*) FROM chi_silas_randomList:ちぃサイラス発言リスト(chi_silas_randomList)が全部で何件あるのか数える(COUNT(*))
この2つを掛けることにより、0〜発言リストの件数-1の値が取得できます。これに+1することで、1〜発言リストの件数の値が取得できます。
ただし、取得してきた値は小数点以下を含むため、小数点以下をfloor関数で切り捨てます。
参考:
MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.4.2 数学関数
http://dev.mysql.com/doc/refman/5.1/ja/mathematical-functions.html


2行目では、「ちぃサイラスBOTの発言リストの@talk_id番目の発言をとってくる」という作業をしています。
分かる人向け:
「それならわざわざtalk_idとか作らなくてもRAND() limit 1でよくね?」→BOTの発言リスト件数程度のデータだったらそれでも構わないんじゃね。


3行目では、取ってきたデータをフェッチしてます。(とりあえず、データとして使えるようにしているという解釈でOK)



なんかもう早速初心者向けじゃない記述になりつつありますが許せ。



ちなみにMySQLが利用できない環境の場合は発言リストはテキストファイルから読み込むとか、ソースコードにべた書きするとかすればOKです。
というかそっちのほうが簡単*2なので、初心者にはこちらをオススメ。
僕も最初ヨアヒムBOTとか作ったときはこうしてました(MySQLとかよくわかってなかったし)

<?php
// 認証部分とかは上と同じなので略

// ランダム発言リスト
$message_array = array("発言1",
"発言2",
"発言3",
"発言4",
"発言5");

$rdm = rand(0,count($message_array)-1);  // 0〜発言リスト数-1の間の数を取得(配列の要素は0から数えるので、0〜発言数-1にしないといけない)
$st->setUpdate($message_array[$rdm]);  // ランダム発言リスト($message_array)の$rdm番目の発言をTweetする

?>


とりあえずコレでphpにアクセスするたびにランダムに発言するようになったとは思います。

*1:後日拡張予定です

*2:発言追加時のメンテナンスは面倒くさいですが