KR/activity/jd_hyj_help.py

320 lines
14 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/usr/bin/env python3
# -*- coding: utf-8 -*
'''
项目名称: JD-Script / jd_hyj
Author: Curtin
功能:环游记
1、好友助力默认按顺序助力每个号6次助力机会
Date: 2021/10/24 下午6:52
Update: 2021/10/24 下午11:52
TG交流 https://t.me/topstyle996
TG频道 https://t.me/TopStyle2021
cron: 0 0,23 * 10-11 *
new Env('环游记');
'''
# UA 可自定义你的, 默认随机生成UA。
UserAgent = ''
import os, re, sys
import random, json, time
try:
import requests
except Exception as e:
print(e, "\n缺少requests 模块请执行命令安装pip3 install requests")
exit(3)
from urllib.parse import unquote
##############
# requests.packages.urllib3.disable_warnings()
pwd = os.path.dirname(os.path.abspath(__file__)) + os.sep
###
def userAgent():
"""
随机生成一个UA
jdapp;iPhone;10.0.4;14.2;9fb54498b32e17dfc5717744b5eaecda8366223c;network/wifi;ADID/2CF597D0-10D8-4DF8-C5A2-61FD79AC8035;model/iPhone11,1;addressid/7785283669;appBuild/167707;jdSupportDarkMode/0;Mozilla/5.0 (iPhone; CPU iPhone OS 14_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/null;supportJDSHWK/1
:return: ua
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.15(0x18000f29) NetType/WIFI Language/zh_CN'
"""
uuid = ''.join(random.sample('123456789abcdef123456789abcdef123456789abcdef123456789abcdef', 40))
addressid = ''.join(random.sample('1234567898647', 10))
iosVer = ''.join(random.sample(["14.5.1", "14.4", "14.3", "14.2", "14.1", "14.0.1", "13.7", "13.1.2", "13.1.1"], 1))
iosV = iosVer.replace('.', '_')
iPhone = ''.join(random.sample(["8", "9", "10", "11", "12", "13"], 1))
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))
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
class getJDCookie(object):
# 适配各种平台环境ck
def getckfile(self):
global v4f
curf = pwd + 'JDCookies.txt'
v4f = '/jd/config/config.sh'
ql_new = '/ql/config/env.sh'
ql_old = '/ql/config/cookie.sh'
if os.path.exists(curf):
with open(curf, "r", encoding="utf-8") as f:
cks = f.read()
f.close()
r = re.compile(r"pt_key=.*?pt_pin=.*?;", re.M | re.S | re.I)
cks = r.findall(cks)
if len(cks) > 0:
return curf
else:
pass
if os.path.exists(ql_new):
print("当前环境青龙面板新版")
return ql_new
elif os.path.exists(ql_old):
print("当前环境青龙面板旧版")
return ql_old
elif os.path.exists(v4f):
print("当前环境V4")
return v4f
return curf
# 获取cookie
def getCookie(self):
global cookies
ckfile = self.getckfile()
try:
if os.path.exists(ckfile):
with open(ckfile, "r", encoding="utf-8") as f:
cks = f.read()
f.close()
if 'pt_key=' in cks and 'pt_pin=' in cks:
r = re.compile(r"pt_key=.*?pt_pin=.*?;", re.M | re.S | re.I)
cks = r.findall(cks)
if len(cks) > 0:
if 'JDCookies.txt' in ckfile:
print("当前获取使用 JDCookies.txt 的cookie")
cookies = ''
for i in cks:
if 'pt_key=xxxx' in i:
pass
else:
cookies += i
return
else:
with open(pwd + 'JDCookies.txt', "w", encoding="utf-8") as f:
cks = "#多账号换行以下示例通过正则获取此文件的ck理论上可以自定义名字标记ck也可以随意摆放ck\n账号1【Curtinlv】cookie1;\n账号2【TopStyle】cookie2;"
f.write(cks)
f.close()
if "JD_COOKIE" in os.environ:
if len(os.environ["JD_COOKIE"]) > 10:
cookies = os.environ["JD_COOKIE"]
print("已获取并使用Env环境 Cookie")
except Exception as e:
print(f"【getCookie Error】{e}")
# 检测cookie格式是否正确
def getUserInfo(self, ck, pinName, userNum):
url = 'https://me-api.jd.com/user_new/info/GetJDUserInfoUnion?orgFlag=JD_PinGou_New&callSource=mainorder&channel=4&isHomewhite=0&sceneval=2&sceneval=2&callback='
headers = {
'Cookie': ck,
'Accept': '*/*',
'Connection': 'keep-alive',
'Referer': 'https://home.m.jd.com/myJd/home.action',
'Accept-Encoding': 'gzip, deflate, br',
'Host': 'me-api.jd.com',
'User-Agent': f'Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.2 Mobile/15E148 Safari/604.1',
'Accept-Language': 'zh-cn'
}
try:
if sys.platform == 'ios':
requests.packages.urllib3.disable_warnings()
resp = requests.get(url=url, verify=False, headers=headers, timeout=60).json()
else:
resp = requests.get(url=url, headers=headers, timeout=60).json()
if resp['retcode'] == "0":
nickname = resp['data']['userInfo']['baseInfo']['nickname']
return ck, nickname
else:
context = f"账号{userNum}{pinName}】Cookie 已失效!请重新获取。"
print(context)
return ck, False
except Exception:
context = f"账号{userNum}{pinName}】Cookie 已失效!请重新获取。"
print(context)
return ck, False
def iscookie(self):
"""
:return: cookiesList,userNameList,pinNameList
"""
cookiesList = []
userNameList = []
pinNameList = []
if 'pt_key=' in cookies and 'pt_pin=' in cookies:
r = re.compile(r"pt_key=.*?pt_pin=.*?;", re.M | re.S | re.I)
result = r.findall(cookies)
if len(result) >= 1:
print("您已配置{}个账号".format(len(result)))
u = 1
for i in result:
r = re.compile(r"pt_pin=(.*?);")
pinName = r.findall(i)
pinName = unquote(pinName[0])
# 获取账号名
ck, nickname = self.getUserInfo(i, pinName, u)
if nickname != False:
cookiesList.append(ck)
userNameList.append(nickname)
pinNameList.append(pinName)
else:
u += 1
continue
u += 1
if len(cookiesList) > 0 and len(userNameList) > 0:
return cookiesList, userNameList, pinNameList
else:
print("没有可用Cookie已退出")
exit(3)
else:
print("cookie 格式错误!...本次操作已退出")
exit(4)
else:
print("cookie 格式错误!...本次操作已退出")
exit(4)
getCk = getJDCookie()
getCk.getCookie()
def buildHeaders(ck):
headers = {
'Accept': 'application/json, text/plain, */*',
'Origin': 'https://wbbny.m.jd.com',
'Accept-Encoding': 'gzip, deflate, br',
'Cookie': ck,
'Content-Type': 'application/x-www-form-urlencoded',
'Host': 'api.m.jd.com',
'Connection': 'keep-alive',
'User-Agent': userAgent(),
# 'Referer': f'https://wbbny.m.jd.com/babelDiy/Zeus/2vVU4E7JLH9gKYfLQ5EVW6eN2P7B/index.html?babelChannel=jdappsyfc&shareType=taskHelp&inviteId=ZXASTT028Z1_cl4-8INRW9rJrQH-3oUxd6t1GFjRWn6u7zB55awQ&mpin=&from=sc&lng=113&lat=23&sid=&un_area=',
'Referer': f'https://wbbny.m.jd.com/babelDiy/Zeus/2vVU4E7JLH9gKYfLQ5EVW6eN2P7B/index.html?babelChannel=jdappsyfc&shareType=taskHelp&inviteId=ZXASTT028Z1_cl4-8INRW9rJrQH-3oUxd6t1GFjRWn6u7zB55awQ&mpin=RnFsl2daPGGLzNTMDSugzOUmYgysBguS0mhHAIPkgjc&from=sc&lng=113.367454&lat=23.112787&sid=4d0c87024e75822e2940d31c251c1b0w&un_area=1_2901_55567_0',
'Accept-Language': 'zh-cn'
}
return headers
def getHomeData(header):
try:
url = 'https://api.m.jd.com/client.action?functionId=travel_getHomeData'
body = 'functionId=travel_getHomeData&body={"inviteId":""}&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=header, data=body, timeout=10).json()
secretp = resp['data']['result']['homeMainInfo']['secretp']
return secretp
except:
return None
def getinviteId(ck):
try:
url = 'https://api.m.jd.com/client.action?functionId=travel_getTaskDetail'
body = 'functionId=travel_getTaskDetail&body={}&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=buildHeaders(ck), data=body).json()
return resp['data']['result']['inviteId']
except:
return 'ZXASTT018v_53RR4Y9lHfIBub1AFjRWn6u7zB55awQ'
# 获取任务list
def travel_getTaskDetail(header):
try:
url = 'https://api.m.jd.com/client.action?functionId=travel_getTaskDetail'
body = 'functionId=travel_getTaskDetail&body={}&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=header, data=body).json()
taskVos = resp['data']['result']['taskVos']
return taskVos
except:
return None
# 完成任务
def travel_collectScore(header, taskId, taskToken, secretp):
try:
url = 'https://api.m.jd.com/client.action?functionId=travel_collectScore'
body = 'functionId=travel_collectScore&body={' + f'"taskId":"{taskId}","taskToken":"{taskToken}","actionType":1,' + f'%22ss%22:%22%7B%5C%22extraData%5C%22:%7B%5C%22log%5C%22:%5C%22%5C%22,%5C%22sceneid%5C%22:%5C%22HYJhPageh5%5C%22%7D,%5C%22secretp%5C%22:%5C%22{secretp}%5C%22,%5C%22random%5C%22:%5C%22%5C%22%7D%22%7D' + '&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=header, data=body).json()
except:
pass
# print("##完成结果:", resp)
# 好友邀请助力
def friendsHelp(ck, inviteId, secretp, nickname):
try:
url = 'https://api.m.jd.com/client.action?functionId=travel_collectScore'
body = 'functionId=travel_collectScore&body={"ss":"%7B%5C%22extraData%5C%22:%7B%5C%22log%5C%22:%5C%22%5C%22,%5C%22sceneid%5C%22:%5C%22HYGJZYh5%5C%22%7D,%5C%22secretp%5C%22:%5C%22'+ secretp + '%5C%22,%5C%22random%5C%22:%5C%22%5C%22%7D","inviteId":"' + inviteId + '"}&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=buildHeaders(ck), data=body, timeout=10).json()
isSuccess = resp['data']['success']
result = resp['data']['bizMsg']
bizCode = resp['data']['bizCode']
if isSuccess:
print(f"\t└😆用户【{nickname}{result}")
else:
print(f"\t└😯用户【{nickname}{result}")
if bizCode == -201:
return True
else:
return False
except:
pass
# 膨胀红包领取
def travel_pk_receiveAward(ck):
try:
url = 'https://api.m.jd.com/client.action?functionId=travel_pk_receiveAward'
body = 'functionId=travel_pk_receiveAward&body={}&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=buildHeaders(ck), data=body, timeout=10).json()
print("👌成功领取红包🧧:",resp['data']['result']['value'])
except:
pass
# 膨胀红包助力
def travel_pk_collectPkExpandScore(ck, inviteId, secretp):
url = 'https://api.m.jd.com/client.action?functionId=travel_pk_collectPkExpandScore'
# body = 'functionId=travel_pk_collectPkExpandScore&body={"ss":"{\"extraData\":{\"log\":\"\",\"sceneid\":\"HYGJZYh5\"},\"secretp\":\"E7CRMI6DTcSTrabHO4r8_5la-GQ\",\"random\":\"35074436\"}","inviteId":"PKASTT018v_53RR4Y9lHfIBub1ACjRWnIaRzT0jeQOc"}&client=wh5&clientVersion=1.0.0'
body = 'functionId=travel_pk_collectPkExpandScore&body={"ss":"%7B%5C%22extraData%5C%22:%7B%5C%22log%5C%22:%5C%22%5C%22,%5C%22sceneid%5C%22:%5C%22HYGJZYh5%5C%22%7D,%5C%22secretp%5C%22:%5C%22' + secretp + '%5C%22,%5C%22random%5C%22:%5C%22%5C%22%7D","inviteId":"' + inviteId + '"}&client=wh5&clientVersion=1.0.0'
resp = requests.post(url=url, headers=buildHeaders(ck), data=body, timeout=10).json()
bizCode = resp['data']['bizCode']
bizMsg = resp['data']['bizMsg']
print(f"\t{bizMsg}")
if bizCode == 103:
return True
else:
return False
def start():
try:
scriptName = '### 环游记 ###'
print(scriptName)
cookiesList, userNameList, pinNameList = getCk.iscookie()
# for ck in cookiesList:
# ss = 'PKASTT018v_53RR4Y9lHfIBub1ACjRWnIaRzT0jeQOc'
# if travel_pk_collectPkExpandScore(ck, ss, getHomeData(ck)):
# travel_pk_receiveAward(ck)
# exit(3)
for c,masterName in zip(cookiesList,userNameList):
print(f"\n### ☺️开始助力 {masterName}")
sharecode = getinviteId(c)
for ck,nickname in zip(cookiesList,userNameList):
if nickname == masterName:
print(f"\t└😓{masterName} 不能助力自己,跳过~")
continue
if friendsHelp(ck, sharecode, getHomeData(buildHeaders(ck)), nickname):
print(f"\t└👌用户【{masterName}】助力任务已完成。")
break
except Exception as e:
print(e)
if __name__ == '__main__':
start()