初探 App Store Connect 的 API:获取销售数据

假期的时候想做一个 iOS Widget,显示最近 App 的销售数据,于是玩了一下 App Store Connect 的 API。记录一下过程,以供后续回顾和加强。

如何调用 App Store Connect 的 API

该 API 是通过 JWT 验证的 Rest API,我用的编程语言是 Python,处理 JWT 验证的库是 @leptureAuthlib,使用起来非常方便。

代码大概如下:

def create_token(private_key_id, issue_id, auth_key_path):
    header = {
        "alg": "ES256",
        "kid": private_key_id,
        "typ": "JWT"
    }

    payload = {
        "iss": issue_id,
        "exp": int(time.time()) + 1200,
        "aud": "appstoreconnect-v1"
    }

    key = open(auth_key_path).read()
    return jwt.encode(header, payload, key).decode('utf8')

如何得到每天的销售数据

销售数据的 API 入口是 https://api.appstoreconnect.apple.com/v1/salesReports,如果要得到当天的销量的话,其中 filter[frequency] 参数的值为 DAILYfilter[reportDate] 为类似 2020-10-08filter[reportSubType]SUMMARY 即可。

返回的结果是 gzip 后的 csv 销量数据,用类似这样的代码就可以解压并写成文件:

def decompress_and_writetofile(response, name):
    content = gzip.decompress(response.content)
    f = open(name, 'w')
    f.write(content.decode('utf8'))
    f.close()

如何计算 Developer Proceeds

用 Numbers 或 Excel 打开 csv 文件后,可以看到详细的 Sales 数据。但其实这些数据很多都是和 Sales 无关的。因为 App 的 Update、Re-download 等等都会记录在这个表格里,简单的说,所有与该 App 或者该 App 的 IAP 相关的包括初次下载、再次下载、升级、购买、内购、恢复购买等等行为,都会成为 Sales 的一部分。

这就要求对这 Sales 数据进行过滤和计算才能得到真正的当时的收入数据。幸好最终的计算也是比较简单的,那就是把 Units 这列,乘以 Developer Proceeds,就是预估的收入数据了。

但是这些有一个问题,那就是 Developer Proceeds 是按用户购买时的货币来记录的,并不会根据汇率给转换一个结果出来。这样做的原因是,最终收入是付款那几天的汇率决定的,当日的「销售和趋势」的收入是仅供参考的,因而 API 返回的数据并没有给出参考汇率的必要。

如何计算大致的汇率

虽说无法去计算准确的当日产生的收入,但自己还是可以去人工做一次汇率转换,以得到一个参考数据的。这时就要用到一些汇率转换的 API。

我找到的两个免费的 Python API 是:forex-pythonExchange Rates API,前者支持货币较少,但支持查询历史汇率,后者支持货币较多,但免费版本似乎不支持历史汇率。可以综合起来使用。

根据上节得到的结果,简单计算一下就可以得到和 App Store Connect API 大致接近的收入预估了。

总结

经过一段时间的完善后,App Store Connect 的 API 确实可以让我们不用打开 App Store Connect 网站,也能完成几乎所有围绕着 App 开发前后的任务了,甚至还有比网站后台更丰富的数据纬度。值得使用!

参考资料

释放剪贴板潜力,效率更上一层楼

PasteNow

PasteNow 是一款剪贴板管理工具,它将使你的日常工作更轻松和快捷。你可以通过它存储各种各样的临时数据:文本、链接、图像等等。

1 Comment

Benny

拜读了,有用但是有限(我个人的问题)。我想实现下多应用基于 7天以及30天的销售额统计报告下载,主要是想看看交易类型的 收款和退款,但是不知道怎么下手写这个代码。我对于python也是非常基础,最多会个简单爬虫这样子,想请教应该往什么方向去看看呢?

Leave a Comment