file_get_contents で JSON データを取得する

【サンプルコード】
JSON形式のファイルを読み込み、呼び出し元ページへリダイレクトするプログラム。( ► JSONについて )

$requestUrl = "http://sample.com/sample/sample?access_token=xxxxx";
// ファイルのコンテンツを取得
$result = file_get_contents($requestUrl );
// デコード
$result = json_decode($result, true); // 第2引数を true にすると、連想配列を返す。
// 配列に格納
$arr = array('code' => $result["meta"]["code"],
'feed_data' => $result["data"]);
// エンコード
$encode = json_encode($arr);

if($DEBUG){
  // デバッグ時は、ブラウザに表示させる
  header(" Content-Type:text/javascript; charset=utf-8");
}else{
  //ブラウザに表示されないので、デバッグ時は何かと不便なため本番のみこっち。
  header(" Content-Type:application/json; charset=utf-8");
}
//上記について詳しくはこちら► http://goo.gl/rkHcD

echo $encode; //出力
exit;
file_get_contents …. ファイルの内容を全て文字列に読み込む ( PHP リファレンス )
json_decode …. JSON 文字列をデコードする ( PHP リファレンス )
json_encode …. JSON 文字列をエンコードする ( PHP リファレンス )
json_last_error …. 直近に発生したエラーを返す ( PHP リファレンス )

※ただし、上記プログラムを実行すると、取得した文字列に「/」を含む(URLなど)場合、json_encode でエスケープされてしまうため「\ /」となってしまう。

▼▼▼▼

 
PHP5.4以降から、json_encode で、引数に JSON_UNESCAPED_SLASHES を設定して、「/」をエンコードしないようにできるようになった。

Instagram API を使う

Client IDを取得する

1. Instagram Developer Documentation にアクセスして、 Register your application ボタンをクリックする。(要ログイン)

2. デベロッパー登録をする( URL・電話番号・APIを使って何を構築するか 、をそれぞれ記入)。

3. Manage Clients 画面 > Register a New Client ボタン > Register new OAuth Client 画面で、 アプリケーション名・(アプリケーションについての)説明・WebSite・OAuthのリダイレクトURL をそれぞれ記入。(全項目入力必須、後で編集可能)

4. 取得したClientIDを使って情報を取得(JSON形式)。

https://api.instagram.com/v1/media/popular?client_id=CLIENT-ID

※個人の投稿した写真を見る時や、コメントやLikeを管理する際には、 AOuth認証が必要となってくるが、ポピュラー写真を閲覧するだけの場合は特に認証は必要ない。

 
 

AOuth認証( Access Token を取得する)

1. Access Token を取得するために必要な code を取得する。

https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code

上記のURLに自分が登録した値を入力してブラウザからアクセスする。

 
2. 遷移した画面で認証すると、redirect_uri に設定したURLにcode 付きでリダイレクトされる。

http://REDIRECT-URI?code=xxxxxxxxxxxxxxxxx

※ユーザがアクセスを拒否した場合以下の結果を返すので、適宜エラー処理を行う
error: access_denied
error_reason: user_denied
error_description: The user denied your request

 
3. Access Token を要求する。

[ AccessToken の取得に必要なパラメータ ]
client_id … クライアントID
client_secret … クライアントシークレット
grant_type … 現在、”authorization_code”のみ指定することができる。
redirect_uri … 認証リクエストを送信した際にredirect_uriで指定した値。(注意: この値は、認証リクエストで指定した値と完全に一致していなければならない。)
code … 認証ステップで受け取ったcodeパラメータの値
※トークンの有効期限が含まれないことに注意する。返されたaccess_tokenは、明示的な有効期限はない。アプリケーションは、ユーザがアクセスを拒否したり、一定時間経過後にトークンの有効期限が切れた場合を適切に処理する必要がある。その場合には、レスポンスデータのmeta情報に “error_type=OAuthAccessTokenError” という値が入る。

今回、取得したAccessTokenはSessionに入れて管理した。

Microsoft Translator API service を使う

Google Translater APIが有料になってしまったので、無料のプランがある Microsoft の翻訳APIを使い、翻訳サービスを作成する

手順1)) Microsoft Translator APIの利用登録

1. Windows Azure Marketplaceにアクセス(要WindowsLiveID)

2. Microsoft Translatorの登録ページへ。1txは1000文字。
 ・¥12,559/1ヶ月(16000 tx/1ヶ月)
 ・¥6,280/1ヶ月 (8000 tx/1ヶ月)
 ・¥4,710/1ヶ月(6000 tx/1ヶ月)
 ・¥3,140/1ヶ月(4000 tx/1ヶ月)
 ・¥0 (2000 tx/1ヶ月)

3. 利用規約に同意すると、 マイアカウント の マイデータ ページにMicrosoft Translatorが表示される。

手順2)) アクセストークン を取得する

1. Azure DataMarket にアプリケーションを登録
クライアントID、名前、顧客の秘密(デフォルトで入力済)、リダイレクトURIを入力。説明の項目は任意で入力。
クライアントID以外の項目は後で編集可能。

2, アクセストークンの生成、取得のサンプルソース(PHP。プログラムにあわせて要修正)
AjaxInterfaceを使う —->>サーバーサイドでアクセストークンを取得し、クライアントサイドで 翻訳メソッドを処理実行。

……………………………………………………………………………………………………………………………………………………………………………

Obtaining an Access Token (アクセストークン を取得する) ページ内の一部訳

Bing AppID は廃止され、これ以上サポートされません。 前述したように、MicrosoftTranslator APIを使用してアクセストークンを取得する必要があります。アクセストークンは、OAuthの規格に準拠し、より安全であり、より柔軟性があります。
アクセストークンの値は、MicrosoftTranslatorAPIへのsubsequent の呼び出しに使用することができます。 (以下略

・プリフィックス “Bearer”+ ” ” + アクセストークンプロパティーの値 をAuthorization ヘッダとし、Microsoft Translator APIを呼び出す。
・*appid* のフィールドは空のままにする。
・アクセストークンは 10分間有効 。 有効期限が切れた場合は、再度アクセストークンを生成する。
・それぞれのリクエストでの 最大文字数は1000文字 まで。スペースとマークアップ文字を含む。

……………………………………………………………………………………………………………………………………………………………………………

Microsoft Translator API と x-webkit-speech(音声入力/Chrome) 使用して作成したWeb翻訳サービス

GoogleWeatherAPIから天気情報を取得する #2

APIから現在の天気ときょうの予報のみ取得する

※ Http通信で接続するため、manifestファイルにpermissionを追加する。

・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
// 取得するデータ
String c_condition;
String c_temp_f ;
String c_temp_c ;
String c_humidity ;
String c_wind ;
String t_low_temp;
String t_high_temp ;
String t_condition ;

// リクエストURL
String requestUrl= "http://www.google.com/ig/api?hl=ja&weather=fukuoka";

URL url = new URL(requestUrl);
// Http通信で接続する
HttpURLConnection http = (HttpURLConnection)url.openConnection();

// XmlPullParser オブジェクトを生成
XmlPullParser xpp = Xml.newPullParser();
// 取得したデータをStreamから直接読み込む
BufferedInputStream inBuffer = new BufferedInputStream(http.getInputStream());
// 日本語エンコード
BufferedReader reader = new BufferedReader(new InputStreamReader(inBuffer, "Shift_JIS"));
xpp.setInput(reader);

for(int e = xpp.getEventType(); e != XmlPullParser.END_DOCUMENT; e = xpp.next() ){
	String tag = xpp.getName(); //タグ名
			
	if(xpp.getDepth() == 3){ //3階層目
		boolean loop_break = false;	
				
		if("forecast_information".equals(tag)){
			do{	//必要ないのでループを進める
				xpp.next();
							
			}while(xpp.getDepth() == 4);
		}					
		//現在の天気データ
		if("current_conditions".equals(tag)){
			do{
				xpp.next();
				tag = xpp.getName();
							
				if(xpp.getEventType() == XmlPullParser.START_TAG){
					if("condition".equals(tag)){
						c_condition = xpp.getAttributeValue(0);
					}else if("temp_f".equals(tag)){
						c_temp_f  = xpp.getAttributeValue(0);
					}else if("temp_c".equals(tag)){
						c_temp_c  = xpp.getAttributeValue(0);							
					}else if("humidity".equals(tag)){
						c_humidity  = xpp.getAttributeValue(0);							
					}else if("wind_condition".equals(tag)){
						c_wind  = xpp.getAttributeValue(0);							
					}
				}							
			}while(xpp.getDepth() == 4);						
		}					
		//本日の天気予報データ	
		if("forecast_conditions".equals(tag)){
			do{
				xpp.next();
				tag  xpp.getName();
							
				if(xpp.getEventType() == XmlPullParser.START_TAG){							
					if("low".equals(tag)){
						t_low_temp = xpp.getAttributeValue(0);
					}else if("high".equals(tag)){
						t_high_temp  = xpp.getAttributeValue(0);
					}else if("condition".equals(tag)){
						t_condition  = xpp.getAttributeValue(0);
									
						//予報は本日分だけ取得するのでループを抜ける
						loop_break = true;
					}
				}
			}while(xpp.getDepth() == 4);
		}
					
		if(loop_break) break;
	}
}
reader.close();// BufferedReader を閉じる
inBuffer.close();// BufferedInputStream を閉じる
http.disconnect();// HttpURLConnection切断
  
HttpURLConnection(API Level1-)
Ref.) Android Developers>HttpURLConnection

XmlPullParser(API Level1-)
Ref.) Android Developers>XmlPullParser

BufferedInputStream(API Level1-)
Ref.) Android Developers>BufferedInputStream

BufferedReader (API Level1-)
Ref.) Android Developers>BufferedReader

GoogleWeatherAPIから天気情報を取得する #1

GoogleWeatherAPI …. 指定されたURLに場所情報を付与して送ると、ピンポイントの天気情報をxml形式で返すAPI。(※ただし、非公式)

URL) http://www.google.com/ig/api?weather=fukuoka

上記URLをブラウザでたたくと、以下のような結果がxmlで表示される。


















































 

【 取得できる情報 】

  • 現在の天気(current_conditions) … 天気、気温(華氏、摂氏)、湿度、天気のアイコン画像、風量
  • 予報データ(forecast_conditions) … 本日を含めて4日間の予報。天気、最高・最低気温、天気のアイコン画像。

 
● 天気情報の種類

  • Partly Sunny(ところにより晴れ)
  • Scattered Thunderstorms(激しいスコール)
  • Showers(にわか雨)
  • Scattered Showers(スコール)
  • Rain and Snow(雨と雪)
  • Overcast(曇天。曇りよりさらに曇った感じ?)
  • Light Snow(弱い雪)
  • Freezing Drizzle(霧雨)
  • Chance of Rain(雨の可能性)
  • Sunny(晴れ)
  • Clear(快晴)
  • Mostly Sunny(だいたい晴れ)
  • Partly Cloudy(ところにより曇り)
  • Mostly Cloudy(だいたい曇り)
  • Chance of Storm(嵐の可能性)
  • Rain(雨)
  • Chance of Snow(雪の可能性)
  • Cloudy(曇り)
  • Mist(霧)
  • Storm(嵐)
  • Thunderstorm(雷嵐)
  • Chance of Storm(嵐の可能性)
  • Sleet(みぞれ)
  • Snow(雪)
  • Icy(非常に寒い)
  • Dust(乾燥して埃っぽい?)
  • Fog(濃霧)
  • Smoke
  • Haze(かすみ、薄霧)
  • Flurries(突風)
  • Light Rain(弱い雨)
  • Snow Showers(吹雪)
  • Hail(あられ、ひょう)

 

● 天気アイコン画像の種類

  • weather_thunderstorms-40.gif
  • weather_partlycloudy-40.gif
  • weather_sunny-40.gif
  • weather_overcast-40.gif
  • weather_rainsnow-40.gif
  • weather_mostlycloudy-40.gif
  • weather_rain-40.gif
  • weather_scatteredthunderstorms-40.gif
  • weather_scatteredshowers-40.gif
  • weather_snowflurries-40.gif
  • weather_haze-40.gif
  • weather_smoke-40.gif
  • weather_fog-40.gif
  • weather_dust-40.gif
  • weather_icy-40.gif
  • weather_snow-40.gif
  • weather_sleet-40.gif
  • weather_cloudy-40.gif
  • weather_drizzle-40.gif
  • weather_windy-40.gif
  • weather_heavyrain-40.gif
  • weather_heavysnow-40.gif
  • weather_scatteredsnowshowers-40.gif