山崎屋の技術メモ

IT業界で働く中で、気になること、メモしておきたいことを書いていきます。

Twitter API ベアラートークン(Bearer Token)を取得する

今更ですが Twitter API を 貪り始めました。

Twitter4J というライブラリもありますが、先ずは生の API を利用した方法をメモしておきます。

今回はベアラートークンの取得をシンプルに行いたいと思います。

ユーザー認証後に取得できるトークンとは異なり、ユーザ認証不要で取得できます。その代わり使える API は限定されます。

違いについてはこのサイトを参考に。
Twitter REST APIの使い方

開発者用 Twitter アカウントの取得や、アプリケーション申請などは済ませておいてください。

アカウント取得方法の参考です。
Twitter API 登録 (アカウント申請方法) から承認されるまでの手順まとめ ※2018年9月時点の情報 - Qiita

コード

決められたとおりにアクセスすれば取得できるので、先ずはソースの全量を載せます。

getBearerToken メソッドがベアラトークンを取得しているメソッドです。

package org.yyama.twittorej.domein;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Base64;

/**
 * 
 * BearerTokenクラス
 * 
 * @author yyama
 *
 */
public class BearerToken {

	private final String token;

	/**
	 * デフォルトコンストラクタ。ベアラトークンを取得する。
	 * 
	 * @throws IOException
	 */
	public BearerToken(String key, String seacret) throws IOException {
		token = getBearerToken(key, seacret);
	}

	private String getBearerToken(String key, String seacret) throws IOException {
		final String encodedKey = URLEncoder.encode(key, "UTF-8");
		final String encodedSeacretKey = URLEncoder.encode(seacret, "UTF-8");
		final String encodedString = Base64.getEncoder()
				.encodeToString((encodedKey + ":" + encodedSeacretKey).getBytes());
		URL urlObj = new URL("https://api.twitter.com/oauth2/token");
		HttpURLConnection http = (HttpURLConnection) urlObj.openConnection();
		http.setDoOutput(true);
		http.setRequestMethod("POST");
		http.setRequestProperty("Authorization", "Basic " + encodedString);
		http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
		http.setUseCaches(false);
		BufferedWriter wr = new BufferedWriter(new OutputStreamWriter(http.getOutputStream()));
		wr.write("grant_type=client_credentials");
		wr.flush();
		wr.close();

		// ボディ(コンテンツ)の取得
		InputStream is = http.getInputStream();
		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder sbBody = new StringBuilder();
		String s;
		while ((s = reader.readLine()) != null) {
			sbBody.append(s);
			sbBody.append("\n");
		}

		// Json 形式で取得されるトークンの文字列だけを切り出して返す。
		return getOnlyTokenString(sbBody.toString());
	}

	private String getOnlyTokenString(String sbBody) {
		String tmp = sbBody.replaceAll("\\{|\\}|\"|\n", "");
		return tmp.split(",")[1].split(":")[1];
	}

	/**
	 * ベアラトークンを返す。
	 * 
	 * @return bearer token
	 */
	public String token() {
		return token;
	}

}

HttpURLConnection を利用して、HTTP ヘッダとボディ部を設定してから TwitterAPI にアクセスします。
 
コメントにも記載していますが、レスポンスは JSON 形式で取得できるので、トークンだけを取得したい場合は整形が必要です。
 
コンストラクタの引数になっている key と seacret はアプリケーションを Twitter に登録したときに発行される Access token と access token secret です。
 
余談ですが、コンストラクタ内で final な変数に値を代入する場合、別スレッドが初期化前の final 変数を参照してしまうことがなくなるので、このクラスはスレッドセーフになっています。
 
 

まとめ

以上簡単ではありますが、今回は Twitter API を利用してベアラートークンの取得方法を紹介しました。

それでは!

Twitter API プログラミング

Twitter API プログラミング

Twitter!―Twitter APIガイドブック

Twitter!―Twitter APIガイドブック

データを集める技術 最速で作るスクレイピング&クローラー (Informatics&IDEA)

データを集める技術 最速で作るスクレイピング&クローラー (Informatics&IDEA)