KIMUSON BLOG

きむそんの雑記ブログ

JavaでTwitterBotを作ってみた!Twitter4J とcron4jを使えば超簡単!

この記事をシェアする

作ったもの

www.kimuson.com

以前記事にも書きました。TwitterBotの「バナ夫」です。

前提

本プロジェクトはheroku環境へのリリースを前提に作られています。
そのため、フォルダ構成はherokuのサンプルプロジェクトを修正して作成しています。

ソース

GitHubでソースを公開しました!
github.com

開発環境

開発環境:OS X
統合開発環境Eclipse(Oxygen Release (4.7.0))
Javaライブラリ:Twitter4J 、cron4j

機能

以前も書いた気がしますが念のため。

自動ツイート

お気に入りのRSSをつぶやきます。

自動フォロー

自動でフォローします。
やみくもにフォローするわけでなくロジックにしたがって1日30人ほどにフォローします。
ITに興味を持っているユーザーのみフォローします。

自動リツイート

リツイートも同じ仕様ですね。IT関連のつぶやきをリツイートします。
こちらは1時間に2回上記の処理を行うようにしています。

自動コメント返し(今は廃止中)

自動でコメント返します。このコメント返しは二種類実装しました。設定した文字列をランダムにコメントとして返します。
AIがコメントを受け取り、理解し、コメントを返します。(ちなみにAIはリクルートさんの「A3RT」を使わせていただきました。)

ソースの構成

mainクラス

mainクラスには主にcron設定を記載している。
Twitterの規約に引っかからないように気をつけながら各タスクを設定していく。

public static void main(String[] args) throws Exception {
    SpringApplication.run(Main.class, args);
	Main app = new Main();
	try {
		app.schedulerSimple();
		Thread.sleep(100000000);
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
  }
public void schedulerSimple() {
	Scheduler scheduler = new Scheduler();
	scheduler.schedule("30 * * * *", new TweetTask());
	scheduler.schedule("40 * * * *", new AutoRetweetTask());
	scheduler.schedule("50 * * * *", new AutoRetweetTask());
	scheduler.schedule("00 12 * * *", new AutoFollowTask());
	scheduler.schedule("00 19 * * *", new AutoFollowTask());
	scheduler.schedule("00 01 * * *", new AutoAnFollowTask());
	scheduler.schedule("00 02 * * *", new AutoAnFollowTask());
	scheduler.schedule("00 03 * * *", new AutoAnFollowTask());
	//scheduler.schedule("1 12 * * *", new AIReplyTask());
	scheduler.start();
	}

ちなみにコメントアウトしているのはAIタスク。

TweetTaskクラス

ArrayListRSSフィードのURLを格納した。

doTweet(rssPathList.get(i));

このメソッドの中でTwitter4jの肝となる処理を行っている。

Element element = (Element) item_list.item(index);
NodeList item_title = element.getElementsByTagName("title");
NodeList item_link = element.getElementsByTagName("link");

取得したRSS情報のタイトルとリンク情報を格納する。
この情報を以下の方法でTwitterにアップすることができる。

twitter.updateStatus(item_title.item(0).getFirstChild().getNodeValue() + "(" + q2 + ")" + "\n"+ item_link.item(0).getFirstChild().getNodeValue());

ちなみにq2の中身は現在日時の情報が格納されている。

これをやっている理由としては、Twitterの規約上同じ内容のツイートが一定時間できなくなる。
そのため、現在日時情報を結合させることで同一の内容としてTwitter側に認識されなくなるために実装している。

AutoRetweetTaskクラス

特定のキーワードをTwitter上で検索し、該当するつぶやきをリツイートする。

検索は以下のコードで実行

// 初期化
Twitter twitter = new TwitterFactory().getInstance();
Query query = new Query();

// 検索ワードをセット
query.setQuery("プログラミング");
// 1度のリクエストで取得するTweetの数
query.setCount(1);

// 検索実行
QueryResult result = null;
try {
	result = twitter.search(query);
} catch (TwitterException e) {
	e.printStackTrace();
}

リツイート自体は以下で実行

twitter.retweetStatus(tweet.getId());

AutoFollowTask クラス

ほぼAutoRetweetTaskクラスと同じ
以下でフォローを実行

twitter.createFriendship(tweet.getUser().getId());

AutoAnFollowTask クラス

自分がフォローしているユーザーが、フォロー返ししてくれたかを確認し、フォローがなければフォローを外す。

// フォロ-リストをループし、1件ごとにリフォローされているか確認し、されていなければフレンド解除する。
int c = 0;
for (Long userId : friendsList) {
	if (c < 30) {
		if (!followersList.contains(userId)) {
			try {
				twitter.destroyFriendship(userId);
				c++;
			} catch (TwitterException e) {
				e.printStackTrace();
			}
		}
	}
}

まとめ

今回Twitter4J とcron4jと活用して比較的簡単に実装できた。
正直これを作るのにそんなに時間はかからなかった。
とはいえこれを作った後、herokuへのリリースでかなり詰まったので、
次回はそのことについて書いていきたい。