京东抢购助手 jd-assistant 源码深度剖析:下单接口参数、错误码与支付密码加密全解
【免费下载链接】jd-assistant京东抢购助手:包含登录,查询商品库存/价格,添加/清空购物车,抢购商品(下单),查询订单等功能项目地址: https://gitcode.com/gh_mirrors/jd/jd-assistant
京东抢购助手jd-assistant是一个用 Python 编写的京东下单自动化开源项目,支持登录、查库存/价格、购物车操作与自动抢购下单。本文深入剖析它的源码,帮你吃透京东下单接口的核心请求参数、常见错误码(resultCode)含义以及支付密码的加密方式,让阅读 jd_assistant.py 不再云里雾里。
一、项目概览:这个助手到底能做什么
打开 README.md 就能看到这个助手的四大能力:登录、商品查询、购物车操作、订单操作。所有功能都收敛在Assistant这一个类里,配合几个轻量模块协作完成:
| 模块 | 职责 | 源码位置 |
|---|---|---|
| 主入口示例 | 演示如何调用助手 | main.py |
| 核心逻辑 | 登录 / 查库存 / 下单 / 抢购 | jd_assistant.py |
| 加密与工具函数 | 密码加密、参数解析 | util.py |
| 配置读取 | 读取config.ini | config.py |
| 依赖清单 | 第三方库版本 | requirements.txt |
依赖非常干净,只有三个第三方库:requests、beautifulsoup4、pycryptodome(RSA 加密用)。
二、下单前的关键:四个必配风控参数
很多新手卡在这里。初始化Assistant时会强制检查eid、fp、track_id、risk_control四个参数,缺一即抛出异常:
if not self.eid or not self.fp or not self.track_id or not self.risk_control: raise AsstException('请在 config.ini 中配置 eid, fp, track_id, risk_control 参数')这四个参数来自订单结算页面的隐藏表单,官方提供的取法是:在结算页打开浏览器开发者工具,在 Console 中运行 js/get_parameters.js 即可一次性打印出全部四个值,填入 config.ini 即可:
var eid = $('#eid').val(); var fp = $('#fp').val(); var trackId = getTakId(); var riskControl = $('#riskControl').val();💡 这四个参数是京东风控的“通行证”,下单请求里会原样带上。乱填会导致订单无法提交,强烈建议部署前先用有货商品实测一遍。
三、核心:京东下单接口submitOrder.action参数全解
普通商品的下单逻辑在 jd_assistant.py 的submit_order()方法中。它向https://trade.jd.com/shopping/order/submitOrder.action发起 POST,请求体由两部分拼成——固定风控参数+条件性支付密码:
| 参数名 | 取值 | 作用 |
|---|---|---|
riskControl | self.risk_control | 风控校验值 |
submitOrderParam.trackId | self.track_id | 链路追踪 ID |
submitOrderParam.eid | self.eid | 设备环境标识 |
submitOrderParam.fp | self.fp | 指纹标识 |
submitOrderParam.needCheck | 1 | 需校验标志 |
submitOrderParam.isBestCoupon | 1 | 自动选择最优优惠券 |
submitOrderParam.jxj | 1 | 校验开关 |
submitOrderParam.payPassword | 加密后的支付密码 | 仅在配置了支付密码时才添加 |
关键点在“条件性支付密码”:
payment_pwd = global_config.get('account', 'payment_pwd') if payment_pwd: data['submitOrderParam.payPassword'] = encrypt_payment_pwd(payment_pwd)为什么要带支付密码?当账户里有可用京券或上次订单用了京豆时,京东可能自动勾选优惠并强制校验支付密码,此时必须提交,否则会报错(见下文60123)。
四、下单错误码速查表(resultCode)
下单接口返回 JSON,最核心的两个字段是success与resultCode。源码里已经贴心地为高频错误码写了“人话注释”,整理成速查表如下:
普通商品下单错误码
| resultCode | 原始 message | 通俗含义 |
|---|---|---|
0 | 无 | ✅ 下单成功,返回orderId |
60123 | 请输入支付密码! | 需在 config.ini 配置支付密码 |
60017 | 您多次提交过快,请稍后再试 | 触发频率风控,稍等再试 |
60077 | 获取用户订单信息失败 | 购物车为空 / 未勾选商品 |
600157 | xxxx 商品无货 | 下单商品无货 |
600158 | xxxx 商品无货 | 下单商品无货(另一分支) |
源码中对应的处理逻辑:
if result_code == 60077: message = message + '(可能是购物车为空 或 未勾选购物车中商品)' elif result_code == 60123: message = message + '(需要在config.ini文件中配置支付密码)'抢购(秒杀)下单错误码
抢购走的是另一套接口marathon.jd.com/seckillnew/...,错误码略有不同:
| resultCode | 原始 message | 通俗含义 |
|---|---|---|
0 | 无 | ✅ 抢购成功,返回订单号与支付链接 |
60074 | 很遗憾没有抢到,再接再厉哦 | 竞争激烈未抢到 |
60017 | 抱歉,您提交过快 | 提交频率过快 |
90013 | 系统正在开小差,请重试 | 服务端异常,重试即可 |
📌 判断下单是否成功的通用规则:先看
success布尔值,再看resultCode是否为0,最后取orderId。
五、支付密码加密:u3 前缀编码 + RSA 登录加密
这里有个容易误解的点,值得单独讲清楚——支付密码和登录密码用的是两套完全不同的加密方案。
1. 支付密码:u3 前缀编码(非 RSA)
支付密码的“加密”其实是一层轻量混淆,位于 util.py:
def encrypt_payment_pwd(payment_pwd): return ''.join(['u3' + x for x in payment_pwd])逻辑很直白:把每一位数字前面拼上u3。例如支付密码123456会变成u31u32u33u34u35u36,再随下单请求体提交。这样做的目的是让密码在明文请求体里不可直接识别。
2. 登录密码:标准 RSA + Base64
真正用到 RSA 的是账号密码登录。util.py里内置了一枚京东 RSA 公钥(RSA_PUBLIC_KEY),配合pycryptodome完成加密:
def encrypt_pwd(password, public_key=RSA_PUBLIC_KEY): rsa_key = RSA.importKey(public_key) encryptor = Cipher_pkcs1_v1_5.new(rsa_key) cipher = b64encode(encryptor.encrypt(password.encode('utf-8'))) return cipher.decode('utf-8')流程是:导入公钥 → PKCS1 v1.5 填充加密 → Base64 编码。不过项目作者在更新记录里说明,京东早已用滑动验证码替换了字符验证码,账号密码登录已失效,官方推荐扫码登录login_by_QRcode(),因此这段 RSA 逻辑现在更多是历史遗留与学习价值。
六、地区 ID 与库存查询
下单需要“地区 ID”来定位库存。它是一个四级 ID(省_市_区县_乡镇),例如1_72_4211,用_或-分隔均可,util.py 的parse_area_id()会统一补齐到 4 位。
获取方式有三种,详见 area_id/README.md:直接查area_id/目录下的地址文件、在商品页控制台执行 JS、或运行get_area_id.py逐级选择。
库存查询走https://c0.3.cn/stock(单商品)或https://c0.3.cn/stocks(多商品),核心是返回字段StockState:
| StockState | 含义 |
|---|---|
33 | 现货 ✅ |
40 | 可配货 ✅ |
0/34 | 无货 ❌ |
36 | 采购中 ⏳ |
只有当skuState == 1(已上架)且StockState ∈ (33, 40)时,程序才判定“有货可下”。
七、两种下单路径:普通商品 vs 抢购商品
jd-assistant 最大的设计亮点,是把京东商品分成了两条完全不同的下单链路,这也是“抢购”的核心。
路径 A:普通商品 → 购物车 → 结算
普通商品(如小米 8、华为畅享 9 Plus)可以正常加入购物车,流程是“加购 → 勾选 →submit_order()结算提交”,对应 main.py 里的buy_item_in_stock()轮询下单:
路径 B:抢购商品 → 独立秒杀接口
抢购商品(如华为 Mate 20 RS)走marathon.jd.com的秒杀接口,不能加入购物车,需要先request_seckill_url()拿链接、再submit_seckill_order()提交。注意部分商品是预约抢购(如图中 21470 人预约),需先点击预约,且购物车里这类商品无法勾选,脚本也清不掉,务必手动清空购物车:
⚡ 抢购模式还支持定时抢购(
submit_order_by_time()/exec_seckill_by_time()),靠 timer.py 精确等到毫秒级时间点再触发,配合retry与interval反复重试,成功概率更高。下单成功还能通过 messenger.py 用 Server酱 推送通知。
八、新手上手清单
- 装依赖:
pip install -r requirements.txt(见 requirements.txt)。 - 扫码登录:
asst.login_by_QRcode(),首次会保存 cookies 供下次复用。 - 填风控参数:按 js/get_parameters.js 取好
eid/fp/track_id/risk_control填入 config.ini。 - 有优惠再配支付密码:账户有京券/京豆时才需在
config.ini的payment_pwd填 6 位数字。 - 先试水:用有货商品跑一遍完整下单,确认发票设为「电子普通发票-个人」、支付方式为「在线支付」。
- 正式抢购:调用
buy_item_in_stock()(普通商品)或exec_seckill_by_time()(抢购商品)。
一句话总结:jd-assistant 的价值,在于把京东“下单”这条链路拆成了可复用的方法——风控参数 + 下单参数 + 错误码处理 + 密码加密 + 双路径下单。读懂了上面这套接口参数与错误码映射,你不仅能跑通这个工具,还能举一反三,理解任何“京东下单自动化”背后的通用逻辑。
【免费下载链接】jd-assistant京东抢购助手:包含登录,查询商品库存/价格,添加/清空购物车,抢购商品(下单),查询订单等功能项目地址: https://gitcode.com/gh_mirrors/jd/jd-assistant
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考