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