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
- PC上检测是否更新并获取泛泰手机OTA包,更新通用获取脚本(7.29)
- OTA更新包内部
- Android 5.x OTA Update官方文档(四、OTA更新包解读)
- 获取当前手机App版本以及AppStore中的最新版本,判断是否需要更新
- 获取数据并通过handler更新
- 在win8.1系统上检测Chrome浏览器是否安装并获取版本号和安装路径
- CE 上 获取 acitvesync 是否与PC同步
- 检测App 更新提示用户是否更新
- 转:Android 通用获取Ip的方法(判断手机是否联网的方法)
- Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
- Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
- 自定义OTA升级包(差分包,增量包,增量更新)
- Android检查手机上是否安装了指定的软件(根据包名检测)
- 检测应用是否安装和检测版本更新,反之提供下载地址并安装应用(V1.2)
- 安卓高级6 拍照或者从相册获取图片 并检测旋转角度或者更新画册扫描
- [ios]获取app版本更新检测的不同语言信息
- Ubuntu 12.04 LTS 更新源方法(加快获取软件的速度,查找某些包是否存在,更新某些常用软件)
- ios检测新版本并更新
- 关于Dll注入
- 【动态规划】花店橱窗布置
- 帝企鹅变形记:拥抱变革 迎接未来
- 现金流量表整理及开发
- css 内容长度超出范围时用...代替
- PC上检测是否更新并获取泛泰手机OTA包,更新通用获取脚本(7.29)
- 有关vs2008连接数据库的一些操作
- 面朝未来,春暖花开
- 网狐棋牌游戏平台服务器架构设计分析
- 电阻电容封装
- JS时间日期验证
- doxygen的doxywizard安装
- XAMPP 安装失败处理
- 很久没来,露个脸