コメント |
[[TwitterSearch.java]]
@DIV
package com.example.listviewobjectjson;
import java.io.BufferedReader;
import java.io.InputStreamReader;
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 android.os.AsyncTask;
import android.util.Base64;
public class TwitterSearch {
// AsyncTask のインラインで参照する為の final
private final String _consumer_key;
private final String _consumer_secret;
private final String _token;
private final String _secret;
// API
private final String _tweet_api = "https://api.twitter.com/1.1/search/tweets.json";
// **************************************************************
// コンストラクタ
// **************************************************************
public TwitterSearch(String _consumer_key, String _consumer_secret,
String _token, String _secret) {
this._consumer_key = _consumer_key;
this._consumer_secret = _consumer_secret;
this._token = _token;
this._secret = _secret;
}
// **************************************************************
// AsyncTask の onPostExecute から外部イベントとして呼び出す為のインターフェイス
// **************************************************************
public interface Searched {
public void onSearchResult(String result);
}
// **************************************************************
// Twitter 投稿
// **************************************************************
public void Search(String query, int count, final Searched OnSearchResult) {
new AsyncTask<String, Void, String>() {
// **************************************************************
// 非同期処理
// **************************************************************
@Override
protected String doInBackground(String... params) {
ArrayList<String> lst = new ArrayList<String>();
String nonce = getNonce();
String timeStamp = getTimeStamp();
String result_string = "";
try {
// *********************************
// 投稿に必要なデータ (1)
// *********************************
lst.add("count=" + params[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(params[0], "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(_tweet_api,"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(_tweet_api + "?q="
+ rfc3986(URLEncoder.encode(params[0], "utf-8"))
+ "&count=" + params[1]
);
// 接続準備
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\"}";
}
return result_string;
}
// **************************************************************
// 非同期処理終了後の処理( 画面へのアクセスが可能 )
// **************************************************************
@Override
protected void onPostExecute(String result) {
// Tweet メソッドの引数のインターフェイス内のメソッドを呼び出す
OnSearchResult.onSearchResult(result);
}
}.execute(query,String.valueOf(count));
}
private String rfc3986( String param ) {
param = param.replace("+", "%20");
param = param.replace("*", "%2A");
param = param.replace("%7E","~");
return param;
}
private String dD(String param){
return "\""+param+"\"";
}
private String getNonce(){
Random random = new Random();
return String.valueOf(random.nextInt(1000000000));
}
private String getTimeStamp(){
return String.valueOf(System.currentTimeMillis() / 1000L);
}
private 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());
signature = new String (Base64.encodeToString(rawHmac, Base64.NO_WRAP));
} catch(NoSuchAlgorithmException e){
}
return signature;
}
}
@END |