ボットの振る舞いを作成する

次に、ボットの振る舞いを作成します。これがいわば、ボットのアイデンティティであり本体になります。

振る舞いは幾つでも設定できますが、なるべくひとつの「人格」をひとつのクラスで表現した方がわかりやすいと思います。
ここでは例として、次のような振る舞いをするボットを作ってみます。

全く無意味ですが、機械翻訳のままならなさを軽く楽しむだけのサンプルです。
名前は j2e2j とつけました。そのまま、“Japanese to English to Japanese” ということです。

フォローされたら、フォローを返す

TuiBotter_Eventsから、「フォローされた」イベントを選んで実装してやります。

class TuiBotter_j2e2j implements TuiBotter_Event_BeFollowed
{
  public function eventBeFollowed(Tuitter_User $user, Tuitter $tuitter)
  {
  }
}

これで、このアカウントがフォローされた場合に、eventBeFollowed という関数が呼び出されるようになります。引数として渡される $user は、フォローしてきたユーザを表すオブジェクト。2番目の $tuitter は Tuitter オブジェクトです。

ここで行いたいことは「フォローし返す」なので、ユーザを既にフォロー中かどうかを確認し、まだであればフォローするように記述します。

class TuiBotter_j2e2j implements TuiBotter_Event_BeFollowed
{
  public function eventBeFollowed(Tuitter_User $user, Tuitter $tuitter)
  {
    if(!$user->isFollowing())
      $user->follow();
  }
}

英語/日本語の翻訳をする。

この部分の説明は、本題とは異なるので割愛します。Google Translation API を利用しています。

private static function _translate($text, $from, $to)
{
  $res = '';
  $url = 'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q='.urlencode($text).'&langpair='.$from.'%7C'.$to;
  if($trans_json = @file_get_contents($url)){
    $trans_json = mb_convert_encoding($trans_json, 'utf-8', 'auto');
    $trans_data = json_decode($trans_json);
    if(isset($trans_data->responseData->translatedText)){
      $res = $trans_data->responseData->translatedText;
    }
  }
  return $res;
}

自分に向かって呟かれた内容を、翻訳して返す

イベント BeMentioned もしくは BeReplied を用います。ここでは BeMentioned を使うことにします。

該当するイベント用のインターフェースを、追加します。

class TuiBotter_j2e2j implements TuiBotter_Event_BeFollowed, TuiBotter_Event_BeMentioned
{
  public function eventBeFollowed(Tuitter_User $user, Tuitter $tuitter)
  {
    if(!$user->isFollowing())
      $user->follow();
  }
  public function eventBeMentioned(Tuitter_Tweet $tweet, Tuitter $tuitter)
  {
    // ここに処理を追加
  }
}

第1引数が、今度は呟きになっています。先程作った関数を使用して内容を翻訳し、呟くには次のようにします。

$text = $tweet->text;
$en = self::_translate($text, 'ja', 'en');  // 日本語→英語
$ja = self::_translate($en,   'en', 'ja');  // 英語→日本語
// つぶやく
$tuitter->sendMessage('TT @'.$tweet->user->screen_name.': '.$ja);

“TT“は“Transfered Tweet“の略で、適当に作ってみました。つぶやきの主のスクリーン名を付与しています。

ふるまいを登録する

これで「ボット」が完成しました。

INIファイルに、この振る舞いを登録してやります。

[Behaviours]
TuiBotter_j2e2j = /path/to/your/project/j2e2j.php