python模拟登陆——去哪儿网

时间:2024-04-02 13:40:47

1. 无痕模式下打开 https://user.qunar.com/passport/login.jsp
发现需要QN1 QN25等最基本的cookie
python模拟登陆——去哪儿网

2. 查看
错误登陆抓包查看登陆接口,发现并没有js加密,使用明文,并且某些参数一看就是固定值
python模拟登陆——去哪儿网
这里大概就能可以尝试:
(1)首先访问网页拿到QN1 QN25,再加上面参数等固定值
(2)其次拿到验证码 (服务器需要验证用户,服务器存储该图片验证码对应的真是验证码,一般保存在参数或cookie中)
python模拟登陆——去哪儿网
观察得到c有点嫌疑,复制粘贴全局搜索,发现貌似是通过js设置固定值
python模拟登陆——去哪儿网
更换验证码,发现字符串仍然一样,但是观察cookie发现返回改变的只有QN25
python模拟登陆——去哪儿网

3.查看加载顺序
python模拟登陆——去哪儿网
(1)首先加载首页,获取QN1 QN25

import requests

def start_get_session():    #获取session,session好处是拿到cookie后,下一次请求自动带上这个cookie
    session_ = requests.session()   #session代表该网站的一系列网站
    return session_

def get_cookies(session_):  #获取 QN1 QN25等一开始进入页面分配的cookie
    session_.get("https://user.qunar.com/passport/login.jsp")
    pass

if __name__ == '__main__':
    session = start_get_session()
    get_cookies(session)

python模拟登陆——去哪儿网
成功获取QN1QN25

(2)再到验证码,保存验证码图片

import requests

def start_get_session():    #获取session,session好处是拿到cookie后,下一次请求自动带上这个cookie
    session_ = requests.session()   #session代表该网站的一系列网站
    return session_

def get_cookies(session_):  #获取 QN1 等一开始进入页面分配的cookie
    session_.get("https://user.qunar.com/passport/login.jsp")
    get_image(session_)	#获取cookie后获取验证码

def get_image(session_):    #前面观察得知为固定值
    response = session_.get("https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a")
    with open("code.png","wb") as f: #文件内容需要保存为比特
        f.write(response.content) #content属性把比特内容取出


if __name__ == '__main__':
    session = start_get_session()
    get_cookies(session)

成功获取验证码

(3)模拟登陆

def login(session_ ,username_ ,password_ ,code_):
    data = {
        'loginType': 0,
        'username': username_,
        'password': password_,
        'remember': 1,
        'vcode': code_,
    }
    url = 'https://user.qunar.com/passport/loginx.jsp'
    response = session_.post(url,data=data)
    print(response.text)

但是返回仍然验证码验证失败
python模拟登陆——去哪儿网

这是为什么呢?验证码输入错误?偶然现象?验证码过期?
再次尝试仍然如此!这说明仍然有问题,被网站识别了
有很多原因,但是大部分都是cookie

4.重新抓包查看
发现仍然有几个"新"cookie
python模拟登陆——去哪儿网
5.搜索未知cookie
python模拟登陆——去哪儿网
在验证码后面获取

session_.get("https://user.qunar.com/passport/addICK.jsp?ssl")

python模拟登陆——去哪儿网
现在仍然差fid QN271不知道如何获取
搜索发现没有(可能没有拦截到,或者不是由服务器设置,可能由js设置)
python模拟登陆——去哪儿网
重新打开登陆根据抓包新加载发现只有一个sessionId很"嫌疑"
python模拟登陆——去哪儿网
全局搜索与重新打开再次全局搜索发现sessionId值会改变,并且无法发现什么逻辑,继续分析…
再次重新打开,搜索sessionId:
因为本来就无法发现sessionId从何而来,所以第一第二pass,而且最后一个的参数很少,org_id=XXX貌似有点嫌疑的味道,于是查看…
发现参数很少,而且干净(没有加密串),嫌疑程度增大
python模拟登陆——去哪儿网
尝试获取sessionId

response = session_.get("https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0")	#尝试获取sessionId

只能获取到他的js代码
python模拟登陆——去哪儿网
继续通过正则表达式获取变动的sessionId

response = session_.get("https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0") #尝试获取sessionId
session_id =re.findall(r"sessionId=(.*?)&",response.text)[0]

填入刚获取到的sessionId以获取fid

session_.get("https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1551522340217&sessionId={}&domain=qunar.com&orgId=ucenter.login".format(session_id))
session_.get("https://user.qunar.com/passport/login.jsp")

python模拟登陆——去哪儿网
好了,现在还剩下QN271未知
跟fid恰巧的是 这个QN271一样搜索不到,基本又可以确认是js加载,全局搜索值
python模拟登陆——去哪儿网
看到这里,貌似有点熟悉啊,怎么这么像刚刚的sessionId的东西…
没错,他的值就是我们要的QN271,第一次见到cookie是js加载的…

#手动添加cookie
session_.cookies.update({"QN271": session_id})		#把QN271塞进去,值就是我们的sessionId
session_.get("https://user.qunar.com/passport/login.jsp")

欸,这不就齐活了吗?
python模拟登陆——去哪儿网
6.cookie这边已经完成,进入测试,如果测试不成功就是user-agent等等请求头的问题
python模拟登陆——去哪儿网
惊奇发现并没有报错,貌似登陆成功了啊
请求下这个页面,如果登陆成功了肯定会有信息出现…
python模拟登陆——去哪儿网
python模拟登陆——去哪儿网
请求一下:
python模拟登陆——去哪儿网

完整代码

import requests
import re

def start_get_session():    #获取session,session好处是拿到cookie后,下一次请求自动带上这个cookie
    session_ = requests.session()   #session代表该网站的一系列网站
    return session_

def get_cookies(session_):  #获取 QN1 等一开始进入页面分配的cookie
    session_.get("https://user.qunar.com/passport/login.jsp")
    get_image(session_)
    session_.get("https://user.qunar.com/passport/addICK.jsp?ssl")
    response = session_.get("https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0") #尝试获取sessionId
    session_id =re.findall(r"sessionId=(.*?)&",response.text)[0]


    #填充刚才获取到的sessionId以获取fid
    session_.get("https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1551522340217&sessionId={}&domain=qunar.com&orgId=ucenter.login".format(
        session_id))
    session_.get("https://user.qunar.com/passport/login.jsp")


    #手动添加cookie
    session_.cookies.update({"QN271": session_id})#把QN271塞进去,值就是我们的sessionId
    session_.get("https://user.qunar.com/passport/login.jsp")


def get_image(session_):    #前面观察得知为固定值
    response = session_.get("https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a")
    with open("code.png","wb") as f: #文件内容需要保存为比特
        f.write(response.content) #content属性把比特内容取出



def login(session_ ,username_ ,password_ ,code_):
    data = {
        'loginType': 0,
        'username': username_,
        'password': password_,
        'remember': 1,
        'vcode': code_,
    }
    url = 'https://user.qunar.com/passport/loginx.jsp'
    response = session_.post(url,data=data)
    print(response.text)
    response = session_.get("http://user.qunar.com/index/basic")
    print(response.text)

if __name__ == '__main__':
    session = start_get_session()
    get_cookies(session)
    username = input("请输入你的用户名:  ")
    password = input("请输入你的密码:  ")
    code = input("请输入验证码:  ") #这里人肉识别验证码
    login(session,username,password,code)