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 即可满足需求。

操作步骤:

  1. 访问 Twitter 开发者平台 创建应用
  2. 获取 Consumer KeyConsumer Secret(在应用详情页的 OAuth 设置区域)
  3. ✅ 关键:将权限从默认的 只读 改为 读写(Read and Write)

3. 配置 TwitterTemplate

TwitterTemplate 还需要 Access TokenAccess Token Secret

  1. 在应用详情页点击 "Create my access token"
  2. 生成的凭证可在 "OAuth tool" 标签页查看
  3. 需要时可随时在详情页点击 "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 获取问题并自动发推的完整流程,将在后续文章中详细展开。


原始标题:The Spring Social Twitter Setup