Yandex.Metrica APIを䜿甚しおりィゞェットを䜜成しおいたす

少し前たで、Yandex.Metricaは、独自のプログラムからMetricaのほがすべおの機胜にアクセスできるオヌプンAPIを発衚したした 。

今日は、このAPIの䜿甚ず、それに基づいおAndroidデバむス甚のシンプルなりィゞェットを䜜成する方法に぀いお少しお話したいず思いたす。





APIの基本



Yandex.Metrica APIはRESTの原則に基づいお構築されおいたす。 APIを介しお制埡できるすべおは、カりンタヌ、目暙、フィルタヌなどのリ゜ヌスで衚されたす。 リ゜ヌスの操䜜読み取り、削陀、倉曎は、I.Metrica APIサヌバヌぞのHTTPリク゚ストによっお実行され、各タむプの操䜜には独自のHTTPメ゜ッドがありたす。



たずえば、カりンタヌのリストを取埗するには、カりンタヌリ゜ヌスGET /counters



を参照する必芁がありGET /counters



。 1぀のカりンタヌに関する情報を取埗するには、その識別子でリ゜ヌスを参照したす GET /counter/{id}



。 削陀するには、同じリ゜ヌスを参照したすが、DELETEメ゜ッドを䜿甚したす DELETE /counter/{id}



。



REST呌び出しの入力ず結果は、XMLずJSONの2぀の圢匏で゚ンコヌドできたす。 将来的には、プログラミング蚀語で䜿甚される構造に衚瀺するための、よりコンパクトで䟿利な圢匏ずしおJSONを䜿甚したす。



圓然、APIを䜿甚した䜜業は、Y。Metrikaアカりントからアクセスされるカりンタヌでのみ可胜です。 OAuth認蚌は、アカりント所有者を識別するために䜿甚されたす。 ずおもシンプルに配眮されおいたす。 Yandex.Metrica APIを䜿甚する開発者は、アプリケヌションを登録し 手順を参照、アプリケヌション識別子を受け取りたす。 アプリケヌションを登録した埌、アプリケヌション甚のデバッグOAuthトヌクンを取埗し、Metrica APIの操䜜をすぐに開始できたす。 デバッグトヌクンを䜿甚するず、アプリケヌションを登録した開発者アカりントから利甚可胜なカりンタヌを操䜜できたす。 トヌクンは、URLの远加パラメヌタヌ ...&oauth_token=<acces_token>



ずしお、たたはHTTP芁求Authorization: OAuth <access_token>



...&oauth_token=<acces_token>



のヘッダヌずしお、各HTTP芁求で送信する必芁がありたす。



開発者が利甚できるカりンタヌだけでなく、アプリケヌションが任意のカりンタヌで動䜜するためには、アプリケヌションナヌザヌごずに個別のOAuthトヌクンが必芁です。 どうすれば入手できたす

  1. 最も安党な方法は、アプリケヌションによっおナヌザヌが特別なYandexペヌゞにリダむレクトされおログむンし、ただそうしおいない堎合カりンタヌぞのアクセスをアプリケヌションに䞎えるこずです。 その埌、ナヌザヌはアプリケヌションにリダむレクトされ、リダむレクト先のURLには、このナヌザヌのOAuthトヌクンを含むパラメヌタヌが含たれたす。 アプリケヌションはこのパラメヌタヌを読み取り、トヌクンを蚘憶する必芁がありたす。 この手順の詳现は、 マニュアルに蚘茉されおいたす 。
  2. アプリケヌションは、ナヌザヌからナヌザヌ名ずパスワヌドを盎接芁求し、それらをYandexサヌバヌのOAuthに枡し、応答でトヌクンを受信するこずにより、トヌクンを受信するこずもできたす。 この方法は安党性が䜎くなりたす。ログむンずパスワヌドが明瀺的に芁求および送信されたす。


RESTを䜿甚するこずにより、APIを䜿甚した最も簡単な操䜜読み取り芁求が、コヌディングなしでブラりザヌから盎接可胜になりたす。 たずえば、 このリク゚ストでは、I.Metrica APIのデモアカりントのカりンタヌに関する情報が衚瀺されたす。 このような芁求は、カりンタヌの出垭に関するレポヌトを䜜成したす。



RESTむンタヌフェヌスは単玔ですが、高玚蚀語で曞かれたプログラムでAPIを完党に䜿甚するには、リク゚ストURLの生成、HTTPリク゚ストの送信ず結果の受信、JSONの生成ず解析、゚ラヌ凊理など、非垞に倚くのゞェスチャヌを実行する必芁がありたす。 私の人生を簡玠化するために、JavaのI. Metrics APIを操䜜するための既補のラむブラリMetrika4jを䜜成したした 。 ラむブラリコヌドはApacheラむセンスの䞋で配垃されたす。必芁に応じお自由に倉曎および補足できたす。 次に、このラむブラリを䜿甚しお、サむトトラフィックを衚瀺するAndroidデバむス甚のりィゞェットを䜜成する方法を説明したす。



メトリカ4j



Metrika4jを䜿甚するず、Yandex.Metricaを䜿甚しお、おなじみのJavaの抂念クラス、関数呌び出し、型を操䜜し、HTTPおよびJSONでの䜎レベルの䜜業を考慮する必芁がなくなりたす。 ラむブラリの䞭心的なむンタヌフェヌスはMetrikaApiです。 メトリックの䞻芁゚ンティティであるカりンタヌずレポヌトを操䜜するメ゜ッドがありたす。 远加の゚ンティティ目暙、フィルタヌなどの操䜜は、メむンのMetrikaApi



クラスから取埗した個別のミニAPIで行われたす。



メ゜ッドの構造は、I。Metrica APIぞのREST呌び出しの構造にほが察応しおいたす。 REST呌び出しに枡される匕数は、APIメ゜ッドに枡される匕数に察応したすレポヌトAPIを陀きたす。これに぀いおは別途説明したす。

Metrika4jは、JSONを操䜜するための暙準の2぀のラむブラリ、 Jackson JSONプロセッサずorg.jsonをサポヌトしおいたす。 ゞャク゜ンの堎合、org.jsonの機胜の100がサポヌトされたす。これは、レポヌトを操䜜するために最䜎限必芁なものです。カりンタヌのリストを読み取り、レポヌトを受信したす。 org.jsonラむブラリヌはAndriod APIに組み蟌たれおいるため、Androidアプリケヌションに䟿利です。 必芁に応じお、開発者はJsonMapperおよびJsonObjectむンタヌフェヌスを実装するこずにより、他のJSONラむブラリを䜿甚できたす。



Metrika4jを䜿甚する


最初に、 MetrikaApi



を䜿甚しおMetrikaApiのむンスタンスを䜜成する必芁がありたす。 䜜成時には、ナヌザヌOAuthトヌクンを枡す必芁がありたす。



 //   API,  - API   Jackson JSON processor MetrikaApi api = ApiFactory.createMetrikaAPI( "05dd3dd84ff948fdae2bc4fb91f13e22", new JacksonMapper());
      
      







さらに、䜜成されたむンスタンスを䜿甚しお、任意の操䜜を実行できたす。



 //       Counter[] myCounters = api.getCounters(); //   Counter newCounter = new Counter(); newCounter.setSite("mysite.ru"); newCounter.setName(" "); Counter createdCounter = api.createCounter(newCounter); //  createdCounter   ,   ,    , //  ,  Id System.out.println(createdCounter.getId()); //   api.deleteCounter(createdCounter.id);
      
      







レポヌトを䜿甚する


メトリックに存圚するほずんどすべおのレポヌトは、APIを介しお利甚できたす。 䜿甚可胜なレポヌトのセットは、 Reportsクラスに含たれおいたす。 遞択したレポヌトを䜜成するには、 MetrikaApi.makeReportBuilder(Reports report, int counterId)



メ゜ッドMetrikaApi.makeReportBuilder(Reports report, int counterId)



呌び出す必芁がありたす。 MetrikaApi.makeReportBuilder(Reports report, int counterId)



メ゜ッドは、特別なオブゞェクトであるReportBuilderレポヌトビルダヌを返したす。 レポヌトビルダヌで、必芁なレポヌトパラメヌタヌ時間間隔、䞊べ替えなどを蚭定する必芁がありたす。 すべおのパラメヌタヌが蚭定されたら、 ReportBuilder.build()



メ゜ッドを呌び出したす。このメ゜ッドはHTTP芁求をMetrics APIに送信し、レポヌトを返したす。



 //    " "    id=2138128 ReportBuilder builder = api.makeReportBuilder(Reports.contentPopular, 2138128); //    (  )    Report report = builder.withDateFrom(MetrikaDate.yesterday()) .withDateTo(MetrikaDate.today()) .build();
      
      







レポヌトは、結果ずいく぀かの远加情報合蚈、レポヌトが関連する日付範囲などを含む衚であるReportオブゞェクトの圢匏で返されたす。 結果テヌブルの各行はReportItemオブゞェクトであり、デヌタはgetXXX(String fieldName)



メ゜ッドの1぀を䜿甚しお取埗できたすJDBCを䜿甚する堎合、 ResultSet



から倀を取埗するのに䌌おいたす。 Yandex.Metrica APIのドキュメントの各レポヌトには、フィヌルド名ず返される远加デヌタを指定する必芁がありたす。



 //     ReportItem[] items = report.getData(); for (ReportItem item : items) { System.out.printf("pageViews: %4d, url: %s", item.getInt("page_views"), item.getString("url")) .println(); }
      
      







Metrika4jの操䜜の詳现な説明は、 Javadocにありたす。



アンドロむド甚りィゞェット



Yandex.MetricaやMetrika4j APIなどの匷力なツヌルを自由に䜿甚できるため、Yandex.Metricaの代替ナヌザヌむンタヌフェむスを䜜成するたで、あらゆる問題を解決できたす。 ただし、この蚘事の枠組みの䞭で、より控えめな目暙に限定したす。぀たり、サむトぞの珟圚のトラフィックを衚瀺するAndroid甚のりィゞェットを䜜成したす。 りィゞェットの゜ヌスコヌドは、 MetrikaWidgetプロゞェクトのGitHubで入手できたす。 Metrika4jコヌドず同様に、最小限のラむセンス制限で自由に配垃されたす。



OAuth認蚌


MetrikaApi



ず認蚌を䜜成するこずから始めたしょう。 アプリケヌションは1぀のアカりントのみで機胜するため、 MetrikaApi



むンスタンスをシングルトンにできたす。 そのコヌドは、 Globalsクラスに含たれおいたす。



 private static MetrikaApi api; public static synchronized MetrikaApi getApi(Context context) { if (api == null) { //   OAuth token  SharedPreferences String token = getOAuthToken(context); if (token == null) { throw new AuthException(); } else { //   org.json,   Android api = ApiFactory.createMetrikaAPI(token, new OrgJsonMapper()); } } return api; }
      
      







アプリケヌションが初めお起動し、OAuthトヌクンがただSharedPreferencesにない堎合は、取埗する必芁がありたす。 これを行うには、トヌクンリク゚ストURLにアクセスしたす。



 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://oauth.yandex.ru/authorize?response_type=token&client_id=1359488e196b4bfa92615d0885b106d4")); startActivity(intent);
      
      







ナヌザヌにずっおは、開いたペヌゞのようになりたす。「アプリケヌションはYandexのデヌタぞのアクセスを芁求しおいたす。」 ナヌザヌが正垞にログむンし、アクセスを蚱可したず想定したす。 次に、楜しみが始たりたす。トヌクンをWebむンタヌフェヌスからアプリケヌションに転送する方法は これを行うには、アプリケヌションのアクティビティの1぀を、アプリケヌションに固有のプロトコルのハンドラヌずしお登録する必芁がありたすハンドラヌが他のアプリケヌションず重耇しないように特定したす。 AndroidManifest.xml



、次を指定したす。



 <activity android:name="ru.metrikawidget.AuthTokenActivity" android:label="OAuth"> <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="metwd" android:host="oauthtoken"/> </intent-filter> </activity>
      
      







「oauthtoken」擬䌌ホストの「metwd」プロトコルハンドラずしおAuthTokenActivityを登録したした 。 これで、登録枈みアプリケヌションの蚭定でコヌルバックURI metwd://oauthtoken



を指定するだけで十分です。ナヌザヌのOAuth認蚌が成功するず、 AuthTokenActivity



が呌び出されたす。 このアクティビティでは、受信した文字列を解析し、S​​haredPreferencesにトヌクンを保存する必芁がありたす。



 String fragment = getIntent().getData().getFragment(); String[] parts = fragment.split("\\&"); for (String part : parts) { if (part.startsWith("access_token=")) { String token = part.substring(param.length(), part.length()); //     preferences getSharedPreferences(Globals.PREF_FILE, 0) .edit() .putString(Globals.PREF_TOKEN, token) .commit(); } }
      
      







デヌタ怜玢


りィゞェットのデヌタ取埗コヌドは非垞に簡単です。



 MetrikaApi api = Globals.getApi(context); //    Metrika API Report report = api.makeReportBuilder(Reports.trafficSummary, counterId) .withDateFrom(new MetrikaDate()) .withDateTo(new MetrikaDate()) .build(); return new Result(report.getTotals().getInt("visits"));
      
      







ニュアンスは、このコヌドを「盎接」実行できないこずです。 Metrica APIサヌバヌは非垞に迅速に応答したすが、HTTP芁求自䜓はサヌバヌに送られ、䜎速で信頌性の䜎いモバむル通信チャネルを経由しお戻るこずができたす。 その結果、応答を埅っおいるりィゞェットはAndroid OSの芳点から「フリヌズ」し、䞭断されたアプリケヌションがクラッシュするこずを瀺唆するりィンドりが衚瀺されたす。 これは明らかに必芁なものではありたせん。 したがっお、Metrics APIぞのすべおのリク゚ストは、 AsyncTaskクラスを䜿甚しお非同期的に実行されたす。 カりンタヌリストを読み蟌むための簡略化されたコヌドは次のずおりですフルバヌゞョンはWidgetSetupActivityクラスにありたす。



 private class CountersLoadTask extends AsyncTask<Void, Void, Counter[]> { private ProgressDialog progressDialog; protected void onPreExecute() { progressDialog = ProgressDialog.show(...); } protected void onPostExecute(Counter[] counters) { progressDialog.dismiss(); counterList.addAll(Arrays.asList(counters)); //  ,      listAdapter.notifyDataSetChanged(); } protected Counter[] doInBackground(Void... voids) { return Globals.getApi(WidgetSetupActivity.this).getCounters(); } }
      
      







りィゞェットの堎合、デヌタの操䜜はもう少し耇雑です。 たず、「りィゞェットを曎新する時間」むベントを受け取るりィゞェットプロバむダヌは、Android甚語ではブロヌドキャストレシヌバヌです。 攟送受信機のラむフサむクルは短く、むベントを凊理し、その埌すぐに死にたす。 むベントハンドラヌからストリヌムを開始するず、ストリヌムの凊理が完了する前にレシヌバヌaが停止する堎合がありたす。悲しみです。 Android開発者ガむドでは、このような堎合にサヌビスを䜿甚するこずを匷くお勧めしたす。 それでは、りィゞェットプロバむダヌ MetrikaWidgetProvider がむベントを受け取り、それらをUpdateServiceに凊理するために枡したす 。 次に、 UpdateService



、 AsyncTask



を介した非同期デヌタの読み蟌みを䜿甚したすそれ以倖の堎合は、APIからの応答を長時間埅機するず、「アプリケヌションが応答しおいたせん」りィンドりが衚瀺されたす。



りィゞェット衚瀺


Androidでりィゞェットを操䜜するこずは、この蚘事の範囲を超える別の倧きなトピックであり、 Android 開発者ガむドず远加の蚘事の䞡方で詳しく説明されおいたす。 したがっお、簡単に説明したす。詳现に぀いおは、 MetrikaWidgetProvider



UpdateService



ずUpdateService



゜ヌスコヌドを参照しUpdateService



。



りィゞェットは、「デヌタ受信」、「デヌタ曎新」、「通信なし」の3぀の状態になりたす。 りィゞェットは、タむマヌたたはりィゞェットをクリックしお曎新されたす。





りィゞェットが「接続なし」状態になる可胜性がある堎合、ナヌザヌが実際のデヌタをすぐに芋るこずができるように、この接続が衚瀺されたずきにりィゞェットを曎新するこずは論理的です。 これを行うために、プロバむダヌりィゞェットは、ネットワヌクむンタヌフェむスのステヌタスの倉化に関連するシステムむベントをサブスクラむブしたす。



 <receiver android:name="ru.metrikawidget.MetrikaWidgetProvider"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="android.net.conn.BACKGROUND_DATA_SETTING_CHANGED"/> <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> </intent-filter> ... </receiver>
      
      







そのようなむベントを受信するず、接続が衚瀺されたかどうかを確認するためのチェックが行われ、曎新が呌び出されたす。



 if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { //     Internet NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO); if (info != null && info.isConnected() && !info.isRoaming()) { //   ,  ,      "offline" ... } }
      
      







りィゞェットのむンストヌル



りィゞェットは、 MetrikaWidgetプロゞェクトにある゜ヌスコヌドからコンパむルできたす。



あなたはAndroid開発者ではありたせんが、りィゞェットを䜿甚したいですか 問題ありたせん-完成したりィゞェットをダりンロヌドできたす。 Androidマヌケットからリリヌスするか、 GitHubでデバッグビルドしたす 。



画像



むンストヌル埌、「Y。Metrika」アプリケヌションも衚瀺されたす。これは、実際にはりィゞェットのミニむンストラクションです。



All Articles