Twitter4j: получить список ответов на определенный твит

Можно ли получить список твитов, которые отвечают на твит (или на его ответы), используя twitter4j? Эта функция есть на веб-сайте Twitter и в приложении для Android.


person Toast    schedule 15.08.2012    source источник


Ответы (5)


Вот код, который я использую в 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 версии 1 больше не используется.

person Bozho    schedule 15.08.2012
comment
Что здесь ? - person Chandan Prakash Sharma; 10.03.2018

Вы можете использовать значение поля InReplyToStatusId, используя Status.getInReplyToStatusId()

Используйте приведенный ниже код кода рекурсивно, чтобы получить все ответы или диалоги твита с помощью API версии 1.1:

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

Используя это, я мог получить твиты со всеми их ответами.

person Hari    schedule 30.08.2013
comment
Не могли бы вы предоставить пример кода, показывающий его использование и поток? - person Ritesh Gune; 18.11.2013
comment
@ Хари, прошло много времени, но у тебя есть полный код. Мне нужно получить все ответы на определенный твит (твит двухлетней давности). Спасибо - person Memin; 18.07.2017
comment
Я попробовал, но не получил ответов (я использую версию Twitter4j 4.0.4). Не могли бы вы поделиться ссылочным кодом? - person Chandan Prakash Sharma; 12.03.2018

Я нашел способ сделать это в 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;
}
person n1amr    schedule 24.08.2015

Не используйте «@» перед псевдонимом. Он ищет только других людей, упоминающих учетную запись. Для поиска ответов на твит от аккаунта используйте «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;
}
person eos1d3    schedule 29.04.2017

Twitter API не имеет функции для получения ответов на твит, но вы можете сделать это в несколько шагов. Вот наиболее эффективный способ для Twitter API версии 7.0.


Шаг 1. Получите все ответы. (Эта функция может вернуть не более 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);
    }
}


Шаг 3. Используйте getInReplyToStatusId(), чтобы определить исходный твит каждого ответа. Сделайте свою функцию рекурсивной (как показано ниже), если вы хотите также получать вложенные ответы.

public void getReply(Status tweet) {
    for (Status reply : replyList) {
        if (tweet.getId() == reply.getInReplyToStatusId()) {
            System.out.println(reply.getText());
            getReply(reply);
        }
    }
}
person User Not Exist    schedule 21.05.2020