Python 实现京东自动登录领京豆

今天带大家进行模拟京东登录,并进行签到获取京豆,1000 个京豆 = 10 元,是不是一个发现了一个「发家致富」的好路子?

废话不多说,下面开始正题。

整体流程如下:

京东自动签到流程

1 模拟登录

首先我们需要的就是模拟京东登录,只有登录了才能进行签到领京豆等操作。模拟登录其实就是通过 HTTP 的 POST 请求讲用户的登录信息发送给服务器进行认证的过程。

1.1 登录数据分析

登录过程表面上看着挺简单,我们只要在浏览器里输入用户名、密码,有时还需要输入一些连开发者都分辨不出的验证码。其实背后是浏览器帮忙做了很多工作(浏览器表示挺累的),因此我们要模拟登录,就要搞清楚浏览器在背后做了什么。

浏览器在做什么

同样的套路,从浏览器进入到京东的登录页面,按下 F12进入开发者调试页面,在浏览器页面输入登录信息后,点击登录(可以尝试输入一个错误的密码,因为登录后页面直接跳转到了主页面,看不到我们要的数据了),可以看到一个 POST 请求:

京东登录

可以看到,浏览器向 https://passport.jd.com/uc/loginService 发送了一个 POST 请求到 ,并在请求头上面带上了一些基本的参数,其中有一个 FormData,这里就是浏览器向服务器提交的表单信息。

看上去是不是一脸蒙蔽了,其实,这些信息大部分是可以在登录页面的源代码里找到的,源码中有一个 id 为 formlogin 的表单,其内容有:

<form id="formlogin" method="post" onsubmit="return false;"> <input type="hidden" id="sa_token" name="sa_token" value="B68C442BE64..." /> <input type="hidden" id="uuid" name="uuid" value="cde6e309-9fed-4511-b517-4ffd7777d31f" /> <input type="hidden" name="eid" id="eid" value="" class="hide" /> <input type="hidden" name="fp" id="sessionId" value="" class="hide" /> <input type="hidden" name="_t" id="token" value="_t" class="hide" /> <input type="hidden" name="loginType" id="loginType" value="f" class="hide" /> <input type="hidden" name="main_flag" id="main_flag" value="main_flag" class="hide" /> <input type="hidden" name="pubKey" id="pubKey" value="MIGfMA0GCSq..." class="hide" /> <input type="hidden" name="qHPHrmjSKm" value="YKsoe" /> form>

可以看到一批 hidden,其实这些都是浏览器后台「偷偷」传给服务器的参数,只不过它们是被隐藏了的,前端页面不可见而已。可以用 BeautifulSoup 获取这些登录信息:

sa_token = soup.find(id='sa_token')['value'] uuid = soup.find(id='uuid')['value'] loginType = soup.find(id='loginType')['value'] pubKey = soup.find(id='pubKey')['value'] _t = soup.find(id='token')['value'] fp = soup.find(id='sessionId')['value'] eid = soup.find(id='eid')['value']

1.2 验证码的处理

普通登陆的情况下验证码 authcode 只要为空即可,但是若京东认为有安全风险问题时,会出现验证码,那这个验证码如何处理呢?

目前验证码处理仍然是一个比较困难的问题,处理方法一般可以分为自动识别手动识别

  • 手动处理:就是通过验证码链接将验证码图片下载到本地,然后手动敲入完成信息录入。
  • 自动识别:指使用一些高级的算法技术来完成的,如 OCR 文字识别,机器学习进行识别训练等。一般免费的文字识别算法识别率并不高,收费的识别效率还是可以接受的。

本文就采用手动录入验证码的方式。

首先,如何判断页面是否需要输入验证码?

调试时,可以看到有这么一个请求:https://passport.jd.com/uc/showAuthCode:

showAuthCode

其返回值是:

({"verifycode":true})

显然,这个地址是用来判断是否该账号是否需要验证码的。

另外在前端点击一下「换一张图片」,可以看到验证码的请求地址是:https://authcode.jd.com/verify/image?a=1&acid=36f24f99-f86d-4e1b-957e-bd51cd3257a4&uid=36f24f99-f86d-4e1b-957e-bd51cd3257a4&yys=1529922165515。

同样的,可以在登录页面源码中得到图片的地址信息:src2="//authcode.jd.com/verify/image?a=1&acid=37fe7934-fbc9-413d-b0a8-e0492e1d01b7&uid=37fe7934-fbc9-413d-b0a8-e0492e1d01b7"。

显然图片的获取地址是由 http: + src2 + yys= + Unix时间戳 拼接组成:

auth_code_url = soup.find(id='JD_Verification1').get('src2') auth_code_url = 'http:{}&yys={}'.format(url, str(int(time.time()*1000)))

这样我们就能得到图片的下载地址,将其下载到本地,然后根据图片内容输入验证码即可。

1.3 会话保持

假设我们已经登录成功,那该如何保持会话呢?也就是我们切换到其他网页后,如何保持会话状态,不用再次登录。

其实在后续访问其他页面时只要在 header 中包含用户 cookie 的话,不需用户名密码即可登录。

这里就要用到会话对象 requests.Session,会话对象让你能够跨请求保持某些参数。它也会在同一个 Session 实例发出的所有请求之间保持某些参数,比如 cookies,并且 requests 模块每次会自动处理 cookies,不需要我们手动来处理 cookie,是不是很方便!

所以如果你向同一主机发送多个请求,底层的 TCP 连接将会被重用,从而也可以带来显著的性能提升。其高级用法可以参考文档:http://docs.python-requests.org/zh_CN/latest/user/advanced.html。

2 获取京豆

通过上面的分析,我们解决了京东的登录问题,下面要做的就是京豆的领取啦。

这次我们主要是到店铺里取签到领京豆,领取京豆店铺的地址可以通过如下页面获取:http://bean.jd.com/myJingBean/list

分析店铺签到的页面源码(这里仅列出部分源码):

<ul class="bean-shop-list"> <li> <div class="s-bean">店内签到最多可领<span class="ftc03">1京豆span>div> <a href="http://misney.jd.com" target="_blank" class="s-btn" clstag="pageclick|keycount|myJingBean_201707111|18">去签到a> li>

可以看出,店铺列表是被 class="bean-shop-list" 包裹的 li 组成,其中有店铺的超链接,我们需要访问这些链接地址进入到店铺主页进行签到。

随便访问一个签到店铺,查看签到的源码是一个地址:https://mall.jd.com/shopSign-1000006984.html,发现是由 固定地址 + 店铺 id 拼接而成的,那我们主要的工作就是获取店铺 id 了。

另外,在访问店铺时,在其 response 是包含 shop_id 的:

<input type="hidden" id="shop_id" value="1000003179" />

那我们就可以直接使用 BeautifulSoup 获取,然后拼接成签到地址:

# 获取店铺 id shop_id = soup.find(id='shop_id')['value'] # 拼接签到地址 sign_url = 'https://mall.jd.com/shopSign-{}.html'.format(shop_id)

这样就可以直接访问签到地址进行签到啦~

运行

$ python jd_beans.py 请输入京东账号:xxxx 请输入京东密码:xxxx 请根据下载图片 authcode.jpg 输入验证码:et3r 1. 获取登录信息成功 2. 登录成功 签到失败:http://sjhpchaju.jd.com HTTPConnectionPool(host='sjhpchaju.jd.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.httpconnection object="" at="" 0x7f0bd105cf60="">: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'</urllib3.connection.httpconnection>,)) 签到失败:http://huliuxiang.jd.com HTTPConnectionPool(host='huliuxiang.jd.com', port=80): Max retries exceeded with url: / (Caused by NewConnectionError('<urllib3.connection.httpconnection object="" at="" 0x7f0bd0a2d0b8="">: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'</urllib3.connection.httpconnection>,))

由于网络原因,部分店铺签到失败。

P.S. 签到后,在京东记录页面好像没找到京东增加的记录,泪奔,不过我们是来学技术的,不要在乎这些蝇头小利。

3 总结

本文的难点在于京东的登录过程,涉及到了 验证码、cookie 的处理,业务逻辑也稍微有些绕,需要判断是否需要验证码、是否登录成功等。其实,主要的就是在 HTTP 交互过程中抽取我们所要的目标数据。

往期推荐

结束的起点——又是一年毕业季!

Python 4 种不同的存取文件骚操作

原文发布于微信公众号 - 小詹学Python(xiaoxiaozhantongxue)

原文发表时间:2018-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小詹同学

老司机带你用python来爬取妹子图

这是小詹关于爬虫的第③篇文章! 这篇文章来自一个大一学弟的公众号「日常学python」 虽然这篇文章难度不大,但是对新手来说绝对是福利,爬天爬地爬空气你懂得~ ...

45180
来自专栏跟着阿笨一起玩NET

Win7系统如何让局域网电脑可以访问的解决办法

能看到那台机器,说明网络是相通的,只是不能允许访问而已。你可以试着这样解决: 1.开启guest用户,具体操作:我的电脑右击---管理---本地用户和组--开启...

10020
来自专栏Netkiller

金融交易系统设计思路

文章还没有写完,接下来笔者要出差一段时间,回来在继续完成该文。 目录 1. 架构纵览 1.1.1. 网站前端 1.1.2. 网站后台 1.1. 网站部分 1.2...

67370
来自专栏HappenLee的技术杂谈

分布式系统的一致性算法------《Designing Data-Intensive Applications》读书笔记13

原子提交防止了数据库处于半更新的状态,这对于需要满足多对象事务和维护次级索引的数据库尤为重要。每个次级索引都是从主数据中分离出来的数据结构,因此,如果修改某些数...

10120
来自专栏FreeBuf

对门控系统的攻击面检查

一、引言 近年来,许多企业出于对安全的考虑,开始逐步使用电脑化的门控系统:要求用户拥有中央数据库授权的口令或者刷卡,以确保那些没有授权的人无法进入公司区域或者公...

18660
来自专栏北京马哥教育

十大企业级Linux服务器安全防护要点

糖豆贴心提醒,本文阅读时间8分钟 随着开源系统Linux的盛行,其在大中型企业的应用也在逐渐普及,很多企业的应用服务都是构筑在其之上,例如Web服务、数据库服...

574160
来自专栏惨绿少年

服务器硬件基础

1.1 关于运维人员 1.1.1 运维的职责 1.保证服务器7*24小时 运行 2.保证数据不能丢 3.提高用户的体验(网站打开的速度) 1.1.2 运维原则 ...

43700
来自专栏Java3y

应用层

DNS 服务器的管辖范围不是以“域”为单位,而是以“区”为单位。一个服务器所负责管辖的(或有权限的)范围叫做区 (zone)

17520
来自专栏网站漏洞修补

公司网站被黑了跳转到彩票、博彩网站怎么处理?

最近一段时间,我们SINE安全公司一连接到数十个公司网站被跳转到彩票,博彩网站上去,客户反映从百度搜索网站进去,直接跳转到彩票网站上,直接输入网址没有跳转,导致...

1.7K50
来自专栏网站漏洞修补

怎么取消百度网址安全中心的拦截提示

很多客户找到我们SINE网站安全公司,说自己的网站被百度网址安全中心拦截了,从百度点击网站进去跳转到博cai网站上去,直接输入网址不会出现跳转。还有的客户网站被...

1.6K60

扫码关注云+社区

领取腾讯云代金券