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凭证。