Статьи

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

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

1. Использование Spring Social Twitter

Необходимые зависимости, необходимые для использования проекта Spring Social Twitter, просты. Сначала определим сам Spring-social-twitter :

1
2
3
4
5
<dependency>
   <groupId>org.springframework.social</groupId>
   <artifactId>spring-social-twitter</artifactId>
   <version>1.0.3.RELEASE</version>
</dependency>

Затем нам нужно переопределить некоторые из его зависимостей более актуальными версиями:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-core</artifactId>
   <version>3.2.2.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-web</artifactId>
   <version>3.2.2.RELEASE</version>
</dependency>
<dependency>
   <artifactId>jackson-mapper-asl</artifactId>
   <groupId>org.codehaus.jackson</groupId>
   <version>1.9.12</version>
</dependency>

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

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

Этот вариант использования — простой твит в личном кабинете, а не от имени других пользователей в их аккаунтах. Тот факт, что это просто, позволяет нам обойтись без большей части OAuth-оркестровки, необходимой, если приложению потребуется твитнуть для нескольких пользователей в каждой из их учетных записей Twitter. Итак, для нашего варианта использования мы создадим шаблон TwitterTemplate напрямую , поскольку мы можем вручную настроить все, что нам нужно для этого. Первое, что нам нужно, — это приложение dev — его можно создать здесь , после входа в систему. После создания приложения у нас будут Consumer Key и Consumer Secret — их можно получить на странице приложения — на вкладке Details в разделе Настройки OAuth . Кроме того, чтобы приложение могло твитнуть в учетной записи, необходимо установить права на чтение и запись, чтобы заменить стандартные права только для чтения .

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

Затем для шаблона TwitterTemplate требуется токен доступа и секрет токена доступа . Их также можно сгенерировать на странице приложения — на вкладке « Сведения » — « Создать мой маркер доступа» . И токен доступа, и секрет могут быть получены из вкладки инструмента OAuth . Новые всегда можно восстановить на вкладке « Сведения » с помощью действия « Восстановить мой токен доступа» . На данный момент у нас есть все, что нам нужно — Ключ потребителя и Секрет потребителя, а также Секрет токена и Секрет доступа — что означает, что мы можем пойти дальше и создать наш шаблон TwitterTemplate для этого приложения:

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

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

Теперь, когда мы увидели, как создать единый шаблон TwitterTemplate для одной учетной записи , мы можем снова оглянуться на наш сценарий использования — нам нужно твитнуть на нескольких учетных записях — что означает, что нам нужно несколько экземпляров TwitterTemplate . Они могут быть легко созданы по запросу с помощью простого механизма:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
@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;
   }
}

Четыре артефакта безопасности, разумеется, выводятся в файл свойств по учетной записи; например, для учетной записи SpringAtSO :

1
2
3
4
SpringAtSO.consumerKey=nqYezCjxkHabaX6cdte12g
SpringAtSO.consumerSecret=7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4A
SpringAtSO.accessToken=1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3
SpringAtSO.accessTokenSecret=ZIpghEJgFGNGQZzDFBT5TgsyeqDKY2zQmYsounPafE

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

1
2
3
4
5
@Configuration
@PropertySource({ "file:///opt/stack/twitter.properties" })
public class TwitterConfig {
    //
}

Свойства в Spring — предмет, который обсуждался ранее, поэтому мы не будем вдаваться в подробности по этому вопросу здесь. Наконец, тест проверит, что учетная запись имеет необходимую информацию о безопасности, доступную в среде Spring; если свойства отсутствуют, логика getTwitterTemplate должна завершить тест с исключением NullPointerException :

01
02
03
04
05
06
07
08
09
10
11
@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 для создания твита:

01
02
03
04
05
06
07
08
09
10
11
12
@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. Тестирование шаблона Twitter

И, наконец, мы можем написать интеграционный тест, чтобы выполнить весь процесс подготовки TwitterTemplate для учетной записи и твитнуть в ней:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { TwitterConfig.class })
public class TweetServiceLiveTest {
   @Autowired
   private TwitterService twitterService;
   @Autowired
   private TwitterTemplateCreator twitterCreator;
   //
   // tests
   @Test
   public void whenTweeting_thenNoExceptions() {
      Twitter twitterTemplate = twitterCreator.getTwitterTemplate("SpringAtSO");
      twitterService.tweet(twitterTemplate, "First Tweet");
   }
}

7. Заключение

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

Ссылка: Spring Social Twitter Setup от нашего партнера JCG Евгения Параскива в блоге baeldung .