Store 서비스를 사용하여 분석 데이터에 액세스

Microsoft Store 분석 API를 사용하여 사용자 또는 조직의 Windows 파트너 센터 계정에 등록된 앱에 대한 분석 데이터를 프로그래밍 방식으로 검색합니다. 이 API를 사용하면 앱 및 추가 기능(앱 내 제품[IAP]이라고도 함) 구입, 오류, 앱 평점 및 리뷰에 대한 데이터를 검색할 수 있습니다. 이 API는 Azure AD(Azure Active Directory)를 사용하여 앱 또는 서비스의 호출을 인증합니다.

다음 단계에서는 엔드투엔드 프로세스를 설명합니다.

  1. 모든 필수 조건을 충족하였는지 확인하세요.
  2. Microsoft Store 분석 API에서 메서드를 호출하기 전에 Azure AD 액세스 토큰을 가져옵니다. 토큰을 가져온 후 만료되기 전에 이 토큰을 Microsoft Store 분석 API에 대한 호출에 사용할 수 있는 시간은 60분입니다. 토큰이 만료되고 나면 새 토큰을 생성할 수 있습니다.
  3. Microsoft Store 분석 API를 호출합니다.

단계 1: Microsoft Store 분석 API를 사용하기 위한 필수 조건 완료

Microsoft Store 분석 API를 호출하는 코드를 작성하기 전에 다음과 같은 필수 조건을 완료했는지 확인합니다.

  • 사용자(또는 사용자의 조직)에게 Azure AD 디렉터리가 있어야 하며 해당 디렉터리에 대한 전역 관리자 권한이 있어야 합니다. Microsoft 365 또는 Microsoft의 기타 비즈니스 서비스를 이미 사용하고 있다면 Azure AD 디렉터리가 이미 있는 것입니다. 그렇지 않은 경우 추가 비용 없이 파트너 센터에서 새 Azure AD를 만들면 됩니다.

  • Azure AD 애플리케이션을 파트너 센터 계정과 연결하고 애플리케이션에 대한 테넌트 ID 및 클라이언트 ID를 검색하고 키를 생성해야 합니다. Azure AD 애플리케이션은 Microsoft Store 분석 API를 호출할 앱 또는 서비스입니다. API에 전달할 Azure AD 액세스 토큰을 가져오려면 테넌트 ID, 클라이언트 ID 및 키가 있어야 합니다.

    참고 항목

    이 작업은 한 번만 수행하면 됩니다. 테넌트 ID, 클라이언트 ID 및 키가 있으면 새 Azure AD 액세스 토큰을 만들어야 할 때마다 다시 사용할 수 있습니다.

Azure AD 애플리케이션을 파트너 센터 계정에 연결하고 필요한 값을 검색하려면 다음을 수행합니다.

  1. 파트너 센터에서 조직의 Azure AD 디렉터리에 조직의 파트너 센터 계정을 연결합니다.

  2. 다음으로, 파트너 센터의 계정 설정 섹션에 있는 사용자 페이지에서 파트너 센터 계정에 대한 분석 데이터에 액세스하는 데 사용할 앱 또는 서비스를 나타내는 Azure AD 애플리케이션을 추가합니다. 이 애플리케이션에 관리자 역할을 할당해야 합니다. 이 애플리케이션이 Azure AD 디렉터리에 아직 없는 경우에는 파트너 센터에서 새 Azure AD 애플리케이션 만들기를 진행할 수 있습니다.

  3. 사용자 페이지로 돌아가서 Azure AD 애플리케이션의 이름을 클릭하여 애플리케이션 설정으로 이동한 다음, 테넌트 ID 값 및 클라이언트 ID 값을 복사하세요.

  4. 새 키 추가를 클릭하세요. 다음 화면에서 값을 복사하세요. 이 페이지를 나간 후에는 이 정보에 다시 액세스할 수 없습니다. 자세한 내용은 Azure AD 애플리케이션에 대한 키 관리를 참조하세요.

2단계: Azure AD 액세스 토큰 가져오기

Microsoft Store 분석 API에서 메서드를 호출하기 전에 먼저 API에 있는 각 메서드의 Authorization 헤더에 전달하는 Azure AD 액세스 토큰을 가져와야 합니다. 액세스 토큰을 가져온 후 만료되기까지 60분이 걸립니다. 토큰이 만료된 후에도 API에 대한 추가 호출이 있을 경우 계속 사용할 수 있도록 토큰을 새로 고칠 수 있습니다.

액세스 토큰을 가져오려면 클라이언트 자격 증명을 이용한 서비스 간 호출의 지침에 따라 HTTP POST를 https://login.microsoftonline.com/<tenant_id>/oauth2/token 엔드포인트로 전송하세요. 샘플 요청은 다음과 같습니다.

POST https://login.microsoftonline.com/<tenant_id>/oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded; charset=utf-8

grant_type=client_credentials
&client_id=<your_client_id>
&client_secret=<your_client_secret>
&resource=https://manage.devcenter.microsoft.com

POST URI의 tenant_id 값, client_idclient_secret 매개 변수에는 이전 섹션의 파트너 센터에서 검색한 애플리케이션의 테넌트 ID, 클라이언트 ID 및 키를 지정합니다. 리소스 매개변수의 경우에는 https://manage.devcenter.microsoft.com을 지정해야 합니다.

액세스 토큰이 만료되고 나면 여기에 있는 지침에 따라 토큰을 새로 고치면 됩니다.

> [!NOTE]
> ResourceType='Graph.windows.net' will be deprecated after September 2023. Please migrate to ResourceType ='Graph.microsoft.com'

3단계: Microsoft Store 분석 API 호출

Azure AD 액세스 토큰이 있으면 Microsoft Store 분석 API를 호출할 준비가 된 것입니다. 액세스 토큰은 각 메서드의 인증 헤더에 전달해야 합니다.

UWP 앱 및 게임에 대한 메서드

앱/게임 취득 및 추가 기능 취득에 사용할 수 있는 메서드는 다음과 같습니다.

UWP 앱에 대한 메서드

파트너 센터의 UWP 앱에 사용할 수 있는 분석 메서드는 다음과 같습니다.

시나리오 메서드
취득, 변환, 설치 및 사용
앱 오류
Insights
등급 및 리뷰
인앱 광고 및 광고 캠페인

데스크톱 애플리케이션에 대한 메서드

Windows 데스크톱 애플리케이션 프로그램에 속하는 개발자 계정에서 사용할 수 있는 분석 메서드는 다음과 같습니다.

시나리오 메서드
설치
블록
애플리케이션 오류
Insights

Xbox Live 서비스에 대한 메서드

Xbox Live 서비스를 사용하는 게임의 개발자 계정에서 사용할 수 있는 추가 메서드는 다음과 같습니다. Xbox용 Microsoft Store Analytics API는 더 이상 사용할 수 없습니다. gaming/xbox-live/get-started/join-dev-program/join-dev-program_nav

시나리오 메서드
일반 분석

하드웨어 및 드라이버에 대한 메서드

Windows 하드웨어 대시보드 프로그램에 속하는 개발자 계정은 하드웨어 및 드라이버에 대한 분석 데이터를 검색하기 위한 추가 메서드 세트에 액세스할 수 있습니다. 자세한 내용은 하드웨어 대시보드 API를 참조하세요.

코드 예

다음 코드 예제에서는 Azure AD 액세스 토큰을 얻고 C# 콘솔 앱에서 Microsoft Store 분석 API를 호출하는 방법을 보여 줍니다. 이 코드 예제를 사용하려면 tenantId 변수, clientId 변수, clientSecret 변수 및 appID 변수를 시나리오에 적합한 값에 할당하세요. 이 예제에는 Microsoft Store 분석 API에서 반환하는 JSON 데이터를 역직렬화하기 위해 Newtonsoft의 Json.NET 패키지가 필요합니다.

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;

namespace TestAnalyticsAPI
{
    class Program
    {
        static void Main(string[] args)
        {
            string tenantId = "<your tenant ID>";
            string clientId = "<your client ID>";
            string clientSecret = "<your secret>";

            string scope = "https://manage.devcenter.microsoft.com";

            // Retrieve an Azure AD access token
            string accessToken = GetClientCredentialAccessToken(
                    tenantId,
                    clientId,
                    clientSecret,
                    scope).Result;

            // This is your app's Store ID. This ID is available on
            // the App identity page of the Dev Center dashboard.
            string appID = "<your app's Store ID>";

            DateTime startDate = DateTime.Parse("08-01-2015");
            DateTime endDate = DateTime.Parse("11-01-2015");
            int pageSize = 1000;
            int startPageIndex = 0;

            // Call the Windows Store analytics API
            CallAnalyticsAPI(accessToken, appID, startDate, endDate, pageSize, startPageIndex);

            Console.Read();
        }

        private static void CallAnalyticsAPI(string accessToken, string appID, DateTime startDate, DateTime endDate, int top, int skip)
        {
            string requestURI;

            // Get app acquisitions
            requestURI = string.Format(
                "https://manage.devcenter.microsoft.com/v1.0/my/analytics/appacquisitions?applicationId={0}&startDate={1}&endDate={2}&top={3}&skip={4}",
                appID, startDate, endDate, top, skip);

            //// Get add-on acquisitions
            //requestURI = string.Format(
            //    "https://manage.devcenter.microsoft.com/v1.0/my/analytics/inappacquisitions?applicationId={0}&startDate={1}&endDate={2}&top={3}&skip={4}",
            //    appID, startDate, endDate, top, skip);

            //// Get app failures
            //requestURI = string.Format(
            //    "https://manage.devcenter.microsoft.com/v1.0/my/analytics/failurehits?applicationId={0}&startDate={1}&endDate={2}&top={3}&skip={4}",
            //    appID, startDate, endDate, top, skip);

            //// Get app ratings
            //requestURI = string.Format(
            //    "https://manage.devcenter.microsoft.com/v1.0/my/analytics/ratings?applicationId={0}&startDate={1}&endDate={2}top={3}&skip={4}",
            //    appID, startDate, endDate, top, skip);

            //// Get app reviews
            //requestURI = string.Format(
            //    "https://manage.devcenter.microsoft.com/v1.0/my/analytics/reviews?applicationId={0}&startDate={1}&endDate={2}&top={3}&skip={4}",
            //    appID, startDate, endDate, top, skip);

            HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, requestURI);
            requestMessage.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

            WebRequestHandler handler = new WebRequestHandler();
            HttpClient httpClient = new HttpClient(handler);

            HttpResponseMessage response = httpClient.SendAsync(requestMessage).Result;

            Console.WriteLine(response);
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);

            response.Dispose();
        }

        public static async Task<string> GetClientCredentialAccessToken(string tenantId, string clientId, string clientSecret, string scope)
        {
            string tokenEndpointFormat = "https://login.microsoftonline.com/{0}/oauth2/token";
            string tokenEndpoint = string.Format(tokenEndpointFormat, tenantId);

            dynamic result;
            using (HttpClient client = new HttpClient())
            {
                string tokenUrl = tokenEndpoint;
                using (
                    HttpRequestMessage request = new HttpRequestMessage(
                        HttpMethod.Post,
                        tokenUrl))
                {
                    string content =
                        string.Format(
                            "grant_type=client_credentials&client_id={0}&client_secret={1}&resource={2}",
                            clientId,
                            clientSecret,
                            scope);

                    request.Content = new StringContent(content, Encoding.UTF8, "application/x-www-form-urlencoded");

                    using (HttpResponseMessage response = await client.SendAsync(request))
                    {
                        string responseContent = await response.Content.ReadAsStringAsync();
                        result = JsonConvert.DeserializeObject(responseContent);
                    }
                }
            }

            return result.access_token;
        }
    }
}

오류 응답

Microsoft Store 분석 API는 오류 코드와 메시지를 포함한 오류 응답을 JSON 개체에 반환합니다. 다음 예제에서는 유효하지 않은 매개변수로 인한 오류 응답을 보여 줍니다.

{
    "code":"BadRequest",
    "data":[],
    "details":[],
    "innererror":{
        "code":"InvalidQueryParameters",
        "data":[
            "top parameter cannot be more than 10000"
        ],
        "details":[],
        "message":"One or More Query Parameters has invalid values.",
        "source":"AnalyticsAPI"
    },
    "message":"The calling client sent a bad request to the service.",
    "source":"AnalyticsAPI"
}