Первая часть серии посвящена начальной работе по использованию StackExchange REST API для получения наиболее часто задаваемых вопросов. Во второй части основное внимание будет уделено настройке поддержки, необходимой для взаимодействия с REST API Twitter с использованием проекта Spring Social Twitter. Конечная цель состоит в том, чтобы иметь возможность публиковать эти вопросы по два в день на нескольких аккаунтах, каждый из которых посвящен одной теме.
1. Использование Spring Social Twitter
Требуемые зависимости, необходимые для использования проекта Spring Social Twitter, просты. Во- первых, мы определяем сам spring-social-twitter
:
<dependency>
<groupId>org.springframework.social</groupId>
<artifactId>spring-social-twitter</artifactId>
<version>1.1.0.RELEASE</version>
</dependency>
Затем нам нужно переопределить некоторые из его зависимостей более современными версиями:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
И spring-core,
и spring-web
определены как зависимости Spring -Social-twitter,
но с более старыми версиями — 3.0.7.RELEASE
и 3.1.0.RELEASE
соответственно. Переопределение их в нашем собственном pom гарантирует, что проект использует актуальные версии, которые мы определили, вместо этих более старых унаследованных версий.
2. Создание приложения Twitter
Этот пример использования — твиты от личного аккаунта, а не от имени других пользователей в их аккаунтах — очень простой. Тот факт, что это просто, позволяет нам обойтись без большей части OAuth-оркестровки , необходимой, если приложению потребуется твитить для нескольких пользователей в каждой из их учетных записей Twitter.
Итак, для нашего варианта использования мы создадим TwitterTemplate
напрямую , так как мы можем вручную настроить все, что нам нужно для этого.
Первое, что нам нужно, это приложение разработчика — его можно создать здесь после входа в систему. После создания приложения у нас будет ключ потребителя и секрет потребителя — их можно получить на странице приложения — на вкладке « Сведения » в разделе
Настройки OAuth
.
Кроме того, чтобы приложение могло публиковать твиты в учетной записи, необходимо установить доступ для чтения и записи
, чтобы заменить привилегии только для чтения по умолчанию.
3. Предоставление TwitterTemplate
Далее, шаблон TwitterTemplate
требует предоставления токена доступа и секрета токена доступа . Их также можно сгенерировать на странице приложения — на вкладке « Сведения » — «
Создать мой токен доступа » . Затем и токен доступа, и секрет можно получить на вкладке инструмента OAuth .
Новые всегда можно создать повторно на вкладке « Сведения » с помощью действия «
Восстановить мой токен доступа
» .
На данный момент у нас есть все, что нам нужно — Consumer Key и Consumer Secret, а также Access Token и Access Token Secret — это означает, что мы можем двигаться вперед и создать наш TwitterTemplate
для этого приложения:
new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);
4. Один шаблон для каждой учетной записи
Теперь, когда мы увидели, как создать один 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;
}
}
Четыре артефакта безопасности, конечно же , вынесены в файл свойств по учетной записи; например, для учетной записи SpringAtSO :
SpringAtSO.consumerKey=nqYezCjxkHabaX6cdte12g
SpringAtSO.consumerSecret=7REmgFW4SnVWpD4EV5Zy9wB2ZEMM9WKxTaZwrgX3i4A
SpringAtSO.accessToken=1197830142-t44T7vwgmOnue8EoAxI1cDyDAEBAvple80s1SQ3
SpringAtSO.accessTokenSecret=ZIpghEJgFGNGQZzDFBT5TgsyeqDKY2zQmYsounPafE
Это обеспечивает хорошее сочетание гибкости и безопасности — учетные данные безопасности не являются частью кодовой базы (которая является открытым исходным кодом ), но живут независимо от файловой системы и подбираются Spring и доступны в Spring Enviroment через простую конфигурацию:
@Configuration
@PropertySource({ "file:///opt/stack/twitter.properties" })
public class TwitterConfig {
//
}
Свойства в Spring — это тема, которая уже обсуждалась ранее, поэтому мы не будем здесь вдаваться в подробности.
Наконец, тест проверит, что учетная запись имеет необходимую информацию о безопасности, легко доступную в среде 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
, давайте обратимся к фактическому действию твитов . Для этого мы будем использовать очень простой сервис, принимающий 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 в Твиттере является создание компонента, взаимодействующего как с API Twitter, так и с API StackExchange , которые мы представили до сих пор. Это будет темой следующей статьи этой серии.