OAuthでRequest tokenの取る 
金曜日, 2月 18, 2011, 10:48 PM - プログラム

OAuthでRequest tokenの取る



twitterの公式のドキュメントを見ながらOAuthを突いてみたけど、
oauth_signatureを作るのにえらい悩んだのでその備忘録。

事の発端になったtwitterのサイト
Authenticating Requests with OAuth

登場するもの


base string


送信するパラメータなどの一式を以下の擬似コードの様につなげたもの。
ただし、oauth_tokenとoauth_token_secretは含まない。

httpMethod + "&" +
url_encode( base_uri ) + "&" +
sorted_query_params.each { | k, v |
url_encode ( k ) + "%3D" +
url_encode ( v )
}.join("%26")


composite signing key


<consumerSecret>&<tokenSecret>
※:ただし、tokenSecretは発行されるまではブランク

oauth_signature


base stringをcomposite signing keyでサインしたもの。
サインの方法はいろいろあるようだけど、今回はHMAC-SHA1を使用した。


oauth_signatureの作り方


basestringの準備


以下のものを組み合わせて作る。
・httpMethod : POSTやGET
・ベースのURL
・oauth_callback : コールバック先のURL
・oauth_consumer_key : 自分のコンシューマキー
・oauth_nonce : 乱数のワンタイムパスワード
・oauth_signature_method : oauth_signatureの方法
・oauth_timestamp%3D1272323042%26
・oauth_version%3D1.0
こんな感じの文字列になる。
POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11%26oauth_consumer_key%3DGDdmIQH6jhtmLUypg82g%26oauth_nonce%3DQP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1272323042%26oauth_version%3D1.0


oauth_signatureを作成する


上記のbase_stringにサインする。
Linuxのコマンドでやるとこんな感じ。
echo -n <base_string> | openssl dgst -sha1 -binary -hmac <composite signing key> | base64

実際に実行すると、こんな感じの文字列になる。
$ echo -n 'POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Flocalhost%253A3005%252Fthe_dance%252Fprocess_callback%253Fservice_provider_id%253D11%26oauth_consumer_key%3DGDdmIQH6jhtmLUypg82g%26oauth_nonce%3DQP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1272323042%26oauth_version%3D1.0' | openssl dgst -sha1 -binary -hmac 'MCD8BKwGdgPHvAuvgvz4EQpqDAtx89grbuNMRd7Eh98&' | base64 

8wUi7m5HFQy76nowoCThusfgB+Q= ←これがoauth_signature

というわけでoauth_signatureとして「8wUi7m5HFQy76nowoCThusfgB+Q=」が作成できました。


Request tokenを取得する


上記で取得したoauth_signature含めた文字列を
ヘッダのAuthorizationに入れて使ってリクエストを投げると
oauth_token、oauth_token_secret、oauth_callback_confirmedが返ってくる、、、らしい。
今日はできなかったのでここまで。

OAuth oauth_nonce="QP70eNmVz8jvdPevU3oJD2AfF7R7odC2XJcn4XlZJqk", oauth_callback="http%3A%2F%2Flocalhost%3A3005%2Fthe_dance%2Fprocess_callback%3Fservice_provider_id%3D11", oauth_signature_method="HMAC-SHA1", oauth_timestamp="1272323042", oauth_consumer_key="GDdmIQH6jhtmLUypg82g", oauth_signature="8wUi7m5HFQy76nowoCThusfgB%2BQ%3D", oauth_version="1.0"


  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 789 )

ウキウキWindow1.0.0リリース 
木曜日, 2月 3, 2011, 09:08 PM - ウキウキView
やっとウキウキWindowのバージョン1.0.0をリリースしました。
ウキウキWindowが何かといいますと、
「ウキウキView」と呼ばれるソーシャル系サービスの
クライアントアプリケーションです。

画面はこんな感じです。
端末の傾きや向きに合わせて3Dで表示されます。






お店の情報を見たり、
感情玉と呼ばれる他の人のコメントを見たり、




自分でコメントを残したりできます。


この手のアプリは今までもあったけど、
ウキウキWindowは3Dで表示してるので
見え方がいろいろと面白いのが良いところです。
あと、今までの単に地図上にコンテンツを重ねてたものは
密集すると何が何がなにやら分からないことが多かったですが、
これはそんなことなくわかりやすいです。

関西圏のコメントのみを最大数表示して表示するとこんな感じです。
感情玉が多すぎて何がなにやらw


やっと初期の構想の機能が実装できたので、
次は後から出てきたアイディアを実装していく予定。
おもしろいですな〜(つ・ω・)つ


リンク
ウキウキView(公式)
AR(拡張現実)アプリ開発記録-ブリリアントサービス
Web版ウキウキView
  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 2.9 / 800 )

ウキウキWindowのビルド方法 
火曜日, 1月 11, 2011, 11:42 PM - ウキウキView
私が作っているウキウキViewの
非公式クライアントである「ウキウキWindow」のビルド方法です。

準備物


ADTセットアップ済みのeclipse
Subclipse(Subversionのクライアント)

リポジトリからチェックアウトする


リポジトリからソースコードをチェックアウトします。

まず、次のリポジトリのURLをリポジトリロケーションに追加します。
リポジトリのURL : https://astroiders.googlecode.com/svn/




そして、tagsの中から最新の「UkiukiWindow」をチェックアウトします。
補足:
・UkiukiWindow3DはSHARPの3D液晶を持った端末専用の3D版です。
・UkiukiWindowDocはろくすっぽメンテされていないドキュメントです。


APIキーを設定する


res/values/string_key.xmlに取得した自分の
Google MapとウキウキViewのAPIキーを書き込みます。
補足:
・api_key_recruitは今はもう使っていないので無視して下さい


端末を繋いで実行する


実行するとウキウキWindowが起動します。



リンク


Android Maps API Key Signup
ウキウキViewサーバー

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 785 )

通常コンテンツ取得V4をAndroidから使う 
木曜日, 12月 30, 2010, 04:54 PM - ウキウキView
前回は長いURLでコンテンツ取得をしました。
今回はこれをAndroid側でどうやって取得して使うかについてです。

Android側で使う場合は次の2ステップで処理をします。
・HTTPリクエストを送信し、文字列として取得する
・取得した文字列をJSONとしてパースする
以下ではこの2つについて説明します。


HTTPリクエストを送信し、文字列として取得する


まずHTTPリクエストとなるURLを作ります。
作成するURLについては前回と同じですが、
これをHttpClientを使ってAndroidのコードで書くと次のようになります。
この例ではjsonString変数にコンテンツの文字列が格納されます。

HttpClient httpClient = new DefaultHttpClient();  
HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
HttpConnectionParams.setSoTimeout(httpParams, 30000);

// コンテンツ取得処理
DecimalFormat df = new DecimalFormat("0.000000");
String lat = df.format((double)geoPoint.getLatitudeE6() / 1E6d);
String lng = df.format((double)geoPoint.getLongitudeE6() / 1E6d);

// HTTP通信用のURLを作成する
String url = "https://www.uki2view.jp/uki2/message/message/v4/"
+ "?apikey=" + apiKey
+ "&lat=" + lat
+ "&lng=" + lng
+ "&range=7"
+ "&sort=1"
+ "&term=full"
+ "&model=" + model;

// HTTP通信を行ってjsonの文字列を取得する
String jsonString = null;
try {
HttpGet objGet = new HttpGet(url);
HttpResponse objResponse = httpClient.execute(objGet);
if (objResponse.getStatusLine().getStatusCode() < 400) {
StringBuilder sb = new StringBuilder(2<<12);
Reader in = new InputStreamReader(objResponse.getEntity().getContent());
char[] buf = new char[2 << 12];
int r;
while ((r = in.read(buf, 0, buf.length)) != -1) {
sb.append(buf, 0, r);
}
in.close();
jsonString = sb.toString();
}
} catch (IOException e) {
Log.d(LearnUkiukiWeb.TAG, e.getMessage(), e);
}


取得した文字列をJSONとしてパースする


上記で取得したコンテンツの情報は、
jsonの形でjsonString変数に格納されていますので、
それを分解してアプリ側で使える様に変換します。
次のコードのUkiukiBallInfoクラスはデータ格納用のクラスです。

// 取得結果をJSONに変換する
List<UkiukiBallInfo> ukiukiBallInfoList = new ArrayList<UkiukiBallInfo>();
try {
JSONObject jsonObject = new JSONObject(jsonString);
JSONObject results = jsonObject.getJSONObject("results");
JSONArray messageArray = results.getJSONArray("message");

for (int i=0;i<messageArray.length();i++) {
JSONObject message = messageArray.getJSONObject(i);
UkiukiBallInfo ubInfo = new UkiukiBallInfo();
ubInfo.setStatus(message.getInt("status"));
ubInfo.setLanguage(message.getString("language"));
ubInfo.setObjectid(message.getString("objectid"));
ubInfo.setNickname(message.getString("nickname"));
ubInfo.setLanguage(message.getString("language"));
ubInfo.setTitle(message.getString("title"));
ubInfo.setRegisttime(message.getString("registtime"));
ubInfo.setUserid(message.getString("userid"));
ubInfo.setUri(message.getString("uri"));
ubInfo.setMtype(message.getString("mtype"));
ubInfo.setParentid(message.getString("parentid"));
ubInfo.setModerate(message.getInt("moderate"));

int ubLat = (int)(message.getDouble("lat")*1E6);
int ubLng = (int)(message.getDouble("lng")*1E6);
ubInfo.setGeoPoint(new GeoPoint(ubLat, ubLng));
ukiukiBallInfoList.add(ubInfo);
}
} catch (JSONException e) {
Log.d(LearnUkiukiWeb.TAG, e.getMessage(), e);
}


これでコンテンツの情報が取得できました。
後は取得したコンテンツをアプリ側で自由に使うことができます。

# 余談ですがJSONObjectはコンストラクタにStringしか与えることが出来ないので、
# しばしば問題になることがあります。
# 現状では回避するには自分でjsonをパースするしかなさそうです、、


サンプルコード


上記コードのサンプルは下記URLからダウンロードできます。
なお、ウキウキView Web APIのAPIキーはmain.xmlに別途設定して下さい。

サンプルコード(eclipseのプロジェクト)

実行すると次のようになります。
この例では大阪駅周辺のコンテンツを取得しています。


取得したコンテンツの中にはアイコンのURLも含まれていますので
そこからアイコンを取得することも出来ます。


  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 91 )

ウキウキViewのAPIキーの準備からデータの取得まで 
木曜日, 12月 23, 2010, 01:22 AM - ウキウキView

APIキーの取得


ウキウキView Web APIを使うにはAPIキーが必要になります。
取得は簡単で下記URLから取得できます。




コンテンツを取得


次は取得できたAPIキーを使ってWeb APIからコンテンツを取得してみます。
今回は大阪駅周辺の感情玉の情報を取得してみます。
取得するにはHTTPのGETメソッドを使用します。

HTTPのリクエスト先のURL
https://www.uki2view.jp/uki2/message/message/v5/
パラメータ名今回設定する値説明
apikey上記で取得したAPIキーウキウキView Web APIのキー
lat34.701909中心となる緯度(これは大阪駅)
lng135.494977中心となる経度(これは大阪駅)
zoom16取得する距離、Google Mapのズームレベルで指定
termfull取得期間、fullは過去2年間
count20取得する感情玉の個数
modeltest端末のモデル


これらのパラメータをリクエスト先のURLの後に"?"を付け、
(パラメータ名)=(設定する値)を"&"で繋げて、一つの長いURLを作ります。
上記のURLとパラメータを組み合わせると次のような長ーーーーーーいURLになります。
https://www.uki2view.jp/uki2/message/message/v5/?apikey=********************************&lat=34.701909&lng=135.494977&zoom=16&term=full&count=50&model=test
※:APIキーは自分のもので置き換えて下さい。

これをWebブラウザに入力すると感情玉のコンテンツのjsonが取得できます。
※:ブラウザによっては文字化けたりダウンロードになるかもしれません。


これだけだとよくわからないので見やすくするとこんな感じになります。
{
"results":
{
"count": 6,
"clusters": [
{
"status": "0",
"objectid": "95526ce73caaad5bbead0d5ae48f6260",
"mtype": "emotion/joy",
"lat": "34.700970000000",
"lng": "135.496446000000",
"nickname": "fujita",
"uptime": "2010-03-06 11:09:17",
"language": "en",
"title": "",
"userid": "4e6cbc1f287702f30ff38cffce876e2b",
"registtime": "2010-03-06 15:51:30",
"moderate": "0"
},
{
"status": "0",
"objectid": "0c78af6081183e1e4b758d0eb3dce5f9",
"mtype": "emotion/joy",
"lat": "34.700970000000",
"lng": "135.496446000000",
"nickname": "fujita",
"uptime": "2010-03-06 11:09:17",
"language": "en",
"title": "",
"userid": "4e6cbc1f287702f30ff38cffce876e2b",
"registtime": "2010-03-06 15:40:14",
"moderate": "0"
},
{
"status": "0",
"objectid": "7dbd042f408b74f80c07d1ae25b84c76",
"mtype": "emotion/sad",
"lat": "34.701542000000",
"lng": "135.494677000000",
"nickname": "3156",
"uptime": "2010-05-10 11:11:18",
"language": "ja",
"title": "もうつかれた。",
"userid": "716147d06258486371b102a6fd355925",
"registtime": "2010-03-11 15:25:26",
"moderate": "0"
}, {
(中略)
}
]
}
}


このデータはjsonと呼ばれる汎用的なデータ構造なので、
大抵のプラットフォームで取り扱うことが出来ます。
Androidでは標準ライブラリのJSONObjectを使えば楽に取り扱えます。

今回は通常コンテンツ取得v5から取得しましたが、
ウキウキView Web APIには他にもホットペッパーやぐるなびの情報が取得できる
サービスデータ取得 APIなどもあり、同じように使用できます。
詳しくは下記リンクをご覧下さい。


リンク
ウキウキView Web API
通常コンテンツ取得V5

  |  0 trackbacks   |  このエントリーのURL   |  related link   |   ( 3 / 866 )


Back Next