对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. linux下,使用nginx实现动静分离,访问图片报404

    一.需求描述 最近在开发一个微信小程序,由于微信小程序端代码包总大小限定在三四兆,所以有很多的图标资源就不能放在微信小程序中进行打包, 否则会超过微信的限制而无法打包.自己能够想到的最简单的办法就是将 ...

  2. 1 - RTOS简介&规范&任务创建

    对外部响应能力: 实时(规定时间内)操作系统 , 有强(飞机系统)弱(信息采集系统)之分 与分时(顺序时间片)操作系统 FreeRTO实时操作系统 支持抢占式调度,合作式调度和时间片调度:内核大小在4 ...

  3. 28_FFmpeg音视频解封装格式

    目录 一.什么是封装格式 二.使用 FFmpeg 实现解封装 1.创建解封装上下文打开流媒体文件 2.检索流信息 2.1.检索流信息 2.2.导出流信息到控制台 3.初始化音频解码器查找合适的音视流和 ...

  4. [LeetCode] 5933. k 镜像数字的和

    一.摘要 本文介绍了一种通过模拟寻找十进制镜像数字,然后判断其对应的k进制表示是否也是镜像的方法.具体来讲即从小到大遍历10进制的镜像数字,然后对10进制镜像数字转为k进制,然后判断转为k进制后是否还 ...

  5. APT案例之点击事件

    目录介绍 01.创建项目步骤 1.1 项目搭建 1.2 项目功能 02.自定义注解 03.创建Processor 04.compiler配置文件 05.编译jar 06.如何使用 07.编译生成代码 ...

  6. 记录--前端中 JS 发起的请求可以暂停吗

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 在前端中,JavaScript(JS)可以使用XMLHttpRequest对象或fetch API来发起网络请求.然而,JavaScrip ...

  7. 记录--uni-app adb安卓wifi无线调试

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 方法一 adb connect连接调试 前提条件: 电脑已安装adb工具 手机和电脑连接的同一个WIFI CMD进入到adb工具所在目录, ...

  8. Java中使用fastJson

    FastJson简介 Fastjson是阿里巴巴开发的一个开源Java库,用于处理JSON数据,广泛应用于Web服务.API接口.数据交换等多个场景. FastJson的作用 主要作用是用于将Java ...

  9. mybatis案例程序

    前置工作 导包(mysql-connector-java.mybatis) 实体类 Mapper层 1.接口 public interface BookMapper { public Book get ...

  10. 【Java面试题】SpringMVC

    九.SpringMVC 63)SpringMVC 的流程 a.用户向服务器发送请求,请求被 SpringMVC 前端控制器 DispatchServlet 捕获: b.DispatcherServle ...