是否有可能使用Twitter4j库从特定用户那里获取Twitter的直接消息?

时间:2017-03-18 22:25:19

标签: java twitter twitter4j dm

我正在使用Twitter4j库来开发一个与Twitter一起工作的项目,我需要的是获取Direct消息,我使用以下代码:

try{
    List<DirectMessage> loStatusList = loTwitter.getDirectMessages();
    for (DirectMessage loStatus : loStatusList) {
        System.out.println(loStatus.getId() + ",@" + loStatus.getSenderScreenName() + "," + loStatus.getText() + "|");
    }
}
catch(Exception e)

它工作正常,但代码返回的是一般的最新消息列表。我想要的是使用某种过滤器来获取这些直接消息,这些过滤器允许我指示的用户找到它们。

例如,我只需要从用户@TwitterUser看到DM。

这个库有效吗?

即使我应该使用其他图书馆,也接受各种建议。如果您让我知道,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

看起来实际的Twitter API不支持通过用户名对该API进行直接过滤。 (见Twitter API doc: GET direct_messages。)

这意味着,您必须在启用分页的情况下对API进行多次调用,并将响应缓存到列表中。

以下是pagination wtih Twitter4J getDirectMessages()的示例。

在该示例中,使用现有的:

List<DirectMessage> messages;

但在循环中,请执行:

messages.addAll(twitter.getDirectMessages(paging));

注意:您只需要执行一次此操作。事实上,你应该将它们保存到像Redis之类的持久本地缓存中。因为一旦您拥有 last 消息ID,就可以要求Twitter API仅返回带有since_id参数的“自id以来的消息”。

无论如何,然后在客户端,您只需使用Java中的常用方法进行过滤。例如:

// Joe is on twitter as @joe
private static final String AT_JOE = "Joe";

// Java 8 Lambda to filter by screen name
List<DirectMessage> messagesFromJoe = messages.stream()
    .filter(message -> message.getSenderScreenName().equals(AT_JOE))
    .collect(Collectors.toList());

上面,getSenderScreenName()是通过阅读Twitter4J API doc for DirectMessage发现的。{/ p>