mirror of https://github.com/KingRan/KR.git
639 lines
22 KiB
Python
639 lines
22 KiB
Python
|
#!/bin/env python3
|
|||
|
# -*- coding: utf-8 -*
|
|||
|
'''
|
|||
|
项目名称: JD-Script / jd_getFollowGift
|
|||
|
Author: Curtin
|
|||
|
功能:
|
|||
|
Date: 2021/6/6 上午7:57
|
|||
|
建议cron: 0 9 * * * python3 jd_getFollowGift.py
|
|||
|
new Env('关注有礼');
|
|||
|
'''
|
|||
|
##################################
|
|||
|
#cookie填写,注意:#ck 优先读取【JDCookies.txt】 文件内的ck 再到 ENV的 变量 JD_COOKIE='ck1&ck2' 最后才到脚本内 cookies=ck
|
|||
|
cookies = ''
|
|||
|
#TG 推送
|
|||
|
# tg机器人token
|
|||
|
TG_BOT_TOKEN = ''
|
|||
|
#tg用户id
|
|||
|
TG_USER_ID = ''
|
|||
|
TG_PROXY_IP = ''
|
|||
|
TG_PROXY_PORT = ''
|
|||
|
TG_API_HOST = ''
|
|||
|
#微信推送加
|
|||
|
PUSH_PLUS_TOKEN = ''
|
|||
|
#Bark 推送
|
|||
|
BARK = ''
|
|||
|
#企业微信推送
|
|||
|
QYWX_AM = ''
|
|||
|
|
|||
|
#######################################
|
|||
|
version = 'v1.0.0 Beta'
|
|||
|
readmes = """
|
|||
|
# JD 关注有礼
|
|||
|
|
|||
|
#
|
|||
|
@Last Version: %s
|
|||
|
|
|||
|
@Last Time: 2021-06-06 07:57
|
|||
|
|
|||
|
@Author: Curtin
|
|||
|
#### **仅以学习交流为主,请勿商业用途、禁止违反国家法律!**
|
|||
|
|
|||
|
# End.
|
|||
|
[回到顶部](#readme)
|
|||
|
""" % version
|
|||
|
|
|||
|
################################ 【Main】################################
|
|||
|
import time, os, sys, datetime
|
|||
|
import requests
|
|||
|
import re, json, base64
|
|||
|
from urllib.parse import unquote, quote_plus
|
|||
|
|
|||
|
# 获取当前工作目录
|
|||
|
pwd = os.path.dirname(os.path.abspath(__file__)) + os.sep
|
|||
|
|
|||
|
# 定义一些要用到参数
|
|||
|
requests.packages.urllib3.disable_warnings()
|
|||
|
scriptHeader = """
|
|||
|
════════════════════════════════════════
|
|||
|
║ ║
|
|||
|
║ JD 关 注 有 礼 ║
|
|||
|
║ ║
|
|||
|
════════════════════════════════════════
|
|||
|
@Version: {}""".format(version)
|
|||
|
remarks = ''
|
|||
|
######JD Cookie (多账号&分隔)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
#######
|
|||
|
notify_mode = []
|
|||
|
message_info = ''''''
|
|||
|
usergetGiftinfo = {}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class getJDCookie(object):
|
|||
|
# 适配各种平台环境ck
|
|||
|
def getckfile(self):
|
|||
|
if os.path.exists(pwd + 'JDCookies.txt'):
|
|||
|
return pwd + 'JDCookies.txt'
|
|||
|
elif os.path.exists('/ql/config/env.sh'):
|
|||
|
print("当前环境青龙面板新版")
|
|||
|
return '/ql/config/env.sh'
|
|||
|
elif os.path.exists('/ql/config/cookie.sh'):
|
|||
|
print("当前环境青龙面板旧版")
|
|||
|
return '/ql/config/env.sh'
|
|||
|
elif os.path.exists('/jd/config/config.sh'):
|
|||
|
print("当前环境V4")
|
|||
|
return '/jd/config/config.sh'
|
|||
|
elif os.path.exists(pwd + 'JDCookies.txt'):
|
|||
|
return pwd + 'JDCookies.txt'
|
|||
|
return pwd + 'JDCookies.txt'
|
|||
|
|
|||
|
# 获取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:
|
|||
|
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'
|
|||
|
headers = {
|
|||
|
'Cookie': ck,
|
|||
|
'Accept': '*/*',
|
|||
|
'Connection': 'keep-alive',
|
|||
|
'Referer': 'https://home.m.jd.com/myJd/newhome.action?sceneval=2&ufc=&',
|
|||
|
'Accept-Encoding': 'gzip, deflate, br',
|
|||
|
'Host': 'me-api.jd.com',
|
|||
|
'User-Agent': 'jdapp;iPhone;9.4.4;14.3;network/4g;Mozilla/5.0 (iPhone; CPU iPhone OS 14_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
|
|||
|
'Accept-Language': 'gzip, deflate, br'
|
|||
|
}
|
|||
|
try:
|
|||
|
resp = requests.get(url=url, verify=False, headers=headers, timeout=60).text
|
|||
|
#r = re.compile(r'GetJDUserInfoUnion.*?\((.*?)\)')
|
|||
|
#result = r.findall(resp)
|
|||
|
userInfo = json.loads(resp)
|
|||
|
nickname = userInfo['data']['userInfo']['baseInfo']['nickname']
|
|||
|
return ck, nickname
|
|||
|
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()
|
|||
|
|
|||
|
|
|||
|
# 获取TG_BOT_TOKEN
|
|||
|
if "TG_BOT_TOKEN" in os.environ:
|
|||
|
if len(os.environ["TG_BOT_TOKEN"]) > 1:
|
|||
|
TG_BOT_TOKEN = os.environ["TG_BOT_TOKEN"]
|
|||
|
print("已获取并使用Env环境 TG_BOT_TOKEN")
|
|||
|
# 获取TG_USER_ID
|
|||
|
if "TG_USER_ID" in os.environ:
|
|||
|
if len(os.environ["TG_USER_ID"]) > 1:
|
|||
|
TG_USER_ID = os.environ["TG_USER_ID"]
|
|||
|
print("已获取并使用Env环境 TG_USER_ID")
|
|||
|
# 获取代理ip
|
|||
|
if "TG_PROXY_IP" in os.environ:
|
|||
|
if len(os.environ["TG_PROXY_IP"]) > 1:
|
|||
|
TG_PROXY_IP = os.environ["TG_PROXY_IP"]
|
|||
|
print("已获取并使用Env环境 TG_PROXY_IP")
|
|||
|
# 获取TG 代理端口
|
|||
|
if "TG_PROXY_PORT" in os.environ:
|
|||
|
if len(os.environ["TG_PROXY_PORT"]) > 1:
|
|||
|
TG_PROXY_PORT = os.environ["TG_PROXY_PORT"]
|
|||
|
print("已获取并使用Env环境 TG_PROXY_PORT")
|
|||
|
elif not TG_PROXY_PORT:
|
|||
|
TG_PROXY_PORT = ''
|
|||
|
# 获取TG TG_API_HOST
|
|||
|
if "TG_API_HOST" in os.environ:
|
|||
|
if len(os.environ["TG_API_HOST"]) > 1:
|
|||
|
TG_API_HOST = os.environ["TG_API_HOST"]
|
|||
|
print("已获取并使用Env环境 TG_API_HOST")
|
|||
|
# 获取pushplus+ PUSH_PLUS_TOKEN
|
|||
|
if "PUSH_PLUS_TOKEN" in os.environ:
|
|||
|
if len(os.environ["PUSH_PLUS_TOKEN"]) > 1:
|
|||
|
PUSH_PLUS_TOKEN = os.environ["PUSH_PLUS_TOKEN"]
|
|||
|
print("已获取并使用Env环境 PUSH_PLUS_TOKEN")
|
|||
|
# 获取企业微信应用推送 QYWX_AM
|
|||
|
if "QYWX_AM" in os.environ:
|
|||
|
if len(os.environ["QYWX_AM"]) > 1:
|
|||
|
QYWX_AM = os.environ["QYWX_AM"]
|
|||
|
print("已获取并使用Env环境 QYWX_AM")
|
|||
|
if "BARK" in os.environ:
|
|||
|
if len(os.environ["BARK"]) > 1:
|
|||
|
BARK = os.environ["BARK"]
|
|||
|
print("已获取并使用Env环境 BARK")
|
|||
|
|
|||
|
|
|||
|
|
|||
|
def message(str_msg):
|
|||
|
global message_info
|
|||
|
print(str_msg)
|
|||
|
message_info = "{}\n{}".format(message_info,str_msg)
|
|||
|
sys.stdout.flush()
|
|||
|
|
|||
|
def exitCodeFun(code):
|
|||
|
try:
|
|||
|
# exitCode = input()
|
|||
|
if sys.platform == 'win32' or sys.platform == 'cygwin':
|
|||
|
print("进程睡眠10分钟后自动退出。")
|
|||
|
time.sleep(600)
|
|||
|
exit(code)
|
|||
|
except:
|
|||
|
time.sleep(3)
|
|||
|
exit(code)
|
|||
|
|
|||
|
def nowtime():
|
|||
|
return datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|||
|
|
|||
|
#获取通知,
|
|||
|
if PUSH_PLUS_TOKEN:
|
|||
|
notify_mode.append('pushplus')
|
|||
|
if TG_BOT_TOKEN and TG_USER_ID:
|
|||
|
notify_mode.append('telegram_bot')
|
|||
|
if BARK:
|
|||
|
notify_mode.append('bark')
|
|||
|
if QYWX_AM:
|
|||
|
notify_mode.append('wecom_app')
|
|||
|
#tg通知
|
|||
|
def telegram_bot(title, content):
|
|||
|
try:
|
|||
|
print("\n")
|
|||
|
bot_token = TG_BOT_TOKEN
|
|||
|
user_id = TG_USER_ID
|
|||
|
if not bot_token or not user_id:
|
|||
|
print("tg服务的bot_token或者user_id未设置!!\n取消推送")
|
|||
|
return
|
|||
|
print("tg服务启动")
|
|||
|
if TG_API_HOST:
|
|||
|
url = f"{TG_API_HOST}/bot{TG_BOT_TOKEN}/sendMessage"
|
|||
|
else:
|
|||
|
url = f"https://api.telegram.org/bot{TG_BOT_TOKEN}/sendMessage"
|
|||
|
|
|||
|
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
|
|||
|
payload = {'chat_id': str(TG_USER_ID), 'text': f'{title}\n\n{content}', 'disable_web_page_preview': 'true'}
|
|||
|
proxies = None
|
|||
|
if TG_PROXY_IP and TG_PROXY_PORT:
|
|||
|
proxyStr = "http://{}:{}".format(TG_PROXY_IP, TG_PROXY_PORT)
|
|||
|
proxies = {"http": proxyStr, "https": proxyStr}
|
|||
|
try:
|
|||
|
response = requests.post(url=url, headers=headers, params=payload, proxies=proxies).json()
|
|||
|
except:
|
|||
|
print('推送失败!')
|
|||
|
if response['ok']:
|
|||
|
print('推送成功!')
|
|||
|
else:
|
|||
|
print('推送失败!')
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
|
|||
|
# 企业微信 APP 推送
|
|||
|
def wecom_app(title, content):
|
|||
|
try:
|
|||
|
if not QYWX_AM:
|
|||
|
print("QYWX_AM 并未设置!!\n取消推送")
|
|||
|
return
|
|||
|
QYWX_AM_AY = re.split(',',QYWX_AM)
|
|||
|
if 4 < len(QYWX_AM_AY) > 5:
|
|||
|
print("QYWX_AM 设置错误!!\n取消推送")
|
|||
|
return
|
|||
|
corpid=QYWX_AM_AY[0]
|
|||
|
corpsecret=QYWX_AM_AY[1]
|
|||
|
touser=QYWX_AM_AY[2]
|
|||
|
agentid=QYWX_AM_AY[3]
|
|||
|
try:
|
|||
|
media_id=QYWX_AM_AY[4]
|
|||
|
except :
|
|||
|
media_id=''
|
|||
|
wx=WeCom(corpid, corpsecret, agentid)
|
|||
|
# 如果没有配置 media_id 默认就以 text 方式发送
|
|||
|
if not media_id:
|
|||
|
message=title + '\n\n' + content
|
|||
|
response=wx.send_text(message, touser)
|
|||
|
else:
|
|||
|
response=wx.send_mpnews(title, content, media_id, touser)
|
|||
|
if response == 'ok':
|
|||
|
print('推送成功!')
|
|||
|
else:
|
|||
|
print('推送失败!错误信息如下:\n',response)
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
|
|||
|
class WeCom:
|
|||
|
def __init__(self, corpid, corpsecret, agentid):
|
|||
|
self.CORPID = corpid
|
|||
|
self.CORPSECRET = corpsecret
|
|||
|
self.AGENTID = agentid
|
|||
|
def get_access_token(self):
|
|||
|
url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken'
|
|||
|
values = {'corpid': self.CORPID,
|
|||
|
'corpsecret': self.CORPSECRET,
|
|||
|
}
|
|||
|
req = requests.post(url, params=values)
|
|||
|
data = json.loads(req.text)
|
|||
|
return data["access_token"]
|
|||
|
def send_text(self, message, touser="@all"):
|
|||
|
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
|
|||
|
send_values = {
|
|||
|
"touser": touser,
|
|||
|
"msgtype": "text",
|
|||
|
"agentid": self.AGENTID,
|
|||
|
"text": {
|
|||
|
"content": message
|
|||
|
},
|
|||
|
"safe": "0"
|
|||
|
}
|
|||
|
send_msges=(bytes(json.dumps(send_values), 'utf-8'))
|
|||
|
respone = requests.post(send_url, send_msges)
|
|||
|
respone = respone.json()
|
|||
|
return respone["errmsg"]
|
|||
|
def send_mpnews(self, title, message, media_id, touser="@all"):
|
|||
|
send_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.get_access_token()
|
|||
|
send_values = {
|
|||
|
"touser": touser,
|
|||
|
"msgtype": "mpnews",
|
|||
|
"agentid": self.AGENTID,
|
|||
|
"mpnews": {
|
|||
|
"articles":[
|
|||
|
{
|
|||
|
"title": title,
|
|||
|
"thumb_media_id": media_id,
|
|||
|
"author": "Author",
|
|||
|
"content_source_url": "",
|
|||
|
"content": message.replace('\n','<br/>'),
|
|||
|
"digest": message
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
send_msges=(bytes(json.dumps(send_values), 'utf-8'))
|
|||
|
respone = requests.post(send_url, send_msges)
|
|||
|
respone = respone.json()
|
|||
|
return respone["errmsg"]
|
|||
|
#push推送
|
|||
|
def pushplus_bot(title, content):
|
|||
|
try:
|
|||
|
print("\n")
|
|||
|
if not PUSH_PLUS_TOKEN:
|
|||
|
print("PUSHPLUS服务的token未设置!!\n取消推送")
|
|||
|
return
|
|||
|
print("PUSHPLUS服务启动")
|
|||
|
url = 'http://www.pushplus.plus/send'
|
|||
|
data = {
|
|||
|
"token": PUSH_PLUS_TOKEN,
|
|||
|
"title": title,
|
|||
|
"content": content
|
|||
|
}
|
|||
|
body = json.dumps(data).encode(encoding='utf-8')
|
|||
|
headers = {'Content-Type':'application/json'}
|
|||
|
response = requests.post(url=url, data=body, headers=headers).json()
|
|||
|
if response['code'] == 200:
|
|||
|
print('推送成功!')
|
|||
|
else:
|
|||
|
print('推送失败!')
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
# BARK
|
|||
|
def bark_push(title, content):
|
|||
|
print("\n")
|
|||
|
if not BARK:
|
|||
|
print("bark服务的bark_token未设置!!\n取消推送")
|
|||
|
return
|
|||
|
print("bark服务启动")
|
|||
|
try:
|
|||
|
response = requests.get('''https://api.day.app/{0}/{1}/{2}'''.format(BARK,title,quote_plus(content))).json()
|
|||
|
if response['code'] == 200:
|
|||
|
print('推送成功!')
|
|||
|
else:
|
|||
|
print('推送失败!')
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
print('Bark推送失败!')
|
|||
|
|
|||
|
def send(title, content):
|
|||
|
"""
|
|||
|
使用 bark, telegram bot, dingding bot, serverJ 发送手机推送
|
|||
|
:param title:
|
|||
|
:param content:
|
|||
|
:return:
|
|||
|
"""
|
|||
|
content = content + "\n\n" + footer
|
|||
|
for i in notify_mode:
|
|||
|
|
|||
|
if i == 'telegram_bot':
|
|||
|
if TG_BOT_TOKEN and TG_USER_ID:
|
|||
|
telegram_bot(title=title, content=content)
|
|||
|
else:
|
|||
|
print('未启用 telegram机器人')
|
|||
|
continue
|
|||
|
elif i == 'pushplus':
|
|||
|
if PUSH_PLUS_TOKEN:
|
|||
|
pushplus_bot(title=title, content=content)
|
|||
|
else:
|
|||
|
print('未启用 PUSHPLUS机器人')
|
|||
|
continue
|
|||
|
elif i == 'bark':
|
|||
|
if BARK:
|
|||
|
bark_push(title=title, content=content)
|
|||
|
else:
|
|||
|
print('未启用Bark APP应用消息推送')
|
|||
|
continue
|
|||
|
elif i == 'wecom_app':
|
|||
|
if QYWX_AM:
|
|||
|
wecom_app(title=title, content=content)
|
|||
|
else:
|
|||
|
print('未启用企业微信应用消息推送')
|
|||
|
continue
|
|||
|
else:
|
|||
|
print('此类推送方式不存在')
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
# 检查是否有更新版本
|
|||
|
|
|||
|
def gettext(url):
|
|||
|
try:
|
|||
|
resp = requests.get(url, timeout=60).text
|
|||
|
if '该内容无法显示' in resp or '违规' in resp:
|
|||
|
return gettext(url)
|
|||
|
return resp
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
|
|||
|
|
|||
|
def isUpdate():
|
|||
|
global footer,readme,uPversion,scriptName
|
|||
|
url = base64.decodebytes(
|
|||
|
b"aHR0cHM6Ly9naXRlZS5jb20vY3VydGlubHYvUHVibGljL3Jhdy9tYXN0ZXIvRm9sbG93R2lmdHMvdXBkYXRlLmpzb24=")
|
|||
|
try:
|
|||
|
result = gettext(url)
|
|||
|
result = json.loads(result)
|
|||
|
scriptName = result['name']
|
|||
|
isEnable = result['isEnable']
|
|||
|
uPversion = result['version']
|
|||
|
info = result['info']
|
|||
|
readme = ""
|
|||
|
pError = result['m']
|
|||
|
footer = ""
|
|||
|
getWait = result['s']
|
|||
|
if isEnable > 50 and isEnable < 150:
|
|||
|
if version != uPversion:
|
|||
|
print(f"\n当前最新版本:【{uPversion}】\n\n{info}\n")
|
|||
|
message(f"{readme}")
|
|||
|
exitCodeFun(888)
|
|||
|
else:
|
|||
|
message(f"{readme}")
|
|||
|
time.sleep(getWait)
|
|||
|
else:
|
|||
|
print(pError)
|
|||
|
exitCodeFun(888)
|
|||
|
|
|||
|
except:
|
|||
|
message("请检查您的环境/版本是否正常!")
|
|||
|
exitCodeFun(888)
|
|||
|
|
|||
|
def outfile(filename, context):
|
|||
|
with open(filename, "w+", encoding="utf-8") as f1:
|
|||
|
f1.write(context)
|
|||
|
f1.close()
|
|||
|
|
|||
|
|
|||
|
def getRemoteShopid():
|
|||
|
url = base64.decodebytes(
|
|||
|
b"aHR0cHM6Ly9naXRlZS5jb20vY3VydGlubHYvUHVibGljL3Jhdy9tYXN0ZXIvRm9sbG93R2lmdHMvc2hvcGlkLnR4dA==")
|
|||
|
try:
|
|||
|
rShopid = gettext(url)
|
|||
|
rShopid = rShopid.split("\n")
|
|||
|
return rShopid
|
|||
|
except:
|
|||
|
print("无法从远程获取shopid")
|
|||
|
exitCodeFun(999)
|
|||
|
def createShopidList():
|
|||
|
global shopidNum ,shopidList
|
|||
|
shopidList = []
|
|||
|
shopids = getRemoteShopid()
|
|||
|
shopidNum = len(shopids) - 1
|
|||
|
for i in range(shopidNum):
|
|||
|
shopid = shopids[i]
|
|||
|
shopid = eval(shopid)
|
|||
|
shopidList.append(shopid)
|
|||
|
def memoryFun(pinName,bean):
|
|||
|
global usergetGiftinfo
|
|||
|
try:
|
|||
|
try:
|
|||
|
|
|||
|
usergetGiftinfo['{}'.format(pinName)]
|
|||
|
usergetGiftinfo['{}'.format(pinName)] += bean
|
|||
|
except:
|
|||
|
usergetGiftinfo['{}'.format(pinName)] = bean
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
|
|||
|
def buildBody(data):
|
|||
|
shopid = data['shopid']
|
|||
|
venderId = data['venderId']
|
|||
|
activityId = data['activityId']
|
|||
|
signbody = data['signbody']
|
|||
|
body = 'body={"follow":0,"shopId":"' + shopid + '","activityId":"' + activityId + '","sourceRpc":"shop_app_home_window","venderId":"'+ venderId + '"}&build=167863&client=apple&clientVersion=10.2.2&d_brand=apple&d_model=iPhone8,1&ef=1&eid=&ep={"ciphertype":5,"cipher":{"screen":"DzUmAtOzCzG=","area":"CJvpCJYmCV8zDtCzXzYzCtGz","wifiBssid":"","osVersion":"CJCkDm==","uuid":"aQf1ZRdxb2r4ovZ1EJZhcxYlVNZSZz09","adid":"","openudid":"Y2O2ZWS5CWO4ENrsZJG4EQYnEJHsEWG5CtO2Y2Y3CJPuZNPsCtSnYG=="},"ts":1636156765,"hdid":"","version":"","appname":"","ridx":-1}&' + signbody
|
|||
|
return body
|
|||
|
|
|||
|
def drawShopGift(cookie, data):
|
|||
|
try:
|
|||
|
url = 'https://api.m.jd.com/client.action?functionId=drawShopGift'
|
|||
|
body = data
|
|||
|
headers = {
|
|||
|
'J-E-H' : '%7B%22ciphertype%22:5,%22cipher%22:%7B%22User-Agent%22:%22IuG0aVLeb25vBzO2Dzq2CyUyCMrfUQrlbwU7TJSmaU9JTJSmCJCkDzivCtLJY2PiZI8yBtKmAG==%22%7D,%22ts%22:1636156765,%22hdid%22:%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=%22,%22version%22:%221.0.3%22,%22appname%22:%22com.360buy.jdmobile%22,%22ridx%22:-1%7D',
|
|||
|
'Accept-Encoding': 'gzip, deflate, br',
|
|||
|
'Cookie': cookie,
|
|||
|
'Connection': 'close',
|
|||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|||
|
'Accept': '*/*',
|
|||
|
'Host': 'api.m.jd.com',
|
|||
|
'User-Agent': 'JD4iPhone/167685 (iPhone; iOS 14.3; Scale/3.00)',
|
|||
|
'Referer': '',
|
|||
|
'J-E-C' : '%7B%22ciphertype%22:5,%22cipher%22:%7B%22pin%22:%22TUU5TJuyTJvQTUU3TUOnTJu1TUU1TUSmTUSnTUU2TJu4TUPQTUU0TUS4TJrOTUU1TUSmTJq2TUU1TUSmTUSn%22%7D,%22ts%22:1636157606,%22hdid%22:%22JM9F1ywUPwflvMIpYPok0tt5k9kW4ArJEU3lfLhxBqw=%22,%22version%22:%221.0.3%22,%22appname%22:%22com.360buy.jdmobile%22,%22ridx%22:-1%7D',
|
|||
|
'Accept-Language': 'zh-Hans-CN;q=1'
|
|||
|
}
|
|||
|
response = requests.post(url, headers=headers, verify=False, data=body, timeout=60)
|
|||
|
if 'isSuccess' in response.text:
|
|||
|
return response.json()
|
|||
|
else:
|
|||
|
return 9
|
|||
|
except Exception as e:
|
|||
|
print(e)
|
|||
|
return 9
|
|||
|
def getGiftresult(result, nickname, pinName, uNum):
|
|||
|
try:
|
|||
|
if result['isSuccess']:
|
|||
|
if result['result']:
|
|||
|
followDesc = result['result']['followDesc']
|
|||
|
giftDesc = result['result']['giftDesc']
|
|||
|
print(f"\t└账号{uNum}【{nickname}】{followDesc}>{giftDesc}")
|
|||
|
if result['result']['giftCode'] == '200':
|
|||
|
try:
|
|||
|
alreadyReceivedGifts = result['result']['alreadyReceivedGifts']
|
|||
|
for g in alreadyReceivedGifts:
|
|||
|
if g['prizeType'] == 4:
|
|||
|
bean = g['redWord']
|
|||
|
memoryFun(pinName, int(bean))
|
|||
|
print(f"\t\t└获得{g['rearWord']}:{g['redWord']}")
|
|||
|
except:
|
|||
|
pass
|
|||
|
except Exception as e:
|
|||
|
print(f"getGiftresult Error {e}")
|
|||
|
|
|||
|
|
|||
|
def start():
|
|||
|
print(scriptHeader)
|
|||
|
isUpdate()
|
|||
|
outfile("Readme.md", readmes)
|
|||
|
cookiesList, userNameList, pinNameList = getCk.iscookie()
|
|||
|
userNum = len(cookiesList)
|
|||
|
message(f"有效账号{userNum}个")
|
|||
|
message(f"开始:{scriptName}")
|
|||
|
createShopidList()
|
|||
|
message(f"获取到店铺:{shopidNum}")
|
|||
|
# print(shopidList)
|
|||
|
starttime = time.perf_counter() # 记录时间开始
|
|||
|
for i in shopidList:
|
|||
|
body = buildBody(i)
|
|||
|
print(f"关注店铺【{i['shopid']}】")
|
|||
|
uNum = 1
|
|||
|
for ck, nickname, pinName in zip(cookiesList, userNameList, pinNameList):
|
|||
|
result = drawShopGift(ck, body)
|
|||
|
if result != 9:
|
|||
|
getGiftresult(result, nickname, pinName, uNum)
|
|||
|
else:
|
|||
|
uNum += 1
|
|||
|
break
|
|||
|
uNum += 1
|
|||
|
endtime = time.perf_counter() # 记录时间结束
|
|||
|
message("\n###【本次统计 {}】###\n".format(nowtime()))
|
|||
|
all_get_bean = 0
|
|||
|
n = 1
|
|||
|
for name, pinname in zip(userNameList, pinNameList):
|
|||
|
try:
|
|||
|
userCountBean = usergetGiftinfo['{}'.format(pinname)]
|
|||
|
message(f"账号{n}:【{name}】\n\t└收获 {userCountBean} 京豆")
|
|||
|
all_get_bean += userCountBean
|
|||
|
except Exception as e:
|
|||
|
message(f"账号{n}:【{name}】\n\t└收获 0 京豆")
|
|||
|
n += 1
|
|||
|
message(f"\n本次总累计获得:{all_get_bean} 京豆")
|
|||
|
message("\n------- 总耗时 : %.03f 秒 seconds -------" % (endtime - starttime))
|
|||
|
print("{0}\n{1}\n{2}".format("*" * 30, scriptHeader, remarks))
|
|||
|
send(f"【{scriptName}】", message_info)
|
|||
|
exitCodeFun(0)
|
|||
|
|
|||
|
if __name__ == '__main__':
|
|||
|
start()
|