Настройка Spring Social Twitter

Spring Social Twitter Настройка

Первая часть серии посвящена начальной работеconsuming the StackExchange REST API, чтобы получить ответы на самые популярные вопросы. Этотsecond part будет сосредоточен на настройке поддержки, необходимой для взаимодействия с API REST Twitter с использованием проекта Spring Social Twitter. Конечная цель состоит в том, чтобы иметь возможность твитнуть эти вопросы, два в день, по нескольким аккаунтам, каждый из которых сфокусирован на одной теме.

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-core, иspring-web определены как зависимостиspring-social-twitter, но сolder versions -3.0.7.RELEASE и3.1.0.RELEASE соответственно. Переопределение их в нашем собственном pom гарантирует, что в проекте используются обновленные версии, которые мы определили, вместо этих старых унаследованных версий.

2. Создание приложения Twitter

Этот вариант использования - твитнутьpersonal account, а не от имени других пользователей в их учетных записях, очень прост. Тот факт, что это просто, позволяет нам обойтись без большинстваOAuth orchestration, необходимых, если приложению потребуется твитнуть для нескольких пользователей в каждой из их учетных записей Twitter.

Итак, для нашего варианта использования мы будем использоватьcreate the TwitterTemplate directly, поскольку мы можем вручную настроить все, что нам нужно для этого.

Первое, что нам нужно, этоdev application - после входа в систему может бытьcreated here. После создания приложения у нас будутConsumer Key иConsumer Secret - они получены на странице приложения - на вкладкеDetails в разделеOAuth settings.

Кроме того, чтобы разрешить Приложению твитнуть в учетной записи, необходимо установитьRead and Write Access, чтобы заменить только привилегии по умолчаниюRead.

3. ПредоставлениеTwitterTemplate

ЗатемTwitterTemplate требует предоставленияAccess Token иAccess Token Secret. Их также можно сгенерировать на странице приложения - на вкладкеDetails -Create my access token. После этого токен доступа и секрет можно получить на вкладкеOAuth tool.

Новые всегда можно восстановить на вкладкеDetails с помощью действияRecreate my access token.

На данный момент у нас есть все, что нам нужно - Consumer Key и Consumer Secret, а также Access Token и Access Token Secret - что означает, что мы можем продолжить и создать нашиTwitterTemplate для этого приложения:

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

4. Один шаблон на аккаунт

Теперь, когда мы увидели, как создать одинTwitterTemplate дляa single account, мы можем снова вернуться к нашему сценарию использования - нам нужно твитнуть для нескольких учетных записей - это означает, что нам нужно несколько экземпляров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;
   }
}

Четыре артефакта безопасности, конечно,externalized in a properties file, по учетной записи; например, дляSpringAtSO account:

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

Это обеспечивает хорошее сочетание гибкости и безопасности - учетные данные безопасности не являются частью кодовой базы (котораяis opensource), но живут независимо в файловой системе и подбираются Spring и доступны в среде Spring через простую конфигурацию. :

@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. Заключение

На этом этапе созданный нами API-интерфейс Twitter полностью отделен от API-интерфейса StackExchange и может использоваться независимо от этого конкретного сценария для чирикания чего угодно.

Следующим логическим шагом в процессе отправки вопросов из учетных записей Stack Exchange в Твиттере является создание компонента, взаимодействующего сboth the Twitter and StackExchange APIs, который мы уже представили - это будет предметом внимания следующей статьи этой серии.