twitterクライアント 〜TL取得編〜

苦手なJavaを勉強するついでに、twitterクライアントっぽいものを作ってみることに。

ちなみに開発環境は最近までやってた仮想マシン上にこちらeclipseを使用。すでに日本語化されてるし、他にも色々ある様子。便利便利

次にTwitter4JSWTをそれぞれダウンロードして、プロジェクトにJARの追加を行う。

一応今日試しに作ったのが↓のようなもの

以下ソース

package twitter.get;

import java.text.SimpleDateFormat;
import java.util.List;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;

public class TwitterGet {
	public static void main(String args) throws TwitterException {
		String twitterID = "togano";
		String twitterPassword = "教えてあげないよ!";
		int getPages = 2;          //取得ページ数(1〜10)
		
		Twitter twitter = new Twitter(twitterID, twitterPassword);
		List statuses = twitter.getFriendsTimelineByPage(1);
		for(int i=1; i statuses2 = twitter.getFriendsTimelineByPage(i+1);
			statuses.addAll(statuses2);
		}
		
		Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("TwitterGet");
		
		shell.setLayout(new FillLayout());
		Table table = new Table(shell, SWT.MULTI | SWT.FULL_SELECTION
				| SWT.BORDER);// ヘッダを可視にする
		table.setHeaderVisible(true);

		TableColumn nameCol = new TableColumn(table, SWT.LEFT);
		nameCol.setText("名前");
		nameCol.setWidth(60);
		TableColumn postCol = new TableColumn(table, SWT.LEFT);
		postCol.setText("投稿");
		postCol.setWidth(300);
		TableColumn dateCal = new TableColumn(table, SWT.LEFT);
		dateCal.setText("日時");
		dateCal.setWidth(130);
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy'/'MM'/'dd' 'HH':'mm':'ss");
	    
	    for(Status status : statuses){
	      TableItem item = new TableItem(table,SWT.NULL);
	      String data = {status.getUser().getName(),status.getText(),
	                       String.valueOf(sdf1.format(status.getCreatedAt()))};
	      item.setText(data);
	    }
	    
	    shell.setSize(520, 500);
	    shell.open();		
	    while (!shell.isDisposed()) {
		if (!display.readAndDispatch())
			display.sleep();
		}
	    display.dispose();
	}
}

でも、絶対おかしいところがある。

		List statuses = twitter.getFriendsTimelineByPage(1);
		for(int i=1; i statuses2 = twitter.getFriendsTimelineByPage(i+1);
			statuses.addAll(statuses2);
		}

20個以上のタイムラインを取得する方法が分からないから、無理やりListを連結させてたり。
もっとスマートなやり方があるはず・・・誰か教えてください・・・

それ以上に、API制限回避して取得する方法を是非・・・
作ってる最中でいきなりエラー大量発生したから何事かと思ったら、ただのAPI制限だったっていうorz
非同期APIのサンプルで解決するのかと思って試したけどコンパイル通らないし
Javadoc読めば解決するのかなぁ でも英語がなぁ・・・
というか、こういう時にtry/catchを使うんだろうか?分かってないからこの辺の勉強も必要だ

とりあえず明日も会社で研修なので今日はここまで


最低限必要なTL取得周りの課題(暫定)
●API制限の回避手段
・TL自動更新
・未読/既読の目印
・Reply/Directの目印
・ソースを綺麗に!


本日の教訓:「英語は大切」



ちなみにオセロを作ろうとしたんだけど、マウスイベント辺りで詰まったから諦めたのは内緒><