前言: 最近太忙了,今天下午得空半小时更新一下博客。今天为大家带来的是某宝秒杀破解教程,因为双十一块到了,也是我最近写的一个小软件,这个协议请求的代码不会给的,但是web自动化的可以在我的github上面看,。在此我声明一下,这篇文字仅供学习,如果用来非法用途,后果博主一概不负!!!侵权立删!!!
技术栈
1、selenium+chromedriver:用web自动化来登陆获取cookie
2、requests:python的一个爬虫库,用来请求某宝的api
3、tkinter:可视化页面库(很丑)
4、urllib:一些参数要编码
首先 :selenium+chromedriver实现登陆获取cookie,也可以用requests请求登陆,但是要破解两个参数,一个是password2密码加密,可解密,难道比较大,可以找到所有的js加密函数,用execjs或者selenium的execute_script进行执行js代码得到;另一个是umidToken,这个是刚加的参数,之前是没有的,所以这个没来得及破解。基于以上,登陆实现最快最的方法就是selenium+chromedriver实现登陆获取cookie了,这个就不多废话了。
其次 :就是把之前保存下来的cookie用session维持会话,再去请求url:
详情页url: 如下图,某个商品的url,这个页面里面几个参数必须要获取,请求购买接口是要的参数,
data = {
‘title’: ‘(unable to decode value)’,
‘x_id’: ‘’,
’seller_id’: seller_id,
‘seller_nickname’: ‘(unable to decode value)’,
‘who_pay_ship’: ‘(unable to decode value)’,
’photo_url’: photo_url,
‘region’: ‘(unable to decode value)’,
‘auto_post’: ‘false’,
‘etm’: ‘post’,
‘virtual’: ‘false’,
’rootCatId’: rootCatId,
‘auto_post1’: ‘’,
‘buyer_from’: ‘ecity’,
‘root_refer’: ‘’,
‘item_url_refer’: ‘https%3A%2F%2Fs.taobao.com%2F’,
’allow_quantity’: allow_quantity,
’buy_param’: buy_param,
‘quantity’: ‘1’,
’tb_token’: tb_token,
‘skuInfo’: ‘(unable to decode value)’,
‘use_cod’: ‘false’,
‘_input_charset’: ‘UTF-8’,
‘destination’: ‘350100’,
’skuId’: skuId,
‘bankfrom’: ‘’,
‘from_etao’: ‘’,
’item_id_num’: item_id_num,
’item_id’: item_id,
’auction_id’: auction_id,
‘seller_rank’: ‘0’,
‘seller_rate_sum’: ‘0’,
‘is_orginal’: ‘no’,
‘point_price’: ‘false’,
‘secure_pay’: ‘true’,
‘pay_method’: ‘(unable to decode value)’,
‘from’: ‘item_detail’,
’buy_now’: buy_now,
’current_price’: current_price,
‘auction_type’: ‘b’,
’seller_num_id’: seller_num_id,
‘activity’: ‘’,
‘chargeTypeId’: ‘’,
}
上面标记黑粗的字都是参数:
seller_id、photo_url、rootCatId、allow_quantity、seller_num_id、current_price(价格)、buy_now(价格):在商品详情页都可以找的到。
buy_param、skuId、item_id_num、item_id、auction_id:都是url中提取的。
tb_token:是cookie中提取的。
至此,请求购买的提交参数就都有了!
请求购买url: https://buy.tmall.com/order/confirm_order.htm
headers = {
“Origin”: “https://detail.tmall.com”,
"Referer": ref_url,
“User-Agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36”
}
headers里面的Referer要是你请求的详情页链接。
params = {
"x-itemid": g_data.get(“item_id_num”),
“x-uid”: c.get(“unb”)
}
params里面的参数x-itemid详情页url的id,x-uid是cookie中的unb字段。
带上之前详情页构造的data进行请求就可以进入到订单确认页面了。
在订单却页面要获取提交订单接口的参数:
data = {
"endpoint": endpoint,
"linkage": linkage,
"data": p_data,
"action": action,
"tb_token": tb_token,
"event_submit_do_confirm": event_submit_do_confirm,
"praper_alipay_cashier_domain": praper_alipay_cashier_domain,
"input_charset": input_charset,
"hierarchy": hierarchy,
}
上面所有的黑体字都是必要参数:
endpoint用url解码一下你就会发现是一个字典类型的字段,看样子应该是哪个json返回的,全局搜索一下,你会发现并不是在上面xhr包中,而正是在上一步的确认订单的页面中,同样的方法找到linkage,
data,hierarchy这些都是url编码的你要解码,其中最难的就是data了,最开始发现他是随机的,后面对比了一下页面中的源数据,发现data下面的每一个对象里面的submit字段决定了data参数,就是submit为true时,才是要提交的参数(这个地方我觉得是全部里面最恶心的地方,你亲身体验一下就知道了)。
_tb_token_是cookie中的字段不在赘述
event_submit_do_confirm在确认订单的页面页面中去找。
praper_alipay_cashier_domain是支付方式,也是比较恶心的一个字段,这里直接告诉大家,也是在确认订单页面中全局搜索unitSuffix字段就可以发现了
input_charset、action也是在原页面中找吗,但是好像是固定的
ok,以上就是就是提交订单所需要的全部参数了,这一个步骤是全过程中最难最恶心的地方,需要有耐心,不然你会乱掉的
提交订单url: https://buy.tmall.com/auction/confirm_order.htm也是购买请求的url
headers = {
‘User-Agent’: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36”,
’Referer’: c_url,
‘Origin’: “https://buy.tmall.com”,
}
headers中的Referer是确认购买页面的url。
params = {
’x-itemid’: itemid,
’x-uid’: c.get(“unb”),
‘submitref’: secretvalue,
‘sparam1’: sparam1
}
params中的x-itemid是商品详情页url的id,x-uid是cookie中的字段不在赘述,submitref、sparam1是在确认订单页面中寻找的。
总结: ok,以上就是某宝秒杀的一些重要参数了,在次声明仅供参考!!!自己花了三天时间完成了一个小软件,感觉最难的地方就是那个data了,太恶心了,我之前破解猪八戒的聊天窗口都没有这么恶心。最后放上一个作品结果吧(不要说慢,因为我电脑用了6年了,电脑配置非常垃圾,这边网络也就一般)
如果是好点配置加网络的话我估价0.3秒不是问题!
web自动化秒杀源码地址:
https://github.com/A-dying-ape/demo/tree/master/%E6%B7%98%E5%AE%9D%E7%A7%92%E6%9D%801.0
——————————————————————
这是我用qt实现的页面:
2021-1-2:
哈喽,大家好。之前说的在自己的电脑上抢不到淘宝限时秒杀的物品,然后最近在github上看到了一个大神分享的京东秒杀流程(地址给忘了,亲测有效,本地运行成功率较低,我下了源码我放到我的资源里面,感兴趣的可以去看看源码哈,但是大神已经把github上面的删了,并且不更新了,所以偷偷看就行了),我看了他的源码,其实就是京东的购买接口了,但是和我写的淘宝秒杀唯一有差距的地方是:大神的京东秒杀程序是有校对服务器时间和本地时间差的(但是我这里有一个问题:如果要校对服务器时间的话,那浏览器上面的倒计时是以服务器为准还是以本地的时间为准?如果是以服务器时间为准的话,那我最最开始写的那个1.0版本的应该是ok的,但是事实却有点尴尬哈哈哈),然后最近不研究淘宝了,淘宝是真的恶心到我了,有耐心大部分都可以破解出来。好了,下面我就把大神的时间校验和一些我网上查到的几个电商平台的服务器时间戳接口分析给大家,有要源码的可以取自行下载。
时间戳校验
# -*- coding:utf-8 -*-
import time
import requests
import json
from datetime import datetime
from jd_logger import logger
from config import global_config
class Timer(object):
def __init__(self, sleep_interval=0.5):
# '2018-09-28 22:45:50.000'
self.buy_time = datetime.strptime(global_config.getRaw('config','buy_time'), "%Y-%m-%d %H:%M:%S.%f")
self.buy_time_ms = int(time.mktime(self.buy_time.timetuple()) * 1000.0 + self.buy_time.microsecond / 1000)
self.sleep_interval = sleep_interval
self.diff_time = self.local_jd_time_diff()
def jd_time(self):
"""
从京东服务器获取时间毫秒
:return:
"""
url = 'https://a.jd.com//ajax/queryServerData.html'
ret = requests.get(url).text
js = json.loads(ret)
return int(js["serverTime"])
def local_time(self):
"""
获取本地毫秒时间
:return:
"""
return int(round(time.time() * 1000))
def local_jd_time_diff(self):
"""
计算本地与京东服务器时间差
:return:
"""
return self.local_time() - self.jd_time()
def start(self):
logger.info('正在等待到达设定时间:{},检测本地时间与京东服务器时间误差为【{}】毫秒'.format(self.buy_time, self.diff_time))
while True:
# 本地时间减去与京东的时间差,能够将时间误差提升到0.1秒附近
# 具体精度依赖获取京东服务器时间的网络时间损耗
if self.local_time() - self.diff_time >= self.buy_time_ms:
logger.info('时间到达,开始执行……')
break
else:
time.sleep(self.sleep_interval)
校验时间的代码就是上面这些了,下面是一些时间戳接口了:
几个电商网站服务器时间接口
# 淘宝
http://api.m.taobao.com/rest/api3.do?api=mtop.common.getTimestamp
# 苏宁
http://quan.suning.com/getSysTime.do
# 京东
https://a.jd.com//ajax/queryServerData.html
以上希望对大家研究秒杀有所帮助!!!!!