AndroidアプリのFlickr API。 ログイン

こんにちはハブラ



AndroidアプリケーションでFlickr APIを使用した少しの経験を共有し、Flickrのユーザー認証についてお話しします。 将来的には、たとえばアルバムや画像のリストを表示するために使用できます。



アプリケーション登録



まず、APIキーを取得する必要があります。アプリケーションを商用目的で使用することはありません。登録するには、[ アプリ作成 ]リンクをクリックします







「Name」、「Purpose」、「Rights Agreement」の入力を求められ、データを送信します。その結果、APIキーとAPIシークレットを取得します。 将来的には、サーバーへのリクエストを作成するためにそれらが必要です。







その後、いくつかのデータを編集する必要があります。同じウィンドウで、 このアプリの認証フローの編集に進みます。







説明とロゴは私たちにとって興味深いものではありません。自由に入力できます。 [コールバックURL]フィールドでは、アクティビティに戻るために使用するコールバックアドレスを設定する必要があります。 私の場合、 appforflickr:// callbackを設定します<intent-filter>では、次のようになります。

... <data android:scheme="appforflickr" android:host="callback"/> ...
      
      



アプリの種類-[Webアプリケーション]を選択して変更を保存します。



次に、アプリケーション自体の構築に直接進みます。



アプリケーションマニフェストで、結果として「android.permission.INTERNET」<intent-filter>ブロックを追加すると、次のようになります。



 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="test.testflickrapi" > <uses-permission android:name="android.permission.INTERNET"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".ui.activities.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> <data android:scheme="appforflickr" android:host="callback"/> </intent-filter> </activity> </application> </manifest>
      
      







ユーザー認証用のリンクを作成する



アプリケーションでユーザーを認証するには、WebViewからアクティビティを実行します。 ただし、最初にログインアドレスを作成しましょう。 テンプレートは次のとおりです。
 http://flickr.com/services/auth/?api_key=[api_key]&perms=[perms]&api_sig=[api_sig]
      
      



[api_key]-これは、アプリケーションの登録時に取得されるキーです。 [perms]-アカウントアクセスレベル。次の値を取ることができます。



[api_sig]-署名。アプリケーションの登録中に受け取ったシークレットと、アルファベット順の引数のリスト、名前、値が含まれます。

この場合、APIキー: 5744fadec815a7e8142d03901065c97b 、シークレットAPI: 8b2c12e80b67970b書き込み許可、署名は次の行です:
 secret + 'api_key' + [api_key] + 'perms' + [perms]
      
      



つまり、 8b2c12e80b67970bapi_key5744fadec815a7e8142d03901065c97bpermswriteがあり、MD5でこの行を暗号化する必要があります。 これを行うには、次の方法を使用します。



 public static final String md5SumOfString(final String s) { try { MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(s.getBytes()); byte messageDigest[] = digest.digest(); StringBuffer hexString = new StringBuffer(); for (int i = 0; i < messageDigest.length; i++) hexString.append(Integer.toHexString(0xFF & messageDigest[i])); return hexString.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; }
      
      





[api_sig]の値を取得します。



その結果、ユーザー認証のアドレスは次のようになります。



 http://www.flickr.com/services/auth/?api_key=9a0554259914a86fb9e7eb014e4e5d52&perms=write&api_sig=b8d7c1ae026d5f86f1f44944f5257f3
      
      



onCreate()で追加
 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
      
      



ここで、urlは上記のアドレスです。 アプリケーションを起動した後、Webページを開いてユーザー名とパスワードを指定します。 入力されたデータが正しい場合、 コールバックURLは自動的にアプリケーションにリダイレクトされます。 値のfrobパラメーターがurlに追加されます。つまり、この場合は次のようになります。



 appforflickr://callback?frob=72157650137623777-b09eae52121bf8ad-130818926
      
      



アクセストークンを取得するには、 Frobが必要です。

onCreate()に条件を追加して、 frobを取得します。



 Uri uri = getIntent().getData(); if (uri != null) { String frob = uri.getQueryParameter("frob"); } else startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
      
      





その処理の後、 APIからflickr.auth.getTokenメソッドを呼び出して、 以降のリクエストに必要なトークンnsid 、およびユーザーのユーザー名フルネームを取得します



要求を送信するには、HttpRequestクラスを作成します。



 public class HttpRequest extends AsyncTask<String, String, String> { public static final String TAG = HttpRequest.class.getSimpleName(); @Override protected void onPreExecute() { Log.d(TAG, "START"); } @Override protected String doInBackground(String... params) { String result = ""; try { String uri = params[0]; HttpGet httpGet = new HttpGet(uri); HttpResponse response = HttpClientHelper.getHttpClient().execute(httpGet); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream inStream = entity.getContent(); result = InputStreamConverter.convertStreamToString(inStream); inStream.close(); } return result; } catch (IllegalStateException e) { return result; } catch (ClientProtocolException e) { return result; } catch (IOException e) { return result; } } @Override protected void onPostExecute(String result) { Log.d(TAG, "STOP"); } }
      
      







HttpClientを取得するクラスHttpClientHelper:



 public class HttpClientHelper { private static HttpClient httpClient = null; private static final int REGISTRATION_TIMEOUT = 30 * 1000; private static final int WAIT_TIMEOUT = 30 * 1000; private HttpClientHelper() {} public static synchronized HttpClient getHttpClient() { if (httpClient == null) { HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.DEFAULT_CONTENT_CHARSET); HttpProtocolParams.setUseExpectContinue(params, true); ConnManagerParams.setTimeout(params, WAIT_TIMEOUT); HttpConnectionParams.setConnectionTimeout(params, REGISTRATION_TIMEOUT); HttpConnectionParams.setSoTimeout(params, WAIT_TIMEOUT); SchemeRegistry schemeReg = new SchemeRegistry(); schemeReg.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schemeReg.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); ClientConnectionManager connectionMgr = new ThreadSafeClientConnManager(params, schemeReg); httpClient = new DefaultHttpClient(connectionMgr, params); } return httpClient; } }
      
      







InputStreamConverterクラスは、InputStreamを文字列に変換します。



 public class InputStreamConverter { private InputStreamConverter() {} public static String convertStreamToString(InputStream inputStream) { BufferedReader reader = new BufferedReader(new InputStreamReader( inputStream)); StringBuilder builder = new StringBuilder(); String line = null; try { while ((line = reader.readLine()) != null) { builder.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } return builder.toString(); } }
      
      







トークンのアドレス:



 https://api.flickr.com/services/rest/?method=flickr.auth.getToken&api_key=9a0554259914a86fb9e7eb014e4e5d52&frob=72157650137623777-b09eae52121bf8ad-130818926&format=json&nojsoncallback=1&perms=write&api_sig=8fd09b55f670ec9a4ba07c076e520ae8
      
      



答えがjsonの形式になるように、値format = jsonおよびnojsoncallback = 1からパラメーターを追加しました



もう一度、onCreate()を変更してリクエストを送信します。



 Uri uri = getIntent().getData(); if (uri != null) { String frob = uri.getQueryParameter("frob"); String url = "..."; //      token String response = ""; HttpRequest httpRequest = new HttpRequest(this); httpRequest.execute(url); try { response = httpRequest.get(); } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } else startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url)));
      
      







さらに受け取った答え:
 {"auth":{"token":{"_content":"12134650097774510-014feda8303a4a64"},"perms":{"_content":"write"},"user":{"nsid":"230211065@N05","username":"user","fullname":"User Alex"}},"stat":"ok"}
      
      



gsonjacksonなどのライブラリを使用して、目的のトークンnsidを取得することができます 。これはすでにアマチュアです。



私の記事が誰かに役立つことを願っています。



PS。 これはHabréでの私の最初の投稿であるため、簡潔さを気の毒に思っており、厳密に判断しないでください。



All Articles