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 了。
另外,在访问店铺时,在其 response 是包含 shop_id 的:
那我们就可以直接使用 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: / (CausedbyNewConnectionError(': Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))
签到失败:http://huliuxiang.jd.com
HTTPConnectionPool(host='huliuxiang.jd.com', port=80): Max retries exceeded with url: / (CausedbyNewConnectionError(': Failed to establish a new connection: [Errno -3] Temporary failure in name resolution',))
由于网络原因,部分店铺签到失败。
P.S. 签到后,在京东记录页面好像没找到京东增加的记录,泪奔,不过我们是来学技术的,不要在乎这些蝇头小利。
3 总结
本文的难点在于京东的登录过程,涉及到了 验证码、cookie 的处理,业务逻辑也稍微有些绕,需要判断是否需要验证码、是否登录成功等。其实,主要的就是在 HTTP 交互过程中抽取我们所要的目标数据。
另外,验证码处理部分还是有些问题,比如前面判断出登录不需要验证码,但是在登录时仍返回「请输入验证码」。还有,有兴趣的同学也可以进行扩展,比如秒杀、抢购等。
from bs4 import BeautifulSoup | |
import time | |
import requests | |
import sys | |
import json | |
post_url = "https://passport.jd.com/uc/loginService" | |
login_url = "https://passport.jd.com/uc/login" | |
auth_url = "https://passport.jd.com/uc/showAuthCode" | |
vip_url = "https://vip.jd.com/sign/index" | |
bean_url = "https://bean.jd.com/myJingBean/list" | |
headers = { | |
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36' | |
' (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36', | |
'Referer': 'https://www.jd.com/' | |
} | |
s = requests.Session() | |
def get_login_info(username, password, login_url): | |
response = s.get(url=login_url, headers=headers) | |
soup = BeautifulSoup(response.text, 'lxml') | |
# 获取目标信息 | |
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'] | |
# 判断页面是否需要验证码 | |
auth_response = s.post(auth_url, data={'loginName': username, 'nloginpwd': password}).text | |
if 'true' in auth_response: | |
# 获取图片地址 | |
auth_code_url = soup.find(id='JD_Verification1').get('src2') | |
auth_code = str(get_auth_img(auth_code_url)) | |
else: | |
auth_code = '' | |
data = { | |
'uuid': uuid, | |
'eid': eid, | |
'fp': fp, | |
'_t': _t, | |
'loginType': loginType, | |
'loginname': username, | |
'nloginpwd': password, | |
'chkRememberMe': True, | |
'authcode': auth_code, | |
'pubKey': pubKey, | |
'sa_token': sa_token | |
# 'authCode': auth_code | |
} | |
print('1. 获取登录信息成功') | |
return data | |
def get_auth_img(url): | |
auth_code_url = 'http:{}&yys={}'.format(url, str(int(time.time()*1000))) | |
auth_img = s.get(auth_code_url, headers=headers) | |
with open('authcode.jpg', 'wb') as f: | |
f.write(auth_img.content) | |
code_typein = input('请根据下载图片 authcode.jpg 输入验证码:') | |
return code_typein | |
def login(data): | |
headers['Referer'] = 'https://passport.jd.com/uc/login?ltype=logout' | |
response = s.post(post_url, data=data, headers=headers) | |
# 若返回数据里有 我的京东 字眼,代表登录成功 | |
if "success" in response.text: | |
print("2. 登录成功") | |
else: | |
print("2. 登录失败") | |
print((response.text).encode('utf-8')) | |
sys.exit(1) | |
def get_shops(): | |
headers['Referer'] = 'https://home.jd.com/' | |
response = s.get(bean_url, headers=headers) | |
soup = BeautifulSoup(response.text, 'lxml') | |
bean_shop_list = soup.find_all('a', class_='s-btn') | |
return bean_shop_list | |
def sign_shop(shop_url): | |
try: | |
headers['Referer'] = str(shop_url) | |
response = s.get(shop_url, headers=headers) | |
soup = BeautifulSoup(response.text, 'lxml') | |
# 获取店铺 id | |
shop_id = soup.find(id='shop_id')['value'] | |
# 拼接签到地址 | |
sign_url = 'https://mall.jd.com/shopSign-{}.html'.format(shop_id) | |
s.get(sign_url, headers=headers) | |
print('签到成功:{}'.format(shop_url)) | |
except Exception as error: | |
print('签到失败:{}'.format(shop_url)) | |
print(error) | |
def main(): | |
username = input('请输入京东账号:') | |
password = input('请输入京东密码:') | |
# 测试时直接将账号信息写在脚本里 | |
# username = '' | |
# password = '' | |
# 获取登录数据 | |
data = get_login_info(username, password, login_url) | |
# 登录成功后,获取 cookie | |
login(data) | |
# VIP 签到领京豆 | |
bean_shop_list = get_shops() | |
if len(bean_shop_list) == 0: | |
print('全部店铺已签到') | |
sys.exit(0) | |
for shop in bean_shop_list: | |
sign_shop(shop['href']) | |
if __name__ == "__main__": | |
main() |
Python 实现京东自动登录领京豆相关推荐
- python京东自动签到_Python 实现京东自动签到领京豆
今天带大家进行模拟京东登录,并进行签到获取京豆,1000 个京豆 = 10 元,毕竟「苍蝇也是肉」,每天用脚本可以获取大概 n 个京豆,是不是一个发现了一个「发家致富」的好路子? 废话不多说,下面开始 ...
- python京东自动签到领金豆_爬虫实战【10】利用Selenium自动登陆京东签到领金币...
今天我们来讲一下如何通过python来实现自动登陆京东,以及签到领取金币. 如何自动登陆京东? 我们先来看一下京东的登陆页面,如下图所示: [插入图片,登陆页面] 登陆框就是右面这一个框框了,但是目前 ...
- python京东自动签到领金豆_[宜配屋]听图阁 - 利用python Selenium实现自动登陆京东签到领金币功能...
如何自动登陆京东? 我们先来看一下京东的登陆页面,如下图所示: [插入图片,登陆页面] 登陆框就是右面这一个框框了,但是目前我们遇到一个困呐,默认的登陆方式是扫码登陆,如果我们想要以用户民个.密码的形 ...
- Python实现京东自动登录(自动完成滑块验证)
前提要配置好webdriver,不会的可以百度一下,我用的是Chrome的. Python自动登录京东,这里需要填写自己的账号和密码 id = "*********" # 用户账号 ...
- python京东自动签到_京东商城自动签到领京豆
一.介绍 PhantomJS是一个基于WebKit的JavaScript API,它使用QtWebKit作为它核心浏览器的功能,使用WebKit来编译解释执行JavaScript代码,任何你可以在基于 ...
- python京东自动签到领金豆_基于Python+Appium实现京东双十一自动领金币功能
基于Python+Appium实现京东双十一自动领金币功能 发布时间:2020-09-28 02:22:30 来源:脚本之家 阅读:87 作者:一土小亘兄 背景:做任务领金币的过程很无聊,而且每天都是 ...
- 京东商城自动签到领京豆
一.介绍 PhantomJS是一个基于WebKit的JavaScript API,它使用QtWebKit作为它核心浏览器的功能,使用WebKit来编译解释执行JavaScript代码,任何你可以在基于 ...
- 淘宝/天猫撸猫猫领喵币、京东全民营业领京豆二合一助手,自动完成双11任务,分享源码
↓↓↓↓↓ 下载地址:https://www.lanzoui.com/b01br9o6j 目前各种脚本,比较复杂,于是写了一个比较简单明了的二合一脚本 1.淘宝/天猫撸猫猫领喵币 增加随机时间,可以自 ...
- python autojs_自动化篇 | 手把手教你使用 AutoJS 自动领京豆
AutoJS 一个支持无障碍服务的 Android 平台上的 JavaScript IDE.Autojs 主要是基于安卓系统的无障碍服务,实现自动化操控和监控手机信息处理. 特性: 由无障碍服务实现的 ...
最新文章
- AI帮你写Python,安装只需5步,还能任你调教 | 开源
- saiku+kettle整合(二)数据装载
- LINQ的基本语法中八个关键字用法说明
- 学习C++的五十个建议(转
- Android:你不知道的 WebView 使用漏洞
- Xamarin.Android SharedPreferences的使用方法
- [网络安全提高篇] 一〇二.Metasploit技术之基础用法万字详解及防御机理
- 企业中的局域网性能应该怎么得到保障?
- Mac OS X下安装Java 7及配置Eclipse JDK
- DEV控件:gridControl常用属性设置
- 虚拟化qemu-img的简单用法。
- java 数据库按钮跳转_java,数据库的连接及基本操作
- CMMI认证需要什么条件?
- linux 脚本 过滤 词,linux学习之shell脚本 - 文本过滤
- 记一次蓝牙音箱无声音的原因
- 【资讯】1225- Flutter 2.10发布,稳定支持Windows
- 华为HCNA独家视频课程
- 数字传感器:新兴的应用
- Ubuntu18.04安装NVIDIA 显卡驱动(GTX 1060)
- Springboot 使用 sendgrid发送邮件
热门文章
- 基于JAVA教学质量评价系统_java毕业设计_springboot框架的教学质量评价系统
- SECS/GEM协议开发系列(二)与Host连接
- 51nod 1298 圆与三角形
- 第三章第三节、他是一个箍桶匠
- URL传参时 从URL中获取中文参数的方法
- java第五章:面向对象(oop)三大特性之多态
- 复习JavaEE笔记
- 苏宁易购董事会改选并聘任张近东为名誉董事长;ASSASSINA莎辛那首个香氛沙龙闪现网红玻璃森林 | 知消...
- 实验报告:小学数学练习、石头剪刀布游戏
- warning: could not load any Objective-C class information. This will significantly reduce the qualit