海淀驾校约车功能分析
本帖最后由 liuyongqing1 于 2018-10-6 15:33 编辑海淀驾校APP约车分析
首先要在电脑上安装charles proxy或是fiddler,本人是mac,fiddler是没有mac版本的。所以选择使用charles proxy。
第一步:安装charles 软件,具体怎么安装网络上有我就不再说明。据说android是有抓包工具的。我手里没有android手机所以没办法测试。还是使用charles。
第二步:设置charles,把macos proxy 勾选上,然后点击proxy settings 设置proxy端口。
第三步:手机上的配置,IOS12点击设置-无线局域网--找到你连接的wifi(与电脑必须在同一个局域网下),点击!号翻到最下面,找到配置代{过}{滤}理并点击,界面选择手动,下面服务器输入电脑的IP地址,端口输入上面的8888,点右上角存储即可。
第四步:在手机上安装海淀驾校app。接下来就是分析步骤:1、输入手机号及密码点击登陆
2、看到charles请求,看到箭头的请求对应下面的是请求详细信息等,可以看到这个地址是post请求,传递了两个参数,passwordmd5和username,username对应手机号,passwordmd5对应的值是把密码用md5加密的。对应的python代码为md5password
PASSWORD='123456'#密码
md5password=hashlib.md5(PASSWORD).hexdigest()#加密后的密码
post成功后会返回学员的基本信息,这里敏感信息太多,所以修改了如下,#后面有注释该字段的意思:
{ "data":{"USERNAME":"1xxxxxxxxxx", #对应用户名
"PHONENUM":"1xxxxxxxxxx",#对应手机密码
"NICKNAME":"1235abc",
"ID":"123456", #id
"XXZH":"12345678",#xxzh 不知道啥意思,学习证号? 但是该字段很重要需要记下
"JGID":"123456",#不知道啥意思,需要记下
"XYBH":"1234567890",#学院编号? 需要记下
"SFZH":"xxxxxx",#身价证号
"JXCODE":"xxxxxxxxx",#驾校code
"APIURL":"",#无用字段
"APIURLIOS":"https://haijiaapi.xuechebu.com:8007",
"JXMC":"海淀驾校",
"XM":"xxx",#姓名
"USERTYPE":"",
"DZ":"北京市",
"SCHOOLPWD":"",#密码明文
"SQCX":"",
"SSBX":"",
"BACKGROUNDIMAGE":"",
"HANDIMAGE":"" },
"code":0, "message":"签到签退等功能,仅限使用本人手机!使用别人手机登录,无法正常签到签退!", "type":0
}
上面的一整条数据对应的代码为:
import requests,json
auth={'username':'1xxxxxxxxxx','passwordmd5':'xxxxxx'}
_headers={ 'User-Agent':'android_haijia;v3.0.2;', 'Content-Type':'application/x-www-form-urlencoded', 'Host':'api.xuechebu.com', 'Connection':'Keep-Alive', 'Accept-Encoding':'gzip'}
r=requests.session()
login=r.post('http://api.xuechebu.com/usercenter/userinfo/login',data=auth,headers=_headers)
Data=json.loads(login.text)
XXZH=Data['data']['XXZH']
JGID =Data['data']['JGID']
XYBH=Data['data']['XYBH']
通过上面代码可以登陆成功,并把数据保存成变量供以后使用,以后代码都差不多,我就不再粘贴代码了。#注意header信息也要填上,不带header头的话可能不成功。特别是user-agent之类的。
上面请求的下一条url地址是:http://haijia.xuechebu.com:8008/Student/SetbadingStuInfo从SetbadingStuInfo这里可以看出是学生信息,就是上一条请求登陆成功后,会接着获取学员信息,我们看看请求主体及返回数据。
这步我记着是必须得请求的不管有没有用,应该是需要获取cookie。 接下来看约车请求。
点击我要约车。
可以看到请求的url是http://haijia.xuechebu.com:8008/KM2/ClYyTimeSectionUIQuery2
{ "data":{
"XnsdList":[{
"Xnsd":"2001",
"XnsdName":"08:00--11:30"
},{
"Xnsd":"2002",
"XnsdName":"12:30--16:00"
},{
"Xnsd":"2003",
"XnsdName":"16:30--20:00"
}],
"YyrqList":[{
"Yyrq":"2018/10/04 16:02:43",
"DisplayWeek":"周四",
"DisplayYyrq":"10-04"
},{
"Yyrq":"2018/10/05 16:02:43",
"DisplayWeek":"周五",
"DisplayYyrq":"10-05"
}],
"QsList":null,
"UIDatas":[{
"Yyrq":"2018/10/04 16:02:43",
"YyrqXH":0,
"Xnsd":"2001",
"XnsdName":null,
"QsName":null,
"Qsid":null,
"SL":1,
"KS":0,
"IsBpked":false,
"IsBpked_SK":0,
"IsCreate":true,
"YyClInfo":""
}
"code":0, "message":""}
可以看到2001代表上午2002代表中午下午 2003代表晚上。2001-2003提前定义好即可,他是不变的。下面SL代表余量,是需要过滤出来的,把有余量的日志过虑出来。例如下面就应该把yyrq有前半部分存下即2018/10/05
{
"Yyrq":"2018/10/05 16:02:43",
"YyrqXH":0,
"Xnsd":"2001",
"XnsdName":null,
"QsName":null,
"Qsid":null,
"SL":12,
"KS":0,
"IsBpked":false,
"IsBpked_SK":0,
"IsCreate":true,
"YyClInfo":""
}
确定好时间和时间段,即可以请求这个时间段内有多少名额了,即有多少车可以练。url地址为:http://haijia.xuechebu.com:8008/KM2/ClYyCars2
可以看到需要提交的参数时间段及预约日志还有学生编号。aaaa字段不用管我记得安卓没有这项。返回的数据是也如上,需要把CNBH取出来。 然后是提交确认信息了,下面的params就是时间日期加上cnbh,直接get即可。此时可以使用异步处理或是多进程。来提交成功率。提交的url地址是http://haijia.xuechebu.com:8008/KM2/ClYyCars2
好了我已经教大家方法。代码嘛我想了想,还是不发了。既然有思路代码肯定是不成问题的。码字不易,请大家多给点分吧。 zn19951027 发表于 2018-10-6 16:52
我可以发给你 源代码 编译即可运行你可以发到论坛装个x 你说对不
好吧我自己也写了约车的。也看看你的吧哈哈。发我邮箱可以吗 ?yongq.liu@ qq.com liuyongqing1 发表于 2018-10-6 17:36
好吧我自己也写了约车的。也看看你的吧哈哈。发我邮箱可以吗 ?yongq.liu@ qq.com
问下这个约车软件现在你还有?能不能发个源码参考下!422109590@QQ.COM 这家伙 代码看的我头疼呢 xiaowanzi52 发表于 2018-10-4 18:04
这家伙 代码看的我头疼呢
有动力研究就不头疼了哈哈 太复杂了完全看不懂,我还得多读几年书 学习学习 厉害厉害!!! 干嘛用的 可是我看不懂呢,然后你有什么用呢
学习一下 xiaowanzi52 发表于 2018-10-5 08:30
可是我看不懂呢,然后你有什么用呢
可以写程序去直接请求啊。这样提高约车成功率~