Python POST 修改某计步APP的数据
某單位組織員工開展健步走活動(dòng),由于策略限制,必須使用傳統(tǒng)計(jì)步器或者手機(jī)APP的方式記錄行走步數(shù),且APP必須始終處于運(yùn)行狀態(tài)方能計(jì)步,這種不合理的方式嚴(yán)重影響了客戶體驗(yàn),但是這一切的一切都沒法改變,所以想著能不能通過修改數(shù)據(jù)包的方式完成步數(shù)的刷新上傳。
使用Charles對(duì)上傳的數(shù)據(jù)進(jìn)行分析
由于是通過手機(jī)APP的記錄并上傳行走步數(shù),因此采用比較易用和好用的Charles抓包工具對(duì)APP上傳的數(shù)據(jù)包進(jìn)行分析
為了避免被某APP發(fā)現(xiàn),此處隱藏掉APP的網(wǎng)站鏈接和目錄
通過不斷的下拉刷新該APP的步數(shù)可以看出,發(fā)生變動(dòng)的有三個(gè)網(wǎng)站鏈接,繼續(xù)尋找與步數(shù)記錄相關(guān)的數(shù)據(jù)包可以發(fā)現(xiàn),它存在于IHttpServletDataService下
進(jìn)一步查看數(shù)據(jù)包
通過查看數(shù)據(jù)包內(nèi)容發(fā)現(xiàn),整個(gè)步數(shù)的刷新是通過ReqMessageBody以及commond兩個(gè)字段組成的Form提交完成的
Form表單內(nèi)容分析
展開ReqMessageBody的內(nèi)容(使用json數(shù)據(jù)格式方便進(jìn)行查看)
{"clientvison": "4.3.2","commond": "UploadData","dayPackage": "0","deviceType": "DS101","deviceserial": "06800000010130ffc4162b9fc","hourPackage": "0","listday": [{"calorieConsumed": 78.0,"exerciseAmount": 1.2,"fatConsumed": 11.1,"goalStepNum": 10000,"stepNumber": 2247,"stepWidth": 70,"walkDistance": 157290,"walkTime": 18,"walkdate": "20180910","weight": 60,"zmrule": "6,7,8,9#3000;18,19,20,21,22#4000","zmstatus": "0,0"},{"calorieConsumed": 1.0,"exerciseAmount": 0.0,"fatConsumed": 0.1,"goalStepNum": 10000,"stepNumber": 35,"stepWidth": 70,"walkDistance": 2450,"walkTime": 0,"walkdate": "20180909","weight": 60,"zmrule": "6,7,8,9#3000;18,19,20,21,22#4000","zmstatus": "0,0"}],"listhour": [{"hour0": "0,0,0,0,0,0","hour1": "0,0,0,0,0,0","hour10": "668,46760,668,46760,0,0","hour11": "228,15960,228,15960,0,0","hour12": "0,0,0,0,0,0","hour13": "0,0,0,0,0,0","hour14": "0,0,0,0,0,0","hour15": "0,0,0,0,0,0","hour16": "0,0,0,0,0,0","hour17": "0,0,0,0,0,0","hour18": "0,0,0,0,0,0","hour19": "0,0,0,0,0,0","hour2": "0,0,0,0,0,0","hour20": "0,0,0,0,0,0","hour21": "0,0,0,0,0,0","hour22": "0,0,0,0,0,0","hour23": "0,0,0,0,0,0","hour24": "0,0,0,0,0,0","hour25": "0,0,0,0,0,0","hour3": "0,0,0,0,0,0","hour4": "0,0,0,0,0,0","hour5": "0,0,0,0,0,0","hour6": "508,35560,508,35560,0,0","hour7": "184,12880,184,12880,0,0","hour8": "659,46130,659,46130,0,0","hour9": "0,0,0,0,0,0","walkdate": "20180910"},{"hour0": "0,0,0,0,0,0","hour1": "0,0,0,0,0,0","hour10": "0,0,0,0,0,0","hour11": "0,0,0,0,0,0","hour12": "0,0,0,0,0,0","hour13": "0,0,0,0,0,0","hour14": "0,0,0,0,0,0","hour15": "0,0,0,0,0,0","hour16": "0,0,0,0,0,0","hour17": "0,0,0,0,0,0","hour18": "0,0,0,0,0,0","hour19": "0,0,0,0,0,0","hour2": "0,0,0,0,0,0","hour20": "0,0,0,0,0,0","hour21": "16,1120,16,1120,0,0","hour22": "19,1330,19,1330,0,0","hour23": "0,0,0,0,0,0","hour24": "0,0,0,0,0,0","hour25": "0,0,0,0,0,0","hour3": "0,0,0,0,0,0","hour4": "0,0,0,0,0,0","hour5": "0,0,0,0,0,0","hour6": "0,0,0,0,0,0","hour7": "0,0,0,0,0,0","hour8": "0,0,0,0,0,0","hour9": "0,0,0,0,0,0","walkdate": "20180909"}],"reqservicetype": 1,"sequenceID": "1536550643973" }大致判斷步數(shù)主要由stepNumber字段控制,walkdate為計(jì)步日期,同時(shí)listhour列表中包含了每個(gè)計(jì)步小時(shí)周期內(nèi)的具體步數(shù),雖然不知道具體的含義,但是已經(jīng)不影響數(shù)據(jù)的修改和上傳了
使用requests模擬POST表單提交
到現(xiàn)在我們就找到了影響數(shù)據(jù)步數(shù)的數(shù)據(jù)字段,下面使用python模擬數(shù)據(jù)交互過程
導(dǎo)入需要的類和庫文件
import requests import urllib import json import datetime import time import random通過分析可以得出,真正標(biāo)識(shí)一個(gè)用戶或者設(shè)備的是deviceserial,這個(gè)可以通過ReqMessageBody看出,同時(shí)為了真實(shí)偽裝POST報(bào)文信息,對(duì)headers進(jìn)行相應(yīng)設(shè)置
url = '網(wǎng)站鏈接' headers = {'User-Agent' : 'Dalvik/2.1.0 (Linux; U; Android 8.0.0; MHA-TL00 Build/HUAWEIMHA-TL00)','Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8','Content-Length' : '2000','Connection' : 'keep-alive'} today = (datetime.datetime.now() - datetime.timedelta(days = 0)) yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1)) str_today = today.strftime("%Y%m%d") str_yesterday = yesterday.strftime("%Y%m%d")表頭中設(shè)置了User-Agent和Content-Type等關(guān)鍵信息,同時(shí)使用datetime函數(shù)以及strftime函數(shù)獲取格式化為20180910格式的當(dāng)前日期
為了模擬步數(shù)的真實(shí)性,使用random.randint函數(shù)獲取每個(gè)小時(shí)時(shí)段內(nèi)的隨機(jī)步數(shù)
組裝新的Message報(bào)文信息
message = {"clientvison": "4.3.2","commond": "UploadData","dayPackage": "0","deviceType": "DS101",#"deviceserial": "06800000010130ffc4162b9fc","deviceserial": "0680000001000ecb75cdf611c542","deviceserial":device,"hourPackage": "0","listday": [{"calorieConsumed": 78.0,"exerciseAmount": 1.2,"fatConsumed": 11.1,"goalStepNum": 10000,#"stepNumber": 18222,"stepNumber": today_stepNumber,"stepWidth": 70,"walkDistance": 157290,"walkTime": 18,#"walkdate": "20180910","walkdate": str_today,"weight": 60,"zmrule": "6,7,8,9#3000;18,19,20,21,22#4000","zmstatus": "0,0"},{"calorieConsumed": 1.0,"exerciseAmount": 0.0,"fatConsumed": 0.1,"goalStepNum": 10000,#"stepNumber": 35,"stepNumber": yesterday_stepNumber,"stepWidth": 70,"walkDistance": 2450,"walkTime": 0,#"walkdate": "20180909","walkdate": str_yesterday,"weight": 60,"zmrule": "6,7,8,9#3000;18,19,20,21,22#4000","zmstatus": "0,0"}],"listhour": [{"hour0": "0,0,0,0,0,0","hour1": "0,0,0,0,0,0",#"hour10": "668,46760,668,46760,0,0","hour10":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour10_1number,cal1 = hour10_1number * 70,step2 = hour10_2number,cal2 = hour10_2number * 70,),"hour11": "228,15960,228,15960,0,0",#"hour12": "0,0,0,0,0,0","hour12":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour12_1number,cal1 = hour12_1number * 70,step2 = hour12_2number,cal2 = hour12_2number * 70,),#"hour13": "0,0,0,0,0,0","hour13":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour13_1number,cal1 = hour13_1number * 70,step2 = hour13_2number,cal2 = hour13_2number * 70,),"hour14": "0,0,0,0,0,0","hour15": "0,0,0,0,0,0","hour16": "0,0,0,0,0,0","hour17": "0,0,0,0,0,0",#"hour18": "0,0,0,0,0,0","hour18":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour18_1number,cal1 = hour18_1number * 70,step2 = hour18_2number,cal2 = hour18_2number * 70,),#"hour19": "0,0,0,0,0,0","hour19":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour19_1number,cal1 = hour19_1number * 70,step2 = hour19_2number,cal2 = hour19_2number * 70,),#"hour20": "0,0,0,0,0,0","hour20":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour20_1number,cal1 = hour20_1number * 70,step2 = hour20_2number,cal2 = hour20_2number * 70,),#"hour21": "0,0,0,0,0,0","hour21":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour21_1number,cal1 = hour21_1number * 70,step2 = hour21_2number,cal2 = hour21_2number * 70,),"hour22": "0,0,0,0,0,0","hour23": "0,0,0,0,0,0","hour24": "0,0,0,0,0,0","hour25": "0,0,0,0,0,0","hour3": "0,0,0,0,0,0","hour4": "0,0,0,0,0,0","hour5": "0,0,0,0,0,0",#"hour6": "508,35560,508,35560,0,0","hour6":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour6_1number,cal1 = hour6_1number * 70,step2 = hour6_2number,cal2 = hour6_2number * 70,),#"hour7": "184,12880,184,12880,0,0","hour7":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour7_1number,cal1 = hour7_1number * 70,step2 = hour7_2number,cal2 = hour7_2number * 70,),#"hour8": "659,46130,659,46130,0,0","hour8":"{step1},{cal1},{step2},{cal2},0,0".format(step1 = hour8_1number,cal1 = hour8_1number * 70,step2 = hour8_2number,cal2 = hour8_2number * 70,),"hour9": "0,0,0,0,0,0","walkdate": str_today,#"walkdate": "20180910"},{"hour0": "0,0,0,0,0,0","hour1": "0,0,0,0,0,0","hour10": "0,0,0,0,0,0","hour11": "0,0,0,0,0,0","hour12": "0,0,0,0,0,0","hour13": "0,0,0,0,0,0","hour14": "0,0,0,0,0,0","hour15": "0,0,0,0,0,0","hour16": "0,0,0,0,0,0","hour17": "0,0,0,0,0,0","hour18": "0,0,0,0,0,0","hour19": "0,0,0,0,0,0","hour2": "0,0,0,0,0,0","hour20": "0,0,0,0,0,0","hour21": "16,1120,16,1120,0,0","hour22": "19,1330,19,1330,0,0","hour23": "0,0,0,0,0,0","hour24": "0,0,0,0,0,0","hour25": "0,0,0,0,0,0","hour3": "0,0,0,0,0,0","hour4": "0,0,0,0,0,0","hour5": "0,0,0,0,0,0","hour6": "0,0,0,0,0,0","hour7": "0,0,0,0,0,0","hour8": "0,0,0,0,0,0","hour9": "0,0,0,0,0,0",#"walkdate": "20180909""walkdate": str_yesterday,}],"reqservicetype": 1,"sequenceID": "1536550643973"}使用requests函數(shù)提交表單信息并打印返回信息
req_message = {#'ReqMessageBody' : '{"clientvison":"4.3.2","commond":"UploadData","dayPackage":"0","deviceType":"DS101","deviceserial":"06800000010130ffc4162b9fc","hourPackage":"0","listday":[{"calorieConsumed":522.0,"exerciseAmount":8.3,"fatConsumed":74.5,"goalStepNum":10000,"stepNumber":18111,"stepWidth":70,"walkDistance":1045730,"walkTime":124,"walkdate":"20180910","weight":60,"zmrule":"6,7,8,9#3000;18,19,20,21,22#4000","zmstatus":"0,0"}],"listhour":[{"hour0":"0,0,0,0,0,0","hour1":"0,0,0,0,0,0","hour10":"0,0,0,0,0,0","hour11":"171,11970,171,11970,0,0","hour12":"690,48300,690,48300,0,0","hour13":"12,840,12,840,0,0","hour14":"1819,127330,1819,127330,0,0","hour15":"0,0,0,0,0,0","hour16":"0,0,0,0,0,0","hour17":"0,0,0,0,0,0","hour18":"0,0,0,0,0,0","hour19":"0,0,0,0,0,0","hour2":"0,0,0,0,0,0","hour20":"0,0,0,0,0,0","hour21":"0,0,0,0,0,0","hour22":"0,0,0,0,0,0","hour23":"0,0,0,0,0,0","hour24":"0,0,0,0,0,0","hour25":"0,0,0,0,0,0","hour3":"0,0,0,0,0,0","hour4":"0,0,0,0,0,0","hour5":"0,0,0,0,0,0","hour6":"0,0,0,0,0,0","hour7":"0,0,0,0,0,0","hour8":"0,0,0,0,0,0","hour9":"0,0,0,0,0,0","walkdate":"20180910"}],"reqservicetype":1,"sequenceID":"1536561269248"}','ReqMessageBody' : json.dumps(message),'commond' : 'UploadData'}r = requests.post(url,headers = headers,data = req_message)r.raise_for_status()print(r.text)time.sleep(10)至此,所有的代碼編寫完畢,最重要的還是對(duì)數(shù)據(jù)包的分析,代碼相對(duì)比較基礎(chǔ),目前來看,這個(gè)程序能夠有效修改步數(shù)(希望不要被某APP發(fā)現(xiàn)并進(jìn)行策略限制)
將Python程序添加到windows例行任務(wù)里面能夠每天定時(shí)執(zhí)行代碼并修改步數(shù),當(dāng)然啦,這個(gè)只是單純的玩一玩,為了自己的身體健康還是應(yīng)該運(yùn)動(dòng)起來,真正修改自己的Body,讓它充滿活力。
總結(jié)
以上是生活随笔為你收集整理的Python POST 修改某计步APP的数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用ReflectionToString
- 下一篇: websocket python爬虫_p