Перейти к основному содержимому

Весенняя социальная настройка Twitter

· 5 мин. чтения

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