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
無料ブログはココログ

ツイッターbot作成あれこれ

2015年8月 8日 (土)

EasyBotterでカスタマイズ覚書2

前項「EasyBotterでカスタマイズ覚書」の続き。

【投稿に他人のIDがある場合(複数ID宛のリプライの場合)はリプライを返さない】
botの暴走を減らしたい、サーバーへの負荷を軽減したい等の目的で、複数ID宛へのリプライをしないようにする。

これは、EasyBotter本体ファイルに予め設定されている[[END]]をそのまま利用する。

いじるのはリプライファイルの方。

"@[a-zA-Z0-9_].*@[a-zA-Z0-9_]"=> array(
"[[END]]",
),

これだけ。

解説。
[ ]は、この括弧内の任意の一字にマッチさせたい時に使用。
a-zやA-Zは小文字と大文字のアルファベット26文字をまとめて表したもの。
0-9は0から9までの数字をまとめて表したもの。
「.*」については前項を参照。

つまり上の命令は、「『@+アルファベットか数字の文字列(つまりツイッターのIDのこと)』があり、その後にも『@+アルファベットか数字の文字列』がある場合は、本体設定の[[END]]を実行する(リプライしない)」ということ。

【URLの含まれるリプライにはリプライを返さない】
URL付きの発言は無視をしたい場合。荒らしとか乗っ取りとかに反応しない対策。

手法は先ほどと同様に、[[END]]を使用する。

"https?://"=> array(
"[[END]]",
),

httpsの後の「?」は、直前が0字もしくは1字の場合にマッチする記号。つまり、「https」でも「http」でも良いという意味。
私は他にも、「RT」や「QT」が含まれたリプには反応しないようにしている。

【半角記号を文字列として認識させたい】
上記までの中で、半角の「?」や「.」や「*」などには特別な働きがあると書いてきた。従って、これらの半角記号を、リプライ時の条件ワードに含ませたい場合には、特別な働きをしないように配慮しなければならない。どういうことかというと……

まずは参考表現。

    "(オーベル|おーべる|オベ|閣下).*(フェル|ふぇる).*元気.*(か|?|\?)"=> array(
    "オベ「私の預かり知らぬところだ」",
    "オベ「本日は出張を命じている」",
    "オベ「今朝、私のデスクにカエルの玩具を置いたのはおそらくフェルナーであろう。……元気なことだ」",
),

これは、「オーベル」または「おーべる」または「オベ」または「閣下」+任意の文字列(有無は問わない)+「フェル」または「ふぇる」+任意の文字列(有無は問わない)+「か」または「?(全角)」または「?(半角)」 を含む投稿があった場合に指定のリプライを返すというもの。

要するに、「閣下、フェルナーは元気ですか」や、「おーべるたん、ふぇるにゃん元気?」などに対応したいというマニアックなリプライパターン。

この赤で表示した「(か|?|\?)」に注目。
これは「か」または「?」か「?(半角)」という意味。本来なら(か|?|?)と書きたいところだが、半角の「?」をそのまま正規表現のなかに放り込むと、前述の通り「直前の文字が1字でも0字でも良い」という意味になってしまう。

そこで、半角「?」の前に半角の「\」を入れている。先に「\」を入れることで、直後の一字を正規表現としてではなく、ただの文字列として見なす、ということになる。

これで初めて、「閣下、フェルナーは元気です?」という投稿に対して、適切なリプライを送ることができる。ちなみに半角「?」にこだわった理由は、ただ表記ブレに対応したいだけ。スマホからの投稿だと、全角か半角か見分けづらくて、気付かないうちに半角記号を使っている場合があるので。

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も参照のこと。

2014年9月16日 (火)

Easy Botterでツイッターbot作成 2.ツイッターとの連携(後編)

前回は連携準備だけで終わってしまいました。今回はいよいよ、ツイッターとの連携作業になります。

1.OAuth認証とは?

また出てきました、良く分からない言葉。読み方はオー・オースです。前回APIについて説明した時に、APIは「アプリケーション同士で連携を取る際の形式」と言いました。このOAuth認証は、そのAPIを承認する手段です。

botプログラム側から、「私はこういうアプリなんです、連携してください」と申し出たのが前回まで。ところがTwitter側としては、「俺と連携するには、いくつかのパスワードが必要だ」と言っているのです。そんなわけで、そのパスワード的役割になるキーを取得します。

2.API Key、API Secret、Access Token、Access Secretを取得する

まず、ブラウザからbot用のTwitterアカウントにログインします。

次に、https://apps.twitter.com/へアクセスします。これはツイッターのアプリ開発者向けのページです。
06twitterapps
右上に表示されているアイコンが、bot用のアカウントであることを確認し、中央の「Create New App」をクリックします。

必要事項を入力していきましょう。ここで入力したものは、あとで変更できます。
07createapp
08createapp2
規約に同意して、Create your Twitter Applicationをクリックします。

09appconp_2
このページが表示されたらOKです。さっそく、API Keyというタブをクリックしましょう。この時点でAPI Keyはできているのですが、このままではツイッターbotとしては使えません。ので、modify app permissionsというリンクをクリックして下さい。おや、また「パーミッション」という言葉が出てきましたね。これから、botがツイッターにアクセスする権限を調整します。

10modifyapppermissions_2

クリックすると、パーミッションの設定ページに飛びます。
11accessp
初めはRead Onlyにチェックが入っていますので、Read and Writeにチェックして、下のUpdate settingsを押して設定を保存します。

API Keyタブをクリックして、Access levelがRead and Writeになっていることを確認して下さい。
12accesspkakunin_2

では次に、Access TokenとAccess secretを取得します。同じページの下の方へスクロールして下さい。
13createaccesstoken
ページ最下方にあるCreate my access tokenというボタンをクリックして下さい。

14accesstokenrefresh
ボタンを押すとページ上部にこんなメッセージが出ます。下にスクロールしてみれば、Access Tokenできてないし((((;゜Д゜))))))
と、慌てることなかれ。このメッセージは、「今作ってるからちょっと待っててね。少ししたらリロードしてちょうだい」と書かれています。
そんなわけで、Refreshというリンクをクリックしてみる。待ち時間は数秒で大丈夫みたいです。

15key
無事、Access TokenとAccess secretも取得できました。こちらもパーミッションはRead and Writeになっていますね。これで、Twitter側のbot受け入れ準備が整いました。

では、これから上の図で赤丸をつけた4つのキーを使いますので、間違いのないように控えておきましょう。

3.settingファイルにAPI Key、API secret、Access Token、Access secretを記述する

botファイルの中にある「setting.php」ファイルを開きましょう。
16settingapikey
先ほど取得した値を、” ”の間に間違いなく入れて保存して下さい。

これを再度サーバー上に転送すれば、botとTwitterとの連携は完了です!
次回はいよいよ、手動でbotを動かしてみます。

2014年9月15日 (月)

Easy Botterでツイッターbot作成 2.ツイッターとの連携

ここでは、最低限のbotプログラムを、ツイッターと連携させるための手続きを説明します。これをしないと、例えプログラムをカスタマイズしてUPしたとしても、プログラムが動くだけでツイッターとはまったく別物、無関係になってしまい、ツイッター用botとしては意味がなくなってしまいます。

1.APIを最新のものにする(ファイルの設置編)

はい、いきなり「API」とか言われても何それ?ですよね。ここは理解できなくても問題ないですが、正式名称はApplication Programming Interfaceです。

簡単に言うと、アプリケーション同士で連携を取る際の形式、書式のようなものです。この書式がちょっと古いので、最新のものに書き換える手続きが必要です。

まず、公式サイトでEasy botterをダウンロードして、解凍してください。

01nakami

解凍するとこんな感じでファイルやフォルダがありますね。

ここに、最新のAPIへ更新するためのファイルを作って入れます。

以下の赤い構文(スクリプト)を、前回のページで説明したテキストエディターにコピー&ペーストして、ファイル名をつけて保存します。名称は何でも良いのですが、ここでは仮に「replace.php」としておきます。

===========================================

<?php $target = "EasyBotter.php"; echo file_put_contents($target,str_replace('replies.xml','mentions.xml', preg_replace("/ps?:\/\/twitter.com\/([a-z\/_]+)/","p://api.twitter.com/1/$1", file_get_contents($target))))?"多分完了しました。確認して下さい":"失敗しました"; ?>


===========================================

保存形式はテキストではなくPHPファイルです。言わずもがなですが、文字コードはUTF-8N、改行コードはLFです。

このファイルを先ほどのファイル内に入れて……
02replace

これを丸々そのままサーバーに転送します。転送には前ページで説明したFTPソフトというものが必要です。また、そのソフトを使用してサーバーに転送するには、転送設定というものをしなければなりません。FTPソフトの操作はソフトのサイトを、転送設定はレンタルサーバーのサイトの説明にしたがって行ってください。

★ 転送時のひとことアドバイス
サーバーにはbotプログラムだけでなく、ホームページなども設置できます。色々なファイルがごちゃごちゃしないように、botプログラムはひとつのフォルダに収めましょう。

2.APIを最新のものにする(書き換え編)

転送したら、サーバー上のEasyBotter.phpのパーミッション(アクセス権)を666に設定して下さい。設定の仕方は、FTPソフトによってだと思いますが、私の使っているホームページビルダー付属のFTPソフトだと、ファイル名を右クリックでメニューが出ます。

03acces1

パーミッション、あるいはアクセス権の変更という名前かと思いますが、これをクリック。

04acces2

全ての項目において、読み込みと書き込みが可能になるよう設定します(これが666です)。
このように変更する理由は、先ほど作ったreplace.phpを実行して、EasyBotter.phpの中身を書き換えるからです。

さて、パーミッションの変更が終わったら、ブラウザで「replace.php」を実行します。
レンタルサーバーでサーバーを借りた時に、「あなたのホームページのアドレスはhttp://www.xxxxx.??/です」などと表示されたと思います。今、転送したファイルは、そのURLに設置されました。
仮にそのURLを「http://www.hapilog.com/」とし、その中に「twitterbot」というフォルダを作ってファイルを入れたと仮定して説明を続けます。

replace.phpを実行するには、ブラウザにURLを直接入力します。
この例で言うなら、「http://www.hapilog.com/twitterbot/replace.php」です。これを入力して確定します。真っ白なページに「多分完了しました。確認して下さい」と表示されたら、最新APIへの書き換え作業大成功です。
「失敗しました」と表示された場合は、replace.phpの内容に間違いがないか、EasyBotter.phpのパーミッションが666になっているか確認してやり直してください。

次回は、ツイッターとの連携後半です。

Easy Botterでツイッターbot作成 1.準備編

二度目のbot作りなのに、すっかり忘れていて悪戦苦闘したので、備忘録として残しておきます。

今はウェブ上でツイートしたい内容を入力して設定するだけの、ブログ感覚のbotなどもありますが、こだわりのbotにしたい!リプライや条件などを色々工夫したいという方は、やはり手作りが一番です。

とはいえ、ゼロからプログラムを作るのはハードルが高い。そこでbotプログラム自体はできているけれど、自由にカスタマイズ可能なEasy Botterを利用したいと思います。

基本的には公式サイト非公式wikiの手順で設置していきますが、書かれていない部分もあるので、補完目的です。

1.準備するもの

・ パソコン(スマホやタブレットでも下記の条件が作れればいける……か?)
・ PHP5以上が使えるレンタルサーバー(※2)
・ bot用のTwitterアカウント(普通の手順で作って下さい)
・ テキストエディター(※3)
・ FTPソフト(作ったプログラムをサーバーへ転送するソフト。こちらを参考に)

2.レンタルサーバーについて

 PHP5以上が使えることが必須です。Yahooなどで「PHP5 レンタルサーバー」と検索するといくつか出てきます。初心者には@pagesが人気のようです。
ちなみに私はLa coocanのスタンダード(有料)です。この後説明するcronも簡単に設定できるので、cron設置の苦労がまったくありませんでした。

3.テキストエディターについて

 botをカスタマイズする際に使用します。保存時に文字コードと改行コードを指定できるソフト必須。文字コートは「UTF-8N」、改行コードは「LF」です。
Windowsであれば、フリーソフトのTeraPadが、動作も軽くPHPのコマンドを自動色分けしてくれて分かりやすいのでオススメです。

次からはいよいよ、具体的に動き出します!