勉強会まとめレポートに関するTwitterBotを作ってみた

ふと思い立ち、ここまでの勉強会参加記録を振り返りつつそれらに関するTwitterBotを作ってみよう、となった。

内容は関連する参加レポートのURLをつぶやくというシンプルなもの。記録内容は過去まとめエントリからテキストをこしらえました。

開発環境構築

EclipseでGAE周りを行う際の環境諸々を準備。

Javaのバージョンについては、GAEの方でjdk7を対応していないっぽい(GAEにデプロイして動かすと以下の様なエラーが出る)ので、プロジェクトのコンパイラ準拠レベル等は1.6に設定しとく必要があります。

Uncaught exception from servlet
java.lang.UnsupportedClassVersionError: jp/shinyaa31/gae/xxxXxxxXxxx/XxxxXxxxXxxxServlet : Unsupported major.minor version 51.0
	at com.google.appengine.runtime.Request.process-860b1c21380ee58f(Request.java)
	at java.lang.ClassLoader.defineClass1(Native Method)
	at java.lang.ClassLoader.defineClass(ClassLoader.java:634)


Twitterアプリケーション申請登録

Twitterアカウントを利用してKeyやSecret情報等一式を取得しておく。必要な情報は以下の4項目。

  • consumerKey
  • consumerSecret
  • accessToken
  • accessTokenSecret

プログラム作成

基本、上記エントリ内容そのままのコード記述。つぶやき生成する箇所をよしなに編集。

package jp.shinyaa31.gae.xxxxXxxxXxxx;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.conf.ConfigurationBuilder;

@SuppressWarnings("serial")
public class XxxxXxxxXxxxServlet extends HttpServlet {

	static Logger logger = Logger.getLogger("participatedEventListBot");

	static String consumerKey = "XXXXXXXXXXXXXXXXXXXXXX";
	static String consumerSecret = "XXXXXXXXXXXXXXXXXXXXXX";

	static String accessToken = "XXXXXXXXXXXXXXXXXXXXXX";
	static String accessTokenSecret = "XXXXXXXXXXXXXXXXXXXXXX";

	private String getTweet() {
		String prefixMessage = "こんな勉強会に参加してました:";

		String[] tweetsMessageArray = {
				"(001) 2010/10/21(木) Flex 4 Spark フレームワーク勉強会(Flex勉強会第124回@東京)に参加してきた http://d.hatena.ne.jp/absj31/20101021/1287673551",
				"(002) 2010/12/16(木) Flex フレームワーク 勉強会(Flex勉強会第127回@東京)に参加してきた http://d.hatena.ne.jp/absj31/20101216/1292518939",
				"(003) 2010/12/20(月) JavaFX & GlassFish 合同勉強会 に参加してきた http://d.hatena.ne.jp/absj31/20101221/1292946278",
				"(004) 2011/01/11(火) 『Wicket勉強会 2011-01』に参加してきた http://d.hatena.ne.jp/absj31/20110111/1294770939",
				"(005) 2011/02/02(水) 第1回 AIR for Android 勉強会に参加してきた http://d.hatena.ne.jp/absj31/20110202/1296669584",
				// (...中略...) 
				"(128) 2012/09/12(水) DevLOVE『学び方を学ぶ 〜オブジェクト指向の設計と実装を学ぶ〜』に参加してきた #devlove http://d.hatena.ne.jp/absj31/20120912/1347469542",
				"(129) 2012/09/15(土) XP祭り2012〜ソーシャルチェンジ!〜に参加してきた(前編) #xpjug #whywg http://d.hatena.ne.jp/absj31/20120915/1347869336",
				"(129) 2012/09/15(土) XP祭り2012〜ソーシャルチェンジ!〜に参加してきた(後編) #xpjug #whywg http://d.hatena.ne.jp/absj31/20120916/1347922048",
				"(130) 2012/09/18(火) Yokohama.groovy #4 を開催してきた #yokohamagroovy http://d.hatena.ne.jp/absj31/20120918/1348888991",

				"(131) 2012/09/29(土) ウェブサイト高速化勉強会に参加してきた #tnmk0929 http://d.hatena.ne.jp/absj31/20120929/1348929687",
				"(132) 2012/10/02(土) Yokohama.groovy #5 を開催してきた #yokohamagroovy http://d.hatena.ne.jp/absj31/20121002/1349193477"
		};
		int randInt = (int)(Math.random() * tweetsMessageArray.length);
		return prefixMessage + tweetsMessageArray[randInt];
	}

	public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		// http://twitter4j.org/ja/configuration.html
		ConfigurationBuilder cb = new ConfigurationBuilder();
		cb.setDebugEnabled(true)
			.setOAuthAccessToken(accessToken)
			.setOAuthAccessTokenSecret(accessTokenSecret)
			.setOAuthConsumerKey(consumerKey)
			.setOAuthConsumerSecret(consumerSecret);
		String twitMessage = getTweet();
		Twitter twitter = new TwitterFactory(cb.build()).getInstance();
		try {
			// Twitterに書き出し
			twitter.updateStatus(twitMessage);
		} catch (Exception e) {
			logger.log(Level.SEVERE, "Twitter Error", e);
		}
	}

}

この時点でWebアプリケーションとして起動し、URLにアクセスすることで上記サーブレットにアクセスし、ツイートが発行される事を確認しておく。


動作を確認したらcronに組み込む設定を(やはり上記サイトを参考にしつつ)設定。

  • cron.xml(新規作成:urlや実行サイクル等を設定)
  • web.xml(追記:上記cronに関する連携設定を追記)
  • appengine-web.xml(applicationを設定)


尚、このまま続けてデプロイさせるとエラーとなる。事前にGoogle App Engineの方でアプリケーションIDを取得しておき、同じIDをappengine-web.xmlのapplicationに付与しないといけないようです。


アプリケーションのアップロード・デプロイ

上記設定作業の後、デプロイ作業を実施。

------------ Deploying frontend ------------

Preparing to deploy:
	Created staging directory at: '/var/folders/p5/p0yjc08x2rv3qnwc6js8nbj80000gn/T/appcfg8445858641068938943.tmp'
	Scanning for jsp files.
	Scanning files on local disk.
	Initiating update.
	Cloning 2 static files.
	Cloning 29 application files.

Deploying:
	Uploading 8 files.
	Uploaded 2 files.
	Uploaded 4 files.
	Uploaded 6 files.
	Uploaded 8 files.
	Initializing precompilation...
	Sending batch containing 7 file(s) totaling 33KB.
	Sending batch containing 1 blob(s) totaling 1KB.
	Deploying new version.

Verifying availability:
	Will check again in 1 seconds.
	Will check again in 2 seconds.
	Closing update: new version is ready to start serving.

Updating datastore:
	Uploading index definitions.
	Uploading cron jobs.

Deployment completed successfully

デプロイ完了後は管理コンソールにアクセスし、cronやその他諸設定や正常稼働を確認。




という訳で、これから参加勉強会のリストは適宜更新&適度なタイミングで過去参加イベントのつぶやきを吐き出して行きますので、何卒!