Twitter4Jを使ってTwitterのBotを作ってみた結果


個人的によく聴くInterFMですが、プレイリストをTwitterで流して欲しいなと思ったけれど無かったのでjavaでそんなことをしてくれるbotを作ってみました。作ったのはこれ → https://twitter.com/InterfmNowplay
実行可能なjarをさくらVPSにデプロイしてcronで10秒ごとに動かしています。

結果いろいろと知ったのでメモです。

■Twitter4JによるTwitter操作

Twitter4J - http://twitter4j.org/ja/index.html

JavaでTwitterのAPIを扱う場合、Twitter4Jというライブラリが便利です。
認証関連はTwitterのページで作成できるキー4つ(consumerKey/consumerSecret/accessToken/accessTokenSecret)をpropertiesファイルに定義するだけです。
また、Tweetするためのコードはこれだけ。

tweetする
Twitter twitter = TwitterFactory.getSingleton();
User user = twitter.verifyCredentials();
Status status = twitter.updateStatus(singer + "/\"" + music + "\"" + "\t" + time);

Twitter用のオブジェクトを作って、認証通して、ツイートという流れですね。

■jsoupによるHTMLのパース

jsoup - http://jsoup.org/
プレイリストの元ネタですが、InterFMで特にAPIを用意してくれてるわけでもないので、HPからスクレイピングするしかありません。パースするのに何かいいライブラリないかなと探したところ、jsoupというライブラリが良さ気だったのでとりあえず試してみました。

あるページのHTMLを取得するコードはこれだけです。

HTML取得
Document document = Jsoup.connect("https://www.interfm.co.jp/search/").get();

以下のコードでHTML全体を文字列で取得できます。

文字列取得
document.outerHtml();

要素の取り出しですが、CSSのセレクタも使えますし、

CSSのセレクタ
Elements elements = document.select("table tr");

jsoup特有の取り出し方もあります。

CSSのセレクタ
Element element = elements.last();

結果、例えば以下が同義だったりします。

Element element = document.select("table tr").last();
Element element = document.select("table tr:last-child").get(0);

で、ごにょごにょやって、下記のようなtableから時間と曲名とアーティストを抜き出します。あとはそれをさっきのTwitter4Jを使ってtweet。

スクリーンショット 2015-02-20 18.23.35.png

■Twitterアカウント作成に電話番号認証が必要になっていた

ラジオのNowPlayingを呟くBotなんて当然サブ垢で作りたかったのでとっても困りました。2014年の12月頃から?電話番号認証が必要になった模様です。電話番号を登録し、その番号にSMSで送られてくるキーを入力することで認証が通ります。これまでのように自由にサブ垢が作れなくなったということです。
とりあえず作成に必要だということで、メイン垢の方にはまだ番号登録していなかったので、仕方なく今回作ったサブ垢に番号を登録しました。番号認証はあとで外したいと思いますが、外したらBot動かなくなるのかな・・?

■おまけ

InterFMは洋楽中心(去年くらいから邦楽も流すようになってきたらしい)ですが、フジロックのオフィシャルメディアだけあってか、上質な洋楽()がどんどん流れてきて良いですよ〜。うちではiPhoneのRadikoをBluetoothでスピーカに繋げてずっと流してます。フジロック系の音楽が好きな方なら絶対ハマると思います!