Spring SocialのTwitterの設定

Spring Social Twitterのセットアップ

シリーズの最初の部分では、上位の質問を取得するために、consuming the StackExchange REST APIの最初の作業を扱います。 このsecond partは、Spring SocialTwitterプロジェクトを使用してTwitterRESTAPIと対話するために必要なサポートの設定に焦点を当てます。 最終目標は、これらの質問を1日に2つずつ、それぞれが単一のトピックに焦点を当てた複数のアカウントでツイートできるようにすることです。

1. Spring Social Twitterの使用

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


   org.springframework.social
   spring-social-twitter
   1.1.0.RELEASE

次に、いくつかの依存関係を最新バージョンで上書きする必要があります。


   org.springframework
   spring-core
   4.1.0.RELEASE


   org.springframework
   spring-web
   4.1.0.RELEASE


   org.codehaus.jackson
   jackson-mapper-asl
   1.9.13

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

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

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

したがって、ユースケースでは、必要なすべてを手動で設定できるため、create the TwitterTemplate directlyを使用します。

最初に必要なのはdev applicationです。ログイン後はcreated hereにすることができます。 アプリケーションを作成すると、Consumer KeyConsumer Secretが表示されます。これらはアプリケーションのページから取得されます。DetailsタブのOAuth settingsの下にあります。

また、アプリケーションがアカウントでツイートできるようにするには、Read and Write Accessを設定して、デフォルトのReadのみの権限を置き換える必要があります。

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

次に、TwitterTemplateでは、Access TokenAccess Token Secretをプロビジョニングする必要があります。 これらは、[アプリケーション]ページ– [Details]タブ–Create my access tokenから生成することもできます。 アクセストークンとシークレットの両方をOAuth toolタブから取得できます。

新しいものは、Recreate my access tokenアクションを介して、Detailsタブでいつでも再生成できます。

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

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

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

a single accountに対して単一の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つのセキュリティアーティファクトはアカウントではexternalized in a properties fileです。たとえば、SpringAtSO accountの場合:

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

これにより、柔軟性と安全性をうまく組み合わせることができます。セキュリティ資格情報はコードベース(is opensource)の一部ではなく、ファイルシステム上で独立して存在し、Springによって取得され、単純な構成を介してSpringEnviromentで利用できます。 :

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

Properties in 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を作成したら、tweetingの実際のアクションに移りましょう。 このために、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. 結論

この時点で、私たちが作成したTwitter APIはStackExchange APIとは完全に分離されており、特定のユースケースとは無関係に使用して、何でもツイートできます。

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