CodeIgniterの学習 71 - 30分位で始められる(かもしれない)Twitterボットの制作(その1、卵くらい)

(2010/08/26 追記)
OAuth対応してなくてベーシック認証のままなので、今となっては参考になりません。
(2010/08/26 追記終わり)

(以下原文)
こんにちは!

今日は Twitter API CodeIgniter Library - http://www.haughin.com/code/twitter/
を使って、CodeIgniterでTwitterAPIを呼び出すボットを作り始めてみる。

(Jobboard関連のエントリーも同時進行します。今日はなんとなくこっちの気分。日報エントリー関連は一時停止中)

動作画面

こんな感じ、まだまだ赤ん坊段階。これから少しずつガメラレベルに育てる(かも)。

A) http://pizw.com/twitterbot
(OAuth対応していないので停止しました。2010/08/28)

に接続すると、

B) http://twitter.com/null_nikki
がおみくじを呟く。まだそれだけ。

寒いとはいわないで。


実験のために、A)のURLを呼び出すと無条件に呟く様にしているが、

本来は http://d.hatena.ne.jp/dix3/20081203/1228237872 等でバッチとしてA)を実行できるようにするか、
別のTwitterアカウントから、@付きでnull_nikki側がコールされた後にA)を起動して返答するように育てていく必要がある。(まだボットとは言えないレベル。)


環境

  • CodeIgniter 1.7.1
  • PHP5以上
  • CURL(Client URL Library 関数)が使える環境であること
  • json_decode() が使えること

ぐらいか。curlについてはググるべし。FedoraUbuntuならyum/aptitude一発で簡単に使える。(レン鯖・Windowsは知らん。)

レン鯖ならcurlで躓くかな?まーいいや。自宅開発鯖で試してちょ。


Twitterへのアカウント登録

http://twitter.com/を開いて、「今すぐ登録」に沿っていくだけなので説明省略。
見れば分かると思う。


ソース

環境面でクリアしているならば、ソースはごく単純。

上記のライブラリーを使うといろいろ複雑なことが出来るが、とりあえずベーシック認証経由で「いまなにしてる?」を更新するだけ。
エラー処理も無し。(実験なので後回し)(Oauthとか認証にもいろいろあるけどそれは後で)



手順1:ライブラリ(application/libraries/Twitter.php の設置 )
Twitter API CodeIgniter Library - http://www.haughin.com/code/twitter/
からダウンロードしたソース内のファイルを、application/libraries/以下に設置。

(同梱されているhome.phpのサンプル等はひとまず設置しない。)




手順2:1のファイルの微修正

1のファイル Twitter.phpの一部がバグっているので微修正する。
(ライブラリ配布サイトのコメント欄で言及されている。)


Twitter.php:146行目付近

<?php
 //(上略)

  public function call($method, $params = array())
  {
    //(中略)
    //if ( $auth === TRUE && ( $this->_conn->authed() || $this->oauth === NULL) ) //ここがバグってる
    if ( $auth === TRUE && ! ( $this->_conn->authed() || $this->oauth === NULL) )
    //(下略)
  }

?>

を上記の様に変更する。これでベーシック認証経由で呟ける様になる。




手順3:コントローラー(application/controllers/twitterbot.php)の新設

こんな感じ。キモはtwitt()メソッド内でTwitterライブラリのauthを呼んで、callでデータを投げている部分だけ。

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
// 本当はバッチから実行時のみ許可するようにする。

// 参考 CodeIgniterの学習 52 - CodeIgniterをバッチとして呼び出せるようにする
// http://d.hatena.ne.jp/dix3/20081203/1228237872

/**
 * Twitter APIを使ってみるテスト(ボット実験用)
 * @author : dix3 
 * @link http://d.hatena.ne.jp/dix3/
 */

class Twitterbot extends Controller {
    // コンストラクタ
    function twitterbot()
    {
        parent :: Controller();
        $this -> load -> model( 'Mod_twitterbot' ); //モデルのロード
        $this -> load -> library( 'twitter' ); //ライブラリのロード
    } 
    // デフォルトインデックス
    function index()
    { 
        // 色々処理振り分けたいけど、あとで
        $this -> twitt();
    }
    function twitt()
    {
        //とりあえずベーシック認証を使用 Oauthや認証OKNG判定は後で
        $this -> twitter -> auth( $this -> Mod_twitterbot -> conf['consumer_key'], 
                                  $this -> Mod_twitterbot -> conf['consumer_key_secret'] ); 
        //いまなにしてる?にデータを投げる
        $ret = $this -> twitter -> call( 'statuses/update',
                                    array( 'status' => $this -> Mod_twitterbot -> get_status() ) 
                                   );

        // エラー判定無し、後で追加する。
        // var_dump($ret);
        echo 'いまなにしてるを更新完了!→ <a href="http://www.twitter.com/null_nikki">twitterのnull_nikkiを開く</a>';
        exit;
    }
}

/**
 * End of file twitterbot.php
 */
/**
 * Location: ./application/controllers/twitterbot.php
 */

?>




手順4:モデル(application/models/mod_twitterbot.php)の新設

こんな感じ。設定ファイルを読み込んで、
arrayヘルパのrandom_element()を使って、ランダムに占い結果を返しているだけ。

<?php if ( !defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
/**
 * Twitter APIを使ってみるテスト(ボット実験用)
 * @author : dix3 
 * @link http://d.hatena.ne.jp/dix3/
 */

class Mod_twitterbot extends Model {
    var $conf; 
    // コンストラクタ
    function Mod_twitterbot()
    {
        parent :: Model();
        $this -> load -> helper( 'array' ); //配列ヘルパのロード(ランダム抽出用)
        $this -> _init(); //初期化
    } 
    // 初期化
    function _init()
    {
        $this -> conf = $this -> load -> config( 'twitterbot_config', true ); //初期設定ファイルのロード
        
    } 
    // おみくじのありがたいお言葉を引く
    function get_status()
    {
        return $this -> conf['bot_words_head'] . random_element( $this -> conf['bot_words_body_arr'] ) . $this -> conf['bot_words_foot']; //お言葉を返す
    }
} //endofclass
/**
 * End of file mod_twitterbot.php
 */
/**
 * Location: ./application/models/mod_twitterbot.php
 */

?>




手順5:設定ファイル(application/config/twitterbot_config.php)の新設
設定ファイル系。特に難しいところは無いはず。
おみくじの配列は、arrayヘルパのrandom_element()でどれかが選ばれるように大吉中吉等を適当にちりばめている。

<?php if ( ! defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' );
/**
 * Twitter APIを使ってみるテスト(ボット実験用)
 * @author : dix3
 * @link : http://d.hatena.ne.jp/dix3/
 */

$config['consumer_key'] = 'twitterのユーザー名'; //id
$config['consumer_key_secret'] = 'twiterのパスワード'; //password
$config['bot_words_head'] = '今日のぼくの運勢は…【';
$config['bot_words_body_arr'] = array('大吉','大吉','大吉','大吉','大吉','ヘブン状態','中吉','中吉','中吉','中吉','中吉','中吉','小吉','小吉','小吉','小吉','小吉','','','','','','末吉','小凶','','中凶','大凶'); //DB周り作るの面倒なので配列でだらだら
$config['bot_words_foot'] = '】だってさ [おみくじver0.00001]';


/* End of file twitterbot_config.php */
/* Location: ./application/config/twitterbot_config.php */

?>




dix3は勝手にしゃべる亀(会話能力ゼロ)を手に入れた!

今日はここまで。ではでは!


※アクセス数は大した事無いと思っているけど、万が一亀が大量に呟いているようなら停止します。ソースをコピペして実験する時はお持ちのアカウントが大量ポストしないようにご注意を。