PC上检测是否更新并获取泛泰手机OTA包,更新通用获取脚本(7.29)

来源:互联网 发布:安卓商城源码 编辑:程序博客网 时间:2024/05/16 10:51

首先看一下检测更新时手机发送的数据

POST /apkmanager/Process/sky_station_30_server.php HTTP/1.1Connection: Keep-AliveContent-Type: multipart/form-data;boundary=pkgnameUser-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.5; IM-A820L Build/GRJ90)Host: apkmanager.skyservice.co.krContent-Length: 616Accept-Encoding: gzip--pkgnameContent-Disposition:form-data;name="file";filename=GET_PKG_DETAIL_INFO.xml<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_REQUEST><SKY_CMD>GET_PKG_DETAIL_INFO</SKY_CMD><TERMINAL_NAME>IM-A820L</TERMINAL_NAME><TERMINAL_CARRIER>LGT-KOR</TERMINAL_CARRIER><TERMINAL_LOCATION>zh_CN</TERMINAL_LOCATION><TERMINAL_MANUFAC>PANTECH</TERMINAL_MANUFAC><BOARD_SOFT_VER>S1231133</BOARD_SOFT_VER><SKY_STATION_VER>875</SKY_STATION_VER><TERMINAL_SERIAL>******</TERMINAL_SERIAL><TERMINAL_IMEI>***************</TERMINAL_IMEI><PKG_NAME>com.pantech.firmware.bin.IM-A820L</PKG_NAME></SKY_REQUEST>--pkgname--

其中*号是隐去的个人信息

得到的反馈是

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_RESPONSE><SKY_CMD>GET_PKG_DETAIL_INFO</SKY_CMD><APK_INFO><PKG_NAME>com.pantech.firmware.bin.IM-A820L</PKG_NAME><APP_NAME>IM-A820L</APP_NAME><PKG_VERSIONCODE>1.39</PKG_VERSIONCODE><PKG_VERSIONNAME>S1231139</PKG_VERSIONNAME><GET_INFO_URL>87b82857c5.apk</GET_INFO_URL><PKG_SIZE>16450257</PKG_SIZE><PKG_DATE>2012-02-10 09:44:04</PKG_DATE><DATA_INIT>0</DATA_INIT><UNZIP_SIZE>0</UNZIP_SIZE><CHECKSUM>07260af6cdde7c991f2f300270447fbc</CHECKSUM></APK_INFO></SKY_RESPONSE>

可以看出有升级到S1231139的包,大小是16450257

那么我们就只要在PC上构建出这个POST就行了

而其中必须的信息是

POST /apkmanager/Process/sky_station_30_server.php HTTP/1.1Content-Type: multipart/form-data;boundary=pkgnameHost: apkmanager.skyservice.co.kr--pkgnameContent-Disposition:form-data;name="file";filename=GET_PKG_DETAIL_INFO.xml<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_REQUEST><SKY_CMD>GET_PKG_DETAIL_INFO</SKY_CMD><TERMINAL_NAME>手机型号</TERMINAL_NAME><BOARD_SOFT_VER>待更新版本</BOARD_SOFT_VER><PKG_NAME>com.pantech.firmware.bin.手机型号</PKG_NAME></SKY_REQUEST>--pkgname--
那么我们就可以针对自己所需的型号版本进行查询了

我利用的便是Python的httplib模块构建POST提交表单

这里先提供一个Python小脚本作示范,大家可以根据自己熟悉的语言实现

import httplibparams = ("--pkgname\nContent-Disposition:form-data;name=\"file\";filename=GET_PKG_DETAIL_INFO.xml\n\n<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_REQUEST><SKY_CMD>GET_PKG_DETAIL_INFO</SKY_CMD><TERMINAL_NAME>IM-A820L</TERMINAL_NAME><BOARD_SOFT_VER>S1231133</BOARD_SOFT_VER><PKG_NAME>com.pantech.firmware.bin.IM-A820L</PKG_NAME></SKY_REQUEST>\n--pkgname--")headers = {"Content-Type":"multipart/form-data;boundary=pkgname", "Connection":"Keep-Alive"}conn = httplib.HTTPConnection("apkmanager.skyservice.co.kr")conn.request("POST","/apkmanager/Process/sky_station_30_server.php",params,headers)response = conn.getresponse()data = response.read()print dataconn.close()

再看一下获取OTA包所发送的数据

POST /apkmanager/Process/sky_station_30_server.php HTTP/1.1Connection: Keep-AliveContent-Type: multipart/form-data;boundary=read_stream:com.pantech.firmware.bin.IM-A820LRange: bytes=0-User-Agent: Dalvik/1.4.0 (Linux; U; Android 2.3.5; IM-A820L Build/GRJ90)Host: apkmanager.skyservice.co.krContent-Length: 792Accept-Encoding: gzip--read_stream:com.pantech.firmware.bin.IM-A820LContent-Disposition:form-data;name="file";filename=GET_PKG_DOWN.xml<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_REQUEST><SKY_CMD>GET_PKG_DOWN</SKY_CMD><TERMINAL_NAME>IM-A820L</TERMINAL_NAME><TERMINAL_CARRIER>LGT-KOR</TERMINAL_CARRIER><TERMINAL_LOCATION>zh_CN</TERMINAL_LOCATION><TERMINAL_MANUFAC>PANTECH</TERMINAL_MANUFAC><BOARD_SOFT_VER>S1231133</BOARD_SOFT_VER><SKY_STATION_VER>875</SKY_STATION_VER><TERMINAL_SERIAL>>******</</TERMINAL_SERIAL><TERMINAL_IMEI>>***************</</TERMINAL_IMEI><SKIP_POSITION>0</SKIP_POSITION><PKG_NAME>com.pantech.firmware.bin.IM-A820L</PKG_NAME><PKG_VERSIONNAME>S1231139</PKG_VERSIONNAME><PKG_VERSIONCODE>1.39</PKG_VERSIONCODE></SKY_REQUEST>--read_stream:com.pantech.firmware.bin.IM-A820L--

此时返回的就是133升级到139的OTA包了,格式为apk,其中就有update.zip,我们需要的就是它

其中必须的是

POST /apkmanager/Process/sky_station_30_server.php HTTP/1.1Content-Type: multipart/form-data;boundary=read_stream:com.pantech.firmware.bin.手机型号Host: apkmanager.skyservice.co.kr--read_stream:com.pantech.firmware.bin.手机型号Content-Disposition:form-data;name="file";filename=GET_PKG_DOWN.xml<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_REQUEST><SKY_CMD>GET_PKG_DOWN</SKY_CMD><TERMINAL_NAME>手机型号</TERMINAL_NAME><BOARD_SOFT_VER>带升级版本</BOARD_SOFT_VER><SKIP_POSITION>0</SKIP_POSITION><PKG_NAME>com.pantech.firmware.bin.手机型号</PKG_NAME><PKG_VERSIONNAME>可升级版本</PKG_VERSIONNAME></SKY_REQUEST>--read_stream:com.pantech.firmware.bin.手机型号--

跟前面获取更新信息类似的,只不过这次就不能把收到的数据print出来了

再看一下获取OTA包的Python脚本

import httplibparams = ("--read_stream:com.pantech.firmware.bin.IM-A820L\nContent-Disposition:form-data;name=\"file\";filename=GET_PKG_DOWN.xml\n\n<?xml version='1.0' encoding='UTF-8' standalone='yes' ?><SKY_REQUEST><SKY_CMD>GET_PKG_DOWN</SKY_CMD><TERMINAL_NAME>IM-A820L</TERMINAL_NAME><BOARD_SOFT_VER>S1231133</BOARD_SOFT_VER><SKIP_POSITION>0</SKIP_POSITION><PKG_NAME>com.pantech.firmware.bin.IM-A820L</PKG_NAME><PKG_VERSIONNAME>S1231139</PKG_VERSIONNAME></SKY_REQUEST>\n--read_stream:com.pantech.firmware.bin.IM-A820L--")headers = {"Content-Type":"multipart/form-data;boundary=read_stream:com.pantech.firmware.bin.IM-A820L", "Connection":"Keep-Alive"}conn = httplib.HTTPConnection("apkmanager.skyservice.co.kr")conn.request("POST","/apkmanager/Process/sky_station_30_server.php",params,headers)response = conn.getresponse()f = open("update.apk", "wb")while True:tmp = response.read(100*1024)if not tmp:breakf.write(tmp)f.close()conn.close()

其中

while True:tmp = response.read(100*1024)if not tmp:breakf.write(tmp)
是防止获取较大的OTA包时造成占用内存过大用的,每收到100K的数据便写入文件



这里再给大家一个只需要输入型号及版本就可获取OTA包的脚本

#-*-coding:utf-8-*-import httplibglobal model, versiondef xmlInf(Elements):from xml.dom.minidom import getDOMImplementationimpl = getDOMImplementation()SKY_REQUEST = impl.createDocument(None, "SKY_REQUEST", None)Request = SKY_REQUEST.documentElementfor Element in Elements:Ele = SKY_REQUEST.createElement(Element[0])Ele.appendChild(SKY_REQUEST.createTextNode(Element[1]))Request.appendChild(Ele)SKY_REQUEST.appendChild(Request)return SKY_REQUEST.toxml(encoding='UTF-8')def getinfo(ResponseStr):from xml.dom import minidomimport timedata = time.strftime('%X %x')+"\n"SKY_RESPONSE = minidom.parseString(ResponseStr).documentElementdata += "---------------------------------------------------------\n"SKY_CMD = SKY_RESPONSE.getElementsByTagName("SKY_CMD")[0]data += SKY_CMD.childNodes[0].nodeValue + "\t" + model+"_"+version+"_to_\n"data += "---------------------------------------------------------\n"APK_INFO = SKY_RESPONSE.getElementsByTagName("APK_INFO")if str(APK_INFO) == "[]":print "无更新信息或型号版本输入错误\n"data = ""return datadata += APK_INFO[0].nodeName + "\n"for node in APK_INFO[0].childNodes:if node.nodeType == node.ELEMENT_NODE:for info in APK_INFO:try:data += info.getElementsByTagName(node.nodeName)[0].nodeNameif len(node.nodeName) >= 15:data += ":"else:data += ":\t" data += str(info.getElementsByTagName(node.nodeName)[0].childNodes[0].nodeValue) + "\n"except:print "出现错误(可能有韩文),请查看Response.xml"o = open("Response.xml", 'wb')o.write(ResponseStr)o.close()data += "Error occured!!!\n"data += "---------------------------------------------------------\n"return dataif __name__ == "__main__":print "请输入手机型号(如IM-A820L):"model = raw_input()print "请输入待更新版本(如S1231150):"version = raw_input()RequestInf = [['SKY_CMD', 'GET_PKG_DETAIL_INFO'], ['TERMINAL_NAME', model], ['BOARD_SOFT_VER', version], ['PKG_NAME', 'com.pantech.firmware.bin.'+model]]xml = xmlInf(RequestInf)params = "--pkgname\nContent-Disposition:form-data;name=\"file\";filename=GET_PKG_DETAIL_INFO.xml\n\n" + xml + "\n--pkgname--"headers = {"Content-Type":"multipart/form-data;boundary=pkgname", "Connection":"Keep-Alive"}i = 0conn = httplib.HTTPConnection("apkmanager.skyservice.co.kr")data = ""while i < 10:try:conn.request(method="POST",url="/apkmanager/Process/sky_station_30_server.php",body=params,headers=headers)response = conn.getresponse()data = response.read()conn.close()breakexcept:conn.close()i += 1print "连接出错,进行第"+str(i)+"次重试"if data != "":f = open("updateinfo.txt", "a")data = getinfo(data)f.write(data+"\n")f.close()if data != "":print dataotaver = data[data.find("PKG_VERSIONNAME:")+16:][:data[data.find("PKG_VERSIONNAME:")+16:].find("\n")]size = data[data.rfind("PKG_SIZE:")+10:][:data[data.rfind("PKG_SIZE:")+10:].find("\n")]print "OTA升级版本:" + str(otaver) + "大小:" + str(size)RequestOTA = [['SKY_CMD', 'GET_PKG_DOWN'], ['TERMINAL_NAME', model], ['BOARD_SOFT_VER', version], ['PKG_NAME', 'com.pantech.firmware.bin.'+model], ['PKG_VERSIONNAME', otaver]]xml = xmlInf(RequestOTA)params = "--read_stream:com.pantech.firmware.bin." +model+ "\nContent-Disposition:form-data;name=\"file\";filename=GET_PKG_DOWN.xml\n\n" + xml + "\n--read_stream:com.pantech.firmware.bin." + model +"--"headers = {"Content-Type":"multipart/form-data;boundary=read_stream:com.pantech.firmware.bin." + model, "Connection":"Keep-Alive"};i = 0conn = httplib.HTTPConnection("apkmanager.skyservice.co.kr")data = ""while i < 10:try:conn.request(method="POST",url="/apkmanager/Process/sky_station_30_server.php",body=params,headers=headers)response = conn.getresponse()file = open(model+'_'+version+'_to_'+otaver+'.apk', 'wb')done = 0.while True:tmp = response.read(100*1024)if not tmp:breakfile.write(tmp)done += 100*1024if done/int(size)>1:print "\r100%    "else:print "\r" + str(round(done/int(size)*100,2)) + "%",file.close()conn.close()breakexcept:conn.close()i += 1print "连接出错,进行第"+str(i)+"次重试"

运行效果如下




转载请注明出处:http://blog.csdn.net/su_ky/article/details/7728877


原创粉丝点击