twitter4j — доступ к информации о твитах из Streaming API

Моя цель — собрать все твиты, содержащие слова «Франция» и «Германия», а также собрать соответствующие метаданные (например, географические координаты, прикрепленные к твиту). Я знаю, что эти метаданные доступны, но я не могу понять, как получить к ним доступ с помощью библиотеки Java, которую я использую: «twitter4j».

Итак, то, что у меня есть, взято из примеров кода на сайте twitter4j. Он распечатывает все твиты, содержащие выбранные мной ключевые слова, поскольку они предоставляются в режиме реального времени API потоковой передачи Twitter. Я вызываю метод filter для своего объекта TwitterStream, и это обеспечивает поток. Но мне нужно больше контроля. А именно, я хотел бы иметь возможность:

1) записать твиты в файл; 2) распечатать только первые 1000 твитов; 3) получить доступ к другим метаданным, прикрепленным к твиту (метод фильтра просто распечатывает имя пользователя и сам твит).

Вот код, который у меня есть до сих пор:

import twitter4j.FilterQuery;
import twitter4j.Status;
import twitter4j.StatusDeletionNotice;
import twitter4j.StatusListener;
import twitter4j.TwitterException;
import twitter4j.TwitterStream;
import twitter4j.TwitterStreamFactory;
import twitter4j.conf.ConfigurationBuilder;

public class Stream {
    public static void main(String[] args) throws TwitterException {

    ConfigurationBuilder cb = new ConfigurationBuilder();
    cb.setDebugEnabled(true);
    cb.setOAuthConsumerKey("bbb");
    cb.setOAuthConsumerSecret("bbb");
    cb.setOAuthAccessToken("bbb");
    cb.setOAuthAccessTokenSecret("bbb");

    TwitterStream twitterStream = new TwitterStreamFactory(cb.build()).getInstance();
    StatusListener listener = new StatusListener() {

        public void onStatus(Status status) {
            System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText());
        }

        public void onDeletionNotice(StatusDeletionNotice statusDeletionNotice) {
            System.out.println("Got a status deletion notice id:" + statusDeletionNotice.getStatusId());
        }

        public void onTrackLimitationNotice(int numberOfLimitedStatuses) {
            System.out.println("Got track limitation notice:" + numberOfLimitedStatuses);
        }

        public void onScrubGeo(long userId, long upToStatusId) {
            System.out.println("Got scrub_geo event userId:" + userId + " upToStatusId:" + upToStatusId);
        }

        public void onException(Exception ex) {
            ex.printStackTrace();
        }
    };

    FilterQuery fq = new FilterQuery();
    String keywords[] = {"France", "Germany"};

    fq.track(keywords);

    twitterStream.addListener(listener);
    twitterStream.filter(fq);      
}
}

person Andrew    schedule 22.02.2012    source источник
comment
Нужна помощь. Я получаю следующую ошибку. 'Тип new StatusListener(){} должен реализовывать унаследованный абстрактный метод StatusListener.onStallWarning(StallWarning)'   -  person ONE_FE    schedule 15.04.2016
comment
Какую версию Twitter4J вы используете? Класс TwitterStream, похоже, не включен в мой. Я использую 3.0.   -  person Martin Erlic    schedule 04.04.2018


Ответы (3)


Посмотрев на это свежим взглядом, я понял решение (которое было довольно очевидным). Редактируем следующую часть кода:

public void onStatus(Status status) {
        System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText());
    }

позволяет мне получить доступ к другим метаданным. Например, если я хочу получить доступ к дате твита, мне просто нужно добавить следующее:

System.out.println(status.getCreatedAt());
person Andrew    schedule 23.02.2012

Ошибка 401 возникает, когда API пытается получить доступ к некоторой информации, которую в настоящее время невозможно получить. Поэтому вам нужно проверить разрешения, которые разрешены в твиттере. Измените его на ЧТЕНИЕ, ЗАПИСЬ и... для полного доступа к API. Или может быть проблема, поскольку вы можете использовать прокси-сервер. Следовательно, укажите детали прокси, используя следующие команды.

 System.getProperties().put("http.proxyHost", "10.3.100.211");
        System.getProperties().put("http.proxyPort", "8080");
person user1580096    schedule 25.08.2013

Чтобы писать твиты в файл:

FileWriter file = new FileWriter(....);

public void onStatus(Status status) {
    System.out.println("@" + status.getUser().getScreenName() + " - " + status.getText() + " -> "+ status.getCreatedAt());
    try {
        file.write(status.getUser().getScreenName() + " - " + status.getText() + " -> "+ status.getCreatedAt() +"\n");
        file.flush();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
person Giovanni    schedule 20.12.2013