requests+re 模拟登陆去哪儿网

分析登陆页面
1. 使用 Chrome 无痕模式访问去哪儿网登陆网页
https://user.qunar.com/passport/login.jsp

直接使用 Chrome 开发者工具分析,发现cookie 返回 QN1


image.png
2. 访问去哪儿网发现登陆需要验证码,所以分析下验证码接口

,发现验证码的URL是固定的

https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a
image.png

而且发现访问验证码后,返回的 cookie 有所改变。返回QN1、QN25


image.png
3. 尝试错误登陆,分析登陆接口

发现请求的网址为

https://user.qunar.com/passport/loginx.jsp

查看请求页面的 from data 数据,以及传入的 cookie 数据 QN1、QN25、QN271、_i、_vi、_fid


image.png

image.png

直接使用验证码返回的 cookie 去访问请求页面,发现不能登录成功,可能有:

  • cookie 不完整;
  • 除了 cookie 还有其他 request headers 校验;

尝试分析剩下的 cookie数据 QN271、_i、_vi、_fid的来源

查找QN271
直接在Chrome 开发者工具 全局搜索 Ctrl+Shift+F,搜索 QN271 的值

image.png

发现QN271是在JS里面的,而且第三条搜索结果的URL很干净

https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0

可以看下里面的构造(数据太长,未截取关键部位)

image.png

点左下角的Pretty print 格式化js文件,发现 QN271存在里面,可以直接使用 正则 获取其值

# secScript.setAttribute("src", "https://rmcsdf.qunar.com/js/device.js?orgId=ucenter.login&sessionId=a7a856be-c704-4aa4-89e6-76f14da844a5&auto=false");
sessionId = re.findall(r'sessionId=(.*?)&',response.text)[0]

查找_i 和 _vi
用上面同样的方法进行查找,并未能找到 _i 的值
一般来说 _i 这个值是服务器返回是,那么可以尝试搜索 set-cookie-name:_i(一般来说应先尝试搜索这个)

image.png

发现有返回 _i 和 _vi 的过程
而URL是:

https://user.qunar.com/passport/addICK.jsp?ssl

查找 fid
set-cookie-name:的方法尝试查找 fid 的值

image.png

很幸运能找到该cookie 值
但是URL却是:

https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1531563394135&sessionId=a7a856be-c704-4aa4-89e6-76f14da844a5&domain=qunar.com&orgId=ucenter.login

callback: callback_1531563394135
sessionId: a7a856be-c704-4aa4-89e6-76f14da844a5
domain: qunar.com
orgId: ucenter.login

需要分析该URL的组成
callback 一般是固定值,请求返回后调用哪个js
sessionId 是非固定值,重新刷新页面,其值会改变
domain 跟 orgId 是固定值
所以难点是找出 sessionId 的规律
但难得可贵的是,这个sessionId值是跟上面 查找QN271 中的 sessionId 是一致的

所以 cookie 添加思路为:

  1. 访问登录页面,获得QN1
    https://user.qunar.com/passport/login.jsp
  2. 访问验证码页面,获得QN1,QN25
    https://user.qunar.com/captcha/api/image?k={en7mni(z&p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a
  3. 访问 addICK 页面,获得_i,_vi
    https://user.qunar.com/passport/addICK.jsp?ssl
  4. 访问 df.js 页面,获得 sessionId,即获得 QN271(并非直接存储在 session)
    https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0
  5. 访问由 sessionId 组成的 URL,获得fid,并往 session 会话中添加 QN271 {'QN271':cookie_QN271}
    'https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1511693290383&'
    'sessionId={}&domain=qunar.com&orgId=ucenter.login'.format(cookie_QN271)

技巧:cookie 添加完成后可以尝试再次登录,访问过程中可以 设置断点debug查看 cookie 是否添加完整


image.png

代码实现:

import requests
import re
"""

此代码共分为4部分:初始化模块,获取添加cookies模块,验证码模块,登录模块

"""


def start_get_session():
    session_ = requests.session()   # 得到一个session
    return session_


def get_base_cookies(session_):
    session_.get('https://user.qunar.com/passport/login.jsp')  # 获得cookie参数,原始的QN1
    get_image(session_)   # 通过调用get_image函数,得到验证码图片,同时获得cookie参数QN1,QN25
    session_.get('https://user.qunar.com/passport/addICK.jsp?ssl')  # 获得cookie参数_i,_vi

    """
    由于获取fid参数的url需要cookie参数SESSIONID得到,所以没办法直接得到fid,需要先得到SESSIONID这个参数,再得到fid参数

    """
    # 经过查找发现SESSIONID在这个js文件中,所以先得到它
    response = session_.get('https://rmcsdf.qunar.com/js/df.js?org_id=ucenter.login&js_type=0')
    # 查找SESSIONID
    cookie_SE = re.findall(r'&sessionId=(.*?)&', response.text)[0]  # 通过正则得到SESSIONID

    # 获取fid
    session_.get('https://rmcsdf.qunar.com/api/device/challenge.json?callback=callback_1511693290383&'
                 'sessionId={}&domain=qunar.com&orgId=ucenter.login'.format(cookie_SE))

    session_.cookies.update({'QN271': cookie_SE})  # 通过比对发现参数QN271和SESSIONID相同,所以直接加入cookies中


def get_image(session_):
    response = session_.get(
        'https://user.qunar.com/captcha/api/image?k={en7mni(z&'
        'p=ucenter_login&c=ef7d278eca6d25aa6aec7272d57f0a9a')   # 获得二维码的response

    with open('./img/code.png', 'wb') as f:
        f.write(response.content)   # 把二维码存进同级img文件夹下命名为code


def login(session_, username, password, vcode):
    data ={
        'loginType': 0,
        'username': username,
        'password': password,
        'remember': 1,
        'vcode': vcode,
    }

    url = 'https://user.qunar.com/passport/loginx.jsp'
    response = session_.post(url , data)   # 通过post请求方式,模拟登录
    print(response.text)


if __name__ == '__main__':   # 主程序,程序入口
    session = start_get_session()   # 实例化一个session
    get_base_cookies(session)   # 调用函数,在session中添加cookie
    username = input('请输入账号:')
    password = input('请输入密码:')
    vcode = input('请输入验证码:')
    login(session, username, password, vcode)  # 调用登录函数

改进:
账户密码可以添加到环境变量中,从环境变量中获取,或者放到.env文件,然后读取;
验证码可以考虑OCR识别或者打码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容