トップ » 技術記事 » 誰でも簡単にできる Twitter ボット作成入門

誰でも簡単にできる Twitter ボット作成入門

タグ: Twitter なでしこ

最近、話題のマイクロブログ Twitter で自動的に発言するプログラム(通称:ボット)を作る方法を紹介します。日本語のプログラミング言語「なでしこ」を使って作るので、専門知識は少しで大丈夫です。面白い(あるいは役に立つ)ボットを作って楽しみましょう。

なんだ!あいつもボットだったのか!

一般的に「ボット(BOT)」というのは「ロボット」の略称で、ネットワークゲームやIRC・チャットなどで、自動実行されるプログラムのことを指します。ネットワークゲームでは、自動でレベルを上げるために使われるため敬遠されることもあるようです。

しかし、IRCやチャットなどを対象としたボットは、人間に変わって退会処理やヘルプ表示の操作を行うなど、役に立つ場合も多いものです。また、簡単な人口知能(人口無能と呼ばれる)を搭載して、誰かの発言に呼応して面白い発言をするボットもあります。

そして、Twitter に置かれた状況を見てみると、非常に多くのボットが存在していることが分かります。有益な情報を定期的に発言するボットや、ブログの新着情報を語るボット、天気予報を発言したり、話しかけられると挨拶を返すボットなどさまざまです。

巧妙に作られたボットは、既に人間なのかボットなのか判断が付かない状況になっています。

Twitter にボットが多いのは公式にAPIが用意され、非常にボットが作りやすい状況であることも理由の一つでしょう。「Twitter ボット 作り方」で検索すると既にいくつかの記事が見つかります。

ここから見ても、PHP/Ruby/Perlと主要な言語にて、多くのボットが作られていることが分かります。プログラミングができれば、そこそこ簡単にボットは作れるのです。

この原稿を書くためにちょっと調査しただけでも、Twitter のユーザーの中には、ボットであることに、ぜんぜん気づかず、ある日それに気づいて「騙された!」という記事を見つけました。短い文章、ほんの一行でやりとりするコミュニケーションですから、それほど深い話をしなければ、ボットか人間か気づかない場合も多いでしょう。

そして、2009年2月には、チームラボがアルゴリズムコンテストとして「ボット」の出来を競うコンテストを開催しています。

このように、ボット作りは非常に奨励?されており、とても楽しいボットの登場が人間の未来を変える可能性も秘めているのです。

「どうしてプログラマーになったんですか?」という質問に対し、幾人かはこう答えるでしょう。

「ドラえもんや、アトムに代表される人間のように話す人工知能を持ったロボットを作ってみたかった」と。そうです。人は、コンピューターの中に自分で知能を持った人間を作って見たいと思うものなのです。

壮大な計画を言えば、このようになります。今回作るボットは人工知能を持ってはいませんが、人に癒しを与える可能性を秘めています。

Twitter ボットを作ろう!~どんなボットを作るのか?

それでは、Twitter ボットを作ってみたいと思います。ここでは、誰でも簡単プログラマーを目指して作っている『日本語プログラミング言語「なでしこ」』を使ってボットを作ります。

既に、なでしこで作られた Twitter クライアントがあり、これを改良して作るのが近道です。以下の解説も参考にすることができるでしょう。

ここで作るのは、話しかけられると、「そんなこと言ってくれる**さんが一番好きです!」とか「**さん、あなたが一番素敵な人です。」とお世辞を返信するボット「chuntarou」(通称:ちゅんちゅん)です。

http://aoikujira.com/demo/hakkaku/rc/20090730vklY2-twitterbot-001.png
http://aoikujira.com/demo/hakkaku/rc/200907309ox5Wo-bot-cap.png

参考にする資料

ボットを作るに当たって、必要になるのは、Twitter API に関する知識です。この API の日本語訳が、以下のサイトにありますので、これを参考にします。

作ったプログラム

とりあえず、発言者を褒めるだけのプログラムは以下の通りです。TWITTER_IDとパスワードを書き換えることで動かすことができます。10分に一回、誰かを褒めるというだけのボットです。ボットだと分かっていても、褒められると嬉しいかも?!

#-----------------------------------------------------------------------
# Twitterbot
#-----------------------------------------------------------------------
# 認証設定
TWITTER_ID=「***」
パスワード=「***」
#-----------------------------------------------------------------------
# APIのURL
API_SELF=「http://twitter.com/statuses/user_timeline.xml」
API_FRIENDS=「http://twitter.com/statuses/friends_timeline.xml」
API_UPDATE=「http://twitter.com/statuses/update.xml」
LASTID=0
#-----------------------------------------------------------------------
# 画面デザイン
表示用とはTエディタ。
表示用のレイアウトは「全体」
「,m1,自由発言,,,自由発言処理
,m2,更新,,,画面更新処理」をメニュー一括作成
# 更新頻度の設定
更新タイマーとはタイマー。
その間隔は60*10 # API制限があるので120以上を指定する
その時満ちた時は~画面更新処理
更新タイマーを開始。
画面更新処理。

#-----------------------------------------------------------------------
●発言考察処理(TSVから)
  #ここで発言するかどうか決める処理
  #
  #自分宛の発言があるか調べる
  もし、TSV=空ならば、戻る。
  TO=「@{TWITTER_ID}」
  LNAME=空
  TSVをTSV取得して反復
    SNAME=それ¥0
    STATUS=それ¥1
    もし、SNAME=TWITTER_IDならば、続ける。#自身に返信しない
    LNAME=SNAME
    STATUSでTOが何文字目か
    もし、それ>0ならば
      「@{SNAME} 」&(SNAMEの褒め言葉選択)を発言書き込み。
      戻る。
  #自分宛の発言がなければ勝手に発言する
  「@{LNAME} 」&(LNAMEの褒め言葉選択)を発言書き込み。

●出だし語選択
  (6の乱数)で条件分岐
    0ならば、それは「おぉ、」
    1ならば、それは「スゴイ!」
    2ならば、それは「そう、」
    3ならば、それは「えっと、」
    4ならば、それは「」
    5ならば、それは「ガーン★ミ」

●褒め言葉選択(SNAMEの)
  結果とは変数。
  結果=出だし語選択
  (6の乱数)で条件分岐
    0ならば、それは「本当、{SNAME}さんって偉いですね!」
    1ならば、それは「スゴイです。」
    2ならば、それは「感心ですよ。」
    3ならば、それは「そんなこと言ってくれる{SNAME}さんが一番好きです!」
    4ならば、それは「そう!{SNAME}さん、あなたが一番素敵な人です!」
    5ならば、それは「大好きです。{SNAME}さん。なんか元気出ました。」
    6ならば、それは「{SNAME}さんって本当かっこいいなぁ~。」
    7ならば、それは「嬉しい、楽しい、{SNAME}さんが大好き!」
    8ならば、それは「{SNAME}さんに惚れそうな予感がします。」
    9ならば、それは「かっこいいなぁ、{SNAME}さんを見習いたいです!」
  それは結果&それ。

#-----------------------------------------------------------------------
●画面更新処理
  更新タイマーを停止。
  結果は空。
  S=空。
  #友達のタイムラインを取得
  5回
    エラー監視
      もし、LASTID≠0ならば
        API=「{API_FRIENDS}?since_id={LASTID+1}」
      違えば
        API=API_FRIENDS
      S=BASIC認証ヘッダをAPIへHTTPゲット。
      抜ける。
    エラーならば
      母艦=「再試行待ち」
      10秒待つ。
    ここまで。
  もし、Sが空ならば、戻る。
  Sの改行&改行まで切り取る。# ヘッダを捨てる
  STATUS=Sから「status」の階層タグ切り出す
  もし、STATUS=空ならば、戻る。#たぶんAPI制限orサーバーダウン
  STATUSを反復
    ID=対象から「id」のタグ切り出してタグ削除。
    SCREEN_NAME=対象から「screen_name」のタグ切り出してタグ削除。
    もし、それが空ならば続ける。
    対象から「text」のタグ切り出してタグ削除。
    HTMLエンティティ復号。
    TEXT=「{\10}」を空に置換
    結果=結果&「{SCREEN_NAME}{\t}{TEXT}{~}」
    もし、ID > LASTIDならば、LASTID = ID
  結果をログ
  結果から発言考察処理
  母艦は「Twitterbot - {今}」
  更新タイマーを開始。
#-----------------------------------------------------------------------
●発言書き込み(MSGを)
  更新タイマーを停止。
  発言UTF=MSGをUTF8N変換。
  成功フラグ=オフ
  5回
    エラー監視
      BASIC認証ヘッダと「status={発言UTF}」をAPI_UPDATEへHTTPポスト。
      成功フラグ=オン
      抜ける。
    エラーならば
      10秒待つ
    ここまで
  もし、成功フラグ=オンならば
    「発言:{MSG}」をログ
  違えば
    「発言失敗:{MSG}」をログ
  ここまで
  更新タイマーを開始。
#-----------------------------------------------------------------------
●自由発言処理
  更新タイマーを停止。
  「何をしていますか?」と尋ねて発言に代入。
  もし、発言=空ならば、戻る。
  発言を発言書き込み。
#-----------------------------------------------------------------------
●BASIC認証ヘッダ
  認証は「{TWITTER_ID}:{パスワード}」をBASE64エンコード。
  ヘッダは「Authorization: Basic {認証}」
  ヘッダを戻す。
#-----------------------------------------------------------------------
●ログ(Sを)
  母艦=「{今}bot>{S}」
  表示用=MID(「{今日} {今}>」&S&改行&表示用,1,1024*8)
#-----------------------------------------------------------------------

この中で注目したいのは、「発言考察処理」という関数です。ここで、誰に発言するのか、どのような発言をするのかという部分を考えています。今は、適当に人を選んで、褒め言葉を合体させているだけなので、かなり単純なボットとなっています。

褒め言葉のパターンが、10パターンしかないので、あまり面白くないのですが、ここを充実させたり、もっとバリエーションや言葉の組み合わせ、発言者の発言を微妙にもじるなど、アイデア次第で、もっと上手に褒めるボットを作ることができそうです。

その他自動フォロー機能

最後に、フォローされたら、自動的にその相手をフォローするスクリプトも必要でしょう。これも、なでしこを使えば、そこそこ簡単に書くことができます。

ここでは、ボット用に GMail を取得したことを前提にしています。以下の、GMAIL_ID/GMAILパスワード、TWITTER_ID/TWITTERパスワードを埋めます。

以下のプログラムをタスクスケジューラに登録して、定期的に実行します。すると、フォローされた旨のメールが届いたていたら、自動的に該当するユーザーを友達に追加します。

#-----------------------------------------------------------------------
# 認証設定
GMAIL_ID=「***」
GMAILパスワード=「***」
TWITTER_ID=「***」
TWITTERパスワード=「***」
DIR=「{母艦パス}メールログ\」
#-----------------------------------------------------------------------
# APIのURL
API_FRIENDSHIP_CREATE=「http://twitter.com/friendships/create/」
#-----------------------------------------------------------------------
母艦=「{GMAIL_ID}のTwitterbotメールチェック」
画面クリア。10,10へ移動。
GMAIL_IDのGMAILパスワードでDIRへGMAIL受信
フォロー確認処理。
「以上---」と表示。
3秒待つ。
終わる。

●フォロー確認処理
  DIR&「*.txt」を全ファイル列挙
  反復
    Sに対象を開く。
    #Twitterからのメールかどうか確認
    Sで「差出人: Twitter」が何文字目?
    もし、それ=0ならば、戻る。
    Sを「http://twitter.com/(\w+)」で正規表現マッチ
    もし、そうならば
      FID=抽出文字列¥0
      もし、FID=空ならば、続ける。
      FIDと友達処理実行

●友達処理実行(FIDと)
  #自身?
  もし、TWITTER_ID=FIDならば、戻る。
  #二重処理防止
  CHK=DIR&「{FID}.check」
  もし(CHKが存在する)ならば、戻る。
  成功フラグ=オフ
  5回
    エラー監視
      URL=「{API_FRIENDSHIP_CREATE}{FID}.xml」
      BODY=空。
      BASIC認証ヘッダとBODYをURLへHTTPポスト。
      成功フラグ=オン
      CHKに「ok」を保存。
      「{FID}と友達になりました。(たぶん)」と表示。
      抜ける。
    エラーならば
      10秒待つ
    ここまで
  それは成功フラグ。

●BASIC認証ヘッダ
  認証は「{TWITTER_ID}:{TWITTERパスワード}」をBASE64エンコード。
  ヘッダは「Authorization: Basic {認証}」
  ヘッダを戻す。 

まとめ

以上、非常に簡単でしたが、Twitterボットの作り方を紹介しました。ボット作りは楽しく、また、フォローされれば非常に嬉しいものです。「我が子が成長し友達を作っている」そんな親の気持ちを擬似的に体験できます。ここで見たように、プログラム自体それほど難しい物ではありませんし、改造するだけならそれほど難しいことを必要としないものとなっています。

ちょっと工夫すれば、何かのPR用にも使えますし、今後も、いろいろ改造していきたいです。


執筆者紹介

クジラ飛行机

クジラ飛行机

くじらはんど(http://kujirahand/)にて、日本語プログラミング言語「なでしこ」(IPA未踏ユース採択)、テキスト音楽「サクラ」(OSPオンラインソフト大賞入賞)など多くのオンラインソフトを開発。著書に「Flexプロフェッショナルガイド」「なでしこ公式バイブル」、「一週間でマスターするActionScript3.0」など。

TrackBack URL :