Python模拟百度贴吧APP短信登录

自己写了一个开源的百度贴吧签到项目,登录用的简单粗暴的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:dstk:tktraceid: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

1 条评论

发表评论

*