JavaでTwitter Bot制作記


ここでは、つぶやき支援Javaアプリ「illuminBot」制作に使用した技術と知識を整理しています。

序々に多忙となり、Tweetする余裕がなくなりつつあるので作ってみたものです。
とはいえ、IlluminShellは完全なBOTではありません。あくまでも貝殻すらいむkが運用してますので、あしからず。

Java初心者なので参考サイトの技術をベースにしましたが、目的や都合によって、内容は適宜変更してます。
(基本的な技術は全て借り物なので、新しい知識の欲しい方は参考サイトを見てください)

0.使用アプリケーション & 環境
1.仕様
2.環境構築
3.必要知識まとめ
4.感想 (2011年9月2日追記)
5.参考サイト&書籍

0.使用アプリケーション & 環境
・Google App Engine (GAE)
・Twitter4J
・Eclipse
・Twitter Developer
1.仕様(の概要だけ)
・BOT名:IlluminBot
・朝昼晩のごあいさつをする(#Greetingタグ付加)
・自動リプライ(17分単位でチェック)
・普段は英語と日本語で指定された言葉をランダムで呟く(10分単位)。
・パブリックタイムラインのツイートの中にキーワードにマッチするツイートがあったら、励ましの言葉を送る。(23分単位)
・オートフォロー&リムーブを20件のみ実施(24時間単位)
・ホームページお知らせ機能 

なんかえらそうに書いてますが、実は後付けです(爆)。
作りながら仕様を適宜変更するプロトタイピング法を採用したもので(^^;)特にツイート間隔は・・ごにょごにょ
(だってちゃんと考える時間がないんだもん !! >なんだそれ)

ホームページ更新お知らせ機能は頻度が少ないので実装しないことにしました。
頻度が上がったら時間と相談して考えます。

励ましの言葉を贈る機能は、Twitterのガイドラインに反するのでアカウント停止されてしまいました。
なので、現在は廃止しました。今後はおとなしくします。Twitter管理者の皆様本当にごめんなさいm(_ _)m
2.環境構築
参考サイトに詳しく述べられている部分は概要だけ書きます。
All-in-one Eclipseを使えないMac OS Xな上、Unix初心者なので環境を構築するのに苦労しました。
(Windows嫌いなんです。 >エミュレータ入れればいいじゃん!)

そこで、同じ状況の人に少しでも参考になればと思い、多少詳しく書きます。

1) Twitter アカウントを入手した状態でDeveloperに登録
 Twitter アカウントを入手していない人は、まずはアカウント入手から初めてください(メールアドレスが必要です)。
 Twitterアプリケーションを登録してConsumer KeyとConsumer Secretを取得。
 この時、ブラウザアプリとして登録し、コールバックURLをコールバックするサーブレットのURLに設定することが必須です。

2) Google App Engine (Google Code内)の「登録」から、App Engineをダウンロード
 登録には携帯電話が必要です。携帯電話のメールアドレスを入力し、GAEのIDを貰います。
 (登録修了後、自分のアプリ管理画面にアクセスするときは「登録」を押せばアプリ画面に行けます)

3) java -version とコマンドを打って、1.6より前のバージョンだった場合はJava 最新版(Mac OS X用)をダウンロード
 (Java for Mac OS Xで検索->ダウンロード&インストール-> java Preference.Appで最新版にチェックを入れる)

4) Eclipse最新版をダウンロード(http://www.eclipse.org/にアクセスする)
 Eclipse Indigo R Packages -> Eclipse IDE for Java EE Developersを選択します。
(まあ、そんなこと言わずに(^^;) >別に最新版じゃなくてもいいよ・・)

5) Eclipseを開いて、「help」-> 「Install New Applications」
 Work withの窓の横に「add」ボタンがあるので、locationをhttp://dl.google.com/eclipse/plugin/3.7 とする。
  Google APIのEclipse用のプラグインをここで入手します。(警告がでたら「Cancel」でなく「OK」を選択してください)
  Web用のプラグインがダウンロードされていなかった場合は、ここでダウンロードします。

6) プロジェクトの作成&ビルドパスの確認
 一応、パッケージを作成後、パッケージを右クリック->Build Path -> Library を選択し、
 JRE System Libraryが入っていなければ「Libraries」タブの「Add Library」で選択し、
 「Order and Export」で該当jarファイルのチェックボックスを入れてBuild Pathを通す。
3.必要な知識まとめ
・Oarth(オース)認証
 ユーザー、Twitterなどのログインを求めるサービス(Service Provider)、情報アクセスサービス(OAuth Consumer)の三つから構成される、
 API認可のためのオープンプロトコルです。Consumerはバックグラウンドで動作しますが、影の主役だったりします。
 ユーザーがリクエストを送ると、ConsumerはService Providerにアクセスし、Request Tokenを発行させます。
 リダイレクト処理の後、ユーザーがService Provider上でConsumerへのアクセス権委譲を許可し、
 (このときにConsumer KeyとSecretが必要)Request TokenをServise Providerが認可します。ConsumerはService Providerと通信し、
 Request TokenをAccess Token(実際のアクセス権)に交換します。ConsumerはAccess Tokenを利用して、情報にアクセスします。
 このようにして、外部の人間であるConsumerが実際のIDとパスワードを知る事なく、サービスにアクセスすることができるようになります。

・Logger
 Loggerとは、GAEのログ出力についてのクラスです。
 logging.propertiesファイルにpackagename.level = INFOすることで、Loggerクラスのinfoメソッドに書き出した内容を
 GAEのDashBord ->右下の「Current Load」でクリックすることでサーブレットごとのLogを見れるようになります。

・cron.xml
 cron.xmlとは、スケジュールタスクの設定ファイルです。
 タグ内に記述した期間ごとにタグの中のurlで指定されたアプリを起動します。

・Twitter4J
 Twitter4Jは、javaアプリケーションからTwitterにアクセスする為に使用するライブラリです。(おそらくTwitter for javaの略かと。)
 外部ライブラリなのでwar/WEB-INF/lib以下にjarファイルをコピー&ペーストします。
 最後に、プロジェクトを右クリックし、Build Pathにて、jarの追加を行い、貼付けたのと同じjarファイルを追加してください。
 (上記方法でpathを通さないとNoClassFoundErrorが発生してしまいます・・)
 非同期処理を使用しないのであれば貼付けるのはcoreの部分だけでもいいかもしれません。

・ConsumerKeyとConsumerSecret
 Twitter.comではOAuth認証を使ってログインしなければなりません。
 OAuth認証に使うのがConsumerKeyとConsumerSecret、そしてAccess Tokenと Access Secretです。
 ただし、これはあくまでもAPIがログインする資格があることを保証するだけです!
 毎回のログインには、AccessTokenとAccessSecretを取得して権限を得る必要があります。
 (権限をえてしまえば、あとはTwitterログイン画面からUser IDとpass wordを入力するだけ)

・PersistenceManager
 GAEでは基本的に外部ファイルを使用できません。そこで、GAEのデータストアを利用する必要があります。
 PersistenceManagerは、GAEのDatastore Java APIを使用する際に、「データを永続化」するために使用するクラスです。
 データオブジェクトをデータストアに格納するためにPersistenceManagerオブジェクトが必要となりますが、newできないので
 このオブジェクトを生成するにはPersistenceManagerFactoryオブジェクトを介さなければなりません。
 ここでの「永続化」を正しく行えれば、Access TokenをDataStoreに保存できます。
 (なお、GAEのDataStore Viewerで取得したAccessTokenを見る事ができます。)

・BigTable
 Googleで使っているDBの名前です。今はやりのNon-SQLなのですが、SQL文も一部サポートしているらしいです。

・詳細について
 詳しいクラスやメソッドの使い方や意味は参考サイトを参照してください。
4.感想
 Java初心者から始めたので、足掛け半年の大作になってしまいました。(そのわりには機能が貧弱?!そんなことないって!)

構文解析でつぶやくBOTにしようかとも考えたのですが、大方わけのわからないものになってしまうので、
このアカウントではランダムに決められた文字列をつぶやくだけにしました。

とにかくつぶやく文字列データを作るのがひたすら苦しかったです。(バイリンガル仕様なので・・)
それでも動かすと25個じゃぜんぜん足りなくて・・・増やしたけどまだ30程度。力つきました。

テキストが読み込めなかったのであまりGAEのお勉強にならなかったのですが。
TomCatのプラグインは元々入ってるし、common.fileuploadパッケージも入手できたし、パスも通ったのに・・
なぜかGAE側でそんなクラスねーよと言われてしまうんですよねぇ。

あとはリプライがかぶらないようにするのと、何度もリプライしないようにすることに苦労しました。
一時期は同じ人に大量ツイートしてしまったりして大変な事に・・ゴメンナサイm(_ _)m

しかし貝殻すらいむkのポジティブツイートで、なんだか書いてるこっちが癒されたりして・・
(えっへん。 >おいおい自画自賛かよ)

文言決まってるくせに、BOTってちょっとすごいかも、と思いました。
ただ、BOTにいろいろ言われるの嫌っていう人もいるかも。

貝殻すらいむkは基本的に無害な生き物なので、何かお気にさわったら御気兼ねなく@IlluminShellまでリプライくだされば、
対応します。また、こんなツイートをつぶやいてほしいというご要望がありましたら同様にリプライかDMどうぞ!

速報!!\(^0^)/)2011年9月2日追記

あやか☻さん(@ayk4696)から、以下のようなリプライを頂きました。
「こんばんは!フォローさせていただきました!Having strong willingness to get happiness, we can be happy.
の言葉に支えられて生きてます(°̥̥̥̥̥̥̥̥﹏°̥̥̥̥̥̥̥̥ )❤よろしくです」
「プロフィールにHaving strong willingness to get happiness, we can be happy.書いても良いですか?」
(kは文法に自信がないけどどうぞと伝える)
「ありがとうございます❤ あの言葉に何回も救われてます」


うおおおおおお 真面目に感謝されちゃったよ!!感激♫♬♪・・と躍り狂ってしまいました。
(はぁはぁ・・反省します。>興奮し過ぎ)

BOT作って良かったな・・これからもWebプログラミングの腕を磨こう!と固く決意したのでした。
5.参考サイト&書籍
     
陽昇れども地の底に光届かず
Google App Engine(Java 用の cron を使用したスケジュール タスク)
Google App Engineを使って無料でサイトを立ち上げる方法
Twitter4J 公式サイト
ゼロから学ぶOAuth(第一回)
APIアクセス権を委譲するプロトコル、 OAuthを知る



このコーナー内の全ての画像及び文章の無断転載を禁止します。