2019年8月
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
無料ブログはココログ

« 人生最良の日(銀河英雄伝説二次 ワンライ用) | トップページ | EasyBotterでカスタマイズ覚書2 »

2015年5月31日 (日)

EasyBotterでカスタマイズ覚書

設置編とか書こうと思ったけど、設置や動作テストにはそれほど苦労しなかったので。具体的に自分でカスタマイズした箇所をメモ代わりに書いておきます。

【リプライ時に相手の名前(IDではなく表示名)を呼ばせる際、名前の中の@以降を読み上げない】
「ななみん@冬コミ落としそう」などの@以降まで読まれるとゲンナリするので、「ななみん」とだけ呼ばれるようにしたい。

EasyBotter.phpファイル内の以下の部分を見つけ、

        if(strpos($text,"{name}") !== FALSE){
            if(!empty($reply)){
                $text = str_replace("{name}",$reply["user"]["name"],$text);               
            }else{
                $randomTweet = $this->getRandomTweet();
                $text = str_replace("{name}",$randomTweet["user"]["name"],$text);       
            }
        }

以下の文と差し替える。@が全角でも半角でも対応。

   //この部分改造(名前の@以降を読み上げない)
    if(strpos($text,"{name}") !== FALSE){
        if(!empty($reply)){
        $prg_reply_name = preg_replace("/(@|@).+/", "", $reply["user"]["name"]);
        $text = str_replace("{name}",$prg_reply_name,$text);
    }else{
        $randomTweet = $this->getRandomTweet();
        $prg_reply_name = preg_replace("/(@|@).+/", "", $reply["user"]["name"]);
        $text = str_replace("{name}",$prg_reply_name,$text);
        }
    }

【リプライに反応してTLに呟きたい】
通常、リプライを受けたら相手にリプライするが、例えば「あんたなんか嫌い!」と言われたら、「嫌いだと言われてしまった……」と空リプで独り言を言わせることを想定する。

EasyBotter.phpファイル内の以下の部分を見つけ、

  //idなどを変換
            $status = $this->convertText($status, $reply);
            //フッターを追加
            $status .= $this->_footer;
        //リプライ相手、リプライ元を付与
        $re["status"] = "@".$reply["user"]["screen_name"]." ".$status;

最後の行に//をつけてコメントアウトする。

      

//$re["status"] = "@".$reply["user"]["screen_name"]." ".$status;

そのあとに、以下の文を追加する。

        switch(true){
            //リプライ反応をTLに発言
                case stristr($status, "[[TLH]]"):
                    $status = str_replace("[[TLH]]","",$status);
                    $re["status"] = $status;
                    $rpid = $reply["id_str"];
                        $this->saveLog("latest_reply",$rpid);
                break;
            //その他
               default:
                   $re["status"] = "@".$reply["user"]["screen_name"]." ".$status;
            }

これを設定した上で、リプライパターンの選択肢中に

    "[[TLH]]オベ「嫌いだと言われてしまった……」",

など、文頭に[[TLH]]をつけたものを用意しておく。

【通常ポストを時間分け

bot.phpファイルに書き込む。

//「分」が30の時にポスト。ただし「時」が0,7,12,19,21の時はそれぞれのデータを、「時」が0より大きく7より小さい時は深夜ファイルを、
//それ以外の「時」の時はその他ファイルを参照してポスト
if(date("i") == 30){
    if(date("G") == 0){
    $response = $eb->postRandom("post_0030.txt");
    } else if(date("G") == 7){
    $response = $eb->postRandom("post_0730.txt");
    } else if(date("G") == 12){
    $response = $eb->postRandom("post_1230.txt");
    } else if(date("G") == 19){
    $response = $eb->postRandom("post_1930.txt");
    } else if(date("G") == 21){
    $response = $eb->postRandom("post_2130.txt");
    } else if(date("G") > 0 && date("G") < 7){
    $response = $eb->postRandom("post_shinya.txt");
    } else {
    $response = $eb->postRandom("post_sonota.txt");
    }
}

//「分」が0で「時」が20の時に、ゆる募ファイルからランダムポスト
if(date("G") == 20 && date("i") == 0){
$response = $eb->postRandom("post_yurubo.txt");
}

【特定の日には特別なリプライを指定する】
時間分けのリプライ版。

//1月1日には正月用リプ、2月14日にはバレンタイン用リプ、3月14日にはホワイトデー用リプ、5月5日には誕生日用リプを使用する
if(date("n") == 1 && date("j") == 1){
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern_newyear.php");
}
else if(date("n") == 2 && date("j") == 14){
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern_valentine.php");
}
else if(date("n") == 3 && date("j") == 14){
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern_whiteday.php");
}
else{
    $response = $eb->reply(5,"reply_randomdata.txt","reply_pattern.php");
}

【時間分けまとめ】
nが月、jが日、Gが時、iが分と覚えれば応用が利く。秒単位の指定をすると動作ラグ等でうまく動かないことが多いので、あまり使わない。

【TLの特定のワードに反応して、1/2の確率でリプライする】

bot.phpファイルに書き込む。

//PHP動作時に1/2の確率で、5分前まで遡ってTLを確認し、反応ワードがあればリプライを返す
if(rand(0,2) == 0){
$response = $eb->replyTimeline(5,"reply_timeline.php");
}

【リプライ条件を複数指定する 例:「こんばんは」単体へのリプとは別に、「オベ様」と「こんばんは」の両方を含む場合のリプを別に設定する】
「.*」を使用する。「.」は任意の一文字という意。「*」は0文字以上、任意の文字数という意。合せて使うと結果的に「任意の文字列」という意味になる。

基本構造は

A.*B で『A(任意の文字列)B』という意味。AとBの間の文字列はあってもなくても構わないが、必ずA、Bの順でなければならない。

つまり、

"オベ様.*こんばんは"=> array(

とすると、「オベ様、今日も一日暑かったね。やっと星が出てきたよ。こんばんは」ならば条件を満たすが、
「こんばんは。今日も一日暑かったね、オベ様」ではAとBの順序が逆なので条件を満たさない。

そこで、「または」を意味する「|」を使用する。

A.*B|B.*A これで「『A(任意の文字列)B』があるか、『B(任意の文字列)A』があれば条件を満たす」ということになる。

"オベ様.*こんばんは|こんばんは.*オベ様"=> array(

これで初めて、「オベ様、こんばんは」でも「こんばんは、オベ様」でも正しく反応するようになる。

さらに、ユーザーたちの表記ブレに対応する。「こんばんは」は「コンバンハ」と書く人も「今晩は」と書く人もいるかもしれない。この表記ブレにも「または」を意味する「|」を使用する。

オベ様.*こんばんは|コンバンハ|今晩は|こんばんは|コンバンハ|今晩は.*オベ様

訳が分からなくなる。さすがにEasyBotterも訳が分からなくなるので、括弧でくくってやる。

"(オベ様 .*(こんばんは|コンバンハ|今晩は))|((こんばんは|コンバンハ|今晩は).*オベ様)"=> array(

外側の赤い括弧は必要ないような気がするが、これがあるとど真ん中の「または(|)」を探しやすい。
大括弧と小括弧みたいに分けられればいいのに……(´・ω・`)

意味合いとしては

{「オベ様」の後ろに(「こんばんは」か「コンバンハ」か「今晩は」)がある}または{(「こんばんは」か「コンバンハ」か「今晩は」)の後ろに「オベ様」がある}時に、以下のリプライを返すよ!

オベ様の方も表記ブレに対応したら、より面倒くさくなるけど原理は同じ。

EasyBotterでカスタマイズ覚書2も参照のこと。

« 人生最良の日(銀河英雄伝説二次 ワンライ用) | トップページ | EasyBotterでカスタマイズ覚書2 »

ツイッターbot作成あれこれ」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: EasyBotterでカスタマイズ覚書:

« 人生最良の日(銀河英雄伝説二次 ワンライ用) | トップページ | EasyBotterでカスタマイズ覚書2 »