Можно ли получить список твитов, которые отвечают на твит (или на его ответы), используя twitter4j? Эта функция есть на веб-сайте Twitter и в приложении для Android.
Twitter4j: получить список ответов на определенный твит
Ответы (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 больше не используется.
Вы можете использовать значение поля InReplyToStatusId
, используя Status.getInReplyToStatusId()
Используйте приведенный ниже код кода рекурсивно, чтобы получить все ответы или диалоги твита с помощью API версии 1.1:
Status replyStatus = twitter.showStatus(status.getInReplyToStatusId());
System.out.println(replyStatus.getText())
Используя это, я мог получить твиты со всеми их ответами.
Я нашел способ сделать это в 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;
}
Не используйте «@» перед псевдонимом. Он ищет только других людей, упоминающих учетную запись. Для поиска ответов на твит от аккаунта используйте «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;
}
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);
}
}
}