首页 > 编程语言 >python 脚本实现XCode自动打包/上传蒲公英/钉钉机器人通知

python 脚本实现XCode自动打包/上传蒲公英/钉钉机器人通知

时间:2022-10-28 15:35:29浏览次数:60  
标签:python data XCode callback json api key print 蒲公英

通常我们使用XCode打包 要archive 然后导出, 然后上传到蒲公英,再然后拿到蒲公英的截图去打包群里通知打包完成,既然这些动作都是由一个个步骤完成,那么何不使用python写一个脚本来实现整个打包过程
1.clean project

cmd = 'xcodebuild clean -workspace %s -scheme %s -configuration %s' % (
        workspace, scheme, configuration)

2.build project

cmd = 'xcodebuild -workspace %s -scheme %s -configuration %s -destination %s build ' % (
        workspace, scheme, configuration,'generic/platform=iOS')

3.archive project

cmd = 'xcodebuild -workspace %s -scheme %s -configuration %s -archivePath %s -destination  %s archive' % (
        workspace, scheme, configuration, archive_path,'generic/platform=iOS')

4.export archive file

cmd = "xcodebuild -exportArchive -archivePath %s -exportPath %s -exportOptionsPlist %s -allowProvisioningUpdates" % (
        archive_file, ipa_path, export_options_plist)

以上命令是对应的xcodebuild打包命令 利用subprocess执行以上命令,等待返回结果

导出ipa包上传到蒲公英 利用os.listdir遍历文件夹及其对应的文件,找到ipa文件

def get_ipafile():
    # 遍历ipa_path文件夹,获取.ipa文件
    file_list = os.listdir(ipa_path)
    for file in file_list:
        if file.endswith('.ipa'):
            cur_path = os.path.join(ipa_path, file)
            return cur_path

上传到蒲公英 利用requests配置对应的参数实现ipa文件上传

import time
import requests
# 官方文档
# https://www.pgyer.com/doc/view/api#fastUploadApp


def _getCOSToken(
    api_key,
    install_type=1,
    password='',
    update_description='',
    callback=None
):
    """
    获取上传的 token
    """
    headers = {'enctype': 'multipart/form-data'}
    payload = {
        '_api_key': api_key,  # API Key
        'buildType': 'ios',  # 需要上传的应用类型,ios 或 android
        # (选填)应用安装方式,值为(1,2,3,默认为1 公开安装)。1:公开安装,2:密码安装,3:邀请安装
        'buildInstallType': install_type,
        'buildPassword': password,  # (选填) 设置App安装密码,密码为空时默认公开安装
        # (选填) 版本更新描述,请传空字符串,或不传。
        'buildUpdateDescription': update_description,
    }
    print("获取TOKE中...")
    try:
        r = requests.post(
            'https://www.pgyer.com/apiv2/app/getCOSToken', data=payload, headers=headers)
        if r.status_code == requests.codes.ok:
            result = r.json()
            print("获取TOKEN成功:%s" % result)
            if callback is not None:
                callback(True, result)
        else:
            print("获取TOKEN失败:%s" % result)
            if callback is not None:
                callback(False, None)
    except Exception as e:
        print("获取TOKEN失败:%s" % e)


def upload_to_pgyer(path, api_key, install_type=1, password='', update_description='', callback=None):
    """
    上传到蒲公英
    :param path: 文件路径
    :param api_key: API Key
    :param install_type: 应用安装方式,值为(1,2,3)。1:公开,2:密码安装,3:邀请安装。默认为1公开
    :param password: App安装密码
    :param update_description:
    :return: 版本更新描述
    """

    def getCOSToken_callback(isSuccess, json):
        if isSuccess:
            _upload_url = json['data']['endpoint']
            files = {'file': open(path, 'rb')}
            headers = {'enctype': 'multipart/form-data'}
            payload = json['data']['params']
            print("iPa包上传中...")

            try:
                r = requests.post(_upload_url, data=payload,
                                  files=files, headers=headers)

                if r.status_code == 204:
                    print("iPa包上传成功,正在获取包信息,请稍等...")
                    _getBuildInfo(api_key=api_key, json=json,
                                  callback=callback)
                else:
                    print("iPa包上传失败 %s" % r)
                    print('HTTPError,Code:' + str(r.status_code))
                    if callback is not None:
                        callback(False, None)
            except requests.exceptions.RequestException as e:
                print('iPa包上传失败:%s' % e)
        else:
            pass

    _getCOSToken(
        api_key=api_key,
        install_type=install_type,
        password=password,
        update_description=update_description,
        callback=getCOSToken_callback,
    )


def _getBuildInfo(api_key, json, callback=None):
    """
    检测应用是否发布完成,并获取发布应用的信息
    """
    time.sleep(3)  # 先等个几秒,上传完直接获取肯定app是还在处理中~
    response = requests.get('https://www.pgyer.com/apiv2/app/buildInfo', params={
        '_api_key': api_key,
        'buildKey': json['data']['params']['key'],
    })
    if response.status_code == requests.codes.ok:
        result = response.json()
        code = result['code']
        if code == 1247 or code == 1246:  # 1246	应用正在解析、1247 应用正在发布中
            _getBuildInfo(api_key=api_key, json=json, callback=callback)
        else:
            if callback is not None:
                callback(True, result)
    else:
        if callback is not None:
            callback(False, None)

上传成功后,将返回的信息push到钉钉机器人 通知对应的人查看扫码下载

def send_dingTalk(url, buildQRCodeURL, appVer, buildCreated):
    data = {
        "msgtype": "markdown",
        "markdown": {
            "text": "### 【%s(iOS)】构建成功\n构建类型:iOS\n构建版本:%s\n[下载地址](%s)\n![](%s)\n构建时间:%s" % (display_name,appVer, url, buildQRCodeURL, buildCreated),
            "title": "【%s(iOS)】构建成功" % display_name,
        },
        'at': {
            "isAtAll": False
        }
    }
    headers = {'Content-Type': 'application/json;charset=UTF-8'}
    send_data = json.dumps(data).encode('utf-8')
    print('开始发送钉钉消息...')
    ret = requests.post(url=dingdingWebHook, data=send_data, headers=headers)
    print(ret.text)
    if ret.status_code == requests.codes.ok:
        print('钉钉消息发送成功')
    else:
        print('钉钉消息失败')

标签:python,data,XCode,callback,json,api,key,print,蒲公英
From: https://www.cnblogs.com/qqcc1388/p/16836246.html

相关文章

  • 贝锐蒲公英:智能组网打造水利监控系统互联精细化管理方案
    在物联网时代,伴随城市化进程的不断演变,市民生活用水压力日渐突出。为了改善这一现状,借助信息技术为手段支撑,实现对水利设施的水资源实时精细化监控管理,是当前较为有效......
  • 求大神解答:利用python爬取各县GDP结果为空,求大神看看我的代码问题在哪?
    目标url=红黑人口库代码importrequestsfromlxmlimportetreeimporttimeif__name__=='__main__':  url='https://pagead2.googlesyndication.com/getconfig/soda......
  • python3.9不支持win7
    安装:Anaconda3-2022.10-Windows-x86_64.exe会报错:FailedtocreateAnacondamenus详细信息:ErrorloadingPythonDLLxxxpython39.dll,LoadLibrary:PyInstaller:Forma......
  • XCode Script脚本实现符号文件上传到bugly
    bugly解析错误信息需要符号文件,而符号文件每次都要手动去上传,有时候遗漏了,archive文件被删除后,想要解析出崩溃信息就很难了,所以,可以通过添加脚本,在archive完成的时候,自动上......
  • python自学 简单的网站开发 1
     URL路由配置 1、先在PyCharm中创建个Django项目,然后在PyCharm中的终端窗口输入。pythonmanage.pystartappmyapp 创建一个名字为myapp的应用2、然后在终......
  • c# - mono - 调用 python 脚本 .py 文件
    c#-mono-调用python脚本.py文件一、定义命令行工具:在windows下是cmd.exe,在mac下使用bash。二、踩过的坑使用Process类,启动一个“命令行工具”,在通过向标准......
  • python - 字符串、日期时间转+格式化
    python-字符串、日期时间转+格式化 #!/usr/bin/envpython3#coding=utf-8importosimportsysimportargparseimportcodecsimporttime,datetimedeftest():#"24/......
  • python - 定时拆分备份 nginx 日志
    python-定时拆分备份nginx日志一、背景:nginx的log不会自动按天备份,而且记录时间格式不统一,此程序专门解决这两个问题;二、windows部署方式1.在nginx目录,创建一个n......
  • python - 分析 iis 日志 wwwlogs
    python-解析iis日志iis日志分析工具比较多,基本都支持windows(不夸平台),统计维度也有限。有找工具的时间还不如自己写一个!!!分析时注意iis日志是格林尼治时间,没有加时区。分......
  • python-爬虫-使用 tomd 库,将 html 转换为 markdown 文档
    python-爬虫-使用tomd库,将html转换为markdown文档编码问题搞死人!注意:写python前要先设置两个位置的编码,一个文件顶部设置文件编码,一个是impor......