質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.35%

App Store ConnectからAPIを使ってレポートを取得したい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,082

score 11

前提・実現したいこと

pythonにてApp Store Connectからレポートを取得したいのですが、
参考になるサイトが少なく、拾ってきたコードを繋げて実行しているのですが、
上手く動作しません。

発生している問題・エラーメッセージ

Traceback (most recent call last):
File "c:/Users/nakatsus/Documents/AppleAPI/GetReport.py", line 90, in <module>
get_apple_reports(request)
File "c:/Users/nakatsus/Documents/AppleAPI/GetReport.py", line 11, in get_apple_reports
token = get_apple_store_connect_api_token() File "c:/Users/nakatsus/Documents/AppleAPI/GetReport.py", line 33, in get_apple_store_connect_api_token
exp = int(time.mktime((datetime.now() + timedelta(minutes=20)).timetuple()))
NameError: name 'time' is not defined

該当のソースコード

import json
import jwt
import requests
import logging, os, sys, re
import pprint
import urllib.request, urllib.error
import datetime

def get_apple_reports(request):

    token = __get_apple_store_connect_api_token()

    date_str = request.args.get('date')
    (code, content, date_str) = __get_reports(token, date_str)

    filename_header = 'test/'
    filename = filename_header + 'S_D_' + '80051256' \
                    + '_' + date_str.replace('-','') + '.txt.gz'

    return (None,200,None)

def __get_apple_store_connect_api_token():

    ALGORITHM = 'ES256'

    APP_STORE_KEY_ID = 'XXXXXXXXXX'
    ISSUER_ID = 'XXXXX-XXXXXX-XXXXX-XXXXX'
    STORE_AUTH_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.p8'

    secret = ""
    with open(STORE_AUTH_KEY,'r') as f:
        secret = f.read()
    exp = int(time.mktime((datetime.now() + timedelta(minutes=20)).timetuple()))
    token = jwt.encode(
        {
            'iss': ISSUER_ID,
            "exp": exp,
            "aud": "appstoreconnect-v1"
        },
        secret,
        algorithm=ALGORITHM,
        headers={
            'alg': ALGORITHM,
            'kid': APP_STORE_KEY_ID,
            "typ": "JWT"        
        }
    )    

    logging.debug('Apple Store Connect API token: ' + token)

    return token    

def __get_reports(token,date_str=None):
    base_url = 'https://api.appstoreconnect.apple.com/v1/salesReports'

    if not date_str:
        jst = datetime.timezone(datetime.timedelta(hours=+9), 'JST')
        date_str = (datetime.datetime.now(jst) - datetime.timedelta(days=1)).strftime('%Y-%m-%d')
    query_parameters = {
        "filter[frequency]": "DAILY",
        "filter[reportSubType]": "SUMMARY",
        "filter[reportType]": "SALES",
        "filter[vendorNumber]": '80051256',
        "filter[reportDate]": date_str
    }

    url = base_url

    logging.debug("url: " + url)
    logging.debug("query_params[filter[reportDate]]: " + date_str)

    headers = {'Authorization': 'Bearer ' + token,
                       'Accept': '*/*'}

    req = urllib.request.Request('{}?{}'.format(url, urllib.parse.urlencode(query_parameters)), headers=headers)
    try:
        with urllib.request.urlopen(req) as res:
            content = res.read()
        code = 200
    except (urllib.error.HTTPError, urllib.error.URLError) as e:
        logging.error("Error occered in urllib.request.Request().\n code: " + str(e.code) + \
                     "\n reason: " + e.reason)
        code = e.code
        content = e.reason

    return (code, content, date_str)

if __name__ == '__main__':
    request = {"args": {"date_str": None}}
    get_apple_reports(request)

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • CHERRY

    2019/05/15 11:15

    ソースコードのインデントが崩れて見にくいので、ソースコードは、コード部分を選択してツールバーの <code> ボタンを利用して、見やすく記述していただけないでしょうか。  [ソースコードを書きましょう]( https://teratail.com/help/question-tips#questionTips3-5-1 )参考

    特に Python は、インデントが変わるとプログラムの意味が変わってしまうので、よろしくおねがいします。

    キャンセル

  • nakatsus

    2019/05/15 11:16

    申し訳ありません、修正いたします。

    キャンセル

  • nakatsus

    2019/05/15 11:19

    修正致しました、宜しくお願い致します。

    キャンセル

回答 1

checkベストアンサー

0

エラーの原因はAPI処理ではなく日時処理関係のモジュールがインポートされていないためです。
また、コード切り貼りした結果import datetimefrom datetime import ~を前提としたコードが混在しています。
とりあえず以下のように修正すれば動作すると思いますが、日時の基本的な処理についていまいちど確認、学習ください。

from datetime import datetime, timedelta, timezone
import time
# 略
exp = int(time.mktime((datetime.now() + timedelta(minutes=20)).timetuple()))
# 略
jst = timezone(timedelta(hours=+9), 'JST')
date_str = (datetime.now(jst) - timedelta(days=1)).strftime('%Y-%m-%d')

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る