自己写了一个开源的百度贴吧签到项目,登录用的简单粗暴的selenium,虽然简单,但是太消耗资源了,当时因为懒得抓包分析登录过程,所以就一直用的selenium登录,刚好这段时间有时间就来简单分析了一下,然后发现国内这些网站的登录提交的数据基本没差。。。
模拟器:夜神模拟器
抓包工具:Charles
这里主要分析用短信验证码登录。
在这里输入手机号,然后看发送的包。
可以看到有四个包,第一个getphonestatus,查询手机号是否存在,存在才会发送短信,这个可以不用管。
sms这个包就是发送验证码的包了,https://wappass.baidu.com/wp/api/login/sms 这是postURL,可以看到需要以下参数:encryptedId,username, tpl,clientfrom,countrycode,gid,dialogVerifyCode,vcodesign,vcodestr,dv,mobileEncryption,duration,ds,tk,traceid。
最后两个属于同一个包,viewlog,这个包的作用是获取tk跟ds。其中连接中的ak应该是appkey什么的,是固定值,后面参数不用管,只要GET这个:https://wappass.baidu.com/viewlog?ak=1e3f2dd1c81f2075171a547893391274 请求即可返回tk跟ds。
OK,第一步发送验证码步骤分析完了,就来分析以下个个参数。
发送验证码的URL,需要POST的参数有很多,经过测试,发现只需要以下参数:username:手机号,tpl:tb,clientfrom:native,gid:gid,dialogVerifyCode:空字符串(防止后面会出现验证码),vcodesign:空字符串,vcodestr:空字符串,ds:ds,tk:tk,traceid:traceid(红色为不固定参数,其余为固定参数)
ds跟tk,直接get上面提到的链接即可得到。
gid的生成方法网上很多,就不分析了,下面是Python代码:
def getGID():
def transform(char):
if char == "4" or char == "-": return char
number = random.randint(0, 15)
if char != "x": number = 3 & number | 8
return format(number, "x").upper()
return "".join([transform(c) for c in "xxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx"])
traceid:
def getTraceid():
traceid = "CA9C8801"
seed = "1234567890abcdefghijklmnopqrstuvwxyz"
sa = []
for i in range(8):
sa.append(random.choice(seed))
traceid = ''.join(sa).upper()
return traceid
把需要的表单参数都得到之后,往postURL:https://wappass.baidu.com/wp/api/login/sms 发送POST请求,即可收到验证码:smsvc。
收到验证码之后我们要继续POST带有验证码(smsvc)的表单。
第二步,提交收到验证码之后的请求包:https://wappass.baidu.com/wp/api/login?v=1557991859994
后面的v参数是13位时间戳,需要POST的参数有点多:
后来经过测试,只需要POST以下参数即可:clientfrom:native,tpl:tb,client:android,adapter:3,t:13位时间戳,gid:gid,smsverify:1,smsvc:六位数短信验证码,mobilenum:手机号,username:手机号,sms:1,traceid:traceid (红色为不固定参数,其余为固定参数)
把上述表单再次往:https://wappass.baidu.com/wp/api/login?v={ts}(ts为13位时间戳)POST即可,接下来会返回一串JSON:
{
"errInfo": {
"no": "0",
"msg": "Dynamic Login Success"
}***省略
还有用户名之类的,就是提示登录成功了。接下来就是拿Cookies什么的了。
还有一种可能是第一次请求的时候碰上验证码,code值为50020,就是需要验证码了,由于返回的是一个JSON,在data段下的vcodesign就是上面提到的vcodesign,验证码链接需要把[‘data’][‘vcodestr’]值跟:https://wappass.baidu.com/cgi-bin/genimage? 拼起来:
vcodesign = r['data']['vcodesign']
vcodestr = r['data']['vcodestr']
print('需要验证码')
vcodeurl = f'https://wappass.baidu.com/cgi-bin/genimage?{vcodestr}'
之后打开验证码链接(vcodeurl ),看到的验证码就是vcode值,再往:https://wappass.baidu.com/wp/api/login/sms POST即可。
本文中的getGid跟getTraceid函数来自:百度登录与贴吧签到 | Lonely Feeling
非技术的路过。