google play 内购数据拉取
拉取 google play console后台内购数据收入。
1:查看官方文档:
https://support.google.com/googleplay/android-developer/answer/6135870?visit_id=638180953496505768-3845517287&p=stats_export&rd=1#export
这里采用 从Google Cloud Storage 下载报表-》使用用户端程式库和服务帐户下载报表

2:准备工作。
1; 从文档的步骤开始,新建立项目。注意是google developers console后台,不是google play console后台。新建项目,在 IAM和管理中-》添加一个服务账号-》生成秘钥。下载的json文件保留。


2;添加权限。需要将这里添加的服务账号邮件添加到 goole play console 后台, 权限需要有能下载报表的权限。

3:Storage sdk初始化
文档中表示,google play console后台的内购收入会每天往Google Cloud Storage的某个zip包添加数据,
我们需要从storage中下载zip包,解析里面的数据就行。通过上面的关联,我们可以通过新建的google cloud账号api去下载google play每天更新的storage中的zip.
在后台开启api权限

添加storage SDK 参考:https://cloud.google.com/storage/docs/reference/libraries#client-libraries-install-java
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>26.13.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-storage</artifactId>
</dependency>
storage初始化:
public void initApay() {
String projectId = "pc-api-8153";//准备工作中那个新建项目的id-- projectId
InputStream is = AndroidPayHelper.class.getResourceAsStream("/firebaseauth/pay_android_key.json");//下载的json文件
try {
GoogleCredentials credentials = GoogleCredentials.fromStream(is)
.createScoped(Lists.newArrayList("https://www.googleapis.com/auth/devstorage.read_only"));
Storage storage = StorageOptions.newBuilder()
.setCredentials(credentials)
.setProjectId(projectId)
.build()
.getService();
} catch (IOException e) {
System.out.println(e);
}
}
4:数据拉取
参考:https://cloud.google.com/storage/docs/downloading-objects?hl=zh-CN#storage-download-object-java
1,google play 后台查看storage的url和bucket:类似-- gs://pubsite_prod_8153303996/sales/

,
2,得到的是 gs://pubsite_prod_8153303996/sales/ 其中pubsite_prod_8153303996 就是bucketName(注意:这个是复制出来的,跟前面项目的projectId不是一个)。展示一下storage下面的文件。
String bucketName = "pubsite_prod_8153303996";
Page<Blob> buckets = storage.list(bucketName);
for (Blob bucket : buckets.iterateAll()) {
System.out.println(bucket.getName());
}
打印出来的会有很多,只需要注意 sales开头的就行:这些就是需要下载的内购数据。
sales/salesreport_202302.zip
sales/salesreport_202303.zip
sales/salesreport_202304.zip
3,zip数据下载
String bucketName = "pubsite_prod_8153303996";
BlobId blobId = BlobId.of(bucketName, "sales/salesreport_202304.zip");
Blob blob = storage.get(blobId);
byte[] content = blob.getContent(); try {
byte[] bytes = GzipUtils.unZip(content);
String body = new String(bytes, StandardCharsets.UTF_8);
putData(body);
} catch (Exception e) {
TaskLoggerUtil.Error(className + " unzip error:", e);
}
4,下载的锁zip包,需要解析:
public static byte[] unZip(byte[] data) throws IOException {
byte[] b = null;
ByteArrayInputStream bis = new ByteArrayInputStream(data);
ZipInputStream zip = new ZipInputStream(bis);
while (zip.getNextEntry() != null) {
byte[] buf = new byte[1024];
int num = -1;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((num = zip.read(buf, 0, buf.length)) != -1) {
baos.write(buf, 0, num);
}
b = baos.toByteArray();
baos.flush();
baos.close();
}
zip.close();
bis.close();
return b;
}
5,分析数据
String cDate = "2023-04-23";//表里的数据是这个月所有数据,如果只需要一天的,需要筛选
String[] separated = datas.split("\n");//拆分行
int len = separated.length;
for (int i = 1; i < len; i++) {
String[] row = separated[i].split(",");//拆分列,每一行数据是通过,组成的 //日期
String date = DateUtils.dateConvertionYs(String.valueOf(row[1]));//这里是将yyyy/MM/dd转为yyyy-MM-dd方便比较
if (!cDate.equals(date)) continue; String packId = row[6];//包名
//收益
float proceeds = Float.parseFloat(row[12]);//收入
}
5:展示数据
数据跟ios一样,需要自己通过汇率转为一种货币,方便计算。

https://cloud.google.com/storage/docs/downloading-objects?hl=zh-CN#storage-download-object-java
google play 内购数据拉取的更多相关文章
- Google Play内购测试
Google Play内购测试 最近项目做海外版本,接入Google wallet支付后,测试验证比较繁琐,故记录一下. Google wallet支付方式接入完成后,需要按照如下步骤设置,才可以进行 ...
- 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据
我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...
- canal从mysql拉取数据,并以protobuf的格式往kafka中写数据
大致思路: canal去mysql拉取数据,放在canal所在的节点上,并且自身对外提供一个tcp服务,我们只要写一个连接该服务的客户端,去拉取数据并且指定往kafka写数据的格式就能达到以proto ...
- Spark Streaming中向flume拉取数据
在这里看到的解决方法 https://issues.apache.org/jira/browse/SPARK-1729 请是个人理解,有问题请大家留言. 其实本身flume是不支持像KAFKA一样的发 ...
- 用setTimeout 代替 setInterval实时拉取数据
在开发中,我们常常碰到需要定时拉取网站数据,如: setInterval(function(){ $.ajax({ url: 'xx', success: function( response ){ ...
- HBase指定大量列集合的场景下并发拉取数据时卡住的问题排查
最近遇到一例,HBase 指定大量列集合的场景下,并发拉取数据,应用卡住不响应的情形.记录一下. 问题背景 退款导出中,为了获取商品规格编码,需要从 HBase 表 T 里拉取对应的数据. T 对商品 ...
- 利用docker hub做中转拉取google的k8s镜像
1.背景 部署kubernetes,需要FQ.但是在初始化的时候,即是FQ了有的镜像pull依然会超时,导致初始化失败.而你又不想使用国内的一些镜像源,因为更新不及时.很多新功能和插件都不会包括,只想 ...
- 数据抓取的艺术(三):抓取Google数据之心得
本来是想把这部分内容放到前一篇<数据抓取的艺术(二):数据抓取程序优化>之中.但是随着任务的完成,我越来越感觉到其中深深的趣味,现总结如下: (1)时间 时间是一个与抓取规模相形而 ...
- tpot从elastic search拉攻击数据之三 用于拉取的java程序
package download; import org.json.JSONArray; import java.io.*; import java.net.URL; import java.net. ...
- Mysql分片后分页排序拉取数据的方法
高并发大流量的互联网架构,一般通过服务层来访问数据库,随着数据量的增大,数据库需要进行水平切分,分库后将数据分布到不同的数据库实例(甚至物理机器)上,以达到降低数据量,增加实例数的扩容目的. 一旦涉及 ...
随机推荐
- 集合的通用遍历方法--java进阶day09
1.集合的三种通用遍历方法 之前我们学习过集合的遍历方法,为什么这里还要再学呢? 这是因为,之前我们用的遍历方法使用了索引,但我们知道set接口的实现类的集合均无索引,所以我们要学习通用的遍历方法 2 ...
- 阿里巴巴暑期实习 Java 面经,灵犀互娱一面
哈希表熟悉吗,可以如何实现? 开散列版本什么时候需要扩容 高并发服务器内的主从reactor模型是如何实现的? 进程 线程 协程 的区别? 如何保证线程安全 ? 了解读写锁吗? 单例模式有了解吗? 可 ...
- DevOps的工作岗位的要求
## 为什么需要DevOps 不是每个人都能理解可靠的版本管理和牢固的构建系统的重要性. 也不是任何人能使得软件的发布达到可靠性,可重复性和可审计的高标准.Devops的职责就是将软件的构建和发布的流 ...
- 短信接口被刷爆:我用Nginx临时止血
最近,朋友公司遇到了一件让他们"寝食难安"的事:他们的短信验证码接口被人盯上了,充进去的钱没多久就被刷得一分不剩.不充钱,业务直接受影响:但充钱吧,就像往无底洞里灌水.他们联系短信 ...
- 使用 StreamJsonRpc 在 ASP.NET Core 中启用 JSON-RPC
StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC).它通过流(如管道.网络流等)实现高效的跨进程或跨网络通信 ...
- 微信小程序/H5 调起确认收款界面
微信小程序/H5 调起确认收款界面详解(附代码+平台兼容处理) 场景:用户点击「收款」按钮后,系统调起微信收款组件,用户确认后完成转账或收款流程.该能力广泛用于现金营销.二手交易.佣金报酬.企业赔付等 ...
- PowerShell : 无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本(npm或yarn)
1.搜索powershell,右键以管理员身份运行 2.若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的 执行策略更改为 RemoteSigned 执行 s ...
- Python3处理文档_word文档(二)
添加分页符 你想要下一个文本在一个单独的页面,即使你所在的一个不是满的."hard"分页符可以做到这一点: document.add_page_break() doc.add_he ...
- Nacos简介—4.Nacos架构和原理
Nacos简介-4.Nacos架构和原理 大纲 1.Nacos的定位和优势 2.Nacos的整体架构 3.Nacos的配置模型 4.Nacos内核设计之一致性协议 5.Nacos内核设计之自研Dist ...
- <HarmonyOS第一课06>构建更加丰富的页面
视频链接: https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101717497640610394?ha_sou ...