1. 使用 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-social-twitter 自带较旧版本的 spring-core 和 spring-web(3.0.7.RELEASE 和 3.1.0.RELEASE),在 pom 中显式声明可确保使用更新版本。
2. 创建 Twitter 应用
本场景是个人账号发推,而非代用户操作,因此可以简化 OAuth 流程。直接创建 TwitterTemplate
即可满足需求。
操作步骤:
- 访问 Twitter 开发者平台 创建应用
- 获取 Consumer Key 和 Consumer Secret(在应用详情页的 OAuth 设置区域)
- ✅ 关键:将权限从默认的 只读 改为 读写(Read and Write)
3. 配置 TwitterTemplate
TwitterTemplate
还需要 Access Token 和 Access Token Secret:
- 在应用详情页点击 "Create my access token"
- 生成的凭证可在 "OAuth tool" 标签页查看
- 需要时可随时在详情页点击 "Recreate my access token" 重新生成
现在我们已获取全部凭证,直接创建 TwitterTemplate
:
new TwitterTemplate(consumerKey, consumerSecret, accessToken, accessTokenSecret);
4. 多账号模板管理
回顾需求:我们需要在多个账号发推,因此需要管理多个 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 配置加载外部文件:
@Configuration
@PropertySource({ "file:///opt/stack/twitter.properties" })
public class TwitterConfig {
//
}
测试验证配置是否正确加载:
@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
发推的核心服务:
@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. 集成测试
完整的发推流程测试(创建模板 + 发推):
@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 场景单独使用。
下一步需要创建桥接组件,同时调用:
- 已实现的 Twitter API
- StackExchange API(前文实现)
这将实现从 StackExchange 获取问题并自动发推的完整流程,将在后续文章中详细展开。