Twitterを100倍楽しむためのbot開発基礎講座
第5回 mentions(@)の扱い
TwitterのAPIでBASIC認証が廃止されました
2010年8月31日にTwitter APIでBASIC認証が廃止されました。実際にBASIC認証が使えなくなったのは日本時間の2010年9月2日10:30ごろだったようです。
以前作ったbotが停止したままだったりしないでしょうか?今一度確認してみましょう。
OAuthは仕組みとしては複雑ですが,使用するだけであればどの言語にもOAuth用ライブラリが用意されており,簡単に扱えますのでさっくり移行してしまいましょう。
たとえばPHPでのOAuthの使い方については第3回 実際にTwitter botを作ってみるを参照してください。
今回はmentionsを扱います
今回はmentionsで会話をするbotの例を紹介します。mentionsというのはAPI上で使われるメソッド名です。直訳すると『言及』などの意味になります。Twitterの場合は@ユーザ名が含まれる発言,リプライを意味します。
弊社で開発したrecipetterもこのタイプになります。
mentionsを扱う上でのポイント
mentionsを使うことで対話のような形をとることができるようになりますので次のポイントを押さえる必要があります。
- 先頭だけでなく文中現れた@bot名もmentionsに現れます
- botの発言を引用された場合や非公式RTされた発言もmentionsに現れます
- どこまでmentionsに対して反応をしたかに注意しましょう
- 反応した順番を保持する必要があります
mentionsのすべてに返答してはいけません
bot宛に話しかけられたら,漏れなくすべての発言に返答したくなるのが心情ですが,mentionsの扱う場合は細心の注意が必要です。
ここで,話しかけられた内容とまったく同じ内容を返答するbot,hi_echoで考えてみます。
たとえば,matsuuがhi_echoに「こんにちは」と話しかけた場合,
@hi_echo こんにちは
hi_echoがそっくりそのまま返すとします。
@matsuu こんにちは
これだけなら問題はないのですが,つぶやきの中に@hi_echoという文字があった場合,
@hi_echo こんにちは, @hi_echo さん
これに対してそのまま次のように返してしまうと,
@matsuu こんにちは, @hi_echo さん
このつぶやきがまたmentionsにはいってしまうので,
@hi_echo こんにちは,@hi_echo さん
@matsuu こんにちは,@hi_echo さん
@matsuu こんにちは,@hi_echo さん
…
と無限ループに陥ってしまうかもしれません。
対策する方法はいくつかあります。
bot自身の発言はすべて無視する
bot自身の発言はすべて無視するようにしておきましょう。そうでなければ上のようなパターンに陥ってしまいます。
@bot名からはじまるつぶやき以外は無視する
引用やRTをする場合,その性質上,つぶやきの頭に@(bot名)がくるというのはないと考えていいと思います。これを逆手にとって,先頭に@bot名が来る場合以外は無視をする,という実装です。ただ,botにあまり慣れてない方を考慮して,botの説明などに「botにつぶやくときは先頭に@bot名と入れないと反応しません」のような説明があるといいでしょう。
bot同士の無限キャッチボールに注意
mentionsを必ず返すbot同士が何かのきっかけでmentionsを投げると,bot間でずっと会話しつづけてしまう場合があるので注意が必要です。
対策としては次のような方法があります。
同じ発言を何度もくり返してくるのはbotと判断して以後返答しない
何度も同じ言葉を返してくるbotの場合,このような方法があると思います。ただ,たくさんの会話パターンを用意されているbotは対応できなかったり,botではない人を誤判定する可能性があります。
必ずmentionsを返すのではなく,たまに返事をしないようにbotを作る
たとえば20回に1回は返事をしないように実装することで,時間はかかるかもしれないがいつかは収束する(最悪の状況は回避できる)方法です。ただ,たまたま返事をしないタイミングにあたったユーザに「このbot使えない」と言われてしまい,悲しくなるかもしれません。
ブラックリストを作る
返事を返さないブラックリストユーザを作成しておき,そのユーザからの問い合わせはすべて無視するように対応をする方法です。プログラムでブラックリストを作る以外にTwitterのblock機能を使う手もあります。
弊社開発のrecipetterはプログラム内でbotのブラックリストを作って対処しています。
ということで
実際につくり始めると,あ,こんな問題も出るのか,と気づくことがあると思います。ぜひ手を動かして作ってみてください。
次回はmentionsを使った簡単なサンプルプログラムを紹介する予定です。


