Twitter4j:获取某条推文的回复列表

4

是否可以使用twitter4j获取回复某条推文(或其回复)的推文列表?Twitter网站和Android应用程序具有此功能。

5个回答

4

这是我在welshare中使用的代码。

第一部分获取Twitter在打开推文时显示在下方的所有推文。其余部分处理对话,以防该推文是回复其他推文。

RelatedResults results = t.getRelatedResults(tweetId);
List<Status> conversations = results.getTweetsWithConversation();
/////////
Status originalStatus = t.showStatus(tweetId);
if (conversations.isEmpty()) {
    conversations = results.getTweetsWithReply();
}

if (conversations.isEmpty()) {
    conversations = new ArrayList<Status>();
    Status status = originalStatus;
    while (status.getInReplyToStatusId() > 0) {
        status = t.showStatus(status.getInReplyToStatusId());
        conversations.add(status);
    }
}
// show the current message in the conversation, if there's such
if (!conversations.isEmpty()) {
    conversations.add(originalStatus);
}

编辑:由于 Twitter API v1 已不再使用,此方法将不再有效


这里的“t”是什么? - Chandan Prakash Sharma

3
我在https://github.com/klinker24/Talon-for-Twitter找到了这个方法,并稍作修改。
public ArrayList<Status> getDiscussion(Status status, Twitter twitter) {
    ArrayList<Status> replies = new ArrayList<>();

    ArrayList<Status> all = null;

    try {
        long id = status.getId();
        String screenname = status.getUser().getScreenName();

        Query query = new Query("@" + screenname + " since_id:" + id);

        System.out.println("query string: " + query.getQuery());

        try {
            query.setCount(100);
        } catch (Throwable e) {
            // enlarge buffer error?
            query.setCount(30);
        }

        QueryResult result = twitter.search(query);
        System.out.println("result: " + result.getTweets().size());

        all = new ArrayList<Status>();

        do {
            System.out.println("do loop repetition");

            List<Status> tweets = result.getTweets();

            for (Status tweet : tweets)
                if (tweet.getInReplyToStatusId() == id)
                    all.add(tweet);

            if (all.size() > 0) {
                for (int i = all.size() - 1; i >= 0; i--)
                    replies.add(all.get(i));
                all.clear();
            }

            query = result.nextQuery();

            if (query != null)
                result = twitter.search(query);

        } while (query != null);

    } catch (Exception e) {
        e.printStackTrace();
    } catch (OutOfMemoryError e) {
        e.printStackTrace();
    }
    return replies;
}

3

您可以使用InReplyToStatusId字段值,通过Status.getInReplyToStatusId()方法来获取它。

使用以下代码递归地获取API v1.1中推文的所有回复或对话:

Status replyStatus = twitter.showStatus(status.getInReplyToStatusId());
System.out.println(replyStatus.getText())

使用这个方法,我可以获取带有所有回复的推文。

请提供一个示例代码,展示如何使用它以及流程。 - Ritesh Gune
@Hari,好久不见了。你有完整的代码吗?我需要获取一条特定推文(两年前的推文)的所有回复。谢谢。 - Memin
我尝试过了,但没有得到回复(我使用的是Twitter4j 4.0.4版本)。你能分享一下参考代码吗? - Chandan Prakash Sharma

3
不要在用户名前使用"@"符号,这只会搜索提到该账户的其他人。如果要搜索账户回复的推文,请使用"to:"。有关查询运算符,请参见https://dev.twitter.com/rest/public/search
public ArrayList<Status> getReplies(String screenName, long tweetID) {
    ArrayList<Status> replies = new ArrayList<>();

    try {
        Query query = new Query("to:" + screenName + " since_id:" + tweetID);
        QueryResult results;

        do {
            results = twitter.search(query);
            System.out.println("Results: " + results.getTweets().size());
            List<Status> tweets = results.getTweets();

            for (Status tweet : tweets) 
                if (tweet.getInReplyToStatusId() == tweetID)
                    replies.add(tweet);
        } while ((query = results.nextQuery()) != null);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return replies;
}

0

Twitter API没有获取推文回复的功能,但您可以通过几个步骤实现。以下是Twitter API 7.0版本最有效的方法。


第一步 - 获取所有回复。(此函数只能返回最近的800个回复)

List<Status> replyList = twitter.getMentionsTimeline(new Paging(1, 800));


步骤2 - 如果用户回复自己的推文,则这些回复将返回到getUserTimeline()而不是getMentionsTimeline()。因此,您需要将这些回复移动到正确的位置。

List<Status> tweetList = new ArrayList<>();
for (Status tweet : twitter.getUserTimeline()) {
    if (tweet.getInReplyToStatusId() == -1) {
        tweetList.add(tweet);
    } else {
        replyList.add(tweet);
    }
}


第三步 - 使用getInReplyToStatusId()来识别每个回复的原始推文。如果您想获取嵌套的回复,可以将函数设置为递归(如下所示)。

public void getReply(Status tweet) {
    for (Status reply : replyList) {
        if (tweet.getId() == reply.getInReplyToStatusId()) {
            System.out.println(reply.getText());
            getReply(reply);
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接