MB blog

こちらは主に自分用のメモです。

ATNDで, 気になるイベントをメールで通知させる


スポンサードリンク

今年は社外の勉強会に定期的に行く、と上司と1年前に約束したことをふと思い出し、最近になって勉強会に出向くようになりました。イベント探しによく利用するのはご存知ATNDです。
しかし、たまに思い出したときに気になるキーワードで検索をかけてみると、いい感じのイベントがすでに定員オーバーになっている、ということも少なくありません。
そこで、あらかじめ登録したキーワードにマッチするイベントを、メールで通知してくれるアプリを書いてみました。
ATNDのJava APIはここから落とせました。 => http://atnd4j.sourceforge.jp/
commonsのSimpleEmailを使って、Gmailsmtpサーバーから送ってます。

汚いけど許してね...

package jp.boc.com;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
import org.hkzo.atnd4j.Atnd;
import org.hkzo.atnd4j.Event;
import org.hkzo.atnd4j.EventsResult;

public class EventNotifier {

	public static void main( String args[] ){

		EventNotifier ntfr = new EventNotifier();

		List<String> list = new ArrayList<String>();
		list.add( "kvs" );
		list.add( "nosql" );
		list.add( "デザインパターン" );

		String query = ntfr.createQuery( list );
		ntfr.sendMail( query );

	}

	private String createQuery( List<String> keywords ){

		StringBuffer sb = new StringBuffer();
		sb.append("keyword_or=");
		for ( String s : keywords ) {
			sb.append(s + "," );
		}
		return sb.toString();
	}

	private void sendMail ( String query ) {
		org.apache.commons.mail.SimpleEmail se = new SimpleEmail();
        try {
             se.setCharset( "utf-8" );
             se.setHostName( "smtp.gmail.com" );
             se.setSmtpPort( 587 );
             se.setTLS( true );
             se.setAuthentication( "username", "password" );
             se.addTo( "送り先アドレス" );
             se.setFrom( "gmailアドレス" );
             se.setSubject( "気になるATNDイベント" );

             StringBuilder msgBldr = new StringBuilder();
             for( Event event : getEvent( query ) ) {
            	 msgBldr.append( "★ " + event.getTitle() + " " + event.getStartedAt() + " @ " + event.getAddress() + "\n"  + "	" + event.getCatch() + "\n\n");
             }
             se.setMsg(msgBldr.toString());
             se.send();

        } catch ( EmailException eme ) {
        	eme.printStackTrace();
        }
	}

	private List<Event> getEvent( String query ) {

		  Atnd atnd = new Atnd();
		  EventsResult res = null;

		  try {
			  res = atnd.getEvents( query );
		  } catch ( IOException ioe ) {
			  ioe.printStackTrace();
		  }

		  List<Event> list = res.getEvents();
		  return list;

		 }
}

とこんな感じのものを、クーロンから3日に1回くらい叩きたいわけです。
問題は置いておくサーバがないということと、たった今、"ATND Notifier"という素晴らしいChrome Extensionを見つけてしまったため、このアプリの存在価値がなくなってしまったことでしょうか。。