1. 无痕模式下打开 https://user.qunar.com/passport/login.jsp
发现需要QN1 QN25等最基本的cookie
2. 查看
错误登陆抓包查看登陆接口,发现并没有js加密,使用明文,并且某些参数一看就是固定值
这里大概就能可以尝试:
(1)首先访问网页拿到QN1 QN25,再加上面参数等固定值
(2)其次拿到验证码 (服务器需要验证用户,服务器存储该图片验证码对应的真是验证码,一般保存在参数或cookie中)
观察得到c有点嫌疑,复制粘贴全局搜索,发现貌似是通过js设置固定值
更换验证码,发现字符串仍然一样,但是观察cookie发现返回改变的只有QN25
3.查看加载顺序
(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)
成功获取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)
但是返回仍然验证码验证失败
这是为什么呢?验证码输入错误?偶然现象?验证码过期?
再次尝试仍然如此!这说明仍然有问题,被网站识别了
有很多原因,但是大部分都是cookie
4.重新抓包查看
发现仍然有几个"新"cookie
5.搜索未知cookie
在验证码后面获取
session_.get("https://user.qunar.com/passport/addICK.jsp?ssl")
现在仍然差fid QN271不知道如何获取
搜索发现没有(可能没有拦截到,或者不是由服务器设置,可能由js设置)
重新打开登陆根据抓包新加载发现只有一个sessionId很"嫌疑"
全局搜索与重新打开再次全局搜索发现sessionId值会改变,并且无法发现什么逻辑,继续分析…
再次重新打开,搜索sessionId:
因为本来就无法发现sessionId从何而来,所以第一第二pass,而且最后一个的参数很少,org_id=XXX貌似有点嫌疑的味道,于是查看…
发现参数很少,而且干净(没有加密串),嫌疑程度增大
尝试获取sessionId
response = session_.get("https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0") #尝试获取sessionId
只能获取到他的js代码
继续通过正则表达式获取变动的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")
好了,现在还剩下QN271未知
跟fid恰巧的是 这个QN271一样搜索不到,基本又可以确认是js加载,全局搜索值
看到这里,貌似有点熟悉啊,怎么这么像刚刚的sessionId的东西…
没错,他的值就是我们要的QN271,第一次见到cookie是js加载的…
#手动添加cookie
session_.cookies.update({"QN271": session_id}) #把QN271塞进去,值就是我们的sessionId
session_.get("https://user.qunar.com/passport/login.jsp")
欸,这不就齐活了吗?
6.cookie这边已经完成,进入测试,如果测试不成功就是user-agent等等请求头的问题
惊奇发现并没有报错,貌似登陆成功了啊
请求下这个页面,如果登陆成功了肯定会有信息出现…
请求一下:
完整代码
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)