This commit is contained in:
Faker 2022-07-07 15:08:43 +08:00
parent 07b3b3ee7f
commit 23d040599b
3 changed files with 408 additions and 3 deletions

46
jdCookie.py Normal file
View File

@ -0,0 +1,46 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2022/7/6 23:00
# @Author : HarbourJ
# @TG : https://t.me/HarbourToulu
# @File : jdCookie.py
import os
import time
def get_cookies():
CookieJDs = []
if os.environ.get("JD_COOKIE"):
print("已获取并使用Env环境 Cookie")
if '&' in os.environ["JD_COOKIE"]:
CookieJDs = os.environ["JD_COOKIE"].split('&')
elif '\n' in os.environ["JD_COOKIE"]:
CookieJDs = os.environ["JD_COOKIE"].split('\n')
else:
CookieJDs = [os.environ["JD_COOKIE"]]
# return CookieJDs
else:
if os.path.exists("JD_COOKIE.txt"):
with open("JD_COOKIE.txt", 'r') as f:
JD_COOKIEs = f.read().strip()
if JD_COOKIEs:
if '&' in JD_COOKIEs:
CookieJDs = JD_COOKIEs.split('&')
elif '\n' in JD_COOKIEs:
CookieJDs = JD_COOKIEs.split('\n')
else:
CookieJDs = [JD_COOKIEs]
CookieJDs = sorted(set(CookieJDs), key=CookieJDs.index)
# return CookieJDs
else:
print("未获取到正确✅格式的京东账号Cookie")
return
print(f"====================共{len(CookieJDs)}个京东账号Cookie=========\n")
print(f"==================脚本执行- 北京时间(UTC+8){time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())}=====================\n")
return CookieJDs
# if __name__ == "__main__":
# get_cookies()
# print(os.environ.get("JD_COOKIE"))

View File

@ -31,8 +31,8 @@ const token = [
"C387DE3A3F4381FB3E451F0C40069FE6", "C387DE3A3F4381FB3E451F0C40069FE6",
"069C121295427F0A7D8FA85B499F72B3", "069C121295427F0A7D8FA85B499F72B3",
"A92269DC92DDD73CC5EB38B3BACF51E3", "A92269DC92DDD73CC5EB38B3BACF51E3",
"7C57F7DD19AF5B0EE308F2BA5B23EFB6", "62CED31ECD51A5D51A2BBB9FB793393A",
"0A58D51DE70A2C933EED3196280D484F", "2ED2F283E4640130BA5128E8BBDC3DDA",
"1DD46671387EAC6FDC14B753E01D5E30", "1DD46671387EAC6FDC14B753E01D5E30",
"0F14035F1DDD2F44460D36B0A007A548", "0F14035F1DDD2F44460D36B0A007A548",
"662E62C629FB6B20CED938E41A0DC026", "662E62C629FB6B20CED938E41A0DC026",
@ -49,7 +49,9 @@ const token = [
"BFD5D11942F2349BBB3F910BCE954E8F", "BFD5D11942F2349BBB3F910BCE954E8F",
"DC2D503AEC0235CB3F574DE47192325A", "DC2D503AEC0235CB3F574DE47192325A",
"921478C146E5C60F2444E3978AC8E94F", "921478C146E5C60F2444E3978AC8E94F",
"A0308C73CA1D98CDFBE776DF2CA60EE7", "65F125FA81931EFB87E3558AB203D3E3",
"6A1D522B151D1245362A9EED52D50CC6",
"20564C6C72406F2707C9069D113B4449",
"A622DB2BAEB4C3B6054CE62968371E43", "A622DB2BAEB4C3B6054CE62968371E43",
"7879A6C855D8D5D52F6329A59DA949FF" "7879A6C855D8D5D52F6329A59DA949FF"
] ]

357
jd_inviteFriendsGift.py Normal file
View File

@ -0,0 +1,357 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
File: jd_inviteFriendsGift.py(邀好友赢大礼)
Author: Fix by HarbourJ from doubi
Date: 2022/7/6 23:26
TG: https://t.me/HarbourToulu
cron: 1 1 1 1 1 1
new Env('邀好友赢大礼');
活动入口https://prodev.m.jd.com/mall/active/dVF7gQUVKyUcuSsVhuya5d2XD4F/index.html?code=xxxxxxxx&invitePin=xxxxxx
修改记录: 增加从环境变量中获取authorCode变量增加对青龙desi JD_COOKIE的适配
变量格式: export jd_inv_authorCode="6b84e047a9154d909febd19d3120aad2"
"""
import json
import requests, random, time, asyncio, re, os, sys
from urllib.parse import quote_plus, unquote_plus
from functools import partial
try:
from jdCookie import get_cookies
getCk = get_cookies()
except:
print("请先下载依赖脚本,\n下载链接https://raw.githubusercontent.com/HarbourJ/HarbourToulu/main/JDCookie.py")
sys.exit(3)
print = partial(print, flush=True)
activatyname = '邀请赢大礼'
activityId = 'dVF7gQUVKyUcuSsVhuya5d2XD4F' # 活动类型
try:
if os.environ.get("jd_inv_authorCode"):
authorCode = os.environ["jd_inv_authorCode"] # 活动id
else:
authorCode = "6b84e047a9154d909febd19d3120aad2"
except:
print("未在环境变量中获取到有效jd_inv_authorCode变量请添加变量后重试")
# 随机ua
def randomuserAgent():
global uuid, addressid, iosVer, iosV, clientVersion, iPhone, area, ADID, lng, lat
uuid = ''.join(random.sample(
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'z'], 40))
addressid = ''.join(random.sample('1234567898647', 10))
iosVer = ''.join(random.sample(["15.1.1", "14.5.1", "14.4", "14.3", "14.2", "14.1", "14.0.1"], 1))
iosV = iosVer.replace('.', '_')
clientVersion = ''.join(random.sample(["10.3.0", "10.2.7", "10.2.4"], 1))
iPhone = ''.join(random.sample(["8", "9", "10", "11", "12", "13"], 1))
area = ''.join(random.sample('0123456789', 2)) + '_' + ''.join(random.sample('0123456789', 4)) + '_' + ''.join(
random.sample('0123456789', 5)) + '_' + ''.join(random.sample('0123456789', 4))
ADID = ''.join(random.sample('0987654321ABCDEF', 8)) + '-' + ''.join(
random.sample('0987654321ABCDEF', 4)) + '-' + ''.join(random.sample('0987654321ABCDEF', 4)) + '-' + ''.join(
random.sample('0987654321ABCDEF', 4)) + '-' + ''.join(random.sample('0987654321ABCDEF', 12))
lng = '119.31991256596' + str(random.randint(100, 999))
lat = '26.1187118976' + str(random.randint(100, 999))
UserAgent = ''
if not UserAgent:
return f'jdapp;iPhone;10.0.4;{iosVer};{uuid};network/wifi;ADID/{ADID};model/iPhone{iPhone},1;addressid/{addressid};appBuild/167707;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS {iosV} like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/null;supportJDSHWK/1'
else:
return UserAgent
# 检测ck状态
async def check(ua, ck):
try:
url = 'https://me-api.jd.com/user_new/info/GetJDUserInfoUnion'
header = {
"Host": "me-api.jd.com",
"Accept": "*/*",
"Connection": "keep-alive",
"Cookie": ck,
"User-Agent": ua,
"Accept-Language": "zh-cn",
"Referer": "https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&",
"Accept-Encoding": "gzip, deflate",
}
result = requests.get(url=url, headers=header, timeout=None).text
codestate = json.loads(result)
if codestate['retcode'] == '1001':
msg = "当前ck已失效请检查"
return {'code': 1001, 'data': msg}
elif codestate['retcode'] == '0' and 'userInfo' in codestate['data']:
nickName = codestate['data']['userInfo']['baseInfo']['nickname']
return {'code': 200, 'name': nickName, 'ck': ck}
except Exception as e:
return {'code': 0, 'data': e}
# 获取当前时间
def get_time():
time_now = round(time.time() * 1000)
return time_now
# 登录plogin
async def plogin(ua, cookie):
now = get_time()
url = f'https://plogin.m.jd.com/cgi-bin/ml/islogin?time={now}&callback=__jsonp{now - 2}&_={now + 2}'
header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
'Connection': 'keep-alive',
'Cookie': cookie,
'Host': 'plogin.m.jd.com',
'Referer': 'https://prodev.m.jd.com/',
'User-Agent': ua
}
response = requests.get(url=url, headers=header, timeout=None).text
return response
# 活动接口
async def jdjoy(ua, cookie):
url = f'https://jdjoy.jd.com/member/bring/getActivityPage?code={authorCode}&invitePin={invitePin}&_t={get_time()}'
header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-Hans-US;q=1,en-US;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/json',
'Cookie': cookie,
"Host": 'jdjoy.jd.com',
'Origin': 'https://prodev.m.jd.com',
"Referer": 'https://prodev.m.jd.com/',
'User-Agent': ua
}
response = requests.get(url=url, headers=header).text
return json.loads(response)
# go开卡
async def ruhui(ua, cookie):
url = f'https://jdjoy.jd.com/member/bring/joinMember?code={authorCode}&invitePin={invitePin}'
header = {
'Host': 'jdjoy.jd.com',
'Content-Type': 'application/json',
'Origin': 'https://prodev.m.jd.com',
'Accept-Encoding': 'gzip, deflate, br',
'Cookie': cookie,
'Connection': 'keep-alive',
'Accept': '*/*',
'User-Agent': ua,
'Referer': activityUrl,
'Accept-Language': 'zh-cn',
'request-from': 'native'
}
response = requests.get(url=url, headers=header).text
return json.loads(response)
# 检查开卡状态
async def check_ruhui(body, cookie, venderId, ua):
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'
headers = {
'Host': 'api.m.jd.com',
'Accept': '*/*',
'Connection': 'keep-alive',
'Cookie': cookie,
'User-Agent': ua,
'Accept-Language': 'zh-cn',
'Referer': f'https://shopmember.m.jd.com/shopcard/?venderId={venderId}&channel=801&returnUrl={json.dumps(activityUrl)}',
'Accept-Encoding': 'gzip, deflate'
}
response = requests.get(url=url, headers=headers, timeout=None).text
return json.loads(response)
# 领取奖励
async def getInviteReward(cookie, ua, number):
url = f'https://jdjoy.jd.com/member/bring/getInviteReward?code={authorCode}&stage={number}'
header = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-Hans-US;q=1,en-US;q=0.9',
'Connection': 'keep-alive',
'Content-Type': 'application/json',
'Cookie': cookie,
"Host": 'jdjoy.jd.com',
'Origin': 'https://prodev.m.jd.com',
"Referer": 'https://prodev.m.jd.com/',
'User-Agent': ua
}
response = requests.get(url=url, headers=header).text
return json.loads(response)
# 开启活动
async def firstInvite(cookie, ua):
url = f'https://jdjoy.jd.com/member/bring/firstInvite?code={authorCode}'
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-Hans-US;q=1,en-US;q=0.9',
'Connection': 'keep-alive',
'Cookie': cookie,
"Host": 'jdjoy.jd.com',
'User-Agent': ua
}
response = requests.get(url=url, headers=header).text
print(response)
return json.loads(response)
async def get_ck(data):
cklist = []
if data['code'] != 200:
return {'code': 0, 'data': data}
else:
env_data = data['data']
for ck in env_data:
if 'remarks' in ck and ck['name'] == 'JD_COOKIE':
cklist.append(ck['value'])
else:
pass
return cklist
# 检查pin
def checkpin(cks: list, pin):
for ck in cks:
if pin in ck:
return ck
else:
None
# 主程序
async def main():
try:
cks = getCk
if not cks:
return
except:
print("未获取到有效COOKIE,退出程序!")
return
success = 0 # 计算成功数
global invitePin, activityUrl
r = re.compile(r"pt_pin=(.*?);")
invitePin = r.findall(cks[0])[0] # 获取COOKIES中第一个车头pin
activityUrl = f'https://prodev.m.jd.com/mall/active/{activityId}/index.html?code={authorCode}&invitePin={invitePin}' # 活动链接
inveteck = checkpin(cks, invitePin) # 根据设定的pin返回对应ck
needinviteNum = [] # 需要助力次数
needdel = []
need = []
if inveteck:
print(f'🔔开始{activatyname}任务', flush=True)
print(f"若已加入活动店铺会员,则无法助力。\n入口:\n{activityUrl}\n")
print(f'您好!{invitePin},正在获取您的活动信息', )
ua = randomuserAgent() # 获取ua
result = await check(ua, inveteck) # 检测ck
if result['code'] == 200:
await plogin(ua, inveteck) # 获取登录状态
await asyncio.sleep(2)
result = await jdjoy(ua, inveteck) # 获取活动信息
await firstInvite(inveteck, ua) # 开启活动
if result['success']:
brandName = result['data']['brandName'] # 店铺名字
venderId = result['data']['venderId'] # 店铺入会id
rewardslist = [] # 奖品
successCount = result['data']['successCount'] # 当前成功数
success += successCount
result_data = result['data']['rewards'] # 奖品数据
print(f'您好!账号[{invitePin}],开启{brandName}邀请好友活动\n去开活动')
for i in result_data:
stage = i['stage']
inviteNum = i['inviteNum'] # 单次需要拉新人数
need.append(inviteNum)
rewardName = i['rewardName'] # 奖品名
rewardNum = i['rewardStock']
if rewardNum != 0:
needinviteNum.append(inviteNum)
needdel.append(inviteNum)
rewardslist.append(f'级别{stage}: 需助力{inviteNum}人,奖品: {rewardName},库存:{rewardNum}\n')
if len(rewardslist) != 0:
print('当前活动奖品如下: \n' + str('\n'.join(rewardslist)) + f'\n当前已助力{successCount}\n')
for nmubers in needdel:
if success >= nmubers:
print("您当前助力已经满足了,可以去领奖励了")
print(f'\n这就去领取奖励{need.index(nmubers) + 1}')
result = await getInviteReward(inveteck, ua, need.index(nmubers) + 1)
print(result)
needinviteNum.remove(nmubers)
await asyncio.sleep(10)
needdel = needinviteNum
if needinviteNum == []:
print('奖励已经全部获取啦,退出程序')
return
for n, ck in enumerate(cks, 1):
ua = randomuserAgent() # 获取ua
try:
pin = re.findall(r'(pt_pin=([^; ]+)(?=;))', str(ck))[0]
pin = (unquote_plus(pin[1]))
except IndexError:
pin = f'用户{n}'
print(f'******开始【京东账号{n}{pin} *********\n')
for n, nmubers in enumerate(needinviteNum, 1):
for nmubers in needdel:
if success >= nmubers:
print(nmubers)
print("您当前助力已经满足了,可以去领奖励了")
print(f'\n这就去领取奖励{need.index(nmubers) + 1}')
result = await getInviteReward(inveteck, ua, need.index(nmubers) + 1)
print(result)
needinviteNum.remove(nmubers)
await asyncio.sleep(10)
needdel = needinviteNum
if needinviteNum == []:
print('奖励已经全部获取啦,退出程序')
return
await plogin(ua, ck) # 获取登录状态
result = await check(ua, ck) # 检测ck
if result['code'] == 200:
result = await jdjoy(ua, ck) # 调用ck
if result['success']:
print(f'账户[{pin}]已开启{brandName}邀请好友活动\n')
await asyncio.sleep(3)
result = await check_ruhui({"venderId": str(venderId), "channel": "401"}, ck, venderId,
ua) # 检查入会状态
try:
if result['result']['userInfo']['openCardStatus'] == 0: # 0 未开卡
await asyncio.sleep(2)
print(f'您还不是会员哦,这就去去助力{invitePin}\n')
result = await ruhui(ua, ck)
if result['success']:
success += 1
print(f'助力成功! 当前成功助力{success}\n')
if '交易失败' in str(result):
success += 1
print(f'助力成功! 当前成功助力{success}\n')
else:
print(result)
await asyncio.sleep(2)
else:
print('您已经是会员啦,不去请求了入会了\n')
continue
except TypeError as e:
print(e)
result = await ruhui(ua, ck)
if result['success']:
success += 1
print(f'助力成功! 当前成功助力{success}\n')
if '交易失败' in result:
success += 1
print(f'助力成功! 当前成功助力{success}\n')
else:
print(result['errorMessage'])
await asyncio.sleep(2)
else: # 没有获取到活动信息
print('未获取到活动参数信息\n')
break
else:
print(result['data'])
continue
else:
print('未能获取到活动信息\n')
return
else:
print(result['data'])
return
else:
print(f'pin填写有误请重试')
if __name__ == "__main__":
asyncio.run(main())