前言
某宝脚本一搜能搜一大堆,就是不知道具体有没有用,但是这款某东的代码于11-17还是可用的,大家拿去白嫖吧!
需要用到的一些工具
-
-
Python版本:3.7.8
-
-
相关模块:
-
-
DecryptLogin模块;
-
-
argparse模块;
-
-
requests模块;
-
-
pyttsx3模块;
-
-
beautifulsoup4模块;
-
-
prettytable模块;
-
-
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
具体而言,就是先用DecryptLogin实现京东商城的模拟登录操作,然后再查询登录账号的购物车中的商品信息,接着打印这些商品信息供用户选择需要抢购的商品,最后用程序实现自动下单抢购目标商品。
因为整个逻辑很简单,也没有考虑一些可能存在的异常情况(毕竟只是一个简单的小案例,主要目的还是学习python和爬虫),所以整体实现起来其实蛮简单的。首先pip安装一下DecryptLogin包:
pip install DecryptLogin
具体而言,就是先用DecryptLogin实现京东商城的模拟登录操作,然后再查询登录账号的购物车中的商品信息,接着打印这些商品信息供用户选择需要抢购的商品,最后用程序实现自动下单抢购目标商品。
因为整个逻辑很简单,也没有考虑一些可能存在的异常情况(毕竟只是一个简单的小案例,主要目的还是学习python和爬虫),所以整体实现起来其实蛮简单的。首先pip安装一下DecryptLogin包:
pip install DecryptLogin
然后简单几行代码就能实现京东商城的模拟登录操作啦:
-
from DecryptLogin
import login
-
-
'''模拟登录'''
-
def
login(
self):
-
lg = login.Login()
-
infos_return, session = lg.jingdong()
-
return infos_return, session
另外,为了避免经常需要重复扫码登录的问题,我加了个导入历史cookies的代码段(淘宝抢购那个脚本也有):
-
-
if
os.
path.isfile(cookie_cache_name):
-
self.session = requests.Session()
-
loadSessionCookies(
self.session, cookie_cache_name)
-
else:
-
self.infos_return,
self.session =
self.login()
-
saveSessionCookies(
self.session, cookie_cache_name)
但是没有加验证cookies是否还在有效期内的代码,感兴趣的同学可以自己添加一下,不感兴趣的同学每次过段时间代码报错就自己手动删下:
cookie_cache.pkl
这个文件吧,作为懒惰的惩罚吧,就在你运行代码的那个文件夹里。
接着,我们来获取一下当前购物车里的商品信息,和之前一样,简单抓包的结果如下:
代码实现如下:
-
-
cart_url =
'https:
//api.m.jd.com/api?'
-
headers = {
-
'User-Agent':
'Mozilla/
5.0 (Windows NT
10.0; Win64; x64) AppleWebKit/
537.36 (KHTML, like Gecko) Chrome/
98.0.
4758.82 Safari/
537.36',
-
'origin':
'https:
//cart.jd.com',
-
'Referer':
'https:
//cart.jd.com',
-
}
-
data = {
-
'functionId':
'pcCart_jc_getCurrentCart',
-
'appid':
'JDC_mall_cart',
-
'loginType':
'3',
-
}
-
response =
self.session.
post(cart_url, headers=headers, data=data)
-
print(response.text)
看起来没什么问题,把我们需要的数据提取出来:
-
-
response_json, cart_infos = response.json(), {}
-
for idx, item
in
enumerate(response_json[
'resultData'][
'cartInfo'][
'vendors']):
-
cart_info = {
-
'title': self.rematch(
r"'Name': '(.*?)',",
str(item)),
-
'Id': item[
'sorted'][
0][
'item'][
'Id'],
-
'skuUuid': self.rematch(
r"'skuUuid': '(.*?)',",
str(item)),
-
'IdForOldVersion': self.rematch(
r"'IdForOldVersion': (.*?),",
str(item)),
-
'SType':
'11',
-
}
-
cart_infos[
str(idx)] = cart_info
接着打印并让用户选择想要抢购的商品信息:
-
-
# 打印并选择想要抢购的商品信息
-
title, items = [
'id',
'title'], []
-
for key, value
in cart_infos.items():
-
items.append([key, value[
'title']])
-
self.printTable(title, items)
-
good_id =
input(
'请选择想要抢购的商品编号(例如"0"): ')
-
assert good_id
in cart_infos,
'输入的商品编号有误'
效果大概是这样子的:
最后根据用户的选择结果进行下单就ok啦,下单相关的代码实现如下:
-
'''购买商品'''
-
def
buygood(
self, good_info):
-
# 取消勾选购物车中的所有商品
-
url =
'https://cart.jd.com/cancelAllItem.action'
-
data = {
-
't':
0,
-
'outSkus':
'',
-
'random': random.random(),
-
}
-
response = self.session.post(url, data=data)
-
# 勾选指定商品商品
-
url =
'https://api.m.jd.com/api'
-
body =
'{"operations":[{"ThePacks":[{"num":1,"sType":%s,"Id":%s,"TheSkus":[{"num":1,"Id":"%s","skuUuid":"%s","useUuid":false}]}]}]}' % \
-
(good_info[
'SType'], good_info[
'Id'], good_info[
'IdForOldVersion'], good_info[
'skuUuid'])
-
data = {
-
'functionId':
'pcCart_jc_cartCheckSingle',
-
'appid':
'JDC_mall_cart',
-
'body': body,
-
'loginType':
'3',
-
}
-
headers = {
-
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
-
'origin':
'https://cart.jd.com',
-
'Referer':
'https://cart.jd.com',
-
}
-
response = self.session.post(url, data=data, headers=headers)
-
# 获取订单结算页面信息
-
url =
'http://trade.jd.com/shopping/order/getOrderInfo.action'
-
params = {
-
'rid':
str(
int(time.time() *
1000)),
-
}
-
headers = {
-
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
-
'Accept':
'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
-
'Referer':
'https://cart.jd.com/cart.action',
-
'Connection':
'keep-alive',
-
'Host':
'trade.jd.com'
-
}
-
response = self.session.get(url=url, params=params, headers=headers)
-
if
'刷新太频繁了'
in response.text:
-
print(
f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} INFO]: 刷新太频繁了')
-
raise RuntimeError(
'刷新太频繁了')
-
if response.status_code != requests.codes.OK:
-
print(
f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())} INFO]: 当前请求存在错误')
-
raise RuntimeError(
'当前请求存在错误')
-
soup = BeautifulSoup(response.text,
'html.parser')
-
risk_control = soup.select(
'input#riskControl')[
0].get(
'value').strip(
' \t\r\n')
-
order_detail = {
-
'address': soup.find(
'span',
id=
'sendAddr').text[
5:],
-
'receiver': soup.find(
'span',
id=
'sendMobile').text[
4:],
-
'total_price': soup.find(
'span',
id=
'sumPayPriceId').text[
1:],
-
'items': []
-
}
-
# 提交订单
-
url =
'https://trade.jd.com/shopping/order/submitOrder.action'
-
data = {
-
'overseaPurchaseCookies':
'',
-
'vendorRemarks':
'[]',
-
'submitOrderParam.sopNotPutInvoice':
'false',
-
'submitOrderParam.trackID':
'TestTrackId',
-
'submitOrderParam.ignorePriceChange':
'0',
-
'submitOrderParam.btSupport':
'0',
-
'riskControl': order_detail,
-
'submitOrderParam.isBestCoupon':
'1',
-
'submitOrderParam.jxj':
'1',
-
'submitOrderParam.trackId':
'9643cbd55bbbe103eef18a213e069eb0',
-
'submitOrderParam.needCheck':
'1',
-
}
-
if self.paywd
is
not
None:
-
data[
'submitOrderParam.payPassword'] =
''.join([
'u3' + x
for x
in self.paywd])
-
headers = {
-
'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36',
-
'Host':
'trade.jd.com',
-
'Referer':
'http://trade.jd.com/shopping/order/getOrderInfo.action',
-
}
-
response = self.session.post(url=url, data=data, headers=headers)
-
response_json = response.json()
-
if response_json.get(
'success'):
return
True
-
return
False
最终京东里的效果如下:
当然这样提示的效果可能不明显,毕竟你不会一直盯着这个终端看,你可以加个语音提示,代码如下:
-
# 电脑语音提示
-
for _ in
range(
5):
-
pyttsx3.
speak(
'已经为您抢购到你所需的商品, 请尽快前往京东完成付款.')
当然,也许你也不一定一直在电脑边上,所以你还可以加个server酱提示,可以在商品抢购成功之后将该消息发送到你的微信上,代码如下:
-
-
'''发送Server酱提示'''
-
def
pushwechat(
self, desp='已经为您抢购到你所需的商品, 请尽快前往京东完成付款.'):
-
server_url =
f'https://sc.ftqq.com/{self.server_key}.send'
-
params = {
-
'text':
'商品抢购成功提示',
-
'desp': desp,
-
}
-
response = requests.get(server_url, params=params)
-
return response
server酱配置地址如下:
http://sc.ftqq.com/3.version
ok,大功告成啦,完整源代码关注文末公众号即可
使用方式:
-
usage: jingdongsnap.py [-h] [--interval INTERVAL] [--paywd PAYWD] [--
key
KEY]
-
-
京东抢购脚本
-
-
optional arguments:
-
-h, --help show this help message
and
exit
-
--interval INTERVAL 抢购商品时查询商品是否可以购买的时间间隔(单位秒)
-
--paywd PAYWD 支付密码, 部分商品需要支付密码才能提交订单, 输入密码不会导致你直接购买商品, 请放心使用
-
--
key
KEY Server酱的
Key
效果展示:
快拿去用吧,需要完整代码的可关注下方公众号哦!
转载:https://blog.csdn.net/weixin_43881394/article/details/127898362