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

前回、OAuthを使用したPHPでのbotの作り方4 - 付箋的メモ帳の続きです。
ソースを解説します。
解説はどうでもいいっていう方は次OAuthを使用したPHPでのbotの作り方6 - 付箋的メモ帳に進んでください。

ライブラリを読み込む

ソースの冒頭でOAuth認証を使うためのライブラリを読み込んでおきます。

<?php

require_once("twitterOAuth.php");

?>

グローバル変数を用意する。

冒頭にソース全体で使うグローバル変数を設定しておきます。

// consumer_keyの値
$consumer_key = "コンシューマー・キー";
// consumer_secretの値
$consumer_secret = "コンシューマーシークレット";

実際に使うためには、

<?php
	// consumer_keyの値
	global $consumer_key;
	// consumer_secretの値
	global $consumer_secret;
?>

「global $変数名;」で使えるようになります。

リプライを取得する

botにリプをもらい、それに対して返事をするためにリプライを取得する関数を作っておきます。

<?php

function access($access_token,$access_token_secret){
	// consumer_keyの値
	global $consumer_key;
	// consumer_secretの値
	global $consumer_secret;
	
	$filename = "rep-id.txt";
	if(file_exists($filename)){//存在チェック
		$fp = fopen($filename,"r");
		$sinceID = fgets($fp);
		fclose($fp);
		
		toLog("@ファイルから取ってきたID:".$sinceID."\n");//log
	}
	
	// OAuthオブジェクト生成
	$oauth = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
	if($sinceID != ""){
		//APIを呼び出す(リプライ件取得)
		$result = $oauth->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml","GET",array("count"=>"30","since_id"=>$sinceID));
	}else{
		$result = $oauth->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml","GET",array("count"=>"30"));
	}
	//扱いやすくする
	$xml = simplexml_load_string($result);
	
	toLog("リプライを取得した\n");
	//最新IDを記録する
	$last_id = $xml->status[0]->id;
	$fp = @fopen($filename,"w");
	fputs($fp,$last_id);
	@fclose($fp);
	
	toLog("@最新ID:".$last_id."\n");//log
	
	return $xml;

}
?>

冒頭の
「function access($access_token,$access_token_secret)」
でアクセストークンとアクセストークンシークレットを受け取ってきています。
なぜかというと、このソースはbotの機能の中核なので、他のbotにも使いまわせるようにしておくためです。

グローバル関数を使う宣言をしておきます。

次に$filenameでファイル名を指定し、
file_exists($filename)でファイルが存在するかチェックします。
ファイルが存在すれば、前回取得したリプライの最後のIDを取得します。

OAuthオブジェクト生成し、

  • IDが取得できていれば、最後に取得したIDの次から30件
  • IDが取得できていなければ、最新30件

を取得します。

取得した結果をsimplexml_load_string($result)で扱い易いように変換します。

$last_id = $xml->status[0]->idで今回取得したリプライの最新IDを取得し、ファイルに出力しておきます。

変換しておいた結果を呼び出し元に返して基本的な処理は終了です。

メッセージをポストする

<?php

function post($access_token,$access_token_secret,$message){
	// consumer_keyの値
	global $consumer_key;
	// consumer_secretの値
	global $consumer_secret;
	global $filename;
	
	$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);
	toLog($xml->status->text."\n");
	
	//echo($content);
}

?>

前の関数と同じようにアクセストークンとアクセストークンシークレットを受け取ってきています。
そのほかに$messageでポストするメッセージを受け取ります。

リプライ取得と同じようにOAuthオブジェクト生成を生成し、メッセージをセットします。
戻り値として実行結果が返ってくるので、正しく実行できていれば、$xml->status->textでbotが投稿したメッセージがわかります。

タイムスタンプ取得、保存しておく

<?php

function timestamp($filename){
	$since = "";
	if(file_exists($filename)){//存在チェック
		$fp = fopen($filename,"r");
		$since=fgets($fp);
		fclose($fp);
	}
	toLog("getタイムスタンプ:".$since."\n");
	
	$timestamp = date("r");
	$fp = fopen($filename,"w");
	fputs($fp,$timestamp);
	fclose($fp);
	toLog("タイムスタンプ:".$timestamp."\n");
	
	return $since;
}

?>

ファイル名を取得しておき、ファイル名が存在するならば中身を取得します。
現在時刻をファイルに書き込んで保存。

取得しておいた中身を返して終了。

log出す

<?php

function toLog($str){
	$filename = "log.txt";
	$fp = fopen($filename,"a");
	fputs($fp,$str);
	fclose($fp);
}

?>

文字列を受け取り、fopen($filename,"a")で指定のファイル名に文字列を追加保存します。
詳しい開設はこっちにへ→よくわかんない時はlogを残してみよう - 付箋的メモ帳

メッセージを一個選んで戻す

複数のメッセージから一つを選んで返します。

<?php

function shufullMsg($msg){
	
	srand();
	//shuffle($msg);
	mt_srand(microtime()*1000000);
	$message = $msg[mt_rand(0,count($msg)-1)];
	
	return $message;
}

?>

$msgは配列です。
乱数を設定しておき、配列の中からランダムに一つを指定します。

ボカロ界隈で暴れまわってる某垢対策まとめ

光/明/大/帝とか黄/金/ネ申/帝とか名乗ってる某荒らしちゃんですね。
垢BANされても懲りないししつこいんだよ!

とにかく、アレの動画・画像を画面から一掃するグリモン(Greasemonkey)用スクリプトを各サイトごとに作りました。

※2011年4月14日に全ソースを更新していますので、黄/金/ネ申/帝を画面から一掃したい方は手元のスクリプトを一回アンインストールしてもう一度入れなおしてください。
なお、黄/金/ネ申/帝/対策ソースはまだテスト不足です。人柱募集なう。

  1. ニコニコ版
  2. ピアプロ
  3. pixiv版

別サイト用に組んでほしいとかありましたら連絡ください。
また、別に組んでくれた人がいましたら教えてください。

pixivで暴れまわってる、某アンチちゃんの画像を表示させなくするグリモン

前回:http://d.hatena.ne.jp/tatsumipoid/20110201/1296568965
前々回:http://d.hatena.ne.jp/tatsumipoid/20101127/1290838437
のPixiv版。

他に開発して下さった方がいたんですけど、URL見失ってしまったので。

まぁ使用法はいつもの通りです。
自己責任で入れてください。

// ==UserScript==
// @name           VsAntiForPixiv
// @namespace      VsAntiForPixiv
// @description    
// @include        http://www.pixiv.net/*
// ==/UserScript==

(function() {
	
	var dell = function(rex,tag){
		var str = tag.getAttribute("alt");
		if(str != null && str !=""){
			for(var x=0; x<rex.length; x++){
				//正規表現に引っかかった動画を消す
				if(str.match(rex[x])){
					var per = tag.parentNode;
					per.style.visibility = "hidden";
					per.style.display = "none";
				}
			}
		}
	}
	
	var main = function(){
		var cnt = 0;
		//正規表現用文字列追加
		var targetStr = new Array(
						"光明大帝",
						"\u9EC3\uF90A神帝",
						"AHSボカロanti!"
						);
		var rexs = new Array();
		//正規表現用RegExp追加
		for(var i=0; i<targetStr.length; i++){
			rexs[i] = new RegExp(targetStr[i],'g');
		}
		
		//<img>のエレメントを特定する
		var aTags = document.getElementsByTagName("img");
		var thumb = null;
		for(var i=0; i<aTags.length; i++){
				thumb = aTags[i];
				dell(rexs,thumb);
				cnt++;
		}
		
		//alert(cnt+"個くらいの画像を消しました");
	}
	
	main();
		
})();

ピアプロで暴れまわってる、某アンチちゃんの画像を表示させなくするグリモン

前回の記事のピアプロ版です。
ニコニコ動画で暴れまわってる、某アンチちゃんの動画を表示させなくするグリモン - 付箋的メモ帳

使い方の説明は前回参照です。
自己責任で入れてください。

中身のソース

// ==UserScript==
// @name           VsAntiForPiaoro
// @namespace      VsAntiForPiapro
// @description    
// @include        http://piapro.jp/*
// ==/UserScript==

(function() {
	
	var dell = function(rex,tag){
		var str = tag.getAttribute("title");
		if(str != null && str !=""){
			for(var x=0; x<rex.length; x++){
				//正規表現に引っかかった動画を消す
				if(str.match(rex[x])){
					var per = tag.parentNode.parentNode;
					per.style.visibility = "hidden";
					per.style.display = "none";
				}
			}
		}
	}
	
	var main = function(){
		var cnt = 0;
		//正規表現用文字列追加
		var targetStr = new Array(
						"光明大帝",
						"\u9EC3\uF90A神帝",
						"AHSボカロanti!"
						);
		var rexs = new Array();
		//正規表現用RegExp追加
		for(var i=0; i<targetStr.length; i++){
			rexs[i] = new RegExp(targetStr[i],'g');
		}
		
		//<a class="thum_btn">のエレメントを特定する
		var aTags = document.getElementsByTagName("a");
		var thumb = null;
		for(var i=0; i<aTags.length; i++){
			var classname = aTags[i].className;
			if(classname.match("thum_btn",'g')){
				thumb = aTags[i];
				dell(rexs,thumb);
				cnt++;
			}
		}
		
		//alert(cnt+"個くらいの動画を消しました");
	}
	
	main();
		
})();

ニコニコ動画で暴れまわってる、某アンチちゃんの動画を表示させなくするグリモン

最近ニコニコ動画で某国のアンチちゃんがvocaloidタグで暴れまわってますね。
どうやら、アンチちゃんは氷山キヨテルとmikiちゃんが好きらしく、それ以外のボーカロイドは邪魔だと主張する動画を大量うpしてくれちゃってます。

あまりにも大量なので堪忍袋の緒が切れました。

というわけで、Firefoxを使っている方は御馴染みであろうGreasemonkeyを使って、アンチちゃんの動画を視界から一掃するスクリプトを打ちました。

アマナさんから情報提供がありましたので、ブラウザ別に対策法を追記しました。

残念ながらページが完全にロードされるまでは見えてしまいますが、これで幾分かスッキリすると思います。
通報するのも面倒だ、通報するために動画をクリックしたくもない!という人には是非。

FirefoxGreasemonkey

  • FirefoxGreasemonkeyを入れて以下のリンクをクリックすると、インストールするか聞かれますので、自己責任で入れてください。

IETrixie

Firefox+グリモンをIEでやる方法です。
こちらの記事がわかりやすいです
IEでGreasemonkeyスクリプトを使う Trixie IE7pro : Web - Paroday

中身のソース

// ==UserScript==
// @name           vsAntiDouga
// @namespace      vsAntiDouga
// @description    Videos disappear from sight in anti
// @include        http://www.nicovideo.jp/*
// ==/UserScript==


(function() {

	var type1 = function(rex){
		var cnt = 0;
		//エレメント取得
		tags = document.getElementsByTagName("p");
		//取得したエレメントを選別する
		for(var i=0; i<tags.length; i++){
			var str = tags[i].getAttribute("title");
			if(str != null && str != ""){
				for(var x=0; x<rex.length; x++){
					//正規表現に引っかかった動画を消す
					if(str.match(rex[x])){
						var per = tags[i].parentNode.parentNode.parentNode.parentNode.parentNode.parentNode;
						per.style.visibility = "hidden";
						per.style.display = "none";
						cnt++;
					}
				}
			}
		}
		return cnt;
	}

	var type4 = function(rex){
		var cnt = 0;
		//エレメント取得
		tags = document.getElementsByTagName("a");
		//取得したエレメントを選別する
		for(var i=0; i<tags.length; i++){
			var str = tags[i].getAttribute("title");
			if(str != null && str != ""){
				for(var x=0; x<rex.length; x++){
					//正規表現に引っかかった動画を消す
					if(str.match(rex[x])){
						var per = tags[i].parentNode.parentNode;
						per.style.visibility = "hidden";
						per.style.display = "none";
						cnt++;
					}
				}
			}
		}
		return cnt;
	}
	
	
	var main = function(){
		
		//正規表現用文字列追加
		var targetStr = new Array(
						"光明大帝",
						"\u9EC3\uF90A神帝",
						"AHSボカロanti!",
						"開発コードMIKI LOVE! IA BAD!"
						);
		var rexs = new Array();
		//正規表現用RegExp追加
		for(var i=0; i<targetStr.length; i++){
			rexs[i] = new RegExp(targetStr[i],'g');
		}
		
		//<p class="thumb_cols">のエレメントを特定する
		var pTags = document.getElementsByTagName("p");
		var thumb = null;
		for(var i=0; i<pTags.length; i++){
			var classname = pTags[i].className;
			if(classname.match("thumb_cols",'g')){
				if (pTags[i].hasChildNodes()){
					thumb = pTags[i].firstChild.childNodes;
					break;
				}
				
			}
		}
		var type = 4;
		//設定してる表示列数を特定する
		for(var i=0; i<thumb.length; i++){
			if(thumb[i].getAttribute("src") != null){
				type = i;
			}
		}
		
		var count=0;//消した動画個数カウント用
		
		//alert(type);
		switch(type){
			//1、2列表示の場合
			case 0:
			case 1:
				count = type1(rexs);
				break;
			//4列表示の場合
			case 2:
				count = type4(rexs);
				break;
			//列が分からなかったら何もしない
			default:
				bleak;
		}
		
		//alert(count+"個くらいの動画を消しました");
	}
	
	main();
})();

いいニコニコライフを取り戻したいですね

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

前回はbotアカウントのアクセストークンとアクセストークン・シークレットを入手しましたね。いわば導入部分でした。
今回からいよいよ、bot本体のソースの解説をしていきます。

中核の部分を作る

まずはbotの最低限必要な中核を作っていきましょう。どのアカウントからも利用する機能が中核化する機能=メソッドになります。

<?php

require_once("twitterOAuth.php");
// consumer_keyの値
$consumer_key = "コンシューマー・キー";
// consumer_secretの値
$consumer_secret = "コンシューマーシークレット";

//リプライをとってくる
function access($access_token,$access_token_secret){
	// consumer_keyの値
	global $consumer_key;
	// consumer_secretの値
	global $consumer_secret;
	
	$filename = "rep-id.txt";
	if(file_exists($filename)){//存在チェック
		$fp = fopen($filename,"r");
		$sinceID = fgets($fp);
		fclose($fp);
		
		toLog("@ファイルから取ってきたID:".$sinceID."\n");//log
	}
	
	// OAuthオブジェクト生成
	$oauth = new TwitterOAuth($consumer_key,$consumer_secret,$access_token,$access_token_secret);
	if($sinceID != ""){
		//APIを呼び出す(リプライ件取得)
		$result = $oauth->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml","GET",array("count"=>"30","since_id"=>$sinceID));
	}else{
		$result = $oauth->OAuthRequest("http://api.twitter.com/1/statuses/mentions.xml","GET",array("count"=>"30"));
	}
	//扱いやすくする
	$xml = simplexml_load_string($result);
	
	toLog("リプライを取得した\n");
	//最新IDを記録する
	$last_id = $xml->status[0]->id;
	$fp = @fopen($filename,"w");
	fputs($fp,$last_id);
	@fclose($fp);
	
	toLog("@最新ID:".$last_id."\n");//log
	
	return $xml;

}

//メッセージをポストする
function post($access_token,$access_token_secret,$message){
	// consumer_keyの値
	global $consumer_key;
	// consumer_secretの値
	global $consumer_secret;
	global $filename;
	
	$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);
	toLog($xml->status->text."\n");
	
	//echo($content);
}

//タイムスタンプ取得
function timestamp($filename){
	$since = "";
	if(file_exists($filename)){//存在チェック
		$fp = fopen($filename,"r");
		$since=fgets($fp);
		fclose($fp);
	}
	toLog("getタイムスタンプ:".$since."\n");
	
	$timestamp = date("r");
	$fp = fopen($filename,"w");
	fputs($fp,$timestamp);
	fclose($fp);
	toLog("タイムスタンプ:".$timestamp."\n");
	
	return $since;
}

//log出す
function toLog($str){
	$filename = "log.txt";
	$fp = fopen($filename,"a");
	fputs($fp,$str);
	fclose($fp);
}
//メッセージを一個選んで戻す
function shufullMsg($msg){
	
	srand();
	//shuffle($msg);
	mt_srand(microtime()*1000000);
	$message = $msg[mt_rand(0,count($msg)-1)];
	
	return $message;
}
?>

以上のソースがbotの必要最低限の中核部分です。

  1. ポストする
  2. @とってくる
  3. メッセージを一つ選ぶ
  4. 時刻を記録する
  5. ログをだす

場合によっては時刻を記録することもログを出すことも必要ではないかもしれません。でもあった方が何かと便利です。
これから、これらの機能を複数のbotで使いまわしていきます。

ソースの詳しい解説は、また次回。

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

前回の続きです。

前回はソースを用意してアプリケーションを登録したところで終わりました。
今回はこのソースの使い道について説明していきます。
この実はソースは一つのアプリケーションでbotを複数管理するために用意したものです。
その前に、前提条件などをさらっと。

そもそもOAuthのアプリケーションって?

OAuthは単なる認証の方式です。別々のサービスを連携させる時に、直にIDやパスワードをやり取りさせるのは良くない、そういった考え方の元に生まれたものです。ID、パスワードをそのサービス外になるべく出さないようにやりとりをするための仕組みがOAuthです。だから回りくどいし、ややこしくて当然なんですね。

実は1bot=1アプリケーションというわけではありません。

アプリケーションを登録すると専用のコンシューマー・キーが渡されます。このキーはこのアプリケーション独自のもので当然1アプリケーション=1コンシューマー・キーです。
同時に発行されたアクセストークンですが、これは1アプリケーション=1アクセストークンではありません。1アプリケーションに対して利用したいアカウントの分だけ発行されます。つまり「1アプリケーション=xアクセストークン」になります。
アプリケーション側から見ると「1アカウント=1アクセストークン」ということです。
これを利用すると、アプリケーションを一つ登録しただけで、複数のbotを動かすことができるということになります。

で、このソースのやってることって?

簡単に言うと、botアカウントのアクセストークンとアクセストークン・シークレットをメモる為に画面に出します。
通常、ついったーにbotのアカウントでログインしてアプリケーションのログインを許可してもアクセストークンは見ることができません。そこで、認証して発行してもらったアクセストークンとアクセストークン・シークレットをbotのソースに組み込ませるために一時的に表示させます。これをメモってソースにコピペすることで一つのアプリケーションから複数のbotで認証できるようになります。

さっそく使ってみよう!

やってみる方が早いと思いますので、さっそく認証してみましょう

  1. まず、ついったーにbotのアカウントでログイン
  2. アプリケーションのURLにアクセスする
  3. 画面に表示されたURLを押す
  4. おなじみの許可しますか?画面になるので、許可してください
  5. 飛ばされた先にわけの分かんない文字列が見える

最後に2行文字列が出ましたね?
この文字列の上の段がアクセストークン、下の段がアクセストークン・シークレットになります。
単にメモれれば良かったので、余計な表示はありません><
これを一時的にどこかにわかりやすくメモっておいてください。次回以降のbot本体の解説に使っていきます。

ちなみにbotのアカウント分この行為を最初に行っておくと便利です。ログインとログアウトでちょっと忙しいですが。

次回はいよいよbot本体のソースの解説をしていきます。