Python京东抢购

Python京东抢购

分析其中提交信息接口的参数,可以成功抢购商品,并且可以提交订单。。。。2018年7月17日

提交信息的获取

直接提交信息对post提交分析其中的参数。

经过分析参数大多数在:https://passport.jd.com/new/login.aspx

图片验证码地址

判断登陆是否有验证码:后面的/uc/showAuthCode可以判断是一个url。
2
访问上面的code_url地址:可以看到获取的是false不需要验证码,true需要验证码
3
分析验证码地址的url:
6
分析验证码的地址:验证码是显示在login.aspx尝试是否能在里面获取参数信息。可以看到里面含有image_url图片后面的参数
4

进行post信息提交

分析post提交url的地址:登陆成功回返回success信息
8

接下来获取用户的信息:


就以上三步分析,主要还是其中参数分析比较困难,以及提交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{}&ltype=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()

猜你喜欢

转载自blog.csdn.net/qq_1290259791/article/details/81091032