В первой части этой серии мы рассмотрели, как мы можем использовать 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
|
@Componentpublic 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=nqYezCjxkHabaX6cdte12gSpringAtSO.consumerSecret=7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4ASpringAtSO.accessToken=1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3SpringAtSO.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
|
@Servicepublic 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, которые мы представили до сих пор, — это будет основной темой следующей статьи этой серии.