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

前回の導入編にて用意したライブラリを早速使って解説をしていきます。

ライブラリを使える状態にする。

GitHub - abraham/twitteroauth: The most popular PHP library for use with the Twitter OAuth REST API.から最新版のzipをダウンロードしてきましょう。上のほうのダウンロードとかそれっぽい英語が書いてあるところをクリックして飛んだ先から落とします。
ダウンロードしてきたファイルをbotのソースをおく予定のフォルダに解凍します。

必要なのは

  1. twitterOAuth.php
  2. OAuth.php
  3. index.php

本来ならindex.phpは要りませんが、今回は一つの登録したアプリケーションを活用して複数のbotを運用することが目的なので捨てずにとっておきます。

解凍した3つのファイルは同じフォルダの中で構いません。他の要らないソース、フォルダは捨ててしまって大丈夫です。

以下の説明はhttp://www.lunawave-ct.net/こちらで解説されてるソースを使用させていただきます。

まず、とりあえずやってみよう

まずは基本となるソースのファイル名を決めます。何でも良いですが、とりあえず、born.phpとかにしておきます。理由は特にないので気にしないように。

空のファイルが出来ましたか?
では下記のソースをコピペしてみましょう。
(下記のソースは参考にさせていただいた元のソースと若干違います。自分が使いやすいようにコメントを入れてあったりするので。)

<?php
	session_start();
	/* Checks if oauth_token is set from returning from twitter */
	$oauth_token = $_REQUEST['oauth_token'];
	/* Set section var */
	$section = $_REQUEST['section'];
	
	// twitteroauth.phpを読み込む。
	include("twitterOAuth.php");

	// Consumer keyの値
	$consumer_key = "コンシューマーキー";
	// Consumer secretの値
	$consumer_secret = "コンシューマーシークレット";
	
	//セッションの中にアクセストークンが入っていないなら実行します
	if ($_SESSION['oauth_access_token'] === NULL && $_SESSION['oauth_access_token_secret'] === NULL) {
      /* Create TwitterOAuth object with app key/secret and token key/secret from default phase */
      $to = new TwitterOAuth($consumer_key, $consumer_secret, $_SESSION['oauth_request_token'], $_SESSION['oauth_request_token_secret']);
      /* Request access tokens from twitter */
      $tok = $to->getAccessToken();
    }
	//発行されたアクセストークンを画面に出力します。
	echo($tok['oauth_token']);
	echo("<br>\n");
	echo($tok['oauth_token_secret']);
	
	session_destroy();
?>

できましたか?
動きそうな気がしますね?嬉しいですね?

ソースを保存したなら、アプリケーションを登録しに行きましょう。
この時、ログインを求められますが、自分のアカウントでもbotのアカウントでも構いません。
http://dev.twitter.com/appsへ飛んで必要な項目を埋めましょう。項目は後から変更できるので、思いつきでも大丈夫です。
コールバックURLには先ほど作ったソースのURLを入力します。

無事登録ができたら、コンシューマ・キーとコンシューマ・シークレットが発行されます。
これを上記のソースの
$consumer_key = "コンシューマーキー";
$consumer_secret = "コンシューマーシークレット";
にそれぞれ置き換えてください。

同時にアクセストークンとアクセストークン・シークレットが発行されていますが、これも何処かにメモっておくといいでしょう。ただし他人には見せてはいけません。

早く動かしたいですね。でも焦っちゃ駄目ですよ?

これを一体どのように活用していくのかは、また次回。

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

twitterではbotが大流行ですね!
しかし、besic認証が6月廃止予定ということで焦って対応された方も多いんではないでしょうか。

もう対策した^p^
え、まじ〜まだ対策してないの〜超余裕〜^p^
まだ対策できてないよ><
結局良くわからん…挫折しそう><

色んな方々いると思います。
そんな中でも難しくて心がくじけそう><な人向けにやんわりと作り方を解説して行こうと思います。

まず、最初に今まで読み漁った記事の紹介を。


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

事前準備

用意するもの

  1. ソースコードが見やすいテキストエディタ
    • 私はsakuraを使ってますが、そこは好き好きにどうぞ。
  2. PHPが動くサーバ
    • これがないとプログラムが動きません
  3. ついったーのアカウント
    • 当然ですね!
  4. OAuthを利用するためのライブラリ(twitteroauth)


用意は出来ましたか?

残念ながら、本日は時間がないのでここまでです。
次の記事でアプリケーションを登録するところまで解説します。

よくわかんない時はlogを残してみよう

知人の方がPHPbot運用をはじめたので、プログラムよくわかんないんだよねー、な方向けに纏めた記事です。そもそも基礎知識がある方には回りくどくて向きません、あしからず。

私も最近PHPでついったーのbotなんぞを運用していたりしてます。それで、私はアホなので、よく打ちミスしてたりするんですよね。PHPだとあからさまなエラーは出してくれますけど、微妙なところだと結果がよくわからなかったりするんですよ。で、どこまで実行できたの?って。そういう時はlogを仕込んでおきましょう。

logって何?

log…正確にはlogファイル。こいつ何やったの?っていうのを地道に記録したものです。実は案外わかりやすく書く必要があります。何故なら後でlogファイルを開くと自分でも案外読めなくなるからです。

結構私は面倒臭がり屋なので、log出しの関数を別に作っています。以下の見本コードを元にlog出しを解説していきます。

見本ソースコード

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


function toLog($str)…つまりこれはtoLogという名前の引数(渡してあげる変数)が一つだけの関数です、ということをあらわしています。

2行目の $filename = "log.txt";
これは$filenameという変数に「log.txt」という文字列を代入しています。「.txt」から見て取れるように何かのファイル名のようですね。その通りです。$filename…読めばわかるとおりファイル名を収める変数になっています。

3行目の $fp = fopen($filename,"a");
これはちょっと難しいかもしれませんね。二つに分けて考えていきましょう。
fopenというのはファイルを開いてください、という命令をする関数です。この場合は$filename…つまり「log.txt」という名前のファイルを開いてください、と指示をしています。
じゃあこの後ろの方についている"a"は何?と思いますよね。これはファイルの開き方です。実はファイルを開くのにモードと言って開き方を指定しなくちゃいけないんです。ファイルのモードは以下の通りです。

文字(モード) 説明
r 読み込み
r+ 読み込み/書き込み
w 書き込み(既存ファイルの上書き)(ファイルが存在しない場合はファイル作成)
w+ 読み込み/書き込み(既存ファイルの上書き)(ファイルが存在しない場合はファイル作成)
a 書き込み(既存ファイルの追加)(ファイルが存在しない場合はファイル作成)
a+ 読み込み/書き込み(既存ファイルの追加)(ファイルが存在しない場合はファイル作成)
x 書き込み。既存ファイルが存在する場合はエラー、既存ファイルが存在しない場合はファイル作成
x+ 読み込み/書き込み。既存ファイルが存在する場合はエラー、既存ファイルが存在しない場合はファイル作成

"a"に当たるのは上から5行目にありますね。書き込み(既存ファイルの追加)(ファイルが存在しない場合はファイル作成)とあります。つまりこのファイルを開いてください、なかったら作ってね^^と指示をしてるんです。
そして$fp…これはいわゆるファイルポインタというものになります。詳しい説明は省きますが、ファイルが無事開けるとtxtファイルなら中にカーソルが合うってことです。
以降はファイルに書き込む時はこの$fpを使っていきます。

4行目 $timestamp = date("r");
date("r");ですが、これは今の日付けと時刻をフォーマットされた形で取得しています。"r"がやっぱりフォーマットを指定してるんですね。どういう形かというと「Wed, 31 Mar 2010 14:43:42 +0900」こんな感じです。わかりやすいですね。ちなみにもっと沢山のフォーマットがあるんですけど、あり過ぎるので割愛します。
そして、ゲットできた現在日付時刻を$timestampに代入しています。

5行目 fputs($fp,$str.":".$timestamp."\n");
fputsはファイルに書き出してください、ということです。おや$fpが出てきましたね!これはさっき開いたファイルのカーソルを示しています。"a"というモードでファイルを開いているので、今は見えませんが、中のカーソルはファイルの一番後ろを指しているんです。つまり、これから一番後ろに何か書き込んでいこうということですね。
$str." ".$timestamp これは$strという変数と":"という文字列(文字が一つでも文字列なんです)と$timestampという変数と"\n"という文字列をくっつけてね、という命令です。少しややこしいですね。こいうことです。
たとえば$strの中身が「ほげ」、$timestampの中身が「Wed, 31 Mar 2010 14:43:42 +0900」なら

$str + " " + $timestamp + "\n" = 「ほげ:Wed, 31 Mar 2010 14:43:42 +0900」

あれ?"\n"は?と思うでしょう。実は「\n」というのは改行なのです。こうしないと実は改行してくれないんです。後で開いたら絶対読みにくいですよね。というわけでこんなことをしておきます。

6行目 fclose($fp);
これはファイルを閉じますよ〜、宣言しています。これは案外大事なので覚えてくださいね。fopenとfcloseは二つでセットなんです。


たった7行なのに実は沢山のことをやりましたね。もしこれ中身の5行を毎回書くことになったら嫌ですよね、飽きますよね。というわけでfunctionにまとめてあるのです。これなら、ここは記録しておきたいな、と思ったらtoLog("ほげふが〜");とか一行書くだけですからね。

使い方

function hoge($msg){
	$rep = "ふーん";
	//もし$msgの中身が「旦那もホモなんだ」だったら驚く
	if(preg_match("/旦那もホモなんだ/u",$msg)){
		$rep = "まじで?";
		//ログに出す
		toLog("驚いた");
	}
	return $rep;
}

こんな感じです。そうすると、ソースが置いてあるところと同じところに「log.txt」があるはずです。それを開くと

驚いた:Wed, 31 Mar 2010 14:43:42 +0900

と、こんな内容が書いてあるはずです。それだけ。でも使いようですから、うまく使ってみてください。

ちなみに私はbotが返信した内容と@を記録して分析してます。これでせっせと日々密かに反応語句を増やしているのです。

付箋的メモ帳の取説もどき

最近ついったーをやってて、技術系のことがらでメモしたいことが多くなってきたので、いっそ自分なりにまとめてみようかと思いました。なんというか、ぐぐってそれで済むこともあるのだけど、もうちょっとこのあたりの解説とかもやもやもや…みたいな。

タイトルはそれなりに迷ったのですけど…自分は付箋にメモをすることが好きなので。
なんか貼って剥がせて、カラフルで、ある程度どこにでも貼れて、好きなように貼れるのが好きです。
付箋にメモするの楽しい。

そういう感じで、何かを書き残したいです。

たぶん方向的にはweb系です。