誰でも簡単にできる Twitter ボット作成入門
最近、話題のマイクロブログ Twitter で自動的に発言するプログラム(通称:ボット)を作る方法を紹介します。日本語のプログラミング言語「なでしこ」を使って作るので、専門知識は少しで大丈夫です。面白い(あるいは役に立つ)ボットを作って楽しみましょう。
なんだ!あいつもボットだったのか!
一般的に「ボット(BOT)」というのは「ロボット」の略称で、ネットワークゲームやIRC・チャットなどで、自動実行されるプログラムのことを指します。ネットワークゲームでは、自動でレベルを上げるために使われるため敬遠されることもあるようです。
しかし、IRCやチャットなどを対象としたボットは、人間に変わって退会処理やヘルプ表示の操作を行うなど、役に立つ場合も多いものです。また、簡単な人口知能(人口無能と呼ばれる)を搭載して、誰かの発言に呼応して面白い発言をするボットもあります。
そして、Twitter に置かれた状況を見てみると、非常に多くのボットが存在していることが分かります。有益な情報を定期的に発言するボットや、ブログの新着情報を語るボット、天気予報を発言したり、話しかけられると挨拶を返すボットなどさまざまです。
巧妙に作られたボットは、既に人間なのかボットなのか判断が付かない状況になっています。
Twitter にボットが多いのは公式にAPIが用意され、非常にボットが作りやすい状況であることも理由の一つでしょう。「Twitter ボット 作り方」で検索すると既にいくつかの記事が見つかります。
ここから見ても、PHP/Ruby/Perlと主要な言語にて、多くのボットが作られていることが分かります。プログラミングができれば、そこそこ簡単にボットは作れるのです。
この原稿を書くためにちょっと調査しただけでも、Twitter のユーザーの中には、ボットであることに、ぜんぜん気づかず、ある日それに気づいて「騙された!」という記事を見つけました。短い文章、ほんの一行でやりとりするコミュニケーションですから、それほど深い話をしなければ、ボットか人間か気づかない場合も多いでしょう。
そして、2009年2月には、チームラボがアルゴリズムコンテストとして「ボット」の出来を競うコンテストを開催しています。
このように、ボット作りは非常に奨励?されており、とても楽しいボットの登場が人間の未来を変える可能性も秘めているのです。
「どうしてプログラマーになったんですか?」という質問に対し、幾人かはこう答えるでしょう。
「ドラえもんや、アトムに代表される人間のように話す人工知能を持ったロボットを作ってみたかった」と。そうです。人は、コンピューターの中に自分で知能を持った人間を作って見たいと思うものなのです。
壮大な計画を言えば、このようになります。今回作るボットは人工知能を持ってはいませんが、人に癒しを与える可能性を秘めています。
Twitter ボットを作ろう!~どんなボットを作るのか?
それでは、Twitter ボットを作ってみたいと思います。ここでは、誰でも簡単プログラマーを目指して作っている『日本語プログラミング言語「なでしこ」』を使ってボットを作ります。
既に、なでしこで作られた Twitter クライアントがあり、これを改良して作るのが近道です。以下の解説も参考にすることができるでしょう。
ここで作るのは、話しかけられると、「そんなこと言ってくれる**さんが一番好きです!」とか「**さん、あなたが一番素敵な人です。」とお世辞を返信するボット「chuntarou」(通称:ちゅんちゅん)です。
参考にする資料
ボットを作るに当たって、必要になるのは、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用にも使えますし、今後も、いろいろ改造していきたいです。
TrackBack URL :



[…] 八角研究所 : 誰でも簡単にできる Twitter ボット作成入門 八角研究所 : 誰でも簡単にできる Twitter ボット作成入門 […]
Posted by 八角研究所 : 誰でも簡単にできる Twitter ボット作成入門 « とっても! ちゅどん(雑記帳) | 2009年07月31日 15:13
[…] 八角研究所 : 誰でも簡単にできる Twitter ボット作成入門 最近、話題のマイクロブログ Twitter で自動的に発言するプログラム(通称 :ボット)を作る方法を紹介します。日本語のプログラミング言語「なでしこ」 を使って作るので、専門知識は少しで大丈夫です。面白い(あるいは役に立つ) ボットを作って楽しみましょう。なんだ!あいつもボットだったのか!一般的に 「ボット(BOT)」と… original article […]
Posted by 八角研究所 : 誰でも簡単にできる Twitter ボット作成入門 | 次なるもの | 2009年08月01日 01:10
[…] 八角研究所 : 誰でも簡単にできる Twitter ボット作成入門 (tags: twitter) […]
Posted by links for 2009-07-31 « 個人的な雑記 | 2009年08月01日 07:01
Why We Twitter? what are we microblogging for…
How fun can that be?
※概して、技術的に面白いことは書いてありません。
Why We Twitter: Understanding Microblogging Usage and Communities
Akshay Java , Tim Finin
University of Maryland
Xiaodan Song , Belle Tseng
NEC…
Posted by 研究開発 | 2009年08月01日 12:24
はじめまして、クジラ飛行机様
ボットの記事大変参考になります。早々試してみましたが
以下のエラーが出てしまいます。
[m2のクリック時を実行中のエラー]
[エラー] Twitterbot1.nako(83): 関数『HTTPゲット』の実行中にエラーが起きました。タイムアウトしました。(関数)
[エラー] Twitterbot1.nako(83): (代入)
[エラー] 評価式(0): (文)
[エラー] Twitterbot1.nako(34): 関数『TSV取得』の実行中にエラーが起きました。CSVの記述に誤りがあります。(関数)
[エラー] Twitterbot1.nako(27): (関数定義)
[エラー] Twitterbot1.nako(103): 関数『発言考察処理』の実行中にエラーが起きました。(関数)
[エラー] Twitterbot1.nako(72): (関数定義)
[エラー] 評価式(1): 関数『画面更新処理』の実行中にエラーが起きました。(関数)
なでしこにそのままコピーアンドペーストしてますので間違いないと思いますがいかがでしょうか。
また質問があればメールを差し上げます。
小林
Posted by 小林 久之 | 2009年12月09日 06:09
こちらで試してみましたがうまく動きますね。
TwitterのIDとパスワードを指定する必要がありますが、正しく指定されていますでしょうか?ご確認ください。
Posted by クジラ飛行机 | 2009年12月09日 09:30
回答ありがとうございます。Twitter_ID とパスワードは間違いなく指定しました。Twiiter_IDは何箇所かありますが間違いなく指定しました。エラーの意味は単にIDとパスワードミスなのでしょうか。そのままコピーしてはりつけてありますので誤りはないと思います。なでしこのエディタにはりつけ実行をクリックしました。3回目ぐらいまではいいのですが、やはりエラーが表示されます。
Posted by koba | 2009年12月09日 20:02
Anyway MUDUKASHII !!!
Posted by Hiroshi Morikawa | 2009年12月16日 00:19
できたよボット…
Twitter公式ナビゲーター「Twinavi」の担当者さんから嬉しいメールが…。Web500の制作したボットが「Twitterお役立ちアカウント」(おもしろ系)に登録されたとの・・・…
Posted by Blog Web500 | 2010年02月12日 11:50
[…] ハワイ人じゃないから。私が、あの絵で思い…はてなブックマークより八角研究所 : 誰でも簡単にできる Twitter ボット作成入門てはいませんが、人に癒しを与える可能性を秘めています。 twitter […]
Posted by 癒し 卓について語ってみました | 安らぎのインテリア空間 | 2010年09月17日 16:25
[…] 妊婦が行ける温泉…妊婦が行ける温泉 いつもこちらでお世話になっています。 現在妊娠7ヶ月で、主人と二人きりの最後の旅行になると思い来週あたりに二泊しようと計画中です。 ですが、なかなかいい温泉が……教えてGooよりあたたかい感動のある本…あたたかい感動のある本 読んだ後あたたかい感動がある本探しています。 陰日なたに咲く、4teen、dive,リズム、西の魔女が死んだみたいなかんじでしょうか。4teen,diveは歳が近いからかな? い……教えてGooより良いヒーリング・ミュージックを教えてください…いヒーリング・ミュージックを教えてください 日々の疲れを取る為に、癒し系の音楽を聴きたいと思っています。今はエンヤをもっぱら聴いていますが、他に何かお勧めの癒し系……教えてGooより八角研究所 : 誰でも簡単にできる Twitter ボット作成入門てはいませんが、人に癒しを与える可能性を秘めています。 twitter ボットを作ろう!~どんなボットを作るのか? それでは、twitter ボットを作ってみたいと思います。ここでは、誰でも簡単プログラマーを目指して作っている『日本語プログラミング言語「なでし…はてなブックマークより一人暮らしの癒しグッズは?…一人暮らしの癒しグッズは? 一人暮らしをしていて、1人で暗い部屋に戻るとさびしいですね。 寂しさを紛らわせるために、こんなグッズが欲しいとか、 あなたの意見を聞かせてもらえ……教えてGooより 癒し 扉についてでした美味しいご飯が食べたい!美味しい水が飲みたい!どちらも水で決まる!美味しい天然水 宅配サービス癒し 扉 […]
Posted by 癒し 扉について真剣に考えるブログ | 安らぎのインテリア空間 | 2010年09月18日 11:39