シリーズの最初のパートでは、上位の質問を取得するために StackExchange RESTAPIを使用する最初の作業を扱いました。 この第2部では、SpringSocialTwitterプロジェクトを使用してTwitterRESTAPIと対話するために必要なサポートの設定に焦点を当てます。 最終的な目標は、これらの質問を1日2回、複数のアカウントでツイートできるようにすることです。各アカウントは1つのトピックに焦点を当てています。

1. SpringSocialTwitterの使用

SpringSocialTwitterプロジェクトを使用するために必要な依存関係は単純です。 まず、spring-social-twitter自体を定義します。

<dependency>
   <groupId>org.springframework.social</groupId>
   <artifactId>spring-social-twitter</artifactId>
   <version>1.1.0.RELEASE</version>
</dependency>

次に、依存関係の一部をより最新のバージョンでオーバーライドする必要があります。

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>4.1.0.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>4.1.0.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.codehaus.jackson</groupId>
   <artifactId>jackson-mapper-asl</artifactId>
   <version>1.9.13</version>
</dependency>

spring-corespring-webはどちらも、 spring-social-twitter によって依存関係として定義されていますが、古いバージョン 3.0.7.RELEASE3.1.0.RELEASEそれぞれ。 独自のpomでこれらをオーバーライドすると、プロジェクトは、これらの古い継承バージョンの代わりに、定義した最新バージョンを使用するようになります。

2. Twitterアプリケーションの作成

このユースケース– 個人アカウントでツイートし、自分のアカウントの他のユーザーに代わってツイートするのは簡単なものです。 シンプルであるという事実により、アプリケーションが複数のユーザーの各Twitterアカウントでツイートする必要がある場合に必要なOAuthオーケストレーションのほとんどを省くことができます。

したがって、ユースケースでは、必要なすべてを手動で設定できるため、TwitterTemplateを直接作成します。

最初に必要なのはdevアプリケーションです。ログイン後にここで作成できます。 アプリケーションを作成すると、コンシューマーキーコンシューマーシークレットが表示されます。これらはアプリケーションのページから取得されます。詳細タブの[ X189X]OAuth設定。

また、アプリケーションがアカウントでツイートできるようにするには、読み取りおよび書き込みアクセスを設定して、デフォルトの読み取りのみの特権を置き換える必要があります。

3. TwitterTemplateのプロビジョニング

次に、 TwitterTemplate では、アクセストークンアクセストークンシークレットをプロビジョニングする必要があります。 これらは、[アプリケーション]ページ– 詳細タブ–アクセストークンの作成から生成することもできます。 アクセストークンとシークレットの両方をOAuthツールタブから取得できます。

新しいものは、詳細タブで、アクセストークンの再作成アクションを介していつでも再生成できます。

この時点で、必要なものがすべて揃っています。コンシューマーキーとコンシューマーシークレット、およびアクセストークンとアクセストークンシークレットです。つまり、そのアプリケーション用にTwitterTemplateを作成できます。

new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);

4. アカウントごとに1つのテンプレート

単一のアカウントに対して単一のTwitterTemplateを作成する方法を確認したので、ユースケースをもう一度振り返ることができます。複数のアカウントでツイートする必要があります。つまり、複数のアカウントが必要です。 TwitterTemplateインスタンス。

これらは、単純なメカニズムを使用して、要求に応じて簡単に作成できます。

@Component
public class TwitterTemplateCreator {
   @Autowired
   private Environment env;

   public Twitter getTwitterTemplate(String accountName) {
      String consumerKey = env.getProperty(accountName + ".consumerKey");
      String consumerSecret = env.getProperty(accountName + ".consumerSecret");
      String accessToken = env.getProperty(accountName + ".accessToken");
      String accessTokenSecret = env.getProperty(accountName + ".accessTokenSecret");
      Preconditions.checkNotNull(consumerKey);
      Preconditions.checkNotNull(consumerSecret);
      Preconditions.checkNotNull(accessToken);
      Preconditions.checkNotNull(accessTokenSecret);

      TwitterTemplate twitterTemplate = 
         new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);
      return twitterTemplate;
   }
}

もちろん、4つのセキュリティアーティファクトは、アカウントによってプロパティファイルで外部化されています。 たとえば、SpringAtSOアカウントの場合:

SpringAtSO.consumerKey=nqYezCjxkHabaX6cdte12g
SpringAtSO.consumerSecret=7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4A
SpringAtSO.accessToken=1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3
SpringAtSO.accessTokenSecret=ZIpghEJgFGNGQZzDFBT5TgsyeqDKY2zQmYsounPafE

これにより、柔軟性と安全性をうまく組み合わせることができます。セキュリティクレデンシャルはコードベース(はオープンソース)の一部ではありませんが、ファイルシステム上で独立して存在し、Springによって取得され、SpringEnviromentを介して利用できます。簡単な構成:

@Configuration
@PropertySource({ "file:///opt/stack/twitter.properties" })
public class TwitterConfig {
    // 
}

Spring のプロパティは以前に説明された主題であるため、ここではこの主題についてこれ以上詳しく説明しません。

最後に、 test は、アカウントにSpring環境ですぐに利用できる必要なセキュリティ情報があることを確認します。 プロパティが存在しない場合、getTwitterTemplateロジックはNullPointerExceptionでテストに失敗するはずです。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TwitterTemplateCreatorIntegrationTest {
   @Autowired
   private TwitterTemplateCreator twitterTemplateCreator;
   //
   @Test
   public void givenValidAccountSpringAtSO_whenRetrievingTwitterClient_thenNoException() {
      twitterTemplateCreator.getTwitterTemplate(SimpleTwitterAccount.SpringAtSO.name());
   }
}

5. ツイート

TwitterTemplate を作成したら、ツイートの実際のアクションに移りましょう。 このために、 TwitterTemplate を受け入れ、その基盤となるAPIを使用してツイートを作成する非常に単純なサービスを使用します。

@Service
public class TwitterService {
   private Logger logger = LoggerFactory.getLogger(getClass());

   public void tweet(Twitter twitter, String tweetText) {
      try {
         twitter.timelineOperations().updateStatus(tweetText);
      } catch (RuntimeException ex) {
         logger.error("Unable to tweet" + tweetText, ex);
      }
   }
}

6. TwitterTemplateのテスト

そして最後に、統合テストを記述して、アカウントの TwitterTemplate をプロビジョニングし、そのアカウントでツイートするプロセス全体を実行できます。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TweetServiceLiveTest {
   @Autowired
   private TwitterService twitterService;
   @Autowired
   private TwitterTemplateCreator twitterCreator;

   @Test
   public void whenTweeting_thenNoExceptions() {
      Twitter twitterTemplate = twitterCreator.getTwitterTemplate("SpringAtSO");
      twitterService.tweet(twitterTemplate, "First Tweet");
   }
}

7. 結論

この時点で、私たちが作成したTwitterAPIはStackExchangeAPIとは完全に分離されており、特定のユースケースとは関係なく、あらゆるものをツイートするために使用できます。

Stack Exchangeアカウントから質問をツイートするプロセスの次の論理的なステップは、コンポーネントを作成することです–これまでに提示したTwitterとStackExchange APIの両方のと相互作用します–これは次の記事の焦点になりますこのシリーズでは。