思路:
1.获取二维码图片并下载到本地
2.检测二维码状态(如是否失效,已被扫描等)
3.使用京东app扫描二维码后登陆成功并获取cookie
分析:
1.首先分析获取二维码
经过测试,改路由每次访问都会生成不同的二维码
在获取二维码的同时生成了一个wlfstk_smdl ,也就是轮询路由里的token,它是构建轮询路由的元素,
2.分析轮询路由
轮询路由里有一个token参数,在获取二维码的同时就已经生成了
该检测状态的路由会返回当前二维码的状态
3.获取cookie
在二维码被成功扫描时会返回一个ticket字段,拿着这个门票就可以轻松的获取登陆后的cookie了
代码部分:
1.导入包
import base64
import re
import threading
import time
import requests
import warnings
warnings.filterwarnings('ignore')
2.获取二维码并保持到本地
def getjdQrCode():
try:
#1.获取二维码
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'referer': 'https://passport.jd.com/new/login.aspx?ReturnUrl=https%3A%2F%2Fwww.jd.com%2F'
}
qrCodeUrl = f'https://qr.m.jd.com/show?appid=133&size=147&t={round(time.time()*10000)}'
qrHtml = requests.get(qrCodeUrl, headers=headers)
cookies = qrHtml.cookies.get_dict()
token = cookies['wlfstk_smdl']
cookieString = ''
for key, value in cookies.items():
cookieString = cookieString + str(key) + "=" + str(value) + ";"
cookieString = r'%s' % (cookieString)
#2.下载二维码到本地
with open('qrCode.jpg', 'wb')as f:
f.write(qrHtml.content)
with open('qrCode.jpg', 'rb') as f:
base64_data = str(base64.b64encode(f.read()))
base64Data = re.findall("b'(.*)'", base64_data)[0]
base64Data = r'%s' % (base64Data)
#3.异步轮询二维码状态
threading.Thread(target=jdLoginStatus, args=(cookieString, token)).start()
imgCode = base64Data
return {'status': 1, 'imgCode': imgCode,'cookieString':cookieString,'token':token}
except:
return {'status': 0}
3.构建轮询路由,实时监测二维码的状态
此时拿出手机,使用京东app扫描qrCode.jpg 并按下确认登陆
def jdLoginStatus(cookieString, token):
#5.轮询二维码状态
try:
while True:
time.sleep(0.5)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'referer': 'https://passport.shop.jd.com/nologin/login.action?ReturnUrl=http%3A%2F%2Fshop.jd.com%2F',
'cookie':cookieString
}
checkUrl = f'https://qr.m.jd.com/check?callback=jQuery4643268&appid=133&token={token}&_={round(time.time()*10000)}'
checkResponse = requests.get(checkUrl,headers=headers,verify=False)
checkJson = eval(checkResponse.text[14:-1])
if checkJson['code'] == 201:
print('二维码未扫描')
pass
elif checkJson['code'] == 202:
print('手机客户端确认登录')
pass
elif checkJson['code'] == 257:
print('无效的二维码')
cookie = 2
loginStatus = 0
break
elif checkJson['code'] == 203:
print('二维码过期')
cookie = 2
loginStatus = 0
break
elif checkJson['code'] == 200:
print('登陆成功')
ticket = checkJson['ticket']
loginStatus = 1
#5.拿着门票去获取登陆后的cookie
cookie = getqrCodeTicketValidation(ticket)
break
else:
#不知道什么状况
cookie = 2
loginStatus = 0
break
print(cookie)
return {'status': 1, 'loginStatus': loginStatus,'cookie':cookie}
except:
return {'status': 0}
4.扫码成功后,获取登陆后的cookie
def getqrCodeTicketValidation(ticket):
url = f'https://passport.jd.com/uc/qrCodeTicketValidation?t={ticket}'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'referer':'https://passport.jd.com/uc/login?ltype=logout&ReturnUrl=https://order.jd.com/center/list.action'
}
response = requests.get(url,headers=headers,verify=False)
cookieDict = response.cookies.get_dict()
cookie = ''
for key,value in cookieDict.items():
cookie += key + '=' + value + ';'
checkOrder(cookie)
return cookie
5.调用
if __name__ == '__main__':
print(getjdQrCode())
6.验证
拿着登陆后的cookie去获取订单页面
def checkOrder(cookie):
url = 'https://order.jd.com/center/list.action'
headers = {
'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
'cookie':cookie
}
response = requests.get(url,headers=headers).text
print(response)
验证登陆成功!订单页面出现了作者的地址信息!!