python实战-网站扫码登录流程全解析

在前文中,我们讲解了企业内网中常用的CAS登陆流程,并给出了用python实现的案例。然而,在互联网环境下,相对更方便、快捷、灵活的扫码登录方式才是主流。本文中,我们就详细来讲解一下扫码登陆的流程,并给出一个实际的案例来加深理解。在前文中,我们讲解了企业内网中常用的CAS登陆流程,并给出了用python实现的案例。然而,在互联网环境下,相对更方便、快捷、灵活的扫码登录方式才是主流。本文中,我们就详细来讲解一下扫码登陆的流程,并给出一个实际的案例来加深理解。

原理分析

扫码登陆的实现上,各家的细节不尽相同,但是基本的流程是类似的,大致如下:

  1. 访问网站扫码登陆页,网站给浏览器返回一个二维码和一个唯一标识KEY
  2. 浏览器开启定时轮询服务器,确认KEY对应的扫码结果
  3. 用户使用app扫码二维码,app获取KEY并告知服务器已扫码
  4. App确认登陆(包含个性化校验过程),服务器更新KEY的校验结果
  5. 浏览器轮询结果成功,获得一次性token

带上token请求资源,获得有效cookie,正常访问资源。

网络分析

下面我们以JD的网站扫码登陆流程为例,进行网络交互分析,为后面的编码实现奠定基础。老规矩,浏览器打开F12开发者工具,访问登陆界面。很容易的在网络协议包中找到请求返回二维码的Get请求。如下图所示,响应正文中正是我们期望返回的二维码图像。

从图中可以看到请求的URL地址,并带了三个参数appid,size,t,前两个应该是固定值,第三个根据值的位数和开头1614也很容易猜到是时间戳。

浏览器返回的唯一标识KEY怎么判断是哪个呢,后面会进行反推,现在先继续往后看,查看浏览器发出的定时轮询包的格式。从包中可以看到,除了常规的字段外,还送了一个token字段,且每次GET请求的token字段是一样的,这个token应该就是网站给浏览器返回的唯一标识KEY了。

我们再回过头来仔细去看之前获取二维码的GET请求应答数据,可以在应答标头中找到这个token的值。如下图所示:

相当于这个唯一KEY放置在cookie中,我们编码实现的时候从cookie里取即可。

然后用APP扫码,分析出在未完成扫码、完成扫码未确认登陆、完成登陆三种场景下,网站分别返回的信息。如下图所示,从图中可以看出,提示内容还是非常明确的。在完成登陆的场景下,网站返回了一个ticket值,我们继续往后看浏览器是怎么应用这个ticket数据的。

从下图中可以看到,浏览器访问了一个验证ticket的地址,并通过参数t带上了ticket的值。在响应正文中,通过returnCode可以得知ticket校验成功。至此,一个扫码登陆的流程就结束了。

编码实现

获取二维码的实现如下所示,其中time.time() 可以返回当前时间的时间戳(1970纪元后经过的浮点秒数),由于整数位只有10位,而分析的包中时间戳是13位的,故乘以1000,将三位毫秒时间也纳入进来。

如下图所示,打开二维码图片文件等待app扫码过程中,程序每隔2s循环100次轮询扫码结果,等到返回结果为200时,保存ticket的值,并作为参数去服务器校验有效性,校验通过后,服务器会设置cookie有效,我们可以把cookie保存下来,下次就可以直接访问资源网站了。

本文通过一个实例,逐步分析并实现了利用Python进行扫码登录的示例。大家进一步实践加深理解。由于篇幅所限,需要完整示例代码的可以https://download.csdn.net/download/zhutou_xu/15499968 免费下载,有疑问的也欢迎在评论区留言交流。后续将推出更多python实战分享,喜欢的就点赞关注我吧。

  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
# JD_AutoBuy ## 京东抢购 Python爬虫,自动登录京东网站,查询商品库存,价格,显示购物车详情等。 可以指定抢购商品,自动购买下单,然后手动去京东付款就行。 ## chang log + 2017-03-30 实现二维码扫码登陆 ## 运行环境 Python 2.7 ## 第三方库 - [Requests][1]: 简单好用,功能强大的Http请求库 - [beautifulsoup4][2]: HTML文档格式化及便签选择器 ## 环境配置 ``` Python pip install requests pip install beautifulsoup4 ``` ## 使用帮助 ``` cmd > python scraper-jd.py -h usage: scraper-jd.py [-h] [-u USERNAME] [-p PASSWORD] [-g GOOD] [-c COUNT] [-w WAIT] [-f] [-s] Simulate to login Jing Dong, and buy sepecified good optional arguments: -h, --help show this help message and exit -u USERNAME, --username USERNAME Jing Dong login user name -p PASSWORD, --password PASSWORD Jing Dong login user password -g GOOD, --good GOOD Jing Dong good ID -c COUNT, --count COUNT The count to buy -w WAIT, --wait WAIT Flush time interval, unit MS -f, --flush Continue flash if good out of stock -s, --submit Submit the order to Jing Dong ``` ## 实例输出 ``` cmd +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Thu Mar 30 17:10:01 2017 > 请打开京东手机客户端,准备扫码登陆: 201 : 二维码未扫描 ,请扫描二维码 201 : 二维码未扫描 ,请扫描二维码 201 : 二维码未扫描 ,请扫描二维码 201 : 二维码未扫描 ,请扫描二维码 202 : 请手机客户端确认登录 200 : BADACIFYhf6fakfHvjiYTlwGzSp4EjFATN3Xw1ePR1hITtw0 登陆成功 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Thu Mar 30 17:10:28 2017 > 商品详情 编号:3133857 库存:现货 价格:6399.00 名称:Apple iPhone 7 Plus (A1661) 128G 黑色 移动联通电信4G手机 链接:http://cart.jd.com/gate.action?pid=3133857&pcount=1&ptype=1 商品已成功加入购物车! 购买数量:3133857 > 1 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Thu Mar 30 17:10:30 2017 > 购物车明细 购买 数量 价格 总价 商品 Y 1 6399.00 6399.00 Apple iPhone 7 Plus (A1661) 128G 黑色 移动联通电信4G手机 总数: 1 总额: 6399.00 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ Thu Mar 30 17:10:30 2017 > 订单详情 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ ... ``` ## 注 代码仅供学习之用,京东网页不断变化,代

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值