代码如下
import concurrent
import datetime
from concurrent.futures import ProcessPoolExecutor
import json
import sys
import time
import requests
import jpype
import urllib3
from log import logger
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
cookie_str = ''
sub_order_time = '2024-05-01 18:07:59.500'
skuId = 124234234234234232343
# 创建一个Session对象
session = requests.session()
jump_url = 'https://un.m.jd.com/cgi-bin/app/appjmp'
token_body = '{"action":"to","to":"https://divide.jd.com/user_routing?skuId=%s"}' % skuId
token_function_id = ''
client = ''
clientVersion = ''
uuid = ''
params = {
"tokenKey": 'AAEAMAje64z7n1vGvN0nq_FH_PgEBZMFBUlqW7rVS-_W2kNwPpykXwjaGg7QDHS7TzrFPQ1',
"to": "https://divide.jd.com/user_routing?skuId=%s" % skuId
}
fp = ''
eid = ''
ep = ''
token_payload = {}
order_rul = 'https://marathon.jd.com/seckillnew/orderService/submitOrder.action?skuId=' + str(skuId)
data = {}
is_first_init_data = True
def make_reserve():
"""商品预约"""
url = 'https://api.m.jd.com/client.action'
body = '{"autoAddCart":"0","bsid":"","check":"0","ctext":"","isShowCode":"0","mad":"0","skuId":"%s","type":"4"}' % skuId
payload = {}
JDClass = jpype.JClass("com.jdsdk.jd_main")
jd = JDClass()
sing = jd.runJni(['appoint', body, uuid, client, clientVersion])
sign = str(sing)
data_array = sign.split('&')
data_dict = {}
# 遍历分割后的数组
for item in data_array:
key, value = item.split('=')
data_dict[key] = value
payload['st'] = data_dict['st']
payload['sign'] = data_dict['sign']
payload['sv'] = 111
resp = session.post(url=url, params=payload)
resp_json = parse_json(resp.text)
print(resp_json)
try:
if resp_json['title'] == '您已成功预约,无需重复预约' or resp_json['title'] == '预约成功!':
logger.info(resp_json['title'])
except Exception as e:
logger.error('预约失败正在重试...')
def sub_order():
global is_first_init_data
while True:
"""
init.action 拿到生成订单的信息
替换订单模版的某些信息
"""
if is_first_init_data:
order_init_url = 'https://marathon.jd.com/seckillnew/orderService/init.action'
order_init_data = {
'sku': skuId,
'num': 1,
}
init_data = session.post(order_init_url, params=order_init_data)
if init_data.text == 'null':
print('init_data == null')
continue
try:
init_data = parse_json(init_data.text)
if init_data.get('islogin'):
print('islogin.no')
continue
except Exception as e:
logger.info('抢购失败,返回信息:{}'.format(init_data.text[0: 128]))
continue
"""
提交订单
"""
for _ in range(1000):
order_resp = session.post(url=order_rul, params=data)
try:
resp_json = parse_json(order_resp.text)
except Exception as e:
logger.info('抢购失败,返回信息:{}'.format(order_resp.text[0: 128]))
continue
if resp_json.get('success'):
order_id = resp_json.get('orderId')
total_money = resp_json.get('totalMoney')
pay_url = 'https:' + resp_json.get('pcUrl')
print('抢购成功,订单号:{}, 总价:{}, 电脑端付款链接:{}'.format(order_id, total_money, pay_url))
logger.info('抢购成功,订单号:{}, 总价:{}, 电脑端付款链接:{}'.format(order_id, total_money, pay_url))
else:
logger.info('抢购失败,返回信息:{}'.format(resp_json))
continue
"""
休息10毫秒
"""
time.sleep(0.01)
def kill_mt():
global marathon_location
"""
appjmp
获取跳转Location
"""
response = session.get(url=jump_url, params=params, allow_redirects=False, verify=False)
location = response.headers.get('Location')
"""
divide验证登陆信息
"""
divide_response = session.get(location, allow_redirects=False, verify=False)
if divide_response.headers.get('Location') == 'https://marathon.jd.com/mobile/koFail.html':
print("第二步出错!!wskey过期")
die()
else:
marathon_location = divide_response.headers.get('Location')
"""
获取第三步跳转连接
当活动开始的时候才会订单生成地址
成功网址 = https://marathon.jd.com/seckillM/seckill.action?skuId=100012043978&num=1&rid=1621310648
失败网址 = https://marathon.jd.com/mobile/koFail.html 非抢购时间都会失败
"""
marathon = session.get(marathon_location, allow_redirects=False, verify=False)
get_pay_location = marathon.headers.get('Location')
"""
seckill.action
在app上就是填写订单
只有在抢购期间内才会请求成功,否则都是失败的
"""
if get_pay_location == 'https://marathon.jd.com/mobile/koFail.html' or get_pay_location is None:
die()
session.get(get_pay_location, allow_redirects=False, verify=False)
sub_order()
def parse_json(s):
begin = s.find('{')
end = s.rfind('}') + 1
return json.loads(s[begin:end])
def die():
sys.exit(1)
def getToken():
logger.info('开始获取 token')
JDClass = jpype.JClass("com.jdsdk.jd_main")
jd = JDClass()
sing = jd.runJni([token_function_id, token_body, uuid, client, clientVersion])
sign = str(sing)
data_array = sign.split('&')
data_dict = {}
# 遍历分割后的数组
for item in data_array:
key, value = item.split('=')
data_dict[key] = value
token_payload['st'] = data_dict['st']
token_payload['sign'] = data_dict['sign']
token_payload['sv'] = 111
url = 'https://api.m.jd.com/client.action'
token_resp = requests.post(url, params=token_payload)
if token_resp.status_code != 200:
print("请求出错!!!")
json = parse_json(token_resp.text)
if json.get('echo'):
print("错误信息")
print(json['echo'])
die()
params['tokenKey'] = json['tokenKey']
logger.info('获取 token完毕')
logger.info('获取到token:' + json['tokenKey'])
if __name__ == "__main__":
# 添加Jar包到类路径
jvmPath = jpype.getDefaultJVMPath()
d = './out/artifacts/xxx_jar/xxx.jar' # 对应jar地址
jpype.startJVM(jvmPath, "-ea", "-Djava.class.path=" + d + "")
make_reserve()
getToken()
kill_mt()
说明
这个脚本是用来抢购京东商品的Python脚本,其中包含了许多自动化操作来模拟用户行为。下面是脚本的主要部分及其功能的详细解释:
1. 初始化和导入库:
– 导入必要的库,如`concurrent`, `datetime`, `requests`, `jpype`等,用于网络请求、日期处理和Java代码交互。
– 使用`urllib3`禁用了HTTPS警告,这是常见的在发起HTTPS请求时避免不必要警告的做法。
2. 全局变量设置:
– 设置cookie字符串、预定时间、商品ID、以及一些URL和header参数。
3. Session对象:
– 创建了一个requests的Session对象用于维持一系列请求的持久连接。
4. 商品预约(make_reserve):
– 发起POST请求预约商品,使用了封装的加密算法生成请求签名,并处理返回的预约结果。
5. 提交订单(sub_order):
– 通过不断检查和提交订单尝试抢购商品。使用了一个循环来持续尝试直到成功或达到尝试次数限制。
6. 抢购主函数(kill_mt):
– 包含了获取token、处理登录跳转、验证登录信息,最后根据响应跳转到抢购页面。
– 如果抢购时间到了,会调用`sub_order()`函数来提交订单。
7. 辅助功能:
– `parse_json`函数用于解析JSON格式的字符串。
– `die()`函数用于在发生错误时退出脚本。
– `getToken()`用于从服务器获取必要的token以继续进行抢购。
8. JPype的使用:
– 使用JPype来启动Java虚拟机,允许Python脚本运行Java代码。这通常用于调用一些复杂的加密函数,这些加密函数是用Java实现的,可能涉及到登录和提交订单的过程。
9. 入口点:
– 脚本的执行从这里开始,首先设置JPype的环境,然后进行商品预约,获取token,并尝试抢购。
这个脚本的目的是自动化地参与京东的商品抢购活动,通过模拟用户的登录和下单过程来尽可能地提高成功率。请注意,使用这类脚本可能违反京东的使用条款,并可能导致账号被封禁。在使用之前,请确保了解相关的法律和政策限制。
注意:
本文部分变量已做脱敏处理,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。技术层面需要提供帮助,可以通过打赏的方式进行探讨。
1. 转载请在文内以超链形式注明出处,谢谢合作!
2. 本站除原创内容,其余所有内容均收集自互联网,仅限用于学习和研究目的,本站不对其内容的合法性承担任何责任。如有版权内容,请通知我们或作者删除,其版权均归原作者所有,本站虽力求保存原有版权信息,但因众多资源经多次转载,已无法确定其真实来源,或已将原有信息丢失,所以敬请原作者谅解!
3. 本站用户所发布的一切资源内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责,若您对本站所载资源作品版权归属存有异议,请留言附说明联系邮箱,我们将在第一时间予以处理 ,同时向您表示歉意!为尊重作者版权,请购买原版作品,支持您喜欢的作者,谢谢!
4. 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客如有发现请立即向站长举报;本站资源文件大多存储在云盘,如发现链接或图片失效,请联系作者或站长及时更新。
暂无评论内容