このページの内容
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