OAuthを使用したPHPでのbotの作り方7
前回OAuthを使用したPHPでのbotの作り方6 - 付箋的メモ帳のソースの解説です。
極めてざっくりとした解説です。
下準備
include("前回の解説ソース")で
OAuthを使用したPHPでのbotの作り方4 - 付箋的メモ帳のソースを読み込んでおきます。
<?php // Access Tokenの値 $access_token = "アクセストークン"; // Access Token Secretの値 $access_token_secret = "アクセストークンシークレット"; ?>
リプライに対する処理を行う
<?php //xmlが帰ってくる $xml = access($access_token,$access_token_secret); $filename = "Rep-timestamp.txt"; $since = timestamp($filename); ?>
最初にリプライを取得し、リプライを取得した時刻をタイムスタンプとして保存します。
リプライがあった場合、リプライの件数分、それぞれに返事を返していきます。
<?php //リプライがある if($xml != null){ if($traceFlg){ toLog("リプライ"); } //リプライ件数分処理 foreach ($xml->status as $value ){ //$status_number = $value->id; //個別発言のステータスナンバー $str = $value->text; //発言内容 $screen_name = $value->user->screen_name; //発言者のtwitterID $name = $value->user->name; $time = strtotime($since); $linetime = strtotime($value->created_at); if($screen_name != "botのアカウント"){ if($linetime > $time){ $message = rep($name,$str); $message = shufullMsg($message); if($message != ""){ $message = "@".$screen_name." ".$message;//リプライ用メッセージ作成 toLog("\n".$str." ■ ".$message."\n"); post($access_token,$access_token_secret,$message); $retcnt++; } } } } toLog("処理終了\n"); } ?>
発言内容、発言者のID、名前を取得しておきます。
if($screen_name != "botのアカウント")で自分自身の発言ではない場合、その内容にあう返事をつくります。
$message = rep($name,$str)で返事のセットを作り、
$message = shufullMsg($message)でランダムに抜き出しています。
メッセージが空でなければ、リプライとしてpostし、次のリプライの処理をします。
通常ポストをする
1時間に1回、通常ポストをする場合です。
<?php toLog("通常ポスト"); $filename = "TL-timestamp.txt"; $since=""; if(file_exists($filename)){//存在チェック $fp = fopen($filename,"r"); $since=fgets($fp); fclose($fp); } $since = strtotime($since); $h = strtotime("- 1 hours"); if($h > $since){ if($traceFlg){ toLog("\n時間比較 一時間前:前回のポスト時刻 ".$h.":".$since."\n"); } timestamp($filename); $msg = nomal(); $message = shufullMsg($msg); post($access_token,$access_token_secret,$message); if($traceFlg){ toLog("通常メッセージ:".$message."\n"); } } toLog("メソッド終了\n"); ?>
保存してあるファイルから、前回ポストした時刻を取得します。
現在の時刻と比べて一時間以上経っていれば、今の時刻を保存し、パターンからメッセージを一つを選んでポストします。
通常ポストのパターンを作る。
通常パターン+時刻別パターンでメッセージのセットを作ります。
<?php function nomal(){ $message= array(//基本のセット "セリフ1", "セリフ2" ); $now = getdate(); if(($now["wday"]==0) | ($now["wday"]==6)){//日曜か土曜日 if($now["hours"] == 12){ array_push($message, "セリフ1", "セリフ2" ); }else if($now["hours"] == 15){ array_push($message, "セリフ1", "セリフ2" ); } }else{ if($now["hours"] == 6){ array_push($message, "セリフ1", "セリフ2" ); }else if($now["hours"] == 12){ array_push($message, "セリフ1", "セリフ2" ); }else if($now["hours"] == 15){ array_push($message, "セリフ1", "セリフ2" ); }else if($now["hours"] == 21){ array_push($message, "セリフ1", "セリフ2" ); } } return $message; } ?>
最初のifで日曜か土曜の場合の処理をわけます。
if($now["hours"] == 12)で時刻別に処理を分けていきます。
array_push($message,"セリフ1","セリフ2");で通常パターンにセリフ1・2を足しました。
呼び出し元に返して終了です。
リプライに対する返事のパターンを作る
「おいしいですよね」等の同意を求められた場合に対する返事を考えます。
<?php function rep($name,$str){ $message = ""; /*パターンマッチスタート*/ if(preg_match("/美味しい(ね|ですね|ですよね)/u",$str) |preg_match("/おいしいしい(ね|ですね|ですよね)/u",$str) |preg_match("/うまかった(ね|ですね|ですよね)/u",$str) ){ $message = array( "セリフ1", $name."セリフ2" ); } return $message; } ?>
if(preg_match("/美味しい(ね|ですね|ですよね)/u",$str)で/〜/の間にある文字列と一致するか調べることができます。
(ね|ですね|ですよね)は「美味しい」のあとに「ね」「ですね」「ですよね」のどれかが続いた場合ということを指します。
$name."セリフ2"で、返事する相手の名前を文中に入れることができます。
メッセージのセットを返して終了です。