1. 概述

在这篇文章中,我们将探讨如何在Java应用中使用Twitter4J与Twitter进行通信。

2. Twitter4J

Twitter4J是一个开源的Java库,它提供了一个方便的API来访问Twitter API

简单来说,我们可以这样与Twitter API交互:我们能够:

  • 发布推文
  • 获取用户的时间线,包括最新的推文列表
  • 发送和接收私信
  • 搜索推文,以及更多操作

这个库确保了我们可以轻松执行这些操作,并且还保证了用户的安全性和隐私,这自然需要我们在应用中配置OAuth凭证。

3. Maven依赖

首先,我们需要在pom.xml中定义Twitter4J的依赖:

<dependency>
    <groupId>org.twitter4j</groupId>
    <artifactId>twitter4j-stream</artifactId>
    <version>4.0.6</version>
</dependency>

要检查是否有新版本的库发布,请跟踪此处的版本

4. 配置

Twitter4J的配置既简单又灵活,可以通过纯文本文件、Java类或环境变量等方式完成。

让我们逐一查看这些方法。

4.1. 纯文本文件

我们可以使用一个名为twitter4j.properties的纯文本文件来存储我们的配置细节。以下是需要提供的属性:

oauth.consumerKey =       // your key
oauth.consumerSecret =    // your secret
oauth.accessToken =       // your token
oauth.accessTokenSecret = // your token secret

这些属性可以在你创建新应用后从Twitter开发者控制台获取。

4.2. Java类

我们还可以使用ConfigurationBuilder类在Java中程序化地配置Twitter4J:

ConfigurationBuilder cb = new ConfigurationBuilder();
cb.setDebugEnabled(true)
  .setOAuthConsumerKey("your consumer key")
  .setOAuthConsumerSecret("your consumer secret")
  .setOAuthAccessToken("your access token")
  .setOAuthAccessTokenSecret("your access token secret");
TwitterFactory tf = new TwitterFactory(cb.build());
Twitter twitter = tf.getInstance();

请注意,我们在下一节中将使用Twitter实例开始获取数据。

4.3. 环境变量

通过环境变量进行配置也是我们的选择。如果这样做,我们需要在变量前加上twitter4j_前缀:

$ export twitter4j.oauth.consumerKey =       // your key
$ export twitter4j.oauth.consumerSecret =    // your secret
$ export twitter4j.oauth.accessToken =       // your access token
$ export twitter4j.oauth.accessTokenSecret = // your access token secret

5. 添加/检索实时推文数据

有了完全配置的应用,我们现在可以最终与Twitter交互了。

让我们看一些示例。

5.1. 发布推文

我们将首先更新Twitter上的推文:

public String createTweet(String tweet) throws TwitterException {
    Twitter twitter = getTwitterinstance();
    Status status = twitter.updateStatus("creating baeldung API");
    return status.getText();
}

通过使用status.getText(),我们可以获取刚刚发布的推文。

5.2. 获取时间线

我们还可以从用户的时间线中获取推文列表:

public List<String> getTimeLine() throws TwitterException {
    Twitter twitter = getTwitterinstance();
    
    return twitter.getHomeTimeline().stream()
      .map(item -> item.getText())
      .collect(Collectors.toList());
}

通过使用twitter.getHomeTimeline(),我们可以获取当前账号ID下发布的所有推文。

5.3. 发送私信

使用Twitter4j,我们还可以向关注者发送和接收私信:

public static String sendDirectMessage(String recipientName, String msg) 
  throws TwitterException {
 
    Twitter twitter = getTwitterinstance();
    DirectMessage message = twitter.sendDirectMessage(recipientName, msg);
    return message.getText();
}

sendDirectMessage方法接受两个参数:

  • RecipientName: 消息接收者的Twitter用户名
  • msg: 消息内容

如果找不到接收者,sendDirectMessage会抛出异常,异常代码为150

5.4. 搜索推文

我们还可以搜索包含某些文本的推文。通过这样做,我们将得到包含用户名的推文列表。

让我们看看如何执行这样的搜索:

public static List<String> searchtweets() throws TwitterException {
 
    Twitter twitter = getTwitterinstance();
    Query query = new Query("source:twitter4j baeldung");
    QueryResult result = twitter.search(query);
    
    return result.getTweets().stream()
      .map(item -> item.getText())
      .collect(Collectors.toList());
}

显然,我们可以遍历QueryResult中接收到的每条推文并获取相关数据。

5.5. 流式API

Twitter流式API在需要实时更新时非常有用,它处理线程创建并监听事件。

让我们创建一个监听器,监听用户发布的推文更新:

public static void streamFeed() {

    StatusListener listener = new StatusListener() {

        @Override
        public void onException(Exception e) {
            e.printStackTrace();
        }
        @Override
        public void onDeletionNotice(StatusDeletionNotice arg) {
        }
        @Override
        public void onScrubGeo(long userId, long upToStatusId) {
        }
        @Override
        public void onStallWarning(StallWarning warning) {
        }
        @Override
        public void onStatus(Status status) {
        }
        @Override
        public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
        }
    };

    TwitterStream twitterStream = new TwitterStreamFactory().getInstance();

    twitterStream.addListener(listener);

    twitterStream.sample();
}

我们可以在所有方法中添加println()语句来检查输出的推文流。所有从API获取的推文数据都是UTF-8格式的,由于Twitter是一个多语言平台,来自不同来源的数据格式可能难以识别。

6. 总结

这篇文章是对使用Twitter4J与Java的快速但全面的介绍。

显示样例的实现可以在GitHub上找到:https://github.com/eugenp/tutorials/tree/master/saas-modules/twitter4j - 这是一个基于Maven的项目,所以导入和运行应该非常容易。我们需要做的唯一更改是插入我们自己的OAuth凭证。