Руководство по работе с Twitter API v2 на Java с помощью twitter-api-java-sdk

twitter-api-java-sdk — это официальный SDK Twitter для Java, который поддерживает Twitter API v2 и трек продуктов для академических исследований. В этом руководстве мы узнаем, как использовать различные функциональные возможности, доступные в Twitter API v2, с помощью twitter-api-java-sdk.

Необходимые условия

Для работы с API Twitter необходимо иметь учетную запись разработчика и ключи и токены API для подключения к API. Подробнее о том, как получить эти ключи и токены, можно узнать здесь.

Чтобы работать с twitter-api-java-sdk, убедитесь, что на вашей машине установлена Java. Если вы используете Maven, добавьте следующую зависимость:

<dependency>
  <groupId>com.twitter</groupId>
  <artifactId>twitter-api-java-sdk</artifactId>
  <version>2.0.0</version>
</dependency>
Вход в полноэкранный режим Выйти из полноэкранного режима

Для всех примеров в этом разделе вам сначала нужно будет создать экземпляр класса TwitterApi и передать ему свой токен. После создания экземпляра вы будете готовы начать использовать различные функции этой библиотеки.

TwitterApi apiInstance = new TwitterApi();
TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
apiInstance.setTwitterCredentials(credentials);
Вход в полноэкранный режим Выход из полноэкранного режима

1. Поиск твитов за последние 7 дней

Для поиска твитов за последние 7 дней вы можете использовать метод tweetsRecentSearch. Вы должны будете передать ему поисковый запрос, чтобы указать данные, которые вы ищете. В примере ниже мы ищем твиты за последние 7 дней, содержащие термин covid, и исключаем ретвиты, используя -is:retweet.

По умолчанию в ответе вы получите только идентификатор твита и текст твита для каждого твита. Если вам нужны дополнительные поля твита, такие как context_annotations, created_at (время создания твита) и т.д., вы можете указать эти поля с помощью параметра tweetFields, как показано в примере 2. Узнать больше о доступных полях можно здесь. По умолчанию запрос возвращает 10 твитов. Если вам нужно больше 10 твитов на запрос, вы можете указать это с помощью параметра maxResults. Максимальное количество твитов на запрос для этой конечной точки недавнего поиска — 100.

import java.util.*;

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String query = "covid -is:retweet";

        int maxResults = 100;

        TweetSearchResponse result = apiInstance.tweets().tweetsRecentSearch(query, null, null, null, null, maxResults,
                null, null, null, null, null, null, null, null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
                System.out.println(tweet.getText());
            }

        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

2. Поиск твитов из полного архива публичных твитов

Если у вас есть доступ к треку продуктов академических исследований, вы можете получить твиты старше 7 дней, то есть из полного архива общедоступных твитов. Чтобы получить эти твиты, убедитесь, что вы используете токен на предъявителя из приложения, связанного с вашим академическим проектом на портале разработчиков Twitter. Вы можете использовать метод tweetsFullarchiveSearch и передать ему поисковый запрос. Как показано в примере ниже, вы также можете указать дополнительные поля твита, такие как created_at, lang и т. д., которые вы хотели бы получить при запросе к API Twitter.

Примечание: Не все твиты имеют связанные с ними context_annotations, поэтому в примере ниже мы выводим context_annotations, только если они доступны для твита.

import java.util.*;

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        Set<String> tweetFields = new HashSet<>(Arrays.asList("created_at", "lang", "context_annotations"));

        String query = "covid -is:retweet";

        int maxResults = 500;

        TweetSearchResponse result = apiInstance.tweets().tweetsFullarchiveSearch(query, null, null, null, null,
                maxResults, null, null, null, null, tweetFields, null, null, null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
                if (tweet.getContextAnnotations() != null) {
                    for (ContextAnnotation contextAnnotation : tweet.getContextAnnotations()) {
                        System.out.println(contextAnnotation.getDomain().getName());
                        System.out.println(contextAnnotation.getEntity().getName());
                    }
                }
            }

        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

3. Получение твитов из полного архива публичных твитов за определенный период времени

Если вы хотите получить твиты из полного архива за определенный период времени, вы можете указать этот период с помощью параметров startTime и endTime, как показано в примере ниже:

import java.time.OffsetDateTime;

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String query = "covid -is:retweet";

        int maxResults = 100;

        OffsetDateTime startTime = OffsetDateTime.parse("2020-01-01T00:00:00Z");

        OffsetDateTime endTime = OffsetDateTime.parse("2021-01-01T11:59:59Z");

        TweetSearchResponse result = apiInstance.tweets().tweetsFullarchiveSearch(query, startTime, endTime, null, null,
                maxResults, null, null, null, null, null, null, null, null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
                System.out.println(tweet.getText());
            }

        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

4. Запись твитов в текстовый файл

В этом примере показано, как можно записать идентификаторы твитов для каждого твита, полученного в результате поиска, в текстовый файл. Обязательно замените fileName на имя по своему усмотрению. Если вы хотите записать в текстовый файл другие поля, внесите соответствующие изменения в приведенный ниже скрипт.

import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.time.OffsetDateTime;
import java.util.*;

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException, FileNotFoundException, UnsupportedEncodingException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String query = "covid -is:retweet";

        int maxResults = 100;

        String fileName = "tweet_ids.txt";

        TweetSearchResponse result = apiInstance.tweets().tweetsFullarchiveSearch(query, null, null, null, null,
                maxResults, null, null, null, null, null, null, null, null, null);

        if (result.getData() != null) {
            PrintWriter writer = new PrintWriter(fileName, "UTF-8");
            for (Tweet tweet : result.getData()) {
                writer.println(tweet.getId());
            }
            writer.close();
        }

    }

}
Вход в полноэкранный режим Выйти из полноэкранного режима

5. Получение твитов с информацией о пользователе для каждого твита

В приведенных примерах мы рассмотрели, как получить информацию о твитах для твитов, которые мы искали. Однако если вам нужна дополнительная информация, связанная с твитом, например, информация о пользователе, опубликовавшем твит, вы можете использовать расширения и передать ее в метод tweetsRecentSearch.

В данном примере нам нужна информация о пользователе, поэтому значение для expansions, которое мы передадим, будет author_id. Кроме того, мы укажем поля userFields, которые мы хотим вернуть, такие как profile_image_url, description (aka биография пользователя) и т.д. Подробнее о доступных полях можно узнать здесь.

Из ответа мы получим список пользователей из объекта includes. Затем мы найдем информацию о пользователе для каждого твита, используя author_id твита.

import java.util.*;

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        // Replace with your own bearer token below
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        Set<String> tweetFields = new HashSet<>(Arrays.asList("created_at", "lang", "conversation_id"));

        Set<String> userFields = new HashSet<>(Arrays.asList("description", "profile_image_url"));

        Set<String> expansions = new HashSet<>(Arrays.asList("author_id"));

        // Replace with your own query below
        String query = "covid -is:retweet";

        TweetSearchResponse result = apiInstance.tweets().tweetsRecentSearch(query, null, null, null, null, 100, null,
                null, null, expansions, tweetFields, userFields, null, null, null);

        // Create a map with User ID and User Object
        Map<String, User> userMap = new HashMap<>();
        if (result.getIncludes() != null && result.getIncludes().getUsers() != null) {
            List<User> users = result.getIncludes().getUsers();
            for (User user : users) {
                userMap.put(user.getId(), user);
            }
        }

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                User user = userMap.get(tweet.getAuthorId());
                System.out.println(tweet.getId());
                System.out.println(user.getUsername());
                System.out.println(user.getDescription());
            }

        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

6. Поиск твитов с географическими метками

Некоторые твиты содержат географическую информацию, связанную с ними. Конечные точки поиска в Twitter API v2 поддерживают такие операторы, как place, place_country, bounding_box, point_radius и т.д. (в настоящее время эти операторы доступны только в треке продуктов для академических исследований), которые позволяют получить эти твиты с географическими метками.

В примере ниже нам нужны все твиты из страны US, поэтому мы указываем ее в нашем поисковом запросе с помощью оператора place_country:US. Теперь, поскольку по умолчанию возвращаются только идентификатор твита и текст твита, нам необходимо указать, что мы хотим получить в ответе и геоинформацию. Для этого мы устанавливаем expansions в geo.place_id в методе tweetsRecentSearch, а также указываем гео-поля, которые мы ищем.

В нашем ответе мы получаем список мест из объекта includes, и мы выполняем поиск по place_id, чтобы получить соответствующую геоинформацию, связанную с твитом (название места в примере ниже).

import java.util.*;

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        Set<String> tweetFields = new HashSet<>(Arrays.asList("created_at", "lang", "geo"));

        Set<String> placeFields = new HashSet<>(Arrays.asList("name", "place_type"));

        Set<String> expansions = new HashSet<>(Arrays.asList("geo.place_id"));

        String query = "covid -is:retweet place_country:US";

        TweetSearchResponse result = apiInstance.tweets().tweetsRecentSearch(query, null, null, null, null, 100, null,
                null, null, expansions, tweetFields, null, null, placeFields, null);

        // Create a map with Place ID and Place Object
        Map<String, Place> placeMap = new HashMap<>();
        if (result.getIncludes() != null && result.getIncludes().getPlaces() != null) {
            List<Place> places = result.getIncludes().getPlaces();
            for (Place place : places) {
                placeMap.put(place.getId(), place);
            }
        }

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                Place place = placeMap.get(tweet.getGeo().getPlaceId());
                System.out.println(tweet.getId());
                System.out.println(place.getName());
            }

        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

7. Получение количества (объема) твитов для поискового запроса

До сих пор мы рассматривали примеры получения твитов по поисковому запросу. Однако если вы хотите получить количество твитов (объем) по поисковому запросу, вы можете использовать функцию tweetCountsRecentSearch. Вы можете передать ей поисковый query и указать granularity для агрегации данных, например, если вам нужен ежедневный подсчет, ежечасный подсчет или 15-минутный подсчет для поискового термина.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String query = "covid -is:retweet";

        TweetCountsResponse result = apiInstance.tweets().tweetCountsRecentSearch(query, null, null, null, null, null,
                null, Granularity.DAY);

        if (result.getData() != null) {
            for (SearchCount searchCount : result.getData()) {
                System.out.println(searchCount.getTweetCount());
            }

        }

    }

}
Вход в полноэкранный режим Выйдите из полноэкранного режима

8. Получение временной шкалы пользователя

Чтобы получить последние 3200 твитов из временной шкалы пользователя, мы можем использовать метод usersIdTweets и передать ему идентификатор пользователя. Мы также можем указать дополнительные поля, которые нам нужны, используя tweetFields и expansions (как показано в примерах выше).

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String userID = "2244994945";

        int maxResults = 100;

        GenericTweetsTimelineResponse result = apiInstance.tweets().usersIdTweets(userID, null, null, maxResults, null,
                null, null, null, null, null, null, null, null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
            }
        }

    }

}
Вход в полноэкранный режим Выйти из полноэкранного режима

9. Получение упоминаний пользователя

Чтобы получить последние 3200 упоминаний пользователя, мы можем использовать метод get_users_musersIdMentionsentions и передать ему id пользователя. Мы также можем указать дополнительные поля, которые нам нужны, используя tweetFields и expansions (как показано в примерах выше).

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String userID = "2244994945";

        int maxResults = 100;

        GenericTweetsTimelineResponse result = apiInstance.tweets().usersIdMentions(userID, null, null, maxResults,
                null, null, null, null, null, null, null, null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
            }
        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

10. Получение подписчиков пользователя

Чтобы получить подписчиков пользователя, мы можем использовать функцию usersIdFollowers и передать ей идентификатор пользователя. Если нам нужны дополнительные поля для объекта User, такие как profile_image_url, мы можем указать их с помощью параметра userFields.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String userID = "2244994945";

        GenericMultipleUsersLookupResponse result = apiInstance.users().usersIdFollowers(userID, null, null);

        if (result.getData() != null) {
            for (User user : result.getData()) {
                System.out.println(user.getId());
                System.out.println(user.getUsername());
            }
        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

11. Получение пользователей, за которыми следит пользователь

Чтобы получить список пользователей, за которыми следит пользователь, мы можем использовать функцию usersIdFollowing и передать ей идентификатор пользователя. Если нам нужны дополнительные поля для объекта User, такие как profile_image_url, мы можем указать их с помощью параметра userFields.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String userID = "2244994945";

        UsersFollowingLookupResponse result = apiInstance.users().usersIdFollowing(userID, null, null);

        if (result.getData() != null) {
            for (User user : result.getData()) {
                System.out.println(user.getId());
                System.out.println(user.getUsername());
            }
        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

12. Получение пользователей, которым нравится твит

Чтобы получить список пользователей, которым понравился твит, мы можем использовать функцию tweetsIdLikingUsers и передать ей идентификатор твита. Если нам нужны дополнительные поля для объекта User, такие как profile_image_url, мы можем указать их с помощью параметра userFields.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String tweetId = "20";

        GenericMultipleUsersLookupResponse result = apiInstance.users().tweetsIdLikingUsers(tweetId, null, null);

        if (result.getData() != null) {
            for (User user : result.getData()) {
                System.out.println(user.getId());
                System.out.println(user.getUsername());
            }
        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

13. Получение пользователей, которые ретвитнули твит

Чтобы получить список пользователей, которые ретвитнули твит, мы можем использовать функцию tweetsIdRetweetingUsers и передать ей идентификатор твита. Если нам нужны дополнительные поля для объекта User, такие как profile_image_url, мы можем указать их с помощью параметра userFields.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String tweetId = "20";

        GenericMultipleUsersLookupResponse result = apiInstance.users().tweetsIdRetweetingUsers(tweetId, null, null);

        if (result.getData() != null) {
            for (User user : result.getData()) {
                System.out.println(user.getId());
                System.out.println(user.getUsername());
            }
        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

14. Получение твитов, которые понравились пользователю

Чтобы получить список твитов, которые понравились пользователю, мы можем использовать функцию usersIdLikedTweets и передать ей идентификатор пользователя. Если нам нужны дополнительные поля для объекта Tweet, такие как context_annotations, created_at и т.д., мы можем указать их с помощью параметра tweetFields.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        String userId = "2244994945";

        UsersIdLikedTweetsResponse result = apiInstance.tweets().usersIdLikedTweets(userId, null, null, null, null,
                null, null, null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
            }
        }

    }

}
Вход в полноэкранный режим Выход из полноэкранного режима

15. Поиск твитов по идентификаторам твитов

В некоторых случаях, если у нас есть список идентификаторов твитов и мы хотим построить набор данных твитов по этим идентификаторам, мы можем использовать функцию findTweetsById и передать ей список идентификаторов твитов. По умолчанию возвращаются только идентификатор твита и текст твита. Если нам нужны дополнительные поля твита, мы можем указать их с помощью параметра tweetFields.

import com.twitter.clientlib.TwitterCredentialsBearer;
import com.twitter.clientlib.ApiException;
import com.twitter.clientlib.api.TwitterApi;
import com.twitter.clientlib.model.*;

import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class TwitterApiExample {

    public static void main(String[] args) throws ApiException {

        TwitterApi apiInstance = new TwitterApi();
        TwitterCredentialsBearer credentials = new TwitterCredentialsBearer("BEARER_TOKEN");
        apiInstance.setTwitterCredentials(credentials);

        List<String> tweetIds = Arrays.asList("1460323737035677698", "1519781379172495360", "1519781381693353984");

        Set<String> tweetFields = new HashSet<>(Arrays.asList("created_at", "lang", "context_annotations"));

        MultiTweetLookupResponse result = apiInstance.tweets().findTweetsById(tweetIds, null, tweetFields, null, null,
                null, null);

        if (result.getData() != null) {
            for (Tweet tweet : result.getData()) {
                System.out.println(tweet.getId());
                System.out.println(tweet.getLang());
                System.out.println(tweet.getCreatedAt().toString());
            }
        }

    }

}
Переход в полноэкранный режим Выход из полноэкранного режима

Это некоторые общие примеры работы с Twitter API v2 с помощью twitter-api-java-sdk.

Если у вас есть вопросы или замечания по этому руководству, пожалуйста, обращайтесь ко мне в Twitter!

Оцените статью
Procodings.ru
Добавить комментарий