В первой части этой серии мы рассмотрели, как мы можем использовать 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, которые мы представили до сих пор, — это будет основной темой следующей статьи этой серии.