phpとOpera widgetでtwitter自作クライアントをつくる3

前回、phpとOpera widgetでtwitter自作クライアントをつくる2 - 付箋的メモ帳の続き。

今回はwidgetの動作を決めるjavascriptを書いていきます。
jQuery使用を前提としていきます。

やりたいこと

  • 発言
  • メンションの自動取得(1分おき)
  • @を返す(ID手打ちなし)
  • アクセストークン、アクセストークンキーの保存
  • メンション自動取得のON・OFF切り替え
  • 手動メンション取得
  • メンション欄の表示非表示
$(function(){
	var ResizeFlg = true;
	var m_viewFlg = true;
	var url = "phpを設置したURL";
	var mantion = false;
	var mantion_clear = 0;
	var mentionsTimer = null;
	var getmantion = (function(){
			var accT = String(widget.preferenceForKey("access_token"));
			var accTs = String(widget.preferenceForKey("access_token_secret"));
			$("#repstat").text("@取得なう"+new Date());
			var timerId = setTimeout('$("#repstat").text("")',20000);
			var req = new XMLHttpRequest();
			req.open( 'POST', url, false);
			req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
			var last_id = widget.preferenceForKey("last_id");
			var param = 'job=mention&AT='+accT+'&AS='+accTs+'&last_id='+last_id;
			req.send(param);
			if (req.readyState == 4 && req.status==200) {
				var data = eval("("+req.responseText+")");
				widget.setPreferenceForKey(String(data[0].id[0]),"last_id");
				var reps = "";
				if(data!=null && data!=""){
					jQuery.each(data,function(){
						reps += "<div><span class='rep'>"+this.screen_name[0]+"</span>"
						+"<span>:"+this.text[0]+"</span></div>";
						mantion_clear++;
						if(mantion_clear>30){
							$("#mentions").empty();
							mantion_clear = 0;
						}
					});
					//$("#textbox").val(req.responseText);
					
					$("#repstat").text("@取得しました"+new Date());
					clearTimeout(timerId);
					setTimeout('$("#repstat").text("")',3000);
					
					$("#mentions").prepend(reps);
					//$(".rep").unbind("click");
					$(".rep").bind("click",function(){
						var txt = String($("#textbox").val());
						$("#textbox").val("@" + $(this).text() + " " + txt);
					});
				}
			}else{
				clearTimeout(timerId);
				$("#repstat").text("@取得できませんでした"+new Date());
				setTimeout('$("#repstat").text(mainstatus)',3000);
			}
		});
		
	//widgetロード処理
	$(window).load(function(){
		$("#settingform").css("display","none");
		if (!window.widget) return;
		var AT = String(widget.preferenceForKey("access_token"));
		var ATS = String(widget.preferenceForKey("access_token_secret"));
		if(AT==null){
			$("#AT").val("初起動です。設定してから使ってください。");
			$("#settingform").css("display","block");
		}else if(AT==""){
			$("#AT").val("設定されていません");
		}else{
			$("#AT").val(AT);
		}
		if(ATS==null){
			$("#ATS").val("初起動です。設定してから使ってください。");
			$("#settingform").css("display","block");
		}else if(ATS==""){
			$("#ATS").val("設定されていません");
		}else{
			$("#ATS").val(ATS);
		}
		//mentionをはじめは20件取得する。
		widget.setPreferenceForKey("","last_id");
		//mentionを取得するかどうか
		mention = Boolean(String(widget.preferenceForKey("mantion_view")));
		if(mention){
			$("input[name=mention]").filter(function(){
				 return ($(this).val() == "true") 
			}).attr("checked", true);
			window.resizeTo(200,380);
			getmantion();
			mentionsTimer = setInterval(getmantion,90000);
			m_viewFlg = false;
		}else{
			$("input[name=mention]").filter(function(){
				 return ($(this).val() != "true") 
			}).attr("checked", true);
			$("#mentions").css("display","none");
		}
	});
	
	//windowを閉じた
	$(window).unload(function(){
		clearInterval(mentionsTimer);
		widget.setPreferenceForKey("","last_id");
	});
	
	$("#setting").click(function(){
		if(ResizeFlg){
			$("#settingform").css("display","block");
			window.resizeBy(0,100);
			ResizeFlg = false;
		}else{
			$("#settingform").css("display","none");
			window.resizeBy(0,-100);
			ResizeFlg = true;
		}
	});
		
	$("#save").click(function(){
		var AT = String($("#AT").val());
		var ATS = String($("#ATS").val());
		widget.setPreferenceForKey(AT,"access_token");
		widget.setPreferenceForKey(ATS,"access_token_secret");
	});
	
	$("#tweetbutton").click(function(){
		var tweet = $("#textbox").val();
		var accT = String(widget.preferenceForKey("access_token"));
		var accTs = String(widget.preferenceForKey("access_token_secret"));
		var req = new XMLHttpRequest();
		req.open( 'POST', url, false);
		req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		var param = 'job=update&message='+tweet+'&AT='+accT+'&AS='+accTs;
		req.send(param);
		if (req.readyState == 4 && req.status==200) {
		 	var data = eval("("+req.responseText+")");
		 	var text = data.status[0];
		 	$("#status").text(text);
		 	$("#textbox").val("");
		}else{
			$("#status").text("通信に失敗しました:"+req.status);
		}
		//getmantion();
	});
	
	$("input[name=mention]").click(function(){
		mantion = Boolean($("input[name=mention]:checked").val());
		if(mantion){
			$("#status").text("取得します");
			widget.setPreferenceForKey(String(mantion),"mantion_view");
			mentionsTimer = setInterval(getmantion,90000);
			m_viewFlg = false;
		}else{
			$("#status").text("");
			widget.setPreferenceForKey("","mantion_view");
			$("#mentions").css("display","none");
			clearInterval(mentionsTimer);
			m_viewFlg = true;
		}
	});
	
	$("#view").click(function(){
		if(m_viewFlg){
			$("#mentions").css("display","block");
			m_viewFlg = false;
		}else{
			$("#mentions").css("display","none");
			m_viewFlg = true;
		}
	});
	$("#repv").click(function(){
		getmantion();
	});
})

ざっくり解説

Opera widgetはクッキーに似たような変数を保持できるので、アプリを閉じても保持しておきたい情報はpreferenceForKeyを使います

  • widget.preferenceForKey('キー名')で取得
  • widget.setPreferenceForKey('値','キー名')で設定

メンション取得は起動時は@最新20件を取得しておきたいので、指定のためのIDは空にしておきます。
以降は最新IDを記憶して新しいメンションを取得します。

ON・OFFでメンション自動取得を切り替えてられるようにしておきます。
このON/OFFは設定値としてwidgetに記憶させておきて、次回起動時にもその設定を引き継ぐようにしておきます。

メンション取得がうまくいっているかどうかを見るために、取得開始時にメッセージを出します。
今のところ、新しいものがないと戻り値がないので、20秒程度で表示を消すように…。
取得後は結果を表示して3秒後にメッセージを消します。

実行してみる

widgetを表示させてctrl+Rで再表示させて、きちんと取得できていれば成功です。

phpとOpera widgetでtwitter自作クライアントをつくる2

前回、phpとOpera widgetでtwitter自作クライアントをつくる1 - 付箋的メモ帳の続き。

今回はwidget側です。
Opera11を前提に作ります。動けばいいのでオペラ推奨の見た目は無視します。

Opera widgetの構造

widgetは実はwebサイトの構成とあんまり変わりません。
index.htmlの見た目をjavascriptで制御して色々しているだけです。

  • config.xmlウィジェット設定ファイル)
  • index.html(基本画面)
  • scriptフォルダ
    • 〜.js
  • img
    • 〜.jpg、〜.gif〜.png
  • style

この構成の通りにファイルを用意していきます。

config.xmlを用意する

http://ja.opera-wiki.com/%E3%81%AF%E3%81%98%E3%82%81%E3%81%A6%E3%81%AE%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E4%BD%9C%E3%82%8A
ここを参考に以下のxmlを記述します。

<?xml version="1.0" encoding="utf-8"?>
<widget defaultmode="widget" version="1.0" dockable="yes" network="public">
	<widgetname>アプリケーション名</widgetname>
	<id>
		<host>作ったところ</host>
		<name>作ったところの名前</name>
		<revised>いつリリースしたか</revised>
	</id>
	
	<author>
		<name>作った人</name>
		<email>連絡先</email>
		<link>サイトとか</link>
	</author>
	
	<icon>アイコン</icon>
	
	<security>
		<access>
			<protocol>http</protocol>
			<protocol>https</protocol>
			<host>アクセス先</host>
			<port>80,8080</port>
		</access>
	</security>
	<width></width>
 	<height></height>
</widget>

これがwidgetの基本的な設定ファイルです。正直authorとかwidth、heightだけでもいいです。

index.htmlを用意する

widgetの画面です。
見た目はスタイルシートで整えたり、スクリプトで表示を切り替えていくので、表示させたいものを全部用意しておきます。

<!DOCTYPE html>
<html>
<head>
  <title>アプリケーション名</title>
  <script type="text/javascript" src="script/jquery-1.5.1.min.js"></script>
  <script type="text/javascript" src="script/main.js"></script>
  <link href="style/style.css" rel="stylesheet" type="text/css" media="screen" />
</head>
<body>
	<!--<div id="header" class="fc">
		<input type="button" id="flipbutton" class="tweetbox" value="X">
		<button id="btnMinimise" data-not-chrome-content="true" class="tweetbox">Minimise</button>
		<input type="button" id="closebutton" class="tweetbox" value="X">
	</div>-->
	<div id="twetform" class="fc">
		<span class="">tweet:</span><span id="status"></span><br>
		<input type="text" id="textbox" class="tweetbox tb" maxlength="140"><br>
		<input type="button" id="tweetbutton" class="tweetbox" value="tweet">
		<input type="button" id="setting" class="tweetbox" value="setting">
		<input type="button" id="view" class="tweetbox" value="view">
		<input type="button" id="repv" class="tweetbox" value="@"><br>
		<span class="supplement">status:</span><span id="repstat"></span>
	</div>
	<div id="settingform" class="fc">
		setting<br>
		access_token:
		<input type="text" id="AT" class="tweetbox tb"><br>
		access_token_secret:
		<input type="text" id="ATS" class="tweetbox tb"><br>
		<input type="button" id="save" value="SAVE" class="tweetbox">
		<input type="button" id="clear" value="CLEAR" class="tweetbox"><br>
		mention view:<br>
		<input type="radio" name="mention" value="true">yes
		/ <input type="radio" name="mention" value="">no
	</div>
	
	<div id="mentions" class="fc">
		mentions:
	</div>
</body>
</html>

javascriptのライブラリが使えるので今回はjQueryをチョイス。
主だった処理をするファイルはmain.jsと命名しておきます。

CSSを用意する

見た目を整えるスタイルシートを用意します。

*{
	padding: 0px;
	margin: 0px;
}
.box{
	width: 30px;
}
.tb{
	width: 140px;
}
.tweetbox{
	background-color:white;
	border: solid 1px gray;
	/*opacity:0.3;*/
}
.fc{
	opacity:0.3;
}
#status,#mentions{
	font-size: small;
}
.rep:hover{
	background-color:white;
}
#repstat , .supplement{
	font-size: x-small;
}

見た目を確認してみる

階層通りに用意したら、まとめてzipにしたあと拡張子をwgtにしてダブルクリックし、Operaにインストールします。
ここで、zipする前のフォルダを選ぶと自動的に上書きされるので、準備OKです。
後は実行しながらjsを書いていきます。

次回

widgetの動作を決めるjavascriptを作ります。

phpとOpera widgetでtwitter自作クライアントをつくる1

デスクトップアプリの自作クライアントはハードルが高いけど、でも自作クライアントで遊んでみたい。
という人向けの簡易自作クライアント。

機能は

  1. 発言できる。
  2. メンションを見られる。

の2つに絞って作っていきます。

クライアントを登録する

bot制作者には毎度おなじみhttp://dev.twitter.com/appsで自分のクライアントを登録しておきます。
項目は大体適当でいいです。

OAuth用にライブラリを用意する

GitHub - abraham/twitteroauth: The most popular PHP library for use with the Twitter OAuth REST API.でライブラリ(twitteroauth)をDLしておきます。

phpでサーバー側をつくる

今回はAOuthを利用した簡易クライアントなので、widgetphp⇔twitterAPIといった手法をとります。

処理の流れ
  • POSTされてきたデータの'job'でやりたい処理を判別します。
    • updateなら発言
    • mentionならメンション取得
  • 発言なら…
    • メッセージをPOSTデータから取得
    • OAuthオブジェクト生成を生成し、メッセージをセットして投稿
    • 結果を取得し、widget用に加工
    • widgetにデータを送る
  • メンション取得なら…
    • 指定したいIDをPOSTデータから取得
    • OAuthオブジェクト生成を生成し、メンションを取得する
      • IDが空ならページ指定で最新20件取得
      • IDが指定されていたら、IDより最新を取得
    • 結果を取得し、widget用に加工
    • widgetにデータを送る

ざっとこんな感じです。

ソース

<?php

require_once("twitterOAuth.php");
// Consumer keyの値
$consumer_key = "コンシューマーキー";
// Consumer secretの値
$consumer_secret = "コンシューマーシークレット";
// Access Tokenの値
$access_token = "";
// Access Token Secretの値
$access_token_secret = "";
//logfile
$filename = "log.txt";
$logFlg = false;
$job="";

$job=$_POST['job'];//処理を判断する

if($logFlg) toLog("----------START--------".$job."----");

if (is_array($job)) return '';

$access_token = $_POST['AT'];
$access_token_secret = $_POST['AS'];

if(preg_match("/update/u",$job)){
	$message = "";
	$message = $_POST['message'];
	
	if($logFlg) toLog($access_token);
	if($logFlg) toLog($access_token_secret);
	if($logFlg) toLog($message);
	
	update($message);
}else if(preg_match("/mention/u",$job)){
	$last_id = $_POST['last_id'];
	mention($last_id);
}


/* ポストする */
function update($message){
	// Consumer keyの値
	global $consumer_key;
	// Consumer secretの値
	global $consumer_secret;
	// Access Tokenの値
	global $access_token;
	// Access Token Secretの値
	global $access_token_secret;
	//logfilen
	global $filename;
	global $logFlg;
	
	if($logFlg) toLog("update");
	
	$oauth = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
	$content = $oauth->OAuthRequest("https://twitter.com/statuses/update.xml", "POST", array("status"=>$message));
	$xml = simplexml_load_string($content);
	
	if($logFlg) toLog($content);
	
	$status = $xml->text;
	if($status==null || $status==""){
		$status = $xml->error;
	}
	
	if($logFlg) toLog($status);
	
	$token_array = array(
		'status' => $status
	);
	
	$json_value	= json_encode( $token_array );
	echo $json_value;
	
	if($logFlg) toLog("update");
	
}

/* メンション取得 */
function mention($last_id){
	// Consumer keyの値
	global $consumer_key;
	// Consumer secretの値
	global $consumer_secret;
	// Access Tokenの値
	global $access_token;
	// Access Token Secretの値
	global $access_token_secret;
	//logfilen
	global $filename;
	global $logFlg;
	$content = "";
	$oauth = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
	if($last_id!="" && $last_id!=null){
		$content = $oauth->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml", "GET", array("since_id"=>$last_id));
	}else{
		$content = $oauth->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml", "GET", array("page"=>1));
	}
	$xml = simplexml_load_string($content);
	
	if($logFlg) toLog($content);
	
	$token_array = array();
	foreach ($xml->status as $value ){
		$str = $value->text;    //発言内容
		$screen_name = $value->user->screen_name; //発言者のtwitterID
		$name = $value->user->name;
		$id = $value->id;
		
		$token = array(
			'name' => $name,
			'screen_name' => $screen_name,
			'text' => $str,
			'id' => $id
		);
		array_push($token_array,$token);
	}
	
	$json_value	= json_encode( $token_array );
	header( 'Content-Type: text/javascript; charset=utf-8' );
	echo $json_value;
	
	if($logFlg) toLog("mention");
}

function toLog($txt){
	global $filename;
	$fo = fopen($filename,"a");
	fputs($fo,$txt." ".date('c')."\n");
	fclose($fo);
}

?>

発言とメンション取得をしたいので、2つ関数を用意しておきます。

コンシューマーキーとコンシューマーシークレットはソースでもっておき、
アクセストークンとアクセストークンシークレットはwidget側で保存しておきます。

widgetからPOSTされてくるデータ

  1. 処理したいこと('job')
  2. アクセストークン('AT')
  3. アクセストークンシークレット('AS')
  4. ポストするメッセージ('message')
  5. メンション取得時に指定するID('last_id')

今回は結果をjson形式でwidgetに返すので、XMLを取得したのち、
必要最低限のデータだけを取り出して変数にセット・json形式に変換しています。

次回

次回はwidget側を作っていきます。

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

前々回、http://d.hatena.ne.jp/tatsumipoid/20110425/1303707752の続きです。

いよいよbotを自動で動かしていきます。
前々回のソースにcronからアクセスするように設定します。
借りるパターンと自前で用意するパターンがありますが、借りることを前提にします。

設定すること

  • アクセス先URL
  • アクセス間隔(何分おき)
  • アクセスする時間帯

大体どこのcronサービスもこんな感じの設定項目があると思います。

  1. アクセス先URLはbotのソースにします。
  2. アクセス間隔は2〜10分程度がいいと思います。そんなにリプライが多くないbotなら5分10分あたりで十分です。
  3. アクセスする時間帯は、botを動かして置きたい時間帯にしてください。

設定してしばらくして、botがpostしていれば成功です。

botがpostしなくなってしまったら

動いていたbotがあるとき動かなくなってしまったら、おそらく語句の量に問題があるとおもいます。
ツイッターでは重複する発言は反映されないようになっています。
また、前10回と同じ内容のpostは反映されにくいようです。

botのメンテナンス

botはメンテナンスが欠かせないものだと思います。
いつまでも同じ語句のままだとそのうち飽きられてしまいます。
今は思いつかなくても、たまにはソースを開いて語句を増やしてあげてください。

OAuthを使用したPHPでのbotの作り方まとめ

PHPでのbotの作り方をざっくりとまとめたものです。
わりと放置していた記事をまとめたので、ほんとにざっくりした内容です。

用語とか関数はググるといいと思います。

導入編
OAuthを使用したPHPでのbotの作り方 - 付箋的メモ帳

導入編(クライアントを登録する)
OAuthを使用したPHPでのbotの作り方2 - 付箋的メモ帳

導入編(コンシューマキーの考え方)
OAuthを使用したPHPでのbotの作り方3 - 付箋的メモ帳

基礎部分編(API利用)
OAuthを使用したPHPでのbotの作り方4 - 付箋的メモ帳

基礎部分編(ざっくり解説)
http://d.hatena.ne.jp/tatsumipoid/20110425/1303700032

bot本体編
OAuthを使用したPHPでのbotの作り方6 - 付箋的メモ帳

bot本体編(ざっくり解説)
OAuthを使用したPHPでのbotの作り方7 - 付箋的メモ帳

cron設定編
OAuthを使用したPHPでのbotの作り方8 - 付箋的メモ帳

おまけ
よくわかんない時はlogを残してみよう - 付箋的メモ帳

この記事をまとめるにあたって、いろいろなところを参考にさせていただきました。
ありがとうございます。

OAuth - Wikipedia
http://http//www.atmarkit.co.jp/fsecurity/special/106oauth/oauth01.html
http://1tb.me/report/02
第1回 OAuthとは?―OAuthの概念とOAuthでできること:ゼロから学ぶOAuth|gihyo.jp … 技術評論社
twitterのbotなどで OAuthを使う方法(PHPバージョン2) | 星光のつれづれ日記
PHP+OAuthでTwitter - SDN Project
http://d.hatena.ne.jp/xmalloc/20100504/1272950102
Oauth認証できるRuby製TwitterBotプログラムの設置方法 - しふーのブログ
http://pavane.rdy.jp/archives/144

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

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

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

前々回OAuthを使用したPHPでのbotの作り方4 - 付箋的メモ帳の続き
いよいよbotの動作の中核にです。
まずは中身のソース

<?php
	include("前回の解説ソース");
	// Access Tokenの値
	$access_token = "アクセストークン";
	// Access Token Secretの値
	$access_token_secret = "アクセストークンシークレット";
	
	$traceFlg = false;
	if($traceFlg){
		toLog("---------------\n");
	}
	
	//xmlが帰ってくる
	$xml = access($access_token,$access_token_secret);
	$filename = "Rep-timestamp.txt";
	$since = timestamp($filename);
	
	//リプライがある
	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");
	}

	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");
	
//通常
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;
}

//リプライ用
function rep($name,$str){
	$message = "";
	
	/*パターンマッチスタート*/

	if(preg_match("/美味しい(ね|ですね|ですよね)/u",$str)
		|preg_match("/おいしいしい(ね|ですね|ですよね)/u",$str)
		|preg_match("/うまかった(ね|ですね|ですよね)/u",$str)
	){
		$message = array(
			"セリフ1",
			"セリフ2"
		);
	}
	
	return $message;
}

?>

botの中核の処理はこれだけです。

最初にリプライを取得し、リプライに対して反応語句を選んでポスト。
次に通常ポストを選んでポストするだけです。

詳しい解説はまた次回。