OAuthを使用したPHPでのbotの作り方7

前回OAuthを使用したPHPでのbotの作り方6 - 付箋的メモ帳のソースの解説です。
極めてざっくりとした解説です。

下準備

include("前回の解説ソース")で
OAuthを使用したPHPでのbotの作り方4 - 付箋的メモ帳のソースを読み込んでおきます。

<?php
	
	// Access Tokenの値
	$access_token = "アクセストークン";
	// Access Token Secretの値
	$access_token_secret = "アクセストークンシークレット";
	
?>

botのアクセストークンとアクセストークンシークレットをグローバル変数として用意します。

リプライに対する処理を行う

<?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"で、返事する相手の名前を文中に入れることができます。

メッセージのセットを返して終了です。