【TwitterAPI】Search API の使い方(Java編)

Application-only authentication: Oauth2 (bearer token)

あるハッシュタグが付いたツイートの一覧を取得したり、あるツイートの埋め込み用HTMLを取得したりなど、Twitterにログインしなくても使える機能については、この方式に則って認証しておく必要があります。逆に言うと、ツイートをしたり、フォローするなど、ログインしないと使えない機能については、Application-user authentication: Oauth 1aに則った認証が必要ですが、それはまた別の記事で扱うことにします。

準備するもの

Twitter Developer のページから、アプリケーションを新規登録して、下記の情報をメモしておきましょう。

  • API key
  • API secret key

bearer token を取得

下記のライブラリを使用しています。

  • OkHttp3
  • Jackson
import java.nio.charset.StandardCharsets;

import org.apache.tomcat.util.codec.binary.Base64;

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public class TwitterApiSample {
	private String getBearerToken() throws IOException {
		String apiKey = "your_api_key_here";
		String apiSecret = "your_api_secret_key_here";
		
		String src = apiKey + ":" + apiSecret;
		String cred = Base64.encodeBase64String(src.getBytes(StandardCharsets.UTF_8));
		
		String url = "https://api.twitter.com/oauth2/token";
		
		RequestBody body = RequestBody.create(
				MediaType.parse("application/x-www-form-urlencoded;charset=UTF-8"),
				"grant_type=client_credentials");
		
		Request request = new Request.Builder()
		        .url(url)
		        .addHeader("Authorization", "Basic " + cred)
		        .post(body)
		        .build();
		
		OkHttpClient client = new OkHttpClient();
		
		Response response = client.newCall(request).execute();
		String responseStr = response.body().string();
		
		ObjectMapper mapper = new ObjectMapper();
		TypeReference<HashMap<String, String>> reference = new TypeReference<HashMap<String, String>>() {};
		Map<String, String> map = mapper.readValue(responseStr, reference);		

		return map.get("access_token");
	}
}

ここでは、API Key や API secret key をハードコーディングしていますが、本番運用を考えると外部ファイルに記述するほうがよいでしょう。
また、Github で public なリポジトリを利用している場合は、不用意にアップしないように注意しましょう。

スポンサーリンク

Search API

日本語文字列を検索する方法

例として、ある日本語の文字列を含むツイートの一覧を取得するメソッド search(String word) を実装してみます。
ポイントとしては、日本語を含む文字列を検索する場合、ダブルクォーテーションで囲ったうえで、UTF-8でURLEncodeする必要があることです。
ハッシュタグ(#)を検索する場合は、#も含めてエンコードします。

	private String search(String word) throws Exception {
		TwitterApiSample app = new TwitterApiSample();
		String json = app.search("#ぷーとん");
		return json;
	}

	private String search(String word) throws Exception {
		String url = "https://api.twitter.com/1.1/search/tweets.json"
				 		+ "?q=" + urlEncode(word);
		
		Request request = new Request.Builder()
		        .url(url)
		        .addHeader("Authorization", "Bearer " + getBearerToken())
		        .build();

		OkHttpClient client = new OkHttpClient();
		Response response = client.newCall(request).execute();
		return response.body().string();
	}

	private String urlEncode(String word) {
		try {
			return URLEncoder.encode("\"" + word + "\"", "UTF-8");
		} catch (UnsupportedEncodingException e) {
			return word;
		}
	}

この戻り値はJSON形式になっており、JacksonなどのJSONを扱えるライブラリでJavaオブジェクトに変換して使うと便利です。
文字列以外にも、ツイートされた日付や戻り値に含まれるツイートの件数などを指定して検索することもできます。
このあたりの詳細は、APIドキュメントを参照してください。
戻り値のJSONフォーマットについても記述があります。

参考URL

  • https://developer.twitter.com/en/docs/basics/authentication/guides/bearer-tokens.html
  • https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets
スポンサーリンク
関連キーワード
Java, SearchAPI, TwitterAPIの関連記事
  • 【TwitterAPI】POST statuses/update APIの使い方( Java で ツイートbot)
  • 【TwitterAPI】Search API の使い方(Java編)
  • 【Java】Jacksonを使ったJSONの解析(エンコード、文字列化)
  • Jacksonで文字列をオブジェクトへ変換
    【Java】Jacksonを使ったJSONの解析(導入とデコード)
  • JavaでHTTPクライアント
    【Java】OkHttp で HTTP クライアントを作成する方法
おすすめの記事