参考链接: 从Python获取输入
Python京东抢购
分析其中提交信息接口的参数,可以成功抢购商品,并且可以提交订单。。。。2018年7月17日
提交信息的获取
直接提交信息对post提交分析其中的参数。 经过分析参数大多数在:https://passport.jd.com/new/login.aspx
图片验证码地址
判断登陆是否有验证码:后面的/uc/showAuthCode可以判断是一个url。 访问上面的code_url地址:可以看到获取的是false不需要验证码,true需要验证码 分析验证码地址的url: 分析验证码的地址:验证码是显示在login.aspx尝试是否能在里面获取参数信息。可以看到里面含有image_url图片后面的参数
进行post信息提交
分析post提交url的地址:登陆成功回返回success信息
接下来获取用户的信息: 就以上三步分析,主要还是其中参数分析比较困难,以及提交url地址后面需要的参数。有的时候url地址后面不要参数可以,但是有的时候没参数就不行。post提交地址的时候,一开始没有加上uuid参数就一直不能提交成功。
加入购物车并提交订单
添加到购物车的接口 注意这里提交订单需要加上header头中的’referer’: ‘https://cart.jd.com/cart.action’。 接下来就是提交订单的参数
贴上抢购过程
可以看到订单号是相同的,物品购买成功 加入了打码模块,和添加多个物品去购物车,以及商品倒计时。
完整登陆代码
import requests
import json
import time
import json
from pyquery import PyQuery as pq
from pprint import pprint as pp
class JingDong:
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/',
}
def __init__(self, username, password):
self.index_url = 'https://passport.jd.com/new/login.aspx' # 京东首页的地址
self.auth_url = 'https://passport.jd.com/uc/showAuthCode' # 判断验证码地址
self.post_url = 'https://passport.jd.com/uc/loginService?uuid{}<ype=logout&version=2015' # 登陆的地址
self.user_url = 'https://passport.jd.com/user/petName/getUserInfoForMiniJd.action?&callback=jsonpUserinfo&_=' + \
str(int(time.time() * 1000)) # 检测用户信息
self.session = requests.Session() # session通信
self.username = username
self.password = password
self.uuid = ''
def login_info(self): # 获取登陆信息的参数
response = self.session.get(
url=self.index_url, headers=self.headers).text
doc = pq(response)
sa_token = doc('#sa_token').attr('value')
uuid = doc('#uuid').attr('value')
self.uuid = uuid
eid = doc('#eid').attr('value')
fp = doc('#sessionId').attr('value')
_t = doc('#token').attr('value')
loginType = doc('#loginType').attr('value')
pubKey = doc('#pubKey').attr('value')
response = self.session.get(
url=self.auth_url, headers=self.headers).text
if 'true' in response: # 返回的true就是需要验证码
auth_code_url = doc('#JD_Verification1').attr('src2') # 获取code的url
auth_code = str(self.get_code(auth_code_url))
else:
auth_code = ''
data = { # 提交的参数
'uuid': uuid,
'eid': eid,
'fp': fp,
'_t': _t,
'loginType': loginType,
'loginname': self.username,
'nloginpwd': self.password,
'authcode': auth_code,
'pubKey': pubKey,
'sa_token': sa_token
}
return data
def get_code(self, url): # 获取验证码
time_str = str((int)(time.time() * 1000))
code_url = f'https:{url}&yys={time_str}' # 拼接code_img的地址
response = self.session.get(
url=code_url, headers=self.headers, stream=True)
with open('code.jpg', 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
code_text = input('请输入验证码:')
return code_text
def login(self):
data = self.login_info() # 获取提交的参数
headers = {
'Referer': self.post_url,
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36'
' (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest'
}
try:
url = self.post_url.format(self.uuid) # 拼接提交url
login_page = self.session.post(
url, data=data, headers=headers) # 提交登陆
if 'success' in login_page.text:
print('登陆成功')
response = self.session.get(
url=self.user_url, headers=headers) # 获取登陆信息
response = response.text.strip('jsonpUserinfo()\n')
pp(json.loads(response))
except Exception as e:
raise e
jingdong = JingDong('用户名', '密码')
jingdong.login()