感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

Twitter4jのアクセストークンをDIする

スポンサーリンク

Twitter4jでツイートするときなど、アクセストークンやコンシューマーキーをコードに書きたくはない。
外出しするための方法として、1つはデータベースから読み込むようにすること。
もう1つは定義ファイルに書き出すこと。

今回はSpringフレームワークを使い、Spring DIを使うことで、定義情報を外出しした。

定義ファイルは以下のように書く。
twitter_bean.xml

<?xml version="1.0" encoding="Shift_JIS" ?>

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
	
	<bean id="testTwitter" class="twitter.OauthImpl">
		<property name="consumerKey">
			<value>XXXXXXXXX</value>
		</property>
		<property name="consumerSecret">
			<value>XXXXXXXXX</value>
		</property>
		<property name="accessToken">
			<value>XXXXXXXXX</value>
		</property>
		<property name="accessTokenSecret">
			<value>XXXXXXXXX</value>
		</property>
	</bean>
	<bean id="client" class="twitter.tweet.TweetClient">
	</bean>

</beans>

この定義ファイルのid=testTwitterの中にあるプロパティをOauthImplにセッターインジェクションする。
OauthImpl.java

package twitter.auth;

import twitter4j.Twitter;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;

public class OauthImpl {
	private String consumerKey;
	private String consumerSecret;
	private String accessToken;
	private String accessTokenSecret;
	
	public String getConsumerKey() {
		return consumerKey;
	}

	public void setConsumerKey(String consumerKey) {
		this.consumerKey = consumerKey;
	}

	public String getConsumerSecret() {
		return consumerSecret;
	}

	public void setConsumerSecret(String consumerSecret) {
		this.consumerSecret = consumerSecret;
	}

	public String getAccessToken() {
		return accessToken;
	}

	public void setAccessToken(String accessToken) {
		this.accessToken = accessToken;
	}

	public String getAccessTokenSecret() {
		return accessTokenSecret;
	}

	public void setAccessTokenSecret(String accessTokenSecret) {
		this.accessTokenSecret = accessTokenSecret;
	}

	public Twitter getAuthenticatedTwitter() {
		Twitter twitter = new TwitterFactory().getInstance();
		twitter.setOAuthConsumer(consumerKey, consumerSecret);
		twitter.setOAuthAccessToken(new AccessToken(accessToken, accessTokenSecret));
		return twitter;
	}
}

そうすることで、OAuthのために必要な認証クラスと、認証情報を疎結合にすることができる。

そして、認証クラスからTwitterオブジェクトを返すようにすれば、使う側も認証を意識する必要がなくなる。
つまり、認証と実行と認証情報を疎結合にすることができる。

こちらがTwitter4jを使ってツイートするクラス。

package twitter.tweet;

import twitter4j.Twitter;
import twitter4j.TwitterException;

public class TweetClient {
	public void tweet(Twitter twitter, String tweet) {
		try {
			twitter.updateStatus(tweet);
		} catch (TwitterException e) {
			e.printStackTrace();
		}
	}
}

これらのクラスを使って、認証されたTwitterでツイートしてみる。

読み込む定義ファイルや、使うユーザーは引数で渡すことで、どのユーザーを使うかも外から指定することができる。

package main;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.FileSystemResource;

import twitter.auth.OauthImpl;
import twitter.tweet.TweetClient;
import twitter4j.Twitter;

public class TweetTest {
	private static String beansXml;
	private static String twitterName;
	
	public static void main(String[] args) {
		if (args.length < 2) {
			System.err.println("Usage: [arg1]xml [arg2]Twitter Name");
			System.exit(-1);
		}
		beansXml = args[0];
		twitterName = args[1];
		
		XmlBeanFactory factory = new XmlBeanFactory(new FileSystemResource(beansXml));
		//認証クラスを取得する
		OauthImpl authenticator = (OauthImpl)factory.getBean(twitterName);
		//ツイッタークライアントを取得する
		TweetClient client = (TweetClient)factory.getBean("client");
		
		Twitter twitter = authenticator.getAuthenticatedTwitter();
		client.tweet(twitter, "みなさん、こんばんわ〜!元気にしてますか??");
	}
}

引数は「twitter_beans.xml testTwitter」
とする。

これを実行すると、認証を指定したユーザーでツイートされることになる。<参考>

Twitter API プログラミング

Twitter API プログラミング

SpringによるWebアプリケーションスーパーサンプル 第2版

SpringによるWebアプリケーションスーパーサンプル 第2版