更新履歴 2013-10-09 : 初回投稿 2013-10-13 : rfc3986 対応と、検索結果を一覧で表示 SkyDrive へ移動BASE64 のエンコードには、外部ライブラリが必要です。( Android ならば Android SDK 内に存在します )
URLエンコードに、URLEncoder.encode を使っていますが、正確には結果の文字列に少し加工が必要です実装しました JSON の処理には、google-gson を使用しています ※ API に対して件数の引数は渡していません
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
import com.google.gson.Gson;
public class HttpAndGet {
public static void main(String[] args) {
// コマンドを入力する為の 128 バイトのバッファ
byte[] line = new byte[128];
// コマンド部分を抽出する文字列
String command = "";
int i_len = 0;
// 終了コマンド
while( !(command.toUpperCase().equals("Q")) ) {
try {
// プロンプト出力
System.out.print("java>");
// 入力( 改行付きで入力 )
i_len = System.in.read(line);
} catch (IOException e) {
e.printStackTrace();
}
try {
// 入力内容を文字列に変換して、入力文を取り出す
command = (new String(line, "SJIS")).substring(0, i_len);
// コマンドのみに変換
command = command.trim();
} catch (UnsupportedEncodingException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
// コマンド処理( 大文字小文字を区別しない )
// "get 検索文字列" で検索( 省略時は "get sworc" とみなす )
if ( (command.toUpperCase()+" ").subSequence(0, 3).equals("GET") ) {
String search_string = null;
String[] data = command.split(" ");
if ( data.length == 1 ) {
search_string = "sworc";
}
else {
search_string = data[1];
}
Twitter_Search(search_string);
}
// MS932 で判断
if ( command.equals("強制終了") ) {
System.out.print("強制終了します");
System.exit(0);
}
}
System.out.print("プログラムを終了しました");
}
private static String _api_url = "https://api.twitter.com/1.1/search/tweets.json";
private static String _consumer_key = "";
private static String _consumer_secret = "";
private static String _token = "";
private static String _secret = "";
// ******************************************************************
// Twitter API の検索
// ******************************************************************
public static void Twitter_Search(String search_string) {
System.out.println("Twitter_Search を実行中です");
ArrayList<String> lst = new ArrayList<String>();
String nonce = getNonce();
String timeStamp = getTimeStamp();
String result_string = "";
try {
// *********************************
// 投稿に必要なデータ (1)
// *********************************
lst.add("oauth_consumer_key=" + _consumer_key);
lst.add("oauth_nonce=" + nonce);
lst.add("oauth_signature_method=" + "HMAC-SHA1");
lst.add("oauth_timestamp=" + timeStamp);
lst.add("oauth_token=" + _token);
lst.add("oauth_version=1.0");
lst.add("q=" + rfc3986(URLEncoder.encode(search_string, "utf-8")));
Collections.sort(lst);
String work = "";
for(int i = 0; i < lst.size() ; i++ ){
if ( i != 0 ) {
work += "&";
}
work += lst.get(i);
}
// *********************************
// 投稿に必要なデータ (2)
// *********************************
String work2 = "GET" + "&";
// API のエントリポイント
work2 += rfc3986(URLEncoder.encode(_api_url,"utf-8")) + "&";
// 投稿に必要なデータ (1)
work2 += rfc3986(URLEncoder.encode(work,"utf-8"));
// *********************************
// 投稿に必要なデータ (3)
// *********************************
String oauth_signature = getSignature(work2);
// *********************************
// 投稿に必要なデータ (4) / ヘッダ
// *********************************
String data = "oauth_consumer_key=" + dD(_consumer_key) +
",oauth_nonce=" + dD(nonce) +
",oauth_signature=" + dD(rfc3986(URLEncoder.encode(oauth_signature, "utf-8"))) +
",oauth_signature_method=" + dD("HMAC-SHA1") +
",oauth_timestamp=" + dD(timeStamp) +
",oauth_token=" + dD(_token) +
",oauth_version=" + dD("1.0");
// 投稿先
URL url = new URL(_api_url + "?q=" + rfc3986(URLEncoder.encode(search_string, "utf-8")));
// 接続準備
HttpURLConnection http = (HttpURLConnection)url.openConnection();
http.setConnectTimeout(30000);
http.setReadTimeout(30000);
http.setRequestMethod("GET");
// ヘッダ
http.setRequestProperty("Authorization", "OAuth " + data);
InputStreamReader isr = null;
try {
// 受信用ストリーム
isr = new InputStreamReader(http.getInputStream(), "UTF-8");
}
catch( Exception e ) {
isr = new InputStreamReader(http.getErrorStream(), "UTF-8");
}
// 受信
BufferedReader br = new BufferedReader(isr);
String line_buffer;
while ( null != (line_buffer = br.readLine() ) ) {
// コマンドプロンプトに表示
result_string += line_buffer;
}
// 終了処理
br.close();
isr.close();
http.disconnect();
}
catch( Exception e ) {
result_string = "{\"errors\":\"unknown\"}";
}
// Gson を作成
Gson gson = new Gson();
System.out.println(result_string);
JSON_ENTRY je = gson.fromJson(result_string,JSON_ENTRY.class);
for(TWITTER item : je.statuses) {
System.out.println( item.text );
System.out.println( item.user.name );
System.out.println( item.user.profile_image_url );
System.out.println( "-----------------------" );
}
}
private static String rfc3986( String param ) {
param = param.replace("+", "%20");
param = param.replace("*", "%2A");
param = param.replace("%7E","~");
return param;
}
private static String dD(String param){
return "\""+param+"\"";
}
private static String getNonce(){
Random random = new Random();
return String.valueOf(random.nextInt(1000000000));
}
private static String getTimeStamp(){
return String.valueOf(System.currentTimeMillis() / 1000L);
}
private static String getSignature(String baseString){
String work = "";
work += _consumer_secret;
work += "&";
work += _secret;
String signature = "";
SecretKeySpec key = new SecretKeySpec(work.getBytes(), "HmacSHA1");
try {
Mac mac = Mac.getInstance(key.getAlgorithm());
try{
mac.init(key);
} catch(InvalidKeyException ike){
}
byte[] rawHmac = mac.doFinal(baseString.getBytes());
// http://commons.apache.org/proper/commons-codec/
signature = new String (Base64.encodeBase64(rawHmac));
} catch(NoSuchAlgorithmException e){
}
return signature;
}
// ******************************************************************
// BufferedReader から テキストを取得
// ******************************************************************
static class TextReader {
public String getText(BufferedReader br) throws IOException {
String result_string = "";
String line_buffer = null;
// BufferedReader は、readLine が null を返すと読み込み終了
while ( null != (line_buffer = br.readLine() ) ) {
result_string += line_buffer;
}
return result_string;
}
}
static class JSON_ENTRY {
TWITTER[] statuses;
}
static class TWITTER {
String text;
USER user;
}
static class USER {
String name;
String profile_image_url;
}
}
関連する記事 ■ Java : Eclipse 実行の System.in.read(buff) でコンソール入力 ■ RFC 3986 に基づいた URL エンコード の簡単な理解 ■ Android : ListView Twitter 検索テンプレート
|
|
【java : 通信関連の最新記事】
- Java : WEB上のテキストファイルを取得する
- Java11 + Visual Studio Code + JavaMail( with JavaBeans Activation Framework )
- Javamail で IMAP 受信
- OkHttp v3.8.0 jar( と okio 1.13.0.jar ) を Eclipse のプロジェクトに追加して一般的な POST 送信を行う
- java をコマンドプロンプトからビルドして実行するサンプル。( メール送信が初心者には楽しいはず )
- Eclipse + JFace : HttpURLConnection で GET
- javamail でメール送信と、付属のバッチビルド用のスクリプトの解説
- google-gson(Java) を使って、JSON を 定義済みクラスのオブジェクトに一括変換する
- Java : RSS(Document) から、item の中の先頭の指定した要素の値を取得するクラス
- google-gson で、JSON 文字列の構成要素の一覧を取り出す処理
- java : Apache commons-net-3.0.1 を使ってごく自然に FTPS(セキュア) でファイルのアップロード/ダウンロード
- javamail 1.4.4 : IMAP で、ユーザから別のユーザへメッセージを全て(範囲指定で)コピーする
- javamail 1.4.4 : IMAP のメール受信イベントでメールを受け取ったら処理を行う
- Java : WEB 上の XML データの内容を取得する







