Twitter4Jを使ってt.coを展開したタイムラインを取得した後何かつぶやく。

この記事は2011/04/30にはてなブログに投稿した”Twitter4Jを使ってタイムラインを取得した後何かつぶやく – Radical No.11 #?”の改訂版です。

Twitter4Jを使ってt.coを展開したタイムラインを取得した後何かつぶやきます。
前書いた記事にのっとってEclipseで実行する方法とWindowsのコマンドラインから実行する方法を書きたいと思います。
(たしかフォロワーさん向けに書いたから実行方法まで載せたような記憶があります。)
あと、昔書いたクラスパスの部分に盛大に間違ってるところがあって変な声が出ました。カレントディレクトリ含めるなって言いながらカレントディレクトリ指定しろとか意味わかんねーだろ。これずっと放置してたとかしにたくなってきますね。

準備

あらかじめTwitter4Jの最新バージョンをDLしてどこか適当な場所に解凍しておいてください。
この記事ではTwitter4J ver.3.0.3を使用しています。
クラス名はTwitterSampleとして進めます。

Eclipseでコンパイル・実行する

まずtwitter4j-core-3.0.3.jarをクラスパスに通す必要があります。
Eclipseのパッケージエクスプローラ「クラス名」右クリック->「ビルド・パス」->「ビルド・パス」の構成
をクリックし,
「ライブラリー」タブ->「外部jar追加」->DLしたTwitter4Jのlibフォルダの「twitter4j-core-バージョン.jar」を選択
で,「外部ライブラリー」のところに選択したライブラリーが追加されてることを確認して下さい.

次に認証用のプロパティの設定をします。
パッケージエクスプローラの「src」を右クリック->「新規」->「ファイル」でファイル名を「twitter4j.properties」にして保存
twitter4j.propertiesに

debug=true
oauth.consumerKey=コンシューマーキー
oauth.consumerSecret=コンシューマーキーシークレット
oauth.accessToken=アクセストークン
oauth.accessTokenSecret=アクセストークンシークレット

を記述することでプロパティを設定出来ます。debugはfalseでもよいのですが、trueにしておくとコンソールにログを吐いてくれるので困ったときになにかと便利です。なくてもよい場合はdebugの行を消してください。
twitter4JはAPI v1.1に完全対応していますが、twitter4j.propertiesのrestBaseURLにAPI v1のURLを指定することでAPI v1を使うことができます。

実行用のクラス本体のコードは以下です。コードのコメント見たら何やってるか大体わかると思うので、詳しくはコードを見てください。

import java.io.*;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import twitter4j.*;

public class TwitterSample {
	public static void main(String[] args) throws IOException {
		
		//プロパティに認証情報を記述しておく
		Twitter twitter = TwitterFactory.getSingleton();
		
		System.out.println("*====Home_Timeline===*");
		
		try {//HomeTL取得開始
			Paging page = new Paging(1, 10);//1ページ目の10件分を取得
			List<Status> statuses = twitter.getHomeTimeline(page);
			for (Status status : statuses) {
				
				String tweet = status.getText();//発言内容

				URLEntity[] entities = status.getURLEntities();//entity取得
				for (URLEntity entity : entities) {
					
					String ex_url = entity.getExpandedURL();//展開後のURL
					String tco = entity.getURL();//t.co

					Pattern p = Pattern.compile(tco);
					Matcher m = p.matcher(tweet);
					tweet = m.replaceAll(ex_url);//置換

				}
				User user = status.getUser();//発言したユーザのインスタンス
				System.out.println(user.getScreenName()// ユーザのアカウント名
						+ " [" + user.getName() + "] " + ":"// ユーザのニックネーム
						+ tweet // ツイート
				);
			}

		} catch (TwitterException e) {
			e.printStackTrace();
		}
		
		//発言の投稿
		System.out.print("何か入力してください> ");
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		String post  = reader.readLine();
		try {
			Status status = twitter.updateStatus(post);
		    System.out.println("投稿に成功しました [" + status.getText() + "]");
		} catch (TwitterException e) {
			e.printStackTrace();
		}
		
	}

}

Eclipseを使わずコマンドラインから実行する方法

適当なフォルダを作る.→そのフォルダの中に上記の「twitter4j.properties」と「TwitterSample.java」を突っ込む

$cd さっきつくったフォルダのパス

でカレントディレクトリをさっき作ったフォルダにします。
Windowsならフォルダのアドレスバー右クリックしたり、フォルダをコマンドプロンプトにドロップするとパスが表示されます。

#コンパイルする
$javac -classpath twitter4j-core-バージョン名.jarまでのパス TwitterSample.java
#実行する
$java -classpath twitter4j-core-バージョン名.jarまでのパス;. TwitterSample

実行時は「クラスパスは、複数指定する場合Windowsなら;でUnixなら:で区切って指定する」「-classpathオプションを使うときは.(ドット)を忘れない(=カレントディレクトリを含める)」に気をつければ実行できると思います。
環境変数にCLASSPATHを指定してしまえば-classpathを指定しなくても実行できるようになります。詳しくは以下のページを御覧ください。
Javaの道:基本事項(5.クラスパス)

Twitterで発言中のt.co短縮URLを展開する。

Twitter APIのhome_timelineやmentions_timelineのオプションで”include_entities”を真にすると、tcoで短縮される前のURLを取得することができます。最初から展開してくれればいいんですけどねこれ…。
続きにPerlとPHPとJavaScriptでサンプルコードを用意しました。APIはv1.1を使用しています。
Continue Reading

Twitterのアイコンをブラウザ経由でアップロードするとドット絵がぼやけたり背景が透過されなかったりする問題とその対策。

※この記事は2012/10/10に投稿したはてなブログ “Twitterのアイコンをブラウザ経由でアップロードすると画像がぼやけたり背景が透過されない問題とその対策(追記あり.GIFアニメも出来るよ!) – Radical No.11 #?” の改訂版です。

  • 2013/8/31追記(GIFアニメが動かなくなった件)
  • 2013/9/30追記(画像の縮小がなくなった件)
  • 2014/2/21追記(ドット絵が拡大される件)タイトルが嘘になる。
  • 2015/8/13追記(48*48でアップするとbiggerが48*48になった件)

この記事の内容は2014/2/21現在のものです。ドキュメントは更新されてないくせにAPIの仕様があほみたいに変わってるので今後どうなるか全くわかりません。ListのAPIもわけわかんないし1.1にアップデートしたんだからもうちょっときちんと対応してくれてもいいのになと思います。


Twitterのブラウザ版アイコンアップロードの仕様が変更になり、ドット絵をアップするとアイコンがぼやけたりGIFアニメが動かせなくなりました。解決策としてはAPI経由でアイコンを変更するとアイコンを原寸のままアップロードすることができます。(つまり、API経由でアイコンを変更できるクライアント等を使用すればアイコンのピンぼけを回避出来ます。)
APIの仕様として「GIFアニメは最初の1フレームからアイコンを生成してアニメーションは消去する」(2013/03/20現在)ということになっているので、GIFアニメは今後動かなくなる可能性があります。ちなみにわたしのアカウントで試したら動いたので、このあたりはよくわかりません。
(2013/8/31追記)自分の持ってるアカウント全てでGIFアニメがPNGに変換されて動かなくなりました。もう動かないと言い切ってよいと思います。
(2014/2/21追記)1月から48px*48pxの画像は73px*73pxに拡大されるようになりました。144px*144pxか192px*192pxにすれば多少はマシになりますがドットバイドットでの表示は不可能です。仕様変更したらドキュメント更新してください頼むから。
(2015/8/13追記)48*48pxの画像をアップするとbiggerが48*48になるため、TL上でドットバイドットで表示されるようになりました。

クライアントを探すのが面倒な人のためにツールを作ったのでリンクをはっておきます。
API経由でアイコン画像をアップロードするツール
使用するAPIのバージョンを選択できるようにしています。特に問題がなければ1.1を使ったほうがいいと思います。

続きはAPI経由とブラウザ版経由の比較です。結構詳しく比較してみたつもりです。
Continue Reading