Update jd_shopLeague_opencard.py

This commit is contained in:
Faker 2023-07-18 14:57:45 +08:00
parent 1f24e107a9
commit ab89276410

View File

@ -2,35 +2,36 @@
# -*- coding: utf-8 -*-
"""
File: jd_shopLeague_opencard.py(通用开卡-shopLeague系列)
File: jd_shopLeague_opencard.py(通用开卡-超店shopLeague系列)
Author: HarbourJ
Date: 2022/8/12 20:37
TG: https://t.me/HarbourToulu
TgChat: https://t.me/HarbourSailing
cron: 1 1 1 1 1 1
new Env('通用开卡-shopLeague系列');
new Env('通用开卡-超店shopLeague系列');
ActivityEntry: https://lzdz1-isv.isvjd.com/dingzhi/shop/league/activity?activityId=dzd16c3e4a819a0e14026da9shop
Description: dingzhi/shop/league系列通用开卡脚本(通常情况下,开一张卡5,最高获得220豆,邀请成功获得20豆)
本地sign算法+redis缓存Token+代理ip(自行配置实测可行)
本地sign算法+redis缓存Token
变量: export jd_shopLeagueId="2b870a1a7450xxxxxxxxxxxxx" 变量值需要传入活动id
并发变量export jd_shopLeague_uuid="你的shareUuid"
Update: 2022/11/01 更新入会算法内置船新入会本地算法
"""
import time
import requests
import sys
import re
import os
import time, requests, sys, re, os, json, random
from datetime import datetime
import json
import random
from urllib.parse import quote_plus, unquote_plus
from functools import partial
print = partial(print, flush=True)
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
from jd_sign import *
try:
from jd_sign import *
except ImportError as e:
print(e)
if "No module" in str(e):
print("请先运行Faker库依赖一键安装脚本(jd_check_sign.py)安装jd_sign.so依赖")
sys.exit()
try:
from jdCookie import get_cookies
getCk = get_cookies()
@ -39,12 +40,13 @@ except:
sys.exit(3)
redis_url = os.environ.get("redis_url") if os.environ.get("redis_url") else "172.17.0.1"
redis_port = os.environ.get("redis_port") if os.environ.get("redis_port") else "6379"
redis_pwd = os.environ.get("redis_pwd") if os.environ.get("redis_pwd") else ""
jd_shopLeagueId = os.environ.get("jd_shopLeagueId") if os.environ.get("jd_shopLeagueId") else ""
inviterUuid = os.environ.get("jd_shopLeague_uuid") if os.environ.get("jd_shopLeague_uuid") else ""
if not jd_shopLeagueId:
print("⚠️未发现有效活动变量,退出程序!")
print("⚠️未发现有效超店活动变量jd_shopLeagueId,退出程序!")
sys.exit()
# 获取远程remote-redis活动ID
if "lzdz1_remote" in jd_shopLeagueId:
@ -63,7 +65,7 @@ def redis_conn():
try:
import redis
try:
pool = redis.ConnectionPool(host=redis_url, port=6379, decode_responses=True, socket_connect_timeout=5, password=redis_pwd)
pool = redis.ConnectionPool(host=redis_url, port=redis_port, decode_responses=True, socket_connect_timeout=5, password=redis_pwd)
r = redis.Redis(connection_pool=pool)
r.get('conn_test')
print('✅redis连接成功')
@ -77,21 +79,19 @@ def redis_conn():
def getToken(ck, r=None):
host = f'{activityUrl.split("com/")[0]}com'
try:
# redis缓存Token 活动域名+pt_pin
pt_pin = unquote_plus(re.compile(r'pt_pin=(.*?);').findall(ck)[0])
except:
# redis缓存Token 活动域名+ck前7位(获取pin失败)
pt_pin = ck[:8]
pt_pin = ck[:15]
try:
try:
if r is not None:
Token = r.get(f'{activityUrl.split("https://")[1].split("-")[0]}_{pt_pin}')
# print("Token过期时间", r.ttl(f'{activityUrl.split("https://")[1].split("-")[0]}_{pt_pin}'))
except Exception as e:
# print(f"redis get error: {str(e)}")
Token = None
if Token is not None:
# print(f"♻获取缓存Token->: {Token}")
print(f"获取缓存Token")
return Token
else:
print("🈳去设置Token缓存")
s.headers = {
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, br',
@ -103,47 +103,27 @@ def getToken(ck, r=None):
'Accept-Language': 'zh-Hans-CN;q=1 en-CN;q=0.9',
'Accept': '*/*'
}
sign_txt = sign({"url": f"{host}", "id": ""}, 'isvObfuscator')
# print(sign_txt)
sign({"url": f"{host}", "id": ""}, 'isvObfuscator')
f = s.post('https://api.m.jd.com/client.action', verify=False, timeout=30)
if f.status_code != 200:
print(f.status_code)
return
else:
if "参数异常" in f.text:
print(f.text)
return
Token_new = f.json()['token']
# print(f"Token->: {Token_new}")
try:
if r.set(f'{activityUrl.split("https://")[1].split("-")[0]}_{pt_pin}', Token_new, ex=1800):
print("✅Token缓存设置成功")
print("✅Token缓存成功")
else:
print("❌Token缓存设置失败")
print("❌Token缓存失败")
except Exception as e:
# print(f"redis set error: {str(e)}")
print(f"✅获取实时Token")
return Token_new
else:
s.headers = {
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'User-Agent': '',
'Cookie': ck,
'Host': 'api.m.jd.com',
'Referer': '',
'Accept-Language': 'zh-Hans-CN;q=1 en-CN;q=0.9',
'Accept': '*/*'
}
sign_txt = sign({"url": f"{host}", "id": ""}, 'isvObfuscator')
# print(sign_txt)
f = s.post('https://api.m.jd.com/client.action', verify=False, timeout=30)
if f.status_code != 200:
print(f.status_code)
return
else:
if "参数异常" in f.text:
return
Token = f.json()['token']
print(f"Token->: {Token}")
return Token
except:
except Exception as e:
print(f"Get Token Error: {str(e)}")
return
def getJdTime():
@ -177,8 +157,7 @@ def getActivity():
'User-Agent': ua,
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'Referer': activityUrl
'Connection': 'keep-alive'
}
response = requests.request("GET", url, headers=headers)
if response.status_code == 200:
@ -232,7 +211,7 @@ def getSimpleActInfoVo():
if res['result']:
return res['data']
else:
print(res['errorMessage'])
print(f"getSimpleActInfoVo Error: {res['errorMessage']}")
def getMyPing(index, venderId):
url = "https://lzdz1-isv.isvjcloud.com/customer/getMyPing"
@ -256,7 +235,7 @@ def getMyPing(index, venderId):
if res['result']:
return res['data']['nickname'], res['data']['secretPin']
else:
print(f"⚠️{res['errorMessage']}")
print(f"⚠️getMyPing Error: {res['errorMessage']}")
if index == 1 and "火爆" in res['errorMessage']:
print(f"\t⛈车头黑,退出本程序!")
sys.exit()
@ -320,7 +299,7 @@ def getUserInfo(pin):
if res['result']:
return res['data']['nickname'], res['data']['yunMidImageUrl'], res['data']['pin']
else:
print(res['errorMessage'])
print(f"getUserInfo Error: {res['errorMessage']}")
def activityContent(pin, pinImg, nickname):
url = "https://lzdz1-isv.isvjcloud.com/dingzhi/shop/league/activityContent"
@ -371,6 +350,7 @@ def drawContent(pin):
requests.request("POST", url, headers=headers, data=payload)
def checkOpenCard(shareUuid, actorUuid):
try:
url = "https://lzdz1-isv.isvjcloud.com/dingzhi/shop/league/checkOpenCard"
payload = f"activityId={activityId}&pin={quote_plus(pin)}&shareUuid={shareUuid}&actorUuid={actorUuid}"
headers = {
@ -392,9 +372,11 @@ def checkOpenCard(shareUuid, actorUuid):
if res['result']:
return res['data']
else:
print(res['errorMessage'])
print(f"checkOpenCard Error: {res['errorMessage']}")
if "活动已结束" in res['errorMessage']:
sys.exit()
except Exception as e:
print(f"checkOpenCard Error: {e}")
def getDrawRecordHasCoupon(pin, actorUuid):
url = "https://lzdz1-isv.isvjcloud.com/dingzhi/taskact/common/getDrawRecordHasCoupon"
@ -435,7 +417,7 @@ def getShareRecord(actorUuid):
if res['result']:
return res['data']
else:
print(res['errorMessage'])
print(f"getShareRecord Error: {res['errorMessage']}")
def saveTask(actorUuid, shareUuid, pin, taskType, taskValue):
url = "https://lzdz1-isv.isvjcloud.com/dingzhi/shop/league/saveTask"
@ -459,13 +441,20 @@ def saveTask(actorUuid, shareUuid, pin, taskType, taskValue):
print(res['data'])
return res['data']
else:
print(res['errorMessage'])
print(f"saveTask Error: {res['errorMessage']}")
def bindWithVender(cookie, venderId):
try:
shopcard_url0 = f"https://lzdz1-isv.isvjcloud.com/dingzhi/joinCommon/activity/7854908?activityId={activityId}&shareUuid={shareUuid}"
shopcard_url = f"https://shopmember.m.jd.com/shopcard/?venderId={venderId}&channel=401&returnUrl={quote_plus(shopcard_url0)}"
s.headers = {
payload = {
'appid': 'jd_shop_member',
'functionId': 'bindWithVender',
'body': json.dumps({
'venderId': venderId,
'shopId': venderId,
'bindByVerifyCodeFlag': 1
}, separators=(',', ':'))
}
headers = {
'Connection': 'keep-alive',
'Accept-Encoding': 'gzip, deflate, br',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
@ -476,24 +465,14 @@ def bindWithVender(cookie, venderId):
'Accept-Language': 'zh-Hans-CN;q=1 en-CN;q=0.9',
'Accept': '*/*'
}
s.params = {
'appid': 'jd_shop_member',
'functionId': 'bindWithVender',
'body': json.dumps({
'venderId': venderId,
'shopId': venderId,
'bindByVerifyCodeFlag': 1
}, separators=(',', ':'))
}
res = s.post('https://api.m.jd.com/', verify=False, timeout=30).json()
response = requests.request("POST", "https://api.m.jd.com/", headers=headers, data=payload, timeout=10).text
res = json.loads(response)
if res['success']:
return res['message']
return res['message'], res['result']['giftInfo'] if res['result'] else ""
except Exception as e:
print(e)
print(f"bindWithVender Error: {venderId} {e}")
def getShopOpenCardInfo(cookie, venderId):
shopcard_url0 = f"https://lzdz1-isv.isvjcloud.com/dingzhi/shop/league/activity/7854908?activityId={activityId}&shareUuid={shareUuid}"
shopcard_url = f"https://shopmember.m.jd.com/shopcard/?venderId={venderId}&channel=401&returnUrl={quote_plus(shopcard_url0)}"
try:
body = {"venderId": str(venderId), "channel": "401"}
url = f'https://api.m.jd.com/client.action?appid=jd_shop_member&functionId=getShopOpenCardInfo&body={json.dumps(body)}&client=H5&clientVersion=9.2.0&uuid=88888'
@ -504,10 +483,10 @@ def getShopOpenCardInfo(cookie, venderId):
'Cookie': cookie,
'User-Agent': ua,
'Accept-Language': 'zh-cn',
'Referer': shopcard_url,
'Referer': 'https://shopmember.m.jd.com/',
'Accept-Encoding': 'gzip, deflate'
}
response = requests.get(url=url, headers=headers, timeout=5).text
response = requests.get(url=url, headers=headers, timeout=10).text
res = json.loads(response)
if res['success']:
venderCardName = res['result']['shopMemberCardInfo']['venderCardName']
@ -540,7 +519,7 @@ if __name__ == '__main__':
num += 1
if num == 1:
firstCk = cookie
if num % 8 == 0:
if num % 5 == 0:
print("⏰等待10s,休息一下")
time.sleep(10)
global ua, activityCookie, token
@ -561,26 +540,28 @@ if __name__ == '__main__':
print(f"获取Token失败⏰等待3s")
time.sleep(3)
continue
time.sleep(0.5)
time.sleep(0.3)
activityCookie = getActivity()
time.sleep(0.5)
time.sleep(0.3)
getSystemConfigForNew()
time.sleep(0.3)
getSimAct = getSimpleActInfoVo()
if getSimAct:
venderId = getSimAct['venderId']
else:
venderId = "1000010825"
venderId = "1000003571"
time.sleep(0.2)
getPin = getMyPing(num, venderId)
if getPin is not None:
if getPin:
nickname = getPin[0]
secretPin = getPin[1]
time.sleep(0.5)
time.sleep(0.2)
accessLogWithAD(venderId, secretPin)
time.sleep(0.5)
time.sleep(0.2)
userInfo = getUserInfo(secretPin)
time.sleep(0.8)
if not userInfo:
continue
time.sleep(0.3)
nickname = userInfo[0]
yunMidImageUrl = userInfo[1]
pin = userInfo[2]
@ -589,6 +570,7 @@ if __name__ == '__main__':
if num == 1:
print("⚠️无法获取车头邀请码,退出本程序!")
sys.exit()
time.sleep(3)
continue
hasEnd = actContent['hasEnd']
if hasEnd:
@ -601,69 +583,87 @@ if __name__ == '__main__':
addSku = actContent['addSku']['allStatus']
print(f"邀请码->: {actorUuid}")
print(f"准备助力->: {shareUuid}")
time.sleep(0.5)
time.sleep(0.2)
drawContent(pin)
time.sleep(0.5)
time.sleep(0.2)
checkOC = checkOpenCard(shareUuid, actorUuid)
allOpenCard = checkOC['allOpenCard']
assistStatus = checkOC['assistStatus']
beanNum = checkOC['beanNum']
sendBeanNum = checkOC['sendBeanNum']
cardList = checkOC['cardList']
assStat = False
if allOpenCard:
print("已完成全部开卡任务")
if assistStatus == 0:
print("已经助力过你~")
elif assistStatus == 2:
print("已经助力过你~")
elif assistStatus == 3:
print("已助力过其他好友~")
elif assistStatus == 1:
print("已完成开卡关注任务,未助力过好友~")
assStat = True
else:
# print('assistStatus:', assistState0)
assStat = True
else:
print("现在去开卡")
openCardLists = [(int(i['value']), i['name']) for i in cardList if i['status'] == 0]
print(f"现在去开卡,共计{len(openCardLists)}个会员💳")
open_num = 0
for shop in openCardLists:
print(f"去开卡 {shop[1]} {shop[0]}")
open_num += 1
print(f"去开卡 {open_num}/{len(openCardLists)} {shop[0]}")
venderId = shop[0]
venderCardName = shop[1]
getShopOpenCardInfo(cookie, venderId)
open_result = bindWithVender(cookie, venderId)
if open_result is not None:
if "火爆" in open_result or "失败" in open_result:
if "火爆" in open_result[0] or "失败" in open_result[0] or "解绑" in open_result[0]:
time.sleep(1.5)
print("\t尝试重新入会 第1次")
open_result = bindWithVender(cookie, venderId)
if "火爆" in open_result or "失败" in open_result:
time.sleep(1.5)
print("\t尝试重新入会 第2次")
open_result = bindWithVender(cookie, venderId)
if "火爆" in open_result or "失败" in open_result:
print(f"\t⛈⛈{venderCardName} {open_result}")
print(f"\t⛈⛈{venderCardName} {open_result[0]}")
assStat = False
break
else:
print(f"\t🎉🎉{venderCardName} {open_result}")
print(f"\t🎉🎉{venderCardName} {open_result[0]}")
assStat = True
if open_result[1]:
print(f"\t🎁获得{','.join([gift['discountString'] + gift['prizeName'] for gift in open_result[1]['giftList']])}")
if open_num % 5 == 0:
print("⏰等待5s,休息一下")
time.sleep(5)
else:
time.sleep(2)
checkOC = checkOpenCard(shareUuid, actorUuid)
if not checkOC:
time.sleep(5)
continue
sendBeanNum = checkOC['sendBeanNum']
allOpenCard = checkOC['allOpenCard']
assistStatus = checkOC['assistStatus']
if sendBeanNum > 0:
print(f"\t🎁开卡获得{sendBeanNum}")
else:
print(f"\t🤖开卡可能没水啦!")
if allOpenCard and assistStatus == 1:
assStat = True
time.sleep(1.5)
checkOpenCard(shareUuid, actorUuid)
time.sleep(0.5)
activityContent(pin, yunMidImageUrl, nickname)
time.sleep(0.5)
drawContent(pin)
print("现在去一键关注店铺")
saveTask(actorUuid, shareUuid, pin, 1, 1)
time.sleep(0.5)
time.sleep(0.3)
print("现在去一键加购")
saveTask(actorUuid, shareUuid, pin, 2, 2)
time.sleep(0.5)
time.sleep(0.3)
getSR = getShareRecord(actorUuid)
if num == 1:
if getSR:
print(f"🎉🎉🎉已经邀请{len(getSR)}")
if getSR and num == 1:
print(f"🧑‍🤝‍🧑已经邀请{len(getSR)}")
if assStat and num != 1:
print("🎉🎉🎉助力成功~")
inviteSuccNum += 1
print(f"本次车头已邀请{inviteSuccNum}")
if num == 1:
print(f"后面账号全部助力 {actorUuid}")
if num == 1:
shareUuid = actorUuid
activityUrl = f"https://lzdz1-isv.isvjcloud.com/dingzhi/shop/league/activity/5929859?activityId={activityId}&shareUuid={shareUuid}"