更新履歴 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 データの内容を取得する