SoLA2-TechBlog

退屈な作業はプログラムに任せましょう!日々の作業に少し工夫を足すだけであなたの時間はもっとクリエイティブになる。

今さらTwitterボットを開発してみた。【part 2】

クラスの作成

拡張性を重視するなら個人的にはオブジェクト指向で記述した方が便利に感じるので、適当な粒度でクラス化していきます。とはいえ基本的な方針は「Twitterボットプログラミングテクニック」に載っている内容に沿って開発します。

Botクラス

Twitterと通信してボットに対して呟く命令等をやり取りするクラスです。基本的には「TwitterOAuth」が面倒な部分をカバーしてくれていますので、私が開発する箇所は、後で出てくるResponderクラスで処理した結果を「TwitterOAuth」に渡すところと、そのエラーチェックの部分だけです。

Responderクラス

ボットに対して命令したい内容を生成するクラスにする予定ですが、現在は固定文言を呟く命令を生成するためのクラスとなっております。後々抽象化して、機能毎に継承するように改良していきます。

ソースコード

前回の記事から変更点があった「bot.php」と、新しく作成した「responder.php」の2点を紹介します。

bot.php
<?php

require_once(__DIR__ . '/config.php');
require_once(__DIR__ . '/responder.php');

use Abraham\TwitterOAuth\TwitterOAuth;

echo '処理開始' . PHP_EOL;
$responderInstance = new Responder();
$responderInstance->Response('クラス化テスト');
echo '処理終了' . PHP_EOL;

class Bot{
    private $connection;    //直接Twitterとやり取りする
    private $responder;     //Twitterにどのような命令を投げるかを処理する

    public function Bot($responder,$consumerKey = CONSUMER_KEY,$consumerSecret = CONSUMER_SECRET,
                        $accessToken = ACCESS_TOKEN,$accessTokenSecret = ACCESS_TOKEN_SECRET){
        $this->connection = new TwitterOAuth($consumerKey, $consumerSecret, $accessToken, $accessTokenSecret);
        $this->responder = $responder;
    }

    //処理結果を検証する
    private function checkResult($result){
        if ($this->connection->getLastHttpCode() === 200) {
            echo '成功!' . PHP_EOL;
        } else {
            echo '失敗!' . $result->errors[0]->message . PHP_EOL;
        }
    }

    //つぶやく処理
    public function Tweet(){
        $opt = $this->responder->getArgs();
        $res = $this->connection->post("statuses/update",$opt);
        $this->checkResult($res);
    }
}

処理結果を検証するメソッドとつぶやく処理を分けた理由は、今後追加機能が発生した場合でも、おそらくチェック処理だけは共通なのではないかという淡い期待を抱いてのものです。

responder.php
<?php

require_once(__DIR__ . '/responder.php');

//ただ呟くだけのResponder
//機能追加はこのクラスを継承して実装
class Responder{
    private $args;

    public function Responder(){
        $this->opt = array();
    }

    //このメソッドをオーバーライドする
    public function Response($input){
        $this->args['status'] = $input;

        $bot = new Bot($this);
        $bot->tweet();
        return true;
    }

    public function getArgs(){
        return $this->args;
    }
}

ResponderクラスにBotクラスを持たせているのには理由があります。今後cronにて自動実行することになると、おそらく、ボットに対して「何かを命令する回数」よりも「何も命令しない回数」の方が多くなるはずです。

であれば、何もしない場合はTwitterへの接続を控えたいので、まずResponderクラスを生成し、必要であればBotクラスを生成する手順にしております。言ってしまえば、好みの問題です。

実行結果

早速、開発環境で実行してみます。ちなみに前回の記事で、ターミナルの余計な部分を表示させないために改行しまくるというアナログチックな対応をしておりましたが、「Ctrl+l」で全て消せる見たいです。早速今回利用してみます。

f:id:gootor3030:20170814202708p:plain

無事処理が終了していそうです。表示内容もすっきりしていてスマートです!

f:id:gootor3030:20170814202549p:plain

肝心のツイートもちゃんとされています。これで心置きなく追加機能を実装できそうですね!

次回予告

次回はいよいよ決まった時間につぶやく機能を作っていきたいと思います。お楽しみに!