Autowink | python으로 어플리케이션 설치 정보 가져오기

eeeclipse·2020년 5월 6일
1

이 문서는 teamwink ALDA HEALTH METRICS 중 하나인 설치와 관련한 정보를 스크래핑하고, 이를 저장하기 위한 스크립트에 대하여 설명하고 있습니다.

개요

ALDA Health Metrics는 노출 - 획득 - 유지 - 활성 등으로 구분이 됩니다. 이 가운데 획득 부문에서 설치는 각각의 스토어 정보에 로그인하여 입력해야하는 번거로움이 있던 바, 이를 자동화할 수 있는 스크립트를 제작하기에 이르렀습니다.

애플과 구글 모두 API를 기반으로 통신하며, 레포트 출력은 물론,다운로드까지 지원합니다. 설치를 제외한 모든 데이터는 서버에서 출력하고 있으니, 설치와 관련한 데이터를 내부에 축적할 수 있다면 procedure를 만드는 것도 가능하지 않을까요 ?

부푼 꿈을 안고 삽질을 시작해보도록 하겠습니다.


시작은 늘 자신감과 함께 해야합니다. 그래야 최소 능이버섯이라도 됩니다.

App Store Connect

들어가기 전에

Apple App Store Api 문서가 친절하게 설명해주고 있습니다. 따라하면 됩니다.

  • 언어 : python 3.x
  • 준비물 : key_id , key_file , issuer_id , venderNumber

패키지와 라이브러리

PyPI에 올라온 appstoreconnect를 이용해보겠습니다.

pip install appstoreconnect

출력

# 준비한 데이터를 입력해줍니다 .. 
# API KEY의 접근은 특정 어플리케이션에 한정지을 수 없습니다.

from appstoreconnect import Api
api = Api(key_id, path_to_key_file, issuer_id)

# list all apps
apps = api.list_apps()
for app in apps:
    print(app.name, app.sku)
    
# download sales report
api.download_sales_and_trends_reports(
    filters={'vendorNumber': 'vendorNumber', 'frequency': 'WEEKLY', 'reportDate': 'YYYY-MM-DD'}, save_to='report.csv')

다른 방식으로 해보기

위의 appstoreconnect 패키지를 사용하지 않고 해보겠습니다. 도큐멘트의 내용을 찬찬히 살펴보면서 진행해보도록 합시다.

통신을 하는데 있어서, API를 생성해야하고, API 요청을 검증하기 위해서 JWT를 생성해야 합니다.

  1. Create the JWT header.
    1. algorithm : ES256
      • 암호화 알고리즘의 하나로 Digital Signature of the JWS Signing를 생성합니다. 입력은 개인화키와 ECDSA P-256 SHA-256, 출력은 (R,S) 페어로 구성되며, R과 S는 256-bit unsigned integers입니다.
    2. Key Identifier : key ID
    3. Token Type : JWT
  2. Create the JWT payload
    1. Issuer ID
    2. Expiration Time : Unix epoch time
      • 20분 이상 유지되는 토큰은 유효하지 않은 것으로 봅니다.
      • 앱스토어 커넥트는 GMT 기준이 아닌 UTC 기준입니다. timezone을 설정해주도록 합시다.
    3. Audience : appstoreconnect-v1
  3. Sign the JWT.

사용할 패키지들을 임포트해줍니다.

from datetime import datetime, timedelta, timezone, time
from jose import jwt, jws
from jose.utils import base64url_decode
import ecdsa
import requests
import json

위에서처럼 입력에 필요한 데이터를 정의합니다. request 를 이용해 json으로 전달할 것입니다.

# Define variables 

KEY_ID = "KEY_ID "
ISSUER_ID = "ISSUER_ID "
with open('path', 'r') as f:
    PRIVATE_KEY = f.read()
TIMESTAMP = int( (datetime.now() + timedelta(minutes = 35)).timestamp()) 

#Create the JWT Payload
    claim = {"iss" : ISSUER_ID,
             "exp" : TIMESTAMP,
             "aud" : "appstoreconnect-v1"}

# Create the JWT Header
    header = {
             "alg": "ES256",
             "kid": KEY_ID,
             "typ": "JWT"
             }

# Create the JWT
    encoded = jwt.encode(claim, PRIVATE_KEY, algorithm='ES256', headers=header)
    
JWT = 'Bearer ' + encoded

## URL = 'https://api.appstoreconnect.apple.com/v1/apps'

URL = 'https://api.appstoreconnect.apple.com/v1/apps' # apps
HEAD = {'Authorization': JWT} 
print(HEAD)

응답 결과를 저장해봅시다.

R = requests.get(URL, headers=HEAD)

print 했을때 <Response [200]> 이 출력되면 통신이 되고 있는 것입니다. 다만 endpoint 마다 response 의 형식이 다릅니다. 우리가 진행한 샘플은 json이므로 가볍게 출력을 해주면 됩니다

Google Play Store

앱스토어 커넥트의 경험을 바탕으로 구글 플레이스토어도 해봅시다.

들어가기 전에

google은 api 문서가 매우 친절하고 google-api-python-client 패키지도 제공합니다. 이걸 이용해서 능이버섯을 탈출해봅시다.

필수 모듈 가져오기

Reference

App Store Connect API
ES256
https://jwt.io/

profile
mathematician, researcher, Data Scientist ⊗ Engineer ⊗ Architect, DBA

0개의 댓글