对iOS的证书、描述文件、账号、设备等管理,之前都去苹果开发者中心操作,官网上操作也比较繁杂,想搞一些自动化之类的,更是麻烦,有时候官网都打不开……

其实苹果还提供里一套API接口,创建证书、创建账号、增加devices等等,这些都可以调用命令操作,可以按需来完成自动化操作或批量操作。

API接口地址:https://api.appstoreconnect.apple.com

文档地址:https://developer.apple.com/documentation/appstoreconnectapi

有人可能看完文档还是不知道怎么下手,简述一下步骤:

1. 生成token

(1)key 和iss以及.p8文件生成就不累述

(2) 构造header

algorithm = 'ES256'
base_api_url = "https://api.appstoreconnect.apple.com"
header = {
"alg": algorithm,
"kid": key,
"typ": "JWT"
}

(3)构造payload

#
payload = {
"iss": iss,
"exp": int(time.mktime((datetime.now() + timedelta(minutes=20)).timetuple())),
"aud": "appstoreconnect-v1"
}

(4)生成token

token = jwt.encode(payload=payload, key=private_key, algorithm=algorithm, headers=header).decode('ascii')
return token

(5)封装请求处理

def base_call(url, token, method="get", data=None):
"""
:param url:
:param token:
:param method:
:param data:
:return:
""" re_header = {"Authorization": "Bearer %s" % token}
r = {}
url = base_api_url + url requests.adapters.DEFAULT_RETRIES = 1
req = requests.session()
req.keep_alive = False if method.lower() == "get":
r = req.get(url, params=data, headers=re_header) elif method.lower() == "post":
re_header["Content-Type"] = "application/json"
r = req.post(url=url, headers=re_header, data=json.dumps(data)) elif method.lower() == "patch":
re_header["Content-Type"] = "application/json"
r = req.patch(url=url, headers=re_header, data=json.dumps(data))
return r

比如我们以增加设备id为例:

def set_devices(api_token, data):
"""
增加devices信息
:param api_token:
:param data:
:return:
"""
set_device_url = '/v1/devices'
res = base_call(set_device_url, api_token, 'post', data)
return res
post_data = {
"data": {
"attributes": {
"name": i.split(',')[0],
"platform": "IOS",
"udid": i.split(',')[1]
},
"type": "devices"
}
}
res = api.set_devices(api_token, post_data)
if res.status_code != 201:
print(res.json()['errors'][0]['detail'])
else:
print("add time:", res.json()['data']['attributes']['addedDate'])

这里的参数组装需要注意,需要参考文档一层层组装参数,data包含自子参数,子参数再包含子参数

完整的代码示例:

# -*- coding:utf-8 -*-
# Author: drew
# create time: 2020-07030
# update time:
# app store connect api import jwt
import time
import json
import requests
from datetime import datetime, timedelta algorithm = 'ES256'
base_api_url = "https://api.appstoreconnect.apple.com" def get_token(key, iss, key_file):
"""
:param key:
:param iss:
:param key_file:
:return:
"""
# 读取私钥
private_key = open(key_file, 'r').read()
# 构造header
header = {
"alg": algorithm,
"kid": key,
"typ": "JWT"
}
# 构造payload
payload = {
"iss": iss,
"exp": int(time.mktime((datetime.now() + timedelta(minutes=20)).timetuple())),
"aud": "appstoreconnect-v1"
} token = jwt.encode(payload=payload, key=private_key, algorithm=algorithm, headers=header).decode('ascii')
return token def base_call(url, token, method="get", data=None):
"""
:param url:
:param token:
:param method:
:param data:
:return:
""" re_header = {"Authorization": "Bearer %s" % token}
r = {}
url = base_api_url + url requests.adapters.DEFAULT_RETRIES = 1
req = requests.session()
req.keep_alive = False if method.lower() == "get":
r = req.get(url, params=data, headers=re_header) elif method.lower() == "post":
re_header["Content-Type"] = "application/json"
r = req.post(url=url, headers=re_header, data=json.dumps(data)) elif method.lower() == "patch":
re_header["Content-Type"] = "application/json"
r = req.patch(url=url, headers=re_header, data=json.dumps(data))
return r # ------------------ 获取具体接口的方法 ------------------ def get_devices(api_token, data=None):
"""
获取devices信息
:param api_token:
:param data:
:return:
"""
get_devices_url = '/v1/devices'
if data is None:
data = {
"filter[platform]": "IOS",
# "filter[status]": "ENABLED",
"limit": 100
}
res = base_call(get_devices_url, api_token, 'get', data)
return res def set_devices(api_token, data):
"""
增加devices信息
:param api_token:
:param data:
:return:
"""
set_device_url = '/v1/devices'
res = base_call(set_device_url, api_token, 'post', data)
return res def update_devices(api_token, id, data,):
"""
增加devices信息
:param id:
:param api_token:
:param data:
:return:
"""
set_device_url = '/v1/devices/{%s}' % id
res = base_call(set_device_url, api_token, 'patch', data)
return res """
if __name__ == "__main__": ios_api_key = 'T8****8AD8'
ios_api_issuer = '69a**9-b79b-4**3-e053-5b**1a4d1'
file_key = "/Users/drew/.private_keys/AuthKey_T85LR***8.p8"
token_api = get_token(ios_api_key, ios_api_issuer, file_key)
# get_udid()
post_data = {
"data": {
"attributes": {
"name": "zb",
"platform": "IOS",
"udid": "80b677c2c****e476caf61ba0d34274000"
},
"type": "devices"
}
} res = set_udid(token_api, post_data)
print(res)
"""
 




调用App Store Connect Api的更多相关文章

  1. [App Store Connect帮助]二、 添加、编辑和删除用户(6)生成 API 密钥

    如果已批准您访问 App Store Connect API,您可以生成 API 密钥,以便使用该密钥配置.认证和使用 App Store Connect 服务. 有关管理和保护您密钥的更多信息,请参 ...

  2. [App Store Connect帮助]九、衡量 App 表现(1)分析和报告概述

    App Store Connect 提供如下分析和报告,以衡量您 App 的表现并查看向您支付的最终付款. App 分析 通过 App Store 展示次数.产品页面查看次数.销售额.App 使用次数 ...

  3. [App Store Connect帮助]一、 App Store Connect 使用入门(1)App Store Connect 工作流程

    您使用 App Store Connect 提交并管理您在 App Store 中销售的 App,使用 TestFlight 分发您 App 的 Beta 版本,接受法律协议,输入您的税务和银行业务信 ...

  4. [App Store Connect帮助]三、管理 App 和版本(2.4)输入 App 信息:提供加密出口合规证明文稿

    上传至 App Store Connect 的 App 被上传至位于美国的 Apple 服务器.如果您提交 App 的目的是为了在 App Store 上分发您的 App 或通过美国或加拿大的境外 T ...

  5. [App Store Connect帮助]二、 添加、编辑和删除用户(1)用户帐户和职能概述

    您可以在 App Store Connect 的“用户和访问”部分管理用户.添加沙盒测试员以及管理 API 密钥. 用户职能决定了用户对 App Store Connect 和 Apple Devel ...

  6. [App Store Connect帮助]八、维护您的 App(4.3)回复顾客评论(iOS、macOS 或 watchOS)

    您可以公开回复顾客评论,但在您的 App Store 产品页上每条评论仅会显示一条回复.您可以回复评论.编辑回复,以及删除回复. 在回复和编辑显示在 App Store 上之前(可能需要至多 24 小 ...

  7. [App Store Connect帮助]八、维护您的 App(4.1)监控顾客评论:评分与评论概述

    App Store 上的评分与评论 顾客可以按照 1 星至 5 星的级别对您的 App 进行评分.顾客还可为您的 iOS 和 macOS App 撰写评论,但无法为 Apple TVOS App 撰写 ...

  8. [App Store Connect帮助]七、在 App Store 上发行(4)分阶段发布某个版本更新(iOS 和 watchOS)

    当您发布您 App 的一个版本更新时,您可以选择分阶段发布您的 iOS App.如果您正在提交一个 iOS 版本更新,且您的 App 处于以下 App 状态之一,则此选项可用. 准备提交 正在等待审核 ...

  9. [App Store Connect帮助]七、在 App Store 上发行(2.5)设定价格与销售范围:向企业或教育机构分发您的 App

    您可以向您添加至 App Store Connect 以及参与“Apple 商务”或“校园教务管理”的用户.企业或教育机构单独分发您的非公开 App.此选项仅在您的 App 尚未获得批准时可用. 有关 ...

  10. [App Store Connect帮助]七、在 App Store 上发行(2.2)设定价格与销售范围:将您的 App 以预订形式发布

    在首次将您的 App 发布至 App Store 前,您可以选择以预订形式提供该 App.在您的 App 发布以供下载之前,顾客可以查看您的产品页并订购您的 App.您的 App 一旦发布,顾客将会收 ...

随机推荐

  1. 磁盘 U盘找不到

    及磁盘找不到了, 第一步: 看排线是否插好,稳当 第二步:在磁盘管理下面,磁盘是否还在,如果磁盘显示在,只是没有磁盘符 第三步:diskpart ,进入磁盘  其他的命令自己 查询 第四步:进入 CM ...

  2. Vue mixin 永远不要用!! 极品垃圾,后期维护就剩骂街了~!!

    为什么 Vue mixin 永远不要用!! 极品垃圾,后期维护就剩骂街了~!! vscode 没有自动跳转 自己维护下看看,重构的时候,还得整个复写,相当于整个软件重写 F!!!

  3. Walrus 0.6发布:预览资源变更、丰富公有云支持,满足企业多云需求

    近日,数澈软件Seal(以下简称"Seal")宣布基于 IaC 的开源应用管理平台 Walrus 0.6 正式发布! 在之前的版本中,Walrus 引入应用模型并优化了应用部署体验 ...

  4. STL:vector中如何使用at()来避免程序报错

    #include <iostream> #include <vector> using namespace std; int main() { vector<int> ...

  5. torch的cuda版本安装

    1.拥有英伟达显卡NVIDIA NVIDIA CUDA各版本下载链接(包括最新11版本和以往10.2版本) 以下是从NVIDIA官网转过来的链接,方便需要下载各种版本CUDA的同学.(借阅) http ...

  6. RowHammer 攻击:内存的隐形威胁

    今天看了一篇 IT 之家关于 AMD 处理器受 RowHammer 内存攻击影响的报道,心血来潮了解了一下 RowHammer 攻击的原理,把了解到的知识记录下来. RowHammer 攻击是一种相对 ...

  7. FPGA中与时序有关的概念

    FPGA中与时序有关的概念 一.时序分析 时序分析是对整个时序进行分析的操作.作用就是了解设计的时序性能,一般而言就是最大时钟频率.时钟频率越高,设计的工作速度越快(忽略设计实现方法的不同导致的效率提 ...

  8. 基于proteus的4026的二分频计数

    基于proteus的4026的二分频计数 1.芯片原理 4026还是一个CMOS芯片,是直接输出段码的计数器.显然,这个芯片的作用就是和七段数码管配合,直接将计数结果显示在数码管上.这里只是用于分频, ...

  9. 【Java】使用位运算完成数组中两个变量交换位置

    1 /** 2 * 3 */ 4 package com.raliable.chapter_0; 5 /** 6 * @author : Administrator 7 * @date :2022年4 ...

  10. 冲刺 NOIP2024 之动态规划专题

    专题链接 B - Birds \(3.19\) . 混合背包 \(DP\) . 定义 \(f_{i,j}\) 表示取到鸟巢 \(i\) ,获得 \(j\) 只小鸟时所剩的魔力值. 显然有 \(f_{0 ...