mirror of
https://github.com/okyyds/yyds.git
synced 2026-07-13 04:21:17 +08:00
311 lines
11 KiB
Python
311 lines
11 KiB
Python
#!/bin/env python3
|
||
# -*- coding: utf-8 -*
|
||
|
||
'''
|
||
cron: 0 59 23 * * 0 jd_15.py
|
||
new Env('Faker群友家电15周年助力');
|
||
'''
|
||
|
||
# cron
|
||
#不做浏览,只做助力 建议先运行jd_appliances.js 在运行此脚本
|
||
# export jd15_pins=["pt_pin1","pt_pin2"]
|
||
|
||
from urllib.parse import unquote, quote
|
||
import time, datetime, os, sys
|
||
import requests, json, re, random
|
||
import threading
|
||
|
||
UserAgent = ''
|
||
script_name = '家电15周年助力'
|
||
|
||
|
||
def printT(msg):
|
||
print("[{}]: {}".format(datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), msg))
|
||
sys.stdout.flush()
|
||
|
||
|
||
def delEnvs(label):
|
||
try:
|
||
if label == 'True' or label == 'yes' or label == 'true' or label == 'Yes':
|
||
return True
|
||
elif label == 'False' or label == 'no' or label == 'false' or label == 'No':
|
||
return False
|
||
except:
|
||
pass
|
||
try:
|
||
if '.' in label:
|
||
return float(label)
|
||
elif '&' in label:
|
||
return label.split('&')
|
||
elif '@' in label:
|
||
return label.split('@')
|
||
else:
|
||
return int(label)
|
||
except:
|
||
return label
|
||
|
||
|
||
class getJDCookie():
|
||
# 适配青龙平台环境ck
|
||
def getckfile(self):
|
||
ql_new = '/ql/config/env.sh'
|
||
ql_old = '/ql/config/cookie.sh'
|
||
if os.path.exists(ql_new):
|
||
printT("当前环境青龙面板新版")
|
||
return ql_new
|
||
elif os.path.exists(ql_old):
|
||
printT("当前环境青龙面板旧版")
|
||
return ql_old
|
||
|
||
# 获取cookie
|
||
def getallCookie(self):
|
||
cookies = ''
|
||
ckfile = self.getckfile()
|
||
try:
|
||
if os.path.exists(ckfile):
|
||
with open(ckfile, "r", encoding="utf-8") as f:
|
||
cks_text = f.read()
|
||
if 'pt_key=' in cks_text and 'pt_pin=' in cks_text:
|
||
r = re.compile(r"pt_key=.*?pt_pin=.*?;", re.M | re.S | re.I)
|
||
cks_list = r.findall(cks_text)
|
||
if len(cks_list) > 0:
|
||
for ck in cks_list:
|
||
cookies += ck
|
||
return cookies
|
||
except Exception as e:
|
||
printT(f"【getCookie Error】{e}")
|
||
|
||
# 检测cookie格式是否正确
|
||
def getUserInfo(self, ck, user_order, pinName):
|
||
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': 'close',
|
||
'Referer': 'https://home.m.jd.com/myJd/home.action',
|
||
'Accept-Encoding': 'gzip, deflate, br',
|
||
'Host': 'me-api.jd.com',
|
||
'User-Agent': '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:
|
||
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"账号{user_order}【{pinName}】Cookie 已失效!请重新获取。"
|
||
print(context)
|
||
return ck, False
|
||
except Exception:
|
||
context = f"账号{user_order}【{pinName}】Cookie 已失效!请重新获取。"
|
||
print(context)
|
||
return ck, False
|
||
|
||
def getcookies(self):
|
||
"""
|
||
:return: cookiesList,userNameList,pinNameList
|
||
"""
|
||
cookiesList = []
|
||
pinNameList = []
|
||
nickNameList = []
|
||
cookies = self.getallCookie()
|
||
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:
|
||
printT("您已配置{}个账号".format(len(result)))
|
||
user_order = 1
|
||
for ck in result:
|
||
r = re.compile(r"pt_pin=(.*?);")
|
||
pinName = r.findall(ck)
|
||
pinName = unquote(pinName[0])
|
||
# 获取账号名
|
||
ck, nickname = self.getUserInfo(ck, user_order, pinName)
|
||
if nickname != False:
|
||
cookiesList.append(ck)
|
||
pinNameList.append(pinName)
|
||
nickNameList.append(nickname)
|
||
user_order += 1
|
||
else:
|
||
user_order += 1
|
||
continue
|
||
if len(cookiesList) > 0:
|
||
return cookiesList, pinNameList, nickNameList
|
||
else:
|
||
printT("没有可用Cookie,已退出")
|
||
exit(4)
|
||
else:
|
||
printT("没有可用Cookie,已退出")
|
||
exit(4)
|
||
|
||
|
||
def getPinEnvs():
|
||
if "jd15_pins" in os.environ:
|
||
if len(os.environ["jd15_pins"]) != 0:
|
||
jd15_pins = os.environ["jd15_pins"]
|
||
jd15_pins = jd15_pins.replace('[', '').replace(']', '').replace('\'', '').replace(' ', '').split(',')
|
||
printT(f"已获取并使用Env环境 jd15_pins:{jd15_pins}")
|
||
return jd15_pins
|
||
else:
|
||
printT('请先配置export jd15_pins=["pt_pin1","pt_pin2"]')
|
||
exit(4)
|
||
printT('请先配置export jd15_pins=["pt_pin1","pt_pin2"]')
|
||
exit(4)
|
||
|
||
|
||
def res_post(cookie, body):
|
||
url = "https://api.m.jd.com/api"
|
||
headers = {
|
||
"Host": "api.m.jd.com",
|
||
"content-length": "146",
|
||
"accept": "application/json, text/plain, */*",
|
||
"origin": "https://welfare.m.jd.com",
|
||
"user-agent": "jdapp;android;10.1.0;10;4636532323835366-1683336356836626;network/UNKNOWN;model/MI 8;addressid/4608453733;aid/dc52285fa836e8fb;oaid/a28cc4ac8bda0bf6;osVer/29;appBuild/89568;partner/xiaomi001;eufv/1;jdSupportDarkMode/0;Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/77.0.3865.120 MQQBrowser/6.2 TBS/045715 Mobile Safari/537.36",
|
||
"sec-fetch-mode": "cors",
|
||
"content-type": "application/x-www-form-urlencoded",
|
||
"x-requested-with": "com.jingdong.app.mall",
|
||
"sec-fetch-site": "same-site",
|
||
"referer": "https://welfare.m.jd.com/",
|
||
"accept-encoding": "gzip, deflate, br",
|
||
"accept-language": "zh-CN,zh;q\u003d0.9,en-US;q\u003d0.8,en;q\u003d0.7",
|
||
"cookie": cookie
|
||
}
|
||
body = json.dumps(body)
|
||
t = str(int(time.time() * 1000))
|
||
data = {
|
||
'appid': 'anniversary-celebra',
|
||
'functionId': 'jd_interaction_prod',
|
||
'body': body,
|
||
't': t,
|
||
'loginType': 2
|
||
}
|
||
res = requests.post(url=url, headers=headers, data=data).json()
|
||
return res
|
||
|
||
|
||
def get_share5(cookie):
|
||
body = {"type": "99", "apiMapping": "/api/supportTask/getShareId"}
|
||
res = res_post(cookie, body)
|
||
# print(res)
|
||
if '成功' in res['msg']:
|
||
return res['data']
|
||
|
||
|
||
def get_share50(cookie):
|
||
body = {"type": "100", "apiMapping": "/api/supportTask/getShareId"}
|
||
res = res_post(cookie, body)
|
||
# print(res)
|
||
|
||
if '成功' in res['msg']:
|
||
return res['data']
|
||
|
||
|
||
def getprize1(cookie,nickname):
|
||
body = {"apiMapping": "/api/prize/getCoupon"}
|
||
res = res_post(cookie, body)
|
||
# print(res)
|
||
if res['code'] == 200:
|
||
print('------【账号:' + nickname + '】------' + res['data']['name'])
|
||
else:
|
||
print('------【账号:' + nickname + '】------优惠券领过了')
|
||
|
||
|
||
def getprize2(cookie,nickname):
|
||
body = {"apiMapping": "/api/prize/doLottery"}
|
||
res = res_post(cookie, body)
|
||
# print(res)
|
||
if res['code'] == 5011:
|
||
print('------【账号:' + nickname + '】------未中奖e卡')
|
||
else:
|
||
print('------【账号:' + nickname + '】------不确定,手动确认')
|
||
|
||
|
||
def help(mycookie, nickname, cookiesList, nickNameList):
|
||
shareId5 = get_share5(mycookie)
|
||
if shareId5 != None:
|
||
# print('获取5助力码成功:', shareId5)
|
||
# print('--------------------------------------开始5个助力-------------')
|
||
body1 = {"shareId": shareId5, "apiMapping": "/api/supportTask/doSupport"}
|
||
for i in range(len(cookiesList)):
|
||
res = res_post(cookiesList[i], body1)
|
||
# print(res)
|
||
try:
|
||
if res['code'] == 200 and res['data']['status'] == 7:
|
||
print(nickNameList[i] + '助力' + nickname + ':' + '5助力成功')
|
||
elif res['code'] == 200 and res['data']['status'] == 4:
|
||
print(nickNameList[i]+'助力'+nickname+':'+'5个助力完成啦----')
|
||
getprize1(mycookie,nickname)
|
||
getprize2(mycookie,nickname)
|
||
break
|
||
elif res['code'] == 200 and res['data']['status'] == 3:
|
||
print(nickNameList[i]+'助力'+nickname+':'+'5已经助力过了')
|
||
except:
|
||
pass
|
||
else:
|
||
print('【账号:' + nickname + '】请先手动执行下浏览任务')
|
||
|
||
shareId50 = get_share50(mycookie)
|
||
if shareId50 != None:
|
||
# print('获取50助力码成功:', shareId50)
|
||
# print('-------------------------------开始50个助力-------------')
|
||
body2 = {"shareId": shareId50, "apiMapping": "/api/supportTask/doSupport"}
|
||
for ck in mycookie:
|
||
res = res_post(ck, body2)
|
||
# print(res)
|
||
try:
|
||
if res['code'] == 200 and res['data']['status'] == 7:
|
||
print(nickNameList[i] + '助力' + nickname + ':' + '50助力成功')
|
||
elif res['code'] == 200 and res['data']['status'] == 4:
|
||
print(nickNameList[i] + '助力' + nickname + ':' + '50个助力完成啦----')
|
||
getprize1(mycookie, nickname)
|
||
getprize2(mycookie, nickname)
|
||
break
|
||
elif res['code'] == 200 and res['data']['status'] == 3:
|
||
print(nickNameList[i] + '助力' + nickname + ':' + '50已经助力过了')
|
||
except:
|
||
pass
|
||
else:
|
||
print('【账号' + nickname + '】请先手动执行下浏览任务')
|
||
|
||
|
||
def use_thread(jd15_cookies, nicks, cookiesList, nickNameList):
|
||
threads = []
|
||
for i in range(len(jd15_cookies)):
|
||
threads.append(
|
||
threading.Thread(target=help, args=(jd15_cookies[i], nicks[i], cookiesList, nickNameList))
|
||
)
|
||
for t in threads:
|
||
t.start()
|
||
for t in threads:
|
||
t.join()
|
||
|
||
|
||
def start():
|
||
printT("############{}##########".format(script_name))
|
||
jd15_pins = getPinEnvs()
|
||
get_jd_cookie = getJDCookie()
|
||
cookiesList, pinNameList, nickNameList = get_jd_cookie.getcookies()
|
||
jd15_cookies = []
|
||
nicks = []
|
||
for ckname in jd15_pins:
|
||
try:
|
||
ckNum = pinNameList.index(ckname)
|
||
jd15_cookies.append(cookiesList[ckNum])
|
||
nicks.append(nickNameList[ckNum])
|
||
except Exception as e:
|
||
try:
|
||
ckNum = pinNameList.index(unquote(ckname))
|
||
jd15_cookies.append(cookiesList[ckNum])
|
||
nicks.append(nickNameList[ckNum])
|
||
except:
|
||
print(f"请检查被助力账号【{ckname}】名称是否正确?ck是否存在?提示:助力名字可填pt_pin的值、也可以填账号名。")
|
||
continue
|
||
if len(jd15_cookies) == 0:
|
||
exit(4)
|
||
use_thread(jd15_cookies, nicks, cookiesList, nickNameList)
|
||
|
||
|
||
if __name__ == '__main__':
|
||
start()
|