移动测试基础 懒人小技巧 (1):python 实现 IPA 上传到蒲公英

wowotou · 发布于 2017年1月11日 · 最后由 dreamer.li 回复于 2017年4月17日 · 726 次阅读

一、为什么要做这件事

在测试过程中,ios app的安装包(.IPA文件)不像安卓的apk文件那样直接放到手机里点击安装即可,一般来说可以通过一下几种来方式来安装:

  • xcode安装到收集中(点击windows->device->点击下面的“+”,选择要装的IPA
  • 通过iTunes或者一些手机助手安装IPA包(itunes并没有试验成功,pp助手通过一些设置是可以直接安装到手机上
  • 借助分发平台提供的下载页面,直接在该页面下载并自动安装,例如蒲公英等

上述三种方式,显然第三种更方便一些,这种方式对于任何人安装都没有太大的成本,只要你有iPhone即可和网络。我们平时在测试期间也是把打包好的IPA包传到蒲公英上面,然后把网址链接发给大家。测试工作中,还是觉得麻烦,一天有的时候要打好几个测试包,每次都要打开蒲公英网页->选择要上传的文件路径 ->选择上传时的参数配置->上传->打开下载页面,就心想能不能把这些比较规范的流程用代码去实现,于是自己就去试了下并把整个过程记录下来。

二、收获了什么

  • 收获了喜悦与感动[哈哈]
  • 进一步了解了下http请求,请原谅我的无知[捂脸],后文如有不对的地方请多多指正

三、Getting Started

3.1要解决的场景

如下图所示

在文件夹A中有某个app不同版本所打包的IPA文件,我的想法就是当有新的IPA(即上图中第二个文件夹中的IPA文件)生成时,运行某个python脚本(puloadIPAtoPGY.py,基于python2.7),便把最新的IPA上传到蒲公英上去,然后自动打开对应的下载页面。下面我们就step by step来实现。

3.2 Step1 找到你要上传的IPA

方法就是判断文件夹A中最新创建的文件夹,然后选择该文件夹下面的IPA。

#!/usr/bin/env python
#coding=utf-8 
import os,time
import requests                          #用于发送http请求到蒲公英,第三方模块,需要pip install requests来下载
import webbrowser                    #用于打开浏览器,并打开某个网址,系统自带模块
def IpaCreatedLastly(dir):         #传入的dir就是文件夹A的路径,如果你的脚本就在当前路径,直接传入“.”即可
    Dirdic={}                            #key=文件夹名称(包含IPA的文件夹路径),value=创建的时间
    for i in os.listdir(dir):          #查找文件夹A中所有的文件
        if os.path.isdir(i):
            print i
            creattime=os.path.getctime(dir+os.sep+i) #算出每个文件夹的创建时间,这里的时间是指距离1970年一月一日的秒数,所以数值越大越说明是最新创建的
            Dirdic[i]=creattime
    Dirdic=sorted(Dirdic.items(),key=lambda item:item[1],reverse=True)            #按value值(创建的时间)从大到小对字典排序
    DirCreatedLastly=Dirdic[0][0]                                                    #字典排列的第一的key值,即最新创建的文件夹
    print '要上传的文件目录是:'+DirCreatedLastly
    IpaPath=""
    for i in os.listdir(dir+os.sep+DirCreatedLastly):                         #找到该文件路径下面的IPA文件
        if(i.find('.ipa')!=(-1)):
            IpaPath=dir+os.sep+DirCreatedLastly+os.sep+i      #得到最新打包的IPA的夹路径
            return IpaPath
    return IpaPath

通过以上我们就得到了我们要上传的IPA文件。

3.3 Step2 上传到蒲公英

接下来到了核心的一步了,首先我们看看蒲公英的开发手册是怎说的,如下图所示:

首先上传这个操作需要用一个post请求。关于http请求最常见的就是get和post请求,get是一种无副作用的请求,即对服务器的资源和数据不做改变,主要用来获取服务器的返回信息,当然它也可以传递参数,这些参数会被放在请求行(http请求有三部分:请求行,请求头,请求正文,其中get请求只有前两部分,post请求有三部分。)的url地址中。而当你的请求对服务器的资源或数据有改动时,就需要用到post请求格式(请求时的参数放在请求正文中),我们这里要上传一个文件,所以不难理解,肯定是要用post请求来实现这一操作。

接下来再看这句:enctype 为 "multipart/form-data",作为小白的我立马就蒙蔽了,赶紧搜了几片博客看了下(博客链接后面会给出),有了些初步的理解。传送文件给服务器,一般是通过传送文件的二进制数据,这里的enctype是编码格式的意思,默认是
application/x-www-form-urlencoded,这个是指发送前将字符按照URL编码格式(空格被编码为’+’,特殊字符被编码为ASCII十六进制字符)来编码,然后再发送。举个例子来进一步说明下,我们有时候会在浏览器中看到网址后面会有一大串由%、数字和英文字母组成的地址,如下图所示:

这是为啥呢,因为传递的参数中有中文,因为采用的是url编码格式,这些特殊的中文字符被转成16进制字符来显示了。而multipart/form-data,是不对字符编码,主要用于上传文件等,我个人的理解这样文件的二进制数据就会被原原本本地发送个服务器。或许看到这你会想,这样代码写起来会不会很麻烦?又经过了一番查找,发现python的requests模块功能很强大,几句话就把上面的事情搞定了。见如下代码:

def uploadIPA(IPAPath):
    if(IPAPath==''):
        print '未找到对应上传的IPA文件!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'
        return
    else:
        url='http://www.pgyer.com/apiv1/app/upload'         #上传的url地址
        data={
            'uKey':'你自己的userkey',
            '_api_key':'你自己的apikey',
            'installType':'2',
            'password':'123456',
            'updateDescription':'测试服'
            }                                #发送的参数数据
        files={'file':open(IPAPath,'rb')}       #上传的文件
        r=requests.post(url,data=data,files=files)   # 发送post请求。完事。。。。

3.4 Step3 打开下载页面

这里用到了的python的webbrower模块,可以比较快速的实现 启动浏览器并打开某个网址,代码如下:

def openDownloadUrl():
    webbrowser.open(r'你自己的蒲公英下载链接',new=1,autoraise=True)

3.5 Step4 实现它

调用上面的函数,实现自动上传到蒲公英,然后浏览器自动打开页面并弹到你的面前。

if __name__ == '__main__':
    dir='.'
    IpaPath=IpaCreatedLastly(dir)
    uploadIPA(IpaPath)
    openDownloadUrl()

四、参考文献

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 11 条回复
11362

抢个沙发,顶一下

2606

很实用

9320

#2楼 @michael_wang 谢谢~准备做个这方面的系列,多多关注与指教~

14017

可以

104

@Pgyer 如果看到了估计要激动的不得了了

3341

试用了,非常棒

9320

#7楼 @jaychang1989 哈哈,为人民服务~

9320

#6楼 @seveniruby 一百块都不给我😂

6859

插眼等TP

11楼 已删除
A7ed86

你好,我也是想研究一个这样的程序,然后是在手机中实现app的自动更新。现在卡在这里是我的程序只能在ma c中跑起来,我要怎么样设置或者做些什么操作可以在手机中运行呢
第一步想法是查找手机safari的bundled,通过操控Safari去访问下载地址,也无法自动启动Safari

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册