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

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

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

整体流程如下:


京东自动签到流程

1 模拟登录

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

1.1 登录数据分析

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


浏览器在做什么

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


京东登录

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

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

</formid="formlogin"method="post"οnsubmit="return false;">

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

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

店内签到最多可领1京豆span>div>

去签到a>

li>

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

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

  • 4
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是一个使用 Python 语言编写的京东自动签到、自动京豆的代码: ```python import requests import json import time # 设置请求头 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36" } # 登录京东账号 def login(username, password): # 获取登录页面 url = "https://passport.jd.com/new/login.aspx?" response = session.get(url=url, headers=headers) # 提取登录页面中的参数 sa_token = response.cookies.get("sa_token") uuid = response.cookies.get("uuid") login_page = response.text s_token = login_page.split("name=\"s_token\" value=\"")[1].split("\"")[0] # 构造登录请求的参数 payload = { "uuid": uuid, "loginType": "c", "sa_token": sa_token, "version": "2015", "r": str(int(time.time() * 1000)), "nloginSig": "", "username": username, "password": password, "authcode": "", "pubKey": "", "fp": "", "deviceinfo": "", "loginname": "", "loginpwd": "", "chkRememberMe": "", "machineNet": "", "machineCpu": "", "machineDisk": "", "authcode1": "", "source": "main", "s_token": s_token, } # 发送登录请求 url = "https://passport.jd.com/uc/loginService" response = session.post(url=url, headers=headers, data=payload) result = json.loads(response.text[1:-1]) if result.get("success") == "true": print("登录成功") else: print("登录失败:" + result.get("emptyAuthcodeUrl")) # 自动签到 def sign(): url = "https://vip.jd.com/sign/index" response = session.get(url=url, headers=headers) sign_data = json.loads(response.text) if sign_data.get("status") == "0": print("今天已签到") else: sign_url = "https://vip.jd.com/sign/sign" response = session.get(url=sign_url, headers=headers) sign_result = json.loads(response.text) if sign_result.get("status") == "0": print("签到成功,获得" + str(sign_result.get("beanNum")) + "京豆") else: print("签到失败:" + sign_result.get("errMsg")) # 自动京豆 def get_jd_bean(): url = "https://bean.m.jd.com/bean/signIndex.action" response = session.get(url=url, headers=headers) bean_data = json.loads(response.text) if bean_data.get("status") == "1": print("今天已京豆") else: url = "https://bean.m.jd.com/bean/SignIn.action" response = session.get(url=url, headers=headers) bean_result = json.loads(response.text) if bean_result.get("status") == "1": print("京豆成功,获得" + str(bean_result.get("amount")) + "京豆") else: print("京豆失败:" + bean_result.get("errorMessage")) if __name__ == '__main__': # 创建会话 session = requests.session() # 登录京东账号 login("用户名", "密码") # 自动签到 sign() # 自动京豆 get_jd_bean() # 关闭会话 session.close() ``` 请将代码中的“用户名”和“密码”替换成您的京东账号的用户名和密码。代码中使用了 requests 库发送 HTTP 请求,使用前请确保已安装该库。代码执行过程中会输出相关信息,以实现自动签到、自动京豆的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值