Collect seeded Qinglong script repositories
This commit is contained in:
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
155
脚本库/web版/账密/51代理自动签到/2026-05-14_51dalili_fea43cd7.py
Normal file
155
脚本库/web版/账密/51代理自动签到/2026-05-14_51dalili_fea43cd7.py
Normal file
@@ -0,0 +1,155 @@
|
||||
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/51dalili.py
|
||||
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/51dalili.py
|
||||
# Repo: smallfawn/QLScriptPublic
|
||||
# Path: daily/51dalili.py
|
||||
# UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
# SHA256: fea43cd7c31202227b74942f467d38857faf034019bfd0d73b876d100c47b55a
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
#51代理每日签到
|
||||
#new Env("51代理自动签到")
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
import time
|
||||
import os
|
||||
|
||||
def login_to_51daili():
|
||||
# 从环境变量读取账号和密码
|
||||
username = os.getenv('dali51user')
|
||||
password = os.getenv('daili51pass')
|
||||
|
||||
if not username or not password:
|
||||
print("错误: 请设置环境变量 dali51user 和 daili51pass")
|
||||
return None
|
||||
|
||||
# 第一次请求获取登录令牌和PHPSESSID
|
||||
print("正在获取登录令牌和PHPSESSID...")
|
||||
session = requests.Session()
|
||||
|
||||
try:
|
||||
# 初始headers,仅包含User-Agent
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'
|
||||
}
|
||||
|
||||
# 发送GET请求获取登录页面
|
||||
response = session.get('https://www.51daili.com', headers=headers, timeout=10)
|
||||
response.raise_for_status()
|
||||
|
||||
# 从响应头中获取PHPSESSID
|
||||
phpsessid = None
|
||||
if 'set-cookie' in response.headers:
|
||||
cookies = response.headers['set-cookie'].split(';')
|
||||
for cookie in cookies:
|
||||
if 'PHPSESSID' in cookie:
|
||||
phpsessid = cookie.split('=')[1]
|
||||
break
|
||||
|
||||
# 解析HTML获取令牌
|
||||
soup = BeautifulSoup(response.text, 'html.parser')
|
||||
token_input = soup.find('input', {'name': '__login_token__'})
|
||||
|
||||
if token_input:
|
||||
login_token = token_input.get('value')
|
||||
print(f"成功获取登录令牌: {login_token}")
|
||||
else:
|
||||
print("未找到登录令牌,使用默认令牌")
|
||||
login_token = "14f2877f31842495ff24e3d73036158a"
|
||||
|
||||
if phpsessid:
|
||||
print(f"成功获取PHPSESSID: {phpsessid}")
|
||||
else:
|
||||
print("未能从响应头中获取PHPSESSID,使用默认值")
|
||||
phpsessid = "qkheban0ocfthart1bk7s861kn"
|
||||
|
||||
# 准备登录数据和更新headers
|
||||
login_data = {
|
||||
'__login_token__': login_token,
|
||||
'account': username,
|
||||
'password': password,
|
||||
'ticket': '1',
|
||||
'keeplogin': '1',
|
||||
'is_read': '1'
|
||||
}
|
||||
|
||||
# 更新headers,添加Cookie
|
||||
headers['Cookie'] = f"PHPSESSID={phpsessid};tncode_check=ok"
|
||||
|
||||
print("正在尝试登录...")
|
||||
time.sleep(1) # 添加短暂延迟
|
||||
|
||||
# 发送POST请求进行登录
|
||||
login_url = 'https://www.51daili.com/index/user/login.html'
|
||||
login_response = session.post(login_url, data=login_data, headers=headers, timeout=10)
|
||||
login_response.raise_for_status()
|
||||
|
||||
# 检查登录是否成功
|
||||
if login_response.status_code == 200:
|
||||
print("登录请求已发送,状态码: 200")
|
||||
|
||||
# 尝试从响应头中查找token
|
||||
print("响应头:", login_response.headers)
|
||||
|
||||
token = None
|
||||
# 检查Set-Cookie头
|
||||
if 'set-cookie' in login_response.headers:
|
||||
cookies = login_response.headers['set-cookie'].split(';')
|
||||
for cookie in cookies:
|
||||
if 'token' in cookie.lower():
|
||||
print(f"找到token cookie: {cookie}")
|
||||
# 提取token值
|
||||
token_parts = cookie.split('=')
|
||||
if len(token_parts) >= 2:
|
||||
token = token_parts[1].strip()
|
||||
break
|
||||
|
||||
# 如果没有在Set-Cookie中找到,检查其他头字段
|
||||
if not token:
|
||||
for key, value in login_response.headers.items():
|
||||
if 'token' in key.lower():
|
||||
print(f"找到token头: {key}: {value}")
|
||||
token = value
|
||||
break
|
||||
|
||||
if token:
|
||||
print(f"成功获取token: {token}")
|
||||
|
||||
# 使用token请求签到页面
|
||||
signin_headers = headers.copy()
|
||||
# 添加token到Cookie
|
||||
signin_headers['Cookie'] = f"{signin_headers.get('Cookie', '')}; token={token}"
|
||||
signin_headers['Referer'] = 'https://www.51daili.com/'
|
||||
|
||||
print("正在请求签到页面...")
|
||||
signin_response = session.get(
|
||||
'https://www.51daili.com/index/user/signin.html',
|
||||
headers=signin_headers,
|
||||
timeout=10
|
||||
)
|
||||
signin_response.raise_for_status()
|
||||
|
||||
print("签到页面响应内容:")
|
||||
print(signin_response.text)
|
||||
else:
|
||||
print("未能从登录响应中提取token")
|
||||
else:
|
||||
print(f"登录请求返回异常状态码: {login_response.status_code}")
|
||||
|
||||
return session
|
||||
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"请求过程中发生错误: {e}")
|
||||
return None
|
||||
|
||||
if __name__ == "__main__":
|
||||
print("51代理登录示例")
|
||||
print("=" * 30)
|
||||
|
||||
session = login_to_51daili()
|
||||
|
||||
if session:
|
||||
print("登录流程完成")
|
||||
# 这里可以继续使用session进行后续操作
|
||||
else:
|
||||
print("登录失败")
|
||||
376
脚本库/web版/账密/5_旅行相关/2025-11-20_5_travel_df64a760.py
Normal file
376
脚本库/web版/账密/5_旅行相关/2025-11-20_5_travel_df64a760.py
Normal file
@@ -0,0 +1,376 @@
|
||||
# Source: https://github.com/AkenClub/ken-iMoutai-Script/blob/main/5_travel.py
|
||||
# Raw: https://raw.githubusercontent.com/AkenClub/ken-iMoutai-Script/main/5_travel.py
|
||||
# Repo: AkenClub/ken-iMoutai-Script
|
||||
# Path: 5_travel.py
|
||||
# UploadedAt: 2025-11-20T09:54:34+08:00
|
||||
# SHA256: df64a760c6c34918f55f14d59e7fc1125fccaa7cef71b2e6d5f0fd9bab9f9e7b
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
"""
|
||||
5、旅行 & 获取小茅运、首次分享奖励
|
||||
|
||||
通知:运行结果会调用青龙面板的通知渠道。
|
||||
|
||||
|
||||
配置环境变量:KEN_IMAOTAI_ENV
|
||||
-- 在旧版本青龙(例如 v2.13.8)中,使用 $ 作为分隔符时会出现解析环境变量失败,此时可以把 `$` 分隔符换为 `#` 作为分隔符。
|
||||
-- 📣 怕出错?**建议直接使用 `#` 作为分隔符即可** (2024-10-15 更新支持)。
|
||||
内容格式为:PHONE_NUMBER$USER_ID$DEVICE_ID$MT_VERSION$PRODUCT_ID_LIST$SHOP_ID^SHOP_MODE^PROVINCE^CITY$LAT$LNG$TOKEN$COOKIE
|
||||
解释:手机号码$用户ID$设备ID$版本号$商品ID列表$店铺ID店铺缺货时自动采用的模式^省份^城市$纬度$经度$TOKEN$COOKIE
|
||||
多个用户时使用 & 连接。
|
||||
|
||||
说明:^SHOP_MODE^PROVINCE^CITY 为可选
|
||||
|
||||
常量。
|
||||
- PHONE_NUMBER: 用户的手机号码。 --- 自己手机号码
|
||||
- CODE: 短信验证码。 --- 运行 1_generate_code.py 获取
|
||||
- DEVICE_ID: 设备的唯一标识符。 --- 运行 1_generate_code.py 获取
|
||||
- MT_VERSION: 应用程序的版本号。 --- 运行 1_generate_code.py 获取
|
||||
- USER_ID: 用户的唯一标识符。 --- 运行 2_login.py 获取
|
||||
- TOKEN: 用于身份验证的令牌。 --- 运行 2_login.py 获取
|
||||
- COOKIE: 用于会话管理的Cookie。 --- 运行 2_login.py 获取
|
||||
- PRODUCT_ID_LIST: 商品ID列表,表示用户想要预约的商品。--- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
- SHOP_ID: 店铺的唯一标识符。 --- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
可设置为 AUTO,则根据 SHOP_MODE 的值来选择店铺 ID。
|
||||
- SHOP_MODE:店铺缺货模式,可选值为NEAREST(距离最近)或INVENTORY(库存最多)。设置该值时,需要同时设置 PROVINCE 和 CITY。
|
||||
非必填,但 SHOP_ID 设置 AUTO 时为必填,需要同时设置 SHOP_MODE、PROVINCE 和 CITY。
|
||||
- PROVINCE: 用户所在的省份。 --- 与 3_retrieve_shop_and_product_info.py 填写的省份一致
|
||||
非必填,但 SHOP_MODE 设置为 NEAREST 或 INVENTORY 时为必填。
|
||||
- CITY: 用户所在的城市。 --- 与 3_retrieve_shop_and_product_info.py 填写的城市一致
|
||||
非必填,但 SHOP_MODE 设置为 NEAREST 或 INVENTORY 时为必填。
|
||||
- LAT: 用户所在位置的纬度。 --- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
- LNG: 用户所在位置的经度。 --- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
|
||||
"""
|
||||
|
||||
import requests
|
||||
import json
|
||||
from datetime import datetime
|
||||
import logging
|
||||
import os
|
||||
import ast
|
||||
import io
|
||||
import re
|
||||
|
||||
from notify import send
|
||||
|
||||
# 每日 9:12 执行,可自行修改。旅行一个周期 30 天,最多获取 30 小茅运,每次旅行基本可获 1 ~ 3 个小茅运,所以一天一次旅行足矣。
|
||||
# 如需每日旅行多次,示例 12 9-20/4 * * * , 表示 9:12 到 20:12 期间每隔 4 小时执行一次,包括 9:12 和 20:12。
|
||||
# 比如 12 9,20 * * * 表示 9:12、20:12 执行。
|
||||
'''
|
||||
cron: 12 9 * * *
|
||||
new Env("5_旅行相关")
|
||||
'''
|
||||
|
||||
# 创建 StringIO 对象
|
||||
log_stream = io.StringIO()
|
||||
|
||||
# 配置 logging
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.INFO)
|
||||
|
||||
# 创建控制台 Handler
|
||||
console_handler = logging.StreamHandler()
|
||||
console_handler.setFormatter(
|
||||
logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
|
||||
|
||||
# 创建 StringIO Handler
|
||||
stream_handler = logging.StreamHandler(log_stream)
|
||||
# stream_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
|
||||
|
||||
# 将两个 Handler 添加到 logger
|
||||
logger.addHandler(console_handler)
|
||||
logger.addHandler(stream_handler)
|
||||
|
||||
# 读取 KEN_IMAOTAI_ENV 环境变量
|
||||
KEN_IMAOTAI_ENV = os.getenv('KEN_IMAOTAI_ENV', '')
|
||||
|
||||
# 解析 KEN_IMAOTAI_ENV 环境变量并保存到 user 列表
|
||||
users = []
|
||||
if KEN_IMAOTAI_ENV:
|
||||
env_list = KEN_IMAOTAI_ENV.split('&')
|
||||
for env in env_list:
|
||||
try:
|
||||
# 使用 re.split() 分割字符串,支持 '#' 和 '$'
|
||||
split_values = re.split(r'[#$]', env)
|
||||
|
||||
PHONE_NUMBER, USER_ID, DEVICE_ID, MT_VERSION, PRODUCT_ID_LIST, SHOP_ID, LAT, LNG, TOKEN, COOKIE = split_values
|
||||
|
||||
user = {
|
||||
'PHONE_NUMBER': PHONE_NUMBER.strip(),
|
||||
'USER_ID': USER_ID.strip(),
|
||||
'DEVICE_ID': DEVICE_ID.strip(),
|
||||
'MT_VERSION': MT_VERSION.strip(),
|
||||
'PRODUCT_ID_LIST': ast.literal_eval(PRODUCT_ID_LIST.strip()),
|
||||
'SHOP_ID': SHOP_ID.strip(),
|
||||
'LAT': LAT.strip(),
|
||||
'LNG': LNG.strip(),
|
||||
'TOKEN': TOKEN.strip(),
|
||||
'COOKIE': COOKIE.strip()
|
||||
}
|
||||
# 检查字段是否完整且有值
|
||||
required_fields = [
|
||||
'PHONE_NUMBER', 'USER_ID', 'DEVICE_ID', 'MT_VERSION',
|
||||
'PRODUCT_ID_LIST', 'SHOP_ID', 'LAT', 'LNG', 'TOKEN', 'COOKIE'
|
||||
]
|
||||
if all(user.get(field) for field in required_fields):
|
||||
# 判断 PRODUCT_ID_LIST 长度是否大于 0
|
||||
if len(user['PRODUCT_ID_LIST']) > 0:
|
||||
users.append(user)
|
||||
else:
|
||||
raise Exception("🚫 预约商品列表 - PRODUCT_ID_LIST 值为空,请添加后重试")
|
||||
else:
|
||||
logging.info(f"🚫 用户信息不完整: {user}")
|
||||
except Exception as e:
|
||||
logging.info(f"🚫 KEN_IMAOTAI_ENV 环境变量格式错误: {e}")
|
||||
|
||||
logging.info("找到以下用户配置:")
|
||||
# 输出用户信息
|
||||
for index, user in enumerate(users):
|
||||
logging.info(f"用户 {index + 1}: 📞 {user['PHONE_NUMBER']}")
|
||||
|
||||
else:
|
||||
logging.info("🚫 KEN_IMAOTAI_ENV 环境变量未定义")
|
||||
|
||||
base_url = "https://h5.moutai519.com.cn/game"
|
||||
|
||||
|
||||
# 生成请求头
|
||||
def generate_headers(device_id, mt_version, cookie, lat=None, lng=None):
|
||||
headers = {
|
||||
"MT-Device-ID": device_id,
|
||||
"MT-APP-Version": mt_version,
|
||||
"User-Agent": "iOS;16.3;Apple;?unrecognized?",
|
||||
"Cookie": f"MT-Token-Wap={cookie};MT-Device-ID-Wap={device_id};"
|
||||
}
|
||||
if lat and lng:
|
||||
headers["MT-Lat"] = lat
|
||||
headers["MT-Lng"] = lng
|
||||
return headers
|
||||
|
||||
|
||||
# 获得旅行奖励
|
||||
def travel_reward(device_id, mt_version, cookie, lat, lng):
|
||||
# 9-20点才能领取旅行奖励
|
||||
current_hour = datetime.now().hour
|
||||
if not (9 <= current_hour < 20):
|
||||
raise Exception("🚫 活动未开始,开始时间9点-20点")
|
||||
|
||||
page_data = get_user_isolation_page_data(device_id, mt_version, cookie)
|
||||
logging.info(f"【旅行前】用户数据:")
|
||||
|
||||
status = page_data.get("status")
|
||||
remain_chance = page_data.get("remainChance")
|
||||
energy_reward_value = page_data.get("energy_reward_value")
|
||||
energy = page_data.get("energy")
|
||||
end_time = page_data.get("end_time")
|
||||
|
||||
# 打印旅行前获得的用户数据
|
||||
log_travel_status(page_data)
|
||||
|
||||
# 如果存在未领取的耐力值奖励,则领取
|
||||
if energy_reward_value > 0:
|
||||
# 获取申购耐力值
|
||||
get_energy_award(cookie, device_id, mt_version, lat, lng)
|
||||
energy += energy_reward_value
|
||||
|
||||
# 本月剩余旅行奖励
|
||||
current_period_can_convert_xmy_num = get_exchange_rate_info(
|
||||
device_id, mt_version, cookie)
|
||||
if current_period_can_convert_xmy_num <= 0:
|
||||
raise Exception("🚫 当月无可领取奖励,直接结束旅行。")
|
||||
logging.info(f"📈当月可领取小茅运数量:{current_period_can_convert_xmy_num}")
|
||||
|
||||
# 进行中
|
||||
if status == 2:
|
||||
formatted_date = datetime.fromtimestamp(
|
||||
end_time / 1000).strftime("%Y-%m-%d %H:%M:%S")
|
||||
raise Exception(f"🚫 旅行暂未结束,本次旅行结束时间:{formatted_date}")
|
||||
# 已完成
|
||||
if status == 3:
|
||||
travel_reward_xmy = get_xm_travel_reward(device_id, mt_version, cookie)
|
||||
logging.info(f"🎁 本次旅行将奖励小茅运:{travel_reward_xmy}")
|
||||
|
||||
try:
|
||||
# 领取旅行获取的小茅运
|
||||
reward_result = receive_reward(device_id, lat, lng, cookie,
|
||||
mt_version)
|
||||
logging.info(f"🎁 领取小茅运结果:{reward_result}")
|
||||
except Exception as e:
|
||||
logging.error(f"🚫 领取小茅运失败: {e}")
|
||||
|
||||
try:
|
||||
# 首次分享获取耐力
|
||||
share_result = share_reward(device_id, lat, lng, cookie,
|
||||
mt_version)
|
||||
# 如果分享成功,则耐力值加 10,用于后续判断是否足够耐力值旅行
|
||||
energy += 10
|
||||
logging.info(f"🎁 分享奖励结果:{share_result}")
|
||||
except Exception as e:
|
||||
logging.error(f"🚫 分享奖励失败: {e}")
|
||||
|
||||
# 本次旅行奖励领取后, 当月实际剩余旅行奖励
|
||||
if travel_reward_xmy > current_period_can_convert_xmy_num:
|
||||
raise Exception("🚫 当月无可领取奖励,当月不再旅行")
|
||||
|
||||
# 如果是未开始状态或者 status 已完成且领取了奖励,则开始新的旅行
|
||||
if remain_chance < 1:
|
||||
raise Exception("🚫 当日旅行次数已耗尽")
|
||||
elif energy < 100:
|
||||
raise Exception(f"🚫 无法旅行,耐力不足100, 当前耐力值:{energy}")
|
||||
else:
|
||||
# 小茅运旅行活动
|
||||
start_travel(device_id, mt_version, cookie)
|
||||
|
||||
|
||||
def log_travel_status(page_data):
|
||||
status = page_data.get("status")
|
||||
remain_chance = page_data.get("remainChance")
|
||||
xmy = page_data.get("xmy")
|
||||
energy = page_data.get("energy")
|
||||
energy_reward_value = page_data.get("energy_reward_value")
|
||||
|
||||
logging.info(
|
||||
f"🌟当前旅行状态: {'未开始' if status == 1 else '进行中' if status == 2 else '已完成'}"
|
||||
)
|
||||
logging.info(f"📅当日剩余旅行次数: {remain_chance}")
|
||||
logging.info(f"💫小茅运: {xmy}")
|
||||
logging.info(f"💪耐力值: {energy}")
|
||||
logging.info(f"🎁未领取的耐力值奖励: {energy_reward_value}")
|
||||
|
||||
|
||||
# 领取旅行获取的小茅运
|
||||
def receive_reward(device_id, lat, lng, cookie, mt_version):
|
||||
url = f"{base_url}/xmTravel/receiveReward"
|
||||
headers = generate_headers(device_id, mt_version, cookie, lat, lng)
|
||||
response = requests.post(url, headers=headers)
|
||||
body = response.json()
|
||||
if body.get("code") != 2000:
|
||||
raise Exception(body)
|
||||
return body.get("data")
|
||||
|
||||
|
||||
# 领取每日首次分享获取耐力
|
||||
def share_reward(device_id, lat, lng, cookie, mt_version):
|
||||
url = f"{base_url}/xmTravel/shareReward"
|
||||
headers = generate_headers(device_id, mt_version, cookie, lat, lng)
|
||||
response = requests.post(url, headers=headers)
|
||||
body = response.json()
|
||||
if body.get("code") != 2000:
|
||||
raise Exception(body)
|
||||
return body.get("data")
|
||||
|
||||
|
||||
# 开始旅行
|
||||
def start_travel(device_id, mt_version, cookie):
|
||||
url = f"{base_url}/xmTravel/startTravel"
|
||||
headers = generate_headers(device_id, mt_version, cookie)
|
||||
response = requests.post(url, headers=headers)
|
||||
body = response.json()
|
||||
if body.get("code") != 2000:
|
||||
raise Exception(f"🚫 开始旅行失败:{body.get('message')}")
|
||||
start_travel_timestamp = body.get("data").get("startTravelTs", 0)
|
||||
start_travel_str = datetime.fromtimestamp(
|
||||
start_travel_timestamp / 1000).strftime("%Y-%m-%d %H:%M:%S")
|
||||
logging.info(f"✅ 开始旅行成功,旅行开始时间:{start_travel_str}")
|
||||
|
||||
|
||||
# 查询 可获取小茅运
|
||||
def get_xm_travel_reward(device_id, mt_version, cookie):
|
||||
url = f"{base_url}/xmTravel/getXmTravelReward"
|
||||
headers = generate_headers(device_id, mt_version, cookie)
|
||||
response = requests.get(url, headers=headers)
|
||||
body = response.json()
|
||||
if body.get("code") != 2000:
|
||||
raise Exception(f"🚫 {body.get('message')}")
|
||||
# 例如 1.95,可能会返回 None
|
||||
travel_reward_xmy = body.get("data").get("travelRewardXmy")
|
||||
return travel_reward_xmy if travel_reward_xmy is not None else 0
|
||||
|
||||
|
||||
# 获取用户数据,查询旅行状态、剩余可领取小茅运数量等
|
||||
def get_user_isolation_page_data(device_id, mt_version, cookie):
|
||||
url = f"{base_url}/isolationPage/getUserIsolationPageData"
|
||||
headers = generate_headers(device_id, mt_version, cookie)
|
||||
params = {"__timestamp": int(datetime.now().timestamp())}
|
||||
response = requests.get(url, headers=headers, params=params)
|
||||
body = response.json()
|
||||
if body.get("code") != 2000:
|
||||
raise Exception(f"🚫 获取用户数据 失败:{body.get('message')}")
|
||||
|
||||
data = body.get("data")
|
||||
# xmy: 小茅运值
|
||||
xmy = data.get("xmy")
|
||||
# energy: 耐力值
|
||||
energy = data.get("energy")
|
||||
xm_travel = data.get("xmTravel")
|
||||
energy_reward = data.get("energyReward")
|
||||
# status: 1. 未开始 2. 进行中 3. 已完成
|
||||
status = xm_travel.get("status")
|
||||
# travelEndTime: 旅行结束时间
|
||||
travel_end_time = xm_travel.get("travelEndTime")
|
||||
# remainChance 今日剩余旅行次数
|
||||
remain_chance = xm_travel.get("remainChance")
|
||||
# 可领取申购耐力值奖励
|
||||
energy_value = energy_reward.get("value")
|
||||
|
||||
end_time = travel_end_time * 1000
|
||||
|
||||
result = {
|
||||
"remainChance": remain_chance,
|
||||
"status": status,
|
||||
"xmy": xmy,
|
||||
"energy_reward_value": energy_value,
|
||||
"energy": energy,
|
||||
"end_time": end_time
|
||||
}
|
||||
return result
|
||||
|
||||
|
||||
# 获取申购耐力值
|
||||
def get_energy_award(cookie, device_id, mt_version, lat, lng):
|
||||
url = f"{base_url}/isolationPage/getUserEnergyAward"
|
||||
headers = generate_headers(device_id, mt_version, cookie, lat, lng)
|
||||
response = requests.post(url, headers=headers)
|
||||
body = response.text
|
||||
json_object = json.loads(body)
|
||||
if json_object.get("code") != 200:
|
||||
raise Exception(f"🚫 {json_object.get('message')}")
|
||||
return body
|
||||
|
||||
|
||||
# 获取本月剩余奖励耐力值
|
||||
def get_exchange_rate_info(device_id, mt_version, cookie):
|
||||
url = f"{base_url}/synthesize/exchangeRateInfo"
|
||||
headers = generate_headers(device_id, mt_version, cookie)
|
||||
params = {"__timestamp": int(datetime.now().timestamp())}
|
||||
response = requests.get(url, headers=headers, params=params)
|
||||
body = response.json()
|
||||
if body.get("code") != 2000:
|
||||
raise Exception(f"🚫 {body.get('message')}")
|
||||
# 返回本月剩余奖励耐力值
|
||||
return body.get("data").get("currentPeriodCanConvertXmyNum")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
for user in users:
|
||||
logging.info('--------------------------')
|
||||
logging.info(f"🧾 用户:{user['PHONE_NUMBER']},执行旅行")
|
||||
try:
|
||||
travel_reward(user['DEVICE_ID'], user['MT_VERSION'],
|
||||
user['COOKIE'], user['LAT'], user['LNG'])
|
||||
except Exception as e:
|
||||
logging.error(f"🚫 旅行失败: {e}")
|
||||
finally:
|
||||
page_data = get_user_isolation_page_data(user['DEVICE_ID'],
|
||||
user['MT_VERSION'],
|
||||
user['COOKIE'])
|
||||
logging.info(f"【旅行后】用户数据:")
|
||||
log_travel_status(page_data)
|
||||
logging.info('--------------------------')
|
||||
|
||||
logging.info("✅ 所有用户旅行完成")
|
||||
|
||||
log_contents = log_stream.getvalue()
|
||||
send("i茅台旅行-日志:", log_contents)
|
||||
@@ -0,0 +1,282 @@
|
||||
# Source: https://github.com/AkenClub/ken-iMoutai-Script/blob/main/99_check_for_validity.py
|
||||
# Raw: https://raw.githubusercontent.com/AkenClub/ken-iMoutai-Script/main/99_check_for_validity.py
|
||||
# Repo: AkenClub/ken-iMoutai-Script
|
||||
# Path: 99_check_for_validity.py
|
||||
# UploadedAt: 2025-11-20T09:54:34+08:00
|
||||
# SHA256: b7dac1c2a41406aad9c26c8d92adf0b74a6bcbae0947eb820a674bd18047d6c4
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
"""
|
||||
99、检查 TOKEN、COOKIE 有效期
|
||||
|
||||
*** 需要安装依赖 PyJWT ***
|
||||
|
||||
通知:运行结果会调用青龙面板的通知渠道。
|
||||
|
||||
配置环境变量:KEN_IMAOTAI_ENV
|
||||
-- 在旧版本青龙(例如 v2.13.8)中,使用 $ 作为分隔符时会出现解析环境变量失败,此时可以把 `$` 分隔符换为 `#` 作为分隔符。
|
||||
-- 📣 怕出错?**建议直接使用 `#` 作为分隔符即可** (2024-10-15 更新支持)。
|
||||
内容格式为:PHONE_NUMBER$USER_ID$DEVICE_ID$MT_VERSION$PRODUCT_ID_LIST$SHOP_ID^SHOP_MODE^PROVINCE^CITY$LAT$LNG$TOKEN$COOKIE
|
||||
解释:手机号码$用户ID$设备ID$版本号$商品ID列表$店铺ID店铺缺货时自动采用的模式^省份^城市$纬度$经度$TOKEN$COOKIE
|
||||
多个用户时使用 & 连接
|
||||
|
||||
说明:^SHOP_MODE^PROVINCE^CITY 为可选
|
||||
|
||||
常量。
|
||||
- PHONE_NUMBER: 用户的手机号码。 --- 自己手机号码
|
||||
- CODE: 短信验证码。 --- 运行 1_generate_code.py 获取
|
||||
- DEVICE_ID: 设备的唯一标识符。 --- 运行 1_generate_code.py 获取
|
||||
- MT_VERSION: 应用程序的版本号。 --- 运行 1_generate_code.py 获取
|
||||
- USER_ID: 用户的唯一标识符。 --- 运行 2_login.py 获取
|
||||
- TOKEN: 用于身份验证的令牌。 --- 运行 2_login.py 获取
|
||||
- COOKIE: 用于会话管理的Cookie。 --- 运行 2_login.py 获取
|
||||
- PRODUCT_ID_LIST: 商品ID列表,表示用户想要预约的商品。--- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
- SHOP_ID: 店铺的唯一标识符。 --- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
可设置为 AUTO,则根据 SHOP_MODE 的值来选择店铺 ID。
|
||||
- SHOP_MODE:店铺缺货模式,可选值为NEAREST(距离最近)或INVENTORY(库存最多)。设置该值时,需要同时设置 PROVINCE 和 CITY。
|
||||
非必填,但 SHOP_ID 设置 AUTO 时为必填,需要同时设置 SHOP_MODE、PROVINCE 和 CITY。
|
||||
- PROVINCE: 用户所在的省份。 --- 与 3_retrieve_shop_and_product_info.py 填写的省份一致
|
||||
非必填,但 SHOP_MODE 设置为 NEAREST 或 INVENTORY 时为必填。
|
||||
- CITY: 用户所在的城市。 --- 与 3_retrieve_shop_and_product_info.py 填写的城市一致
|
||||
非必填,但 SHOP_MODE 设置为 NEAREST 或 INVENTORY 时为必填。
|
||||
- LAT: 用户所在位置的纬度。 --- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
- LNG: 用户所在位置的经度。 --- 运行 3_retrieve_shop_and_product_info.py 获取
|
||||
|
||||
"""
|
||||
|
||||
import datetime
|
||||
import time
|
||||
import requests
|
||||
import json
|
||||
import os
|
||||
import ast
|
||||
import io
|
||||
import jwt
|
||||
import logging
|
||||
import re
|
||||
|
||||
from notify import send
|
||||
|
||||
# 每日 18:05 定时检查并通知
|
||||
'''
|
||||
cron: 05 18 * * *
|
||||
new Env("99_检查 TOKEN、COOKIE 有效期")
|
||||
'''
|
||||
|
||||
# 创建 StringIO 对象
|
||||
log_stream = io.StringIO()
|
||||
|
||||
# 配置 logging
|
||||
logger = logging.getLogger()
|
||||
logger.setLevel(logging.INFO)
|
||||
|
||||
# 创建控制台 Handler
|
||||
console_handler = logging.StreamHandler()
|
||||
console_handler.setFormatter(
|
||||
logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
|
||||
|
||||
# 创建 StringIO Handler
|
||||
stream_handler = logging.StreamHandler(log_stream)
|
||||
# stream_handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))
|
||||
|
||||
# 将两个 Handler 添加到 logger
|
||||
logger.addHandler(console_handler)
|
||||
logger.addHandler(stream_handler)
|
||||
|
||||
# 调试模式
|
||||
DEBUG = False
|
||||
|
||||
# 读取 KEN_IMAOTAI_ENV 环境变量
|
||||
KEN_IMAOTAI_ENV = os.getenv('KEN_IMAOTAI_ENV', '')
|
||||
|
||||
# 解析 KEN_IMAOTAI_ENV 环境变量并保存到 user 列表
|
||||
users = []
|
||||
if KEN_IMAOTAI_ENV:
|
||||
env_list = KEN_IMAOTAI_ENV.split('&')
|
||||
for env in env_list:
|
||||
try:
|
||||
# 使用 re.split() 分割字符串,支持 '#' 和 '$'
|
||||
split_values = re.split(r'[#$]', env)
|
||||
|
||||
PHONE_NUMBER, USER_ID, DEVICE_ID, MT_VERSION, PRODUCT_ID_LIST, SHOP_INFO, LAT, LNG, TOKEN, COOKIE = split_values
|
||||
|
||||
SHOP_MODE = ''
|
||||
PROVINCE = ''
|
||||
CITY = ''
|
||||
|
||||
if '^' in SHOP_INFO:
|
||||
parts = SHOP_INFO.split('^')
|
||||
if len(parts) > 1:
|
||||
# 检测 parts 长度是否为 4,否则抛出异常
|
||||
if len(parts) != 4:
|
||||
raise Exception(
|
||||
"🚫 店铺缺货模式值错误,请检查是否为 SHOP_ID^SHOP_MODE^PROVINCE^CITY"
|
||||
)
|
||||
SHOP_ID, SHOP_MODE, PROVINCE, CITY = parts
|
||||
# 检测 SHOP_MODE 是否为 NEAREST 或 INVENTORY
|
||||
if SHOP_MODE not in ['NEAREST', 'INVENTORY', '']:
|
||||
raise Exception(
|
||||
"🚫 店铺缺货模式值错误,请检查 SHOP_MODE 值是否为 NEAREST(<默认> 距离最近) 或 INVENTORY(库存最多) 或 空字符串(不选择其他店铺)"
|
||||
)
|
||||
# 如果 SHOP_MODE 值合法,则需要配合检测 PROVINCE 和 CITY 是否为空(接口需要用到这些值)
|
||||
if not PROVINCE or not CITY:
|
||||
raise Exception(
|
||||
"🚫 店铺缺货模式值为 NEAREST 或 INVENTORY 时,需要同时设置 PROVINCE 和 CITY"
|
||||
)
|
||||
else:
|
||||
logging.warning(
|
||||
"🚨🚨 建议根据环境变量格式,设置 SHOP_ID^SHOP_MODE^PROVINCE^CITY 值,否则无法在指定店铺缺货时自动预约其他店铺!🚨🚨"
|
||||
)
|
||||
# 如果 SHOP_INFO 没有 ^ 符号,则 SHOP_ID 为 SHOP_INFO
|
||||
SHOP_ID = SHOP_INFO
|
||||
|
||||
# 如果 SHOP_ID 为 AUTO,检查 SHOP_MODE 是否为空
|
||||
if SHOP_ID == 'AUTO' and not SHOP_MODE:
|
||||
raise Exception(
|
||||
"🚫 店铺缺货模式值错误,SHOP_ID 值为 AUTO 时,需设置 SHOP_MODE、PROVINCE 和 CITY 值 "
|
||||
)
|
||||
|
||||
user = {
|
||||
'PHONE_NUMBER': PHONE_NUMBER.strip(),
|
||||
'USER_ID': USER_ID.strip(),
|
||||
'DEVICE_ID': DEVICE_ID.strip(),
|
||||
'MT_VERSION': MT_VERSION.strip(),
|
||||
'PRODUCT_ID_LIST': ast.literal_eval(PRODUCT_ID_LIST.strip()),
|
||||
'SHOP_ID': SHOP_ID.strip(),
|
||||
'SHOP_MODE': SHOP_MODE.strip(),
|
||||
'PROVINCE': PROVINCE.strip(),
|
||||
'CITY': CITY.strip(),
|
||||
'LAT': LAT.strip(),
|
||||
'LNG': LNG.strip(),
|
||||
'TOKEN': TOKEN.strip(),
|
||||
'COOKIE': COOKIE.strip()
|
||||
}
|
||||
# 检查字段是否完整且有值,不检查 SHOP_MODE、PROVINCE、CITY 字段(PROVINCE 和 CITY 用于 SHOP_MODE 里,而 SHOP_MODE 可选)
|
||||
required_fields = [
|
||||
'PHONE_NUMBER', 'USER_ID', 'DEVICE_ID', 'MT_VERSION',
|
||||
'PRODUCT_ID_LIST', 'SHOP_ID', 'LAT', 'LNG', 'TOKEN', 'COOKIE'
|
||||
]
|
||||
if all(user.get(field) for field in required_fields):
|
||||
# 判断 PRODUCT_ID_LIST 长度是否大于 0
|
||||
if len(user['PRODUCT_ID_LIST']) > 0:
|
||||
users.append(user)
|
||||
else:
|
||||
raise Exception("🚫 预约商品列表 - PRODUCT_ID_LIST 值为空,请添加后重试")
|
||||
else:
|
||||
logging.info(f"🚫 用户信息不完整: {user}")
|
||||
except Exception as e:
|
||||
errText = f"🚫 KEN_IMAOTAI_ENV 环境变量格式错误: {e}"
|
||||
send("i茅台预约日志:", errText)
|
||||
raise Exception(errText)
|
||||
|
||||
logging.info("找到以下用户配置:")
|
||||
# 输出用户信息
|
||||
for index, user in enumerate(users):
|
||||
if DEBUG:
|
||||
logging.info(f"用户 {index + 1}: {user}")
|
||||
continue
|
||||
logging.info(f"用户 {index + 1}: 📞 {user['PHONE_NUMBER']}")
|
||||
|
||||
else:
|
||||
errText = "🚫 KEN_IMAOTAI_ENV 环境变量未定义"
|
||||
send("i茅台预约日志:", errText)
|
||||
raise Exception(errText)
|
||||
|
||||
|
||||
# 生成请求头
|
||||
def generate_headers(device_id, mt_version, cookie, lat=None, lng=None):
|
||||
headers = {
|
||||
"MT-Device-ID": device_id,
|
||||
"MT-APP-Version": mt_version,
|
||||
"User-Agent": "iOS;16.3;Apple;?unrecognized?",
|
||||
"Cookie": f"MT-Token-Wap={cookie};MT-Device-ID-Wap={device_id};"
|
||||
}
|
||||
if lat and lng:
|
||||
headers["MT-Lat"] = lat
|
||||
headers["MT-Lng"] = lng
|
||||
return headers
|
||||
|
||||
|
||||
# 检查 JWT 有效期
|
||||
def check_jwt(jwt_value):
|
||||
# 解码 JWT
|
||||
try:
|
||||
# 注意:此处的密钥应与生成 JWT 时使用的密钥一致
|
||||
decoded = jwt.decode(jwt_value, options={"verify_signature": False})
|
||||
|
||||
# 获取 exp 时间戳
|
||||
exp_timestamp = decoded.get("exp")
|
||||
if exp_timestamp:
|
||||
# 转换为日期
|
||||
exp_date = datetime.datetime.fromtimestamp(
|
||||
exp_timestamp, tz=datetime.timezone.utc)
|
||||
|
||||
# 获取当前时间
|
||||
current_date = datetime.datetime.now(datetime.timezone.utc)
|
||||
|
||||
exp_date_str = exp_date.strftime('%Y-%m-%d %H:%M:%S')
|
||||
|
||||
# 判断是否过期
|
||||
if current_date > exp_date:
|
||||
logging.info(
|
||||
f"⚠️ TOKEN 已过期: {exp_date_str},请重新执行 第1、2步 脚本获取最新 TOKEN、COOKIE 值。"
|
||||
)
|
||||
else:
|
||||
logging.info(f"✅ TOKEN 有效: 过期时间为 {exp_date_str}")
|
||||
else:
|
||||
logging.warning("⚠️ TOKEN 中没有 'exp' 字段")
|
||||
except jwt.DecodeError:
|
||||
logging.error("⚠️ TOKEN 解析失败")
|
||||
|
||||
|
||||
# 获取用户信息 测试 API 是否调用成功
|
||||
def check_api(cookie, device_id, mt_version, lat, lng):
|
||||
global DEBUG
|
||||
try:
|
||||
timestamp = str(
|
||||
int(time.mktime(datetime.date.today().timetuple())) * 1000)
|
||||
url = f"https://h5.moutai519.com.cn/game/userinfo?__timestamp={timestamp}&"
|
||||
headers = generate_headers(device_id, mt_version, cookie, lat, lng)
|
||||
|
||||
response = requests.post(url, headers=headers)
|
||||
progress_data = json.loads(response.text)
|
||||
if progress_data.get("code") != 2000:
|
||||
message = progress_data.get("message")
|
||||
raise Exception({message})
|
||||
if DEBUG:
|
||||
logging.info(f"✅ 测试通过: {progress_data}")
|
||||
return
|
||||
logging.info("✅ 测试通过")
|
||||
except Exception as e:
|
||||
logging.error(f"🚫 测试不通过: {e}")
|
||||
logging.error(f"⚠️ TOKEN、COOKIE 值真的失效啦!建议及时更新!否则无法正常预约和旅行咯!")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
||||
logging.info('--------------------------')
|
||||
logging.info(
|
||||
'💬 TOKEN 有效期时间不一定准确,一般上下浮动 6 小时,以真实 API 连接的结果为准。同时建议临近有效期时手动更新 TOKEN、COOKIE,不用等到过期再去更新。'
|
||||
)
|
||||
|
||||
for user in users:
|
||||
try:
|
||||
logging.info('--------------------------')
|
||||
logging.info(f"📞 用户 {user['PHONE_NUMBER']} 开始检查")
|
||||
logging.info(f"🔍 开始检查 TOKEN 有效期")
|
||||
check_jwt(user['TOKEN'])
|
||||
|
||||
logging.info(f"🔍 开始测试真实 API 连接")
|
||||
check_api(user['COOKIE'], user['DEVICE_ID'], user['MT_VERSION'],
|
||||
user['LAT'], user['LNG'])
|
||||
except Exception as e:
|
||||
logging.error(
|
||||
f"🚫 用户 {user['PHONE_NUMBER']} 检查异常: {e},请手动执行 4、5 脚本,检查 TOKEN、COOKIE 是否过期"
|
||||
)
|
||||
|
||||
logging.info('--------------------------')
|
||||
logging.info("✅ 所有用户检查完成")
|
||||
|
||||
log_contents = log_stream.getvalue()
|
||||
send("i茅台 TOKEN、COOKIE 有效期检查日志:", log_contents)
|
||||
599
脚本库/web版/账密/Bing每日图片/2025-08-25_imgbing_3ecde192.js
Normal file
599
脚本库/web版/账密/Bing每日图片/2025-08-25_imgbing_3ecde192.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/KFC疯狂星期四搞笑语录/2025-08-25_kfc_f6eae98a.js
Normal file
630
脚本库/web版/账密/KFC疯狂星期四搞笑语录/2025-08-25_kfc_f6eae98a.js
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,888 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/PUSH.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/PUSH.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/PUSH.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: 03f616e38dec8c5f1c9aaf545820f572e718dde1c354f8d67974394f4fc42e4f
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
脚本名称:PUSH.js
|
||||
脚本兼容: airsript 1.0、airscript 2.0
|
||||
更新时间:20241226
|
||||
具备功能:
|
||||
1. 多渠道推送
|
||||
2. 独立推送、消息池推送
|
||||
3. 消息过期判断
|
||||
4. 长度分片、分隔符分片
|
||||
5. 优先级排序
|
||||
6. 单日多次推送
|
||||
7. 消息池内格式自动排版
|
||||
支持推送:
|
||||
bark、pushplus、Server酱、邮箱
|
||||
钉钉、discord、企业微信
|
||||
息知、即时达、wxpusher
|
||||
*/
|
||||
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messagePushHeader = ""; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var pushHeader = ""
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 512; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 256; // 消息距离,用于匹配100字符内最近的行
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
{ name: "qywx", key: "xxxxxx", flag: "0" },
|
||||
{ name: "xizhi", key: "xxxxxx", flag: "0" },
|
||||
{ name: "jishida", key: "xxxxxx", flag: "0" },
|
||||
{ name: "wxpusher", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
};
|
||||
|
||||
// airscript检测版本
|
||||
function checkVesion(){
|
||||
try{
|
||||
let temp = Application.Range("A1").Text;
|
||||
Application.Range("A1").Value = temp
|
||||
console.log("😶🌫️ 检测到当前airscript版本为1.0,进行1.0适配")
|
||||
}catch{
|
||||
console.log("😶🌫️ 检测到当前airscript版本为2.0,进行2.0适配")
|
||||
version = 2
|
||||
}
|
||||
}
|
||||
|
||||
// 消息分片,以换行符为分割,自动检索切割位置符号
|
||||
function splitMessage(data) {
|
||||
let chunks = [];
|
||||
let start = 0;
|
||||
|
||||
while (start < data.length) {
|
||||
let end = start + maxMessageLength;
|
||||
if (end >= data.length) {
|
||||
chunks.push(data.slice(start));
|
||||
break;
|
||||
}
|
||||
|
||||
// 查找距离 maxMessageLength 在 20 字符以内的最近的换行符
|
||||
let newlineIndex = data.lastIndexOf('【', end + parseInt(messageDistance));
|
||||
// console.log(newlineIndex)
|
||||
if (newlineIndex > start && newlineIndex >= end - parseInt(messageDistance)) {
|
||||
end = newlineIndex;
|
||||
}
|
||||
|
||||
chunks.push(data.slice(start, end));
|
||||
start = end;
|
||||
}
|
||||
|
||||
return chunks
|
||||
}
|
||||
|
||||
// 纯长度分片
|
||||
// function splitMessage(data) {
|
||||
// let chunks = [];
|
||||
// for (let i = 0; i < data.length; i += maxMessageLength) {
|
||||
// chunks.push(data.slice(i, i + maxMessageLength));
|
||||
// }
|
||||
|
||||
// return chunks
|
||||
|
||||
// // chunks.forEach((chunk, index) => {
|
||||
// // // let message = `${index + 1}/${chunks.length}: ${chunk}`;
|
||||
// // bark(message, key)
|
||||
// // });
|
||||
// }
|
||||
|
||||
// 去除首尾换行和空格
|
||||
function customTrim(str) {
|
||||
return str.replace(/^\s+|\s+$/g, '');
|
||||
}
|
||||
|
||||
// 获取时间
|
||||
function getDate(){
|
||||
let currentDate = new Date();
|
||||
// 2024/07/04
|
||||
// currentDate = currentDate.getFullYear() + '' + (currentDate.getMonth() + 1).toString().padStart(2, '0') + '' + currentDate.getDate().toString().padStart(2, '0');
|
||||
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
|
||||
|
||||
return currentDate
|
||||
}
|
||||
|
||||
checkVesion()
|
||||
|
||||
// 当天时间
|
||||
var todayDate = getDate()
|
||||
getPush() // 读取推送配置
|
||||
var msgArray = [] // 存放消息内容
|
||||
getMessage() // 读取消息配置
|
||||
sendNotify() // 消息推送
|
||||
// console.log(jsonPush)
|
||||
// console.log(jsonEmail)
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("🥚 激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("🍳 无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}else{ // 不推送
|
||||
jsonPush[i].flag = 0;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 读取推送配置
|
||||
function getPush(){
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("🍳 开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
}
|
||||
|
||||
// 休眠
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// 推送优先级排序
|
||||
function sortMsgArrayByPriority(msgArray) {
|
||||
return msgArray.sort((a, b) => b.priority - a.priority);
|
||||
}
|
||||
|
||||
// 读取消息配置
|
||||
function getMessage(){
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("🍳 开始读取主配置表");
|
||||
|
||||
// var configTitleMapping = {
|
||||
// '工作表的名称': 'name',
|
||||
// '备注': 'note',
|
||||
// '只推送失败消息(是/否)': 'pushFailureOnly',
|
||||
// '推送昵称(是/否)': 'pushNickname',
|
||||
// '是否存活': 'isAlive',
|
||||
// '更新时间': 'updateTime',
|
||||
// '消息': 'message',
|
||||
// '推送时间': 'pushTime',
|
||||
// '推送方式': 'pushMethod',
|
||||
// '是否通知': 'notify',
|
||||
// '加入消息池': 'addToMessagePool',
|
||||
// '推送优先级': 'pushPriority',
|
||||
// '当日可推送次数': 'dailyPushLimit',
|
||||
// '当日剩余推送次数': 'remainingDailyPushes',
|
||||
// };
|
||||
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
let msgDict = {
|
||||
"pos": 0, // 位置,记录在表格的第几行,从2开始
|
||||
"name": "", // 名称
|
||||
"note": "", // 备注
|
||||
// "onlyError": "", // 只推送错误消息
|
||||
"update":"", // 脚本更新时间,即脚本是否已执行
|
||||
"msg" : "", // 待推送消息
|
||||
"date": "", // 推送时间,即单天是否已推送
|
||||
"methodPush":"", // 推送方式
|
||||
"flagPush" : "", // 是否通知
|
||||
"pool":"", // 是否加入消息池,加入消息池的都会整合为一条消息统一推送
|
||||
"priority":"0", // 优先级,根据优先级来对消息前后顺序进行排序
|
||||
"dailyPushLimit":1, // 当日可推送次数
|
||||
"remainingDailyPushes": "" // 当日剩余推送次数
|
||||
}
|
||||
|
||||
msgDict.pos = i // 位置,在第几行,从2开始
|
||||
msgDict["name"] = Application.Range("A" + i).Text; // 工作表名称
|
||||
msgDict.note = Application.Range("B" + i).Text; // 备注
|
||||
// msgDict.onlyError = Application.Range("C" + i).Text; // 只推送错误消息
|
||||
msgDict.update = Application.Range("F" + i).Text; // 脚本更新时间,即脚本是否已执行
|
||||
msgDict.msg = Application.Range("G" + i).Text; // 待推送消息
|
||||
msgDict.date = Application.Range("H" + i).Text; // 推送时间,即单天是否已推送
|
||||
msgDict.methodPush = Application.Range("I" + i).Text; // 推送方式
|
||||
msgDict.flagPush = Application.Range("J" + i).Text; // 是否通知
|
||||
msgDict.pool = Application.Range("K" + i).Text; // 是否加入消息池,加入消息池的都会整合为一条消息统一推送
|
||||
msgDict.priority = Application.Range("L" + i).Text; // 优先级,根据优先级来对消息前后顺序进行排序
|
||||
msgDict.dailyPushLimit = Application.Range("M" + i).Text; // 当日可推送次数
|
||||
msgDict.remainingDailyPushes = Application.Range("N" + i).Text; // 当日剩余推送次数
|
||||
|
||||
|
||||
if (msgDict.name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
// console.log(msgDict)
|
||||
msgArray.push(msgDict)
|
||||
}
|
||||
|
||||
// 根据优先级排序,值大的排前面
|
||||
msgArray = sortMsgArrayByPriority(msgArray)
|
||||
// console.log(msgArray)
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// 将日期转换为一串可比较的数字 2024/9/17 -> 20240917。隔月存在问题
|
||||
function convertToDateNumber(dateString) {
|
||||
const [year, month, day] = dateString.split('/').map(Number);
|
||||
return year * 10000 + (month * 100) + day;
|
||||
}
|
||||
|
||||
// 计算两个日期之间的距离
|
||||
function dateDistance(oldDate, newDate){
|
||||
// 定义两个日期,2024/9/17
|
||||
let date1 = new Date(oldDate);
|
||||
let date2 = new Date(newDate);
|
||||
let diffInMilliseconds = date2 - date1; // 计算两个日期之间的毫秒差
|
||||
let diffInDays = diffInMilliseconds / (1000 * 60 * 60 * 24); // 将毫秒差转换为天数
|
||||
return diffInDays // 返回天数 0-n
|
||||
}
|
||||
|
||||
// 推送器
|
||||
function sendMessage(msgCurrentDict = "", msgPool = "", msgAppend = ""){
|
||||
|
||||
let shards = [] // 分割符分片数据,一级分割
|
||||
|
||||
if(msgCurrentDict != ""){
|
||||
// 独立推送
|
||||
console.log("🚀 消息推送:" + msgCurrentDict.note)
|
||||
// 消息分片
|
||||
// 方式1:按照指定分割符分片 separator
|
||||
shards = msgCurrentDict.msg.split(separator); // // 分割符分片数据,一级分割
|
||||
let chunks = []
|
||||
for(let i=0; i<shards.length; i++){
|
||||
strTrim = customTrim(shards[i]) + "\n\n" // 消息内间隔。去除首位空格和换行,然后在末尾拼接2个换行。
|
||||
chunks = splitMessage(strTrim) // 长度限制分割,二级分割
|
||||
// console.log(chunks)
|
||||
// console.log(chunks.length)
|
||||
for (let j = 0; j < chunks.length; j++) {
|
||||
pushMessage(chunks[j], msgCurrentDict.methodPush, "【" + msgCurrentDict.note + "】",)
|
||||
sleep(2000)
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
// 消息池推送
|
||||
console.log("🚀 艾默库消息池推送")
|
||||
// 消息分片
|
||||
// 方式1:按照指定分割符分片 separator
|
||||
msgPool += msgAppend // 追加数据
|
||||
shards = msgPool.split(separator);
|
||||
let chunks = []
|
||||
for(let i=0; i<shards.length;i++){
|
||||
strTrim = customTrim(shards[i]) + "\n\n" // 消息内间隔。去除首位空格和换行,然后在末尾拼接2个换行
|
||||
chunks = splitMessage(strTrim)
|
||||
// console.log(chunks)
|
||||
// console.log(chunks.length)
|
||||
for (let j = 0; j < chunks.length; j++) {
|
||||
// console.log(chunks[i])
|
||||
pushMessage(chunks[j], "@all", "【" + "艾默库消息池" + "】\n")
|
||||
sleep(2000)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// 发送消息
|
||||
function sendNotify(){
|
||||
ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
|
||||
// console.log("🍳 开始发送消息");
|
||||
let msgCurrentDict = ""
|
||||
let msgPool = ""
|
||||
let msgAppend = "" // 追加到消息池末尾的信息
|
||||
let shards = [] // 分割符分片数据,一级分割
|
||||
for (let i = 0; i < msgArray.length; i++) {
|
||||
msgCurrentDict = msgArray[i]
|
||||
// console.log(msgCurrentDict)
|
||||
// {"name":"aliyundrive_multiuser","note":"阿里云盘(多用户版)","msg":"","date":"","methodPush":"","flagPush":"@all"}
|
||||
// 从读取推送数据
|
||||
// if(msgCurrentDict.flagPush == "是" && msgCurrentDict.update != "" && msgCurrentDict.date == ""){ // 第一次执行时更新时间不为空,推送时间为空
|
||||
// }
|
||||
|
||||
// console.log(msgCurrentDict.date)
|
||||
// console.log(todayDate)
|
||||
// 消息池的先不推送,最后统一推送
|
||||
// 1. 消息池判断,使得消息池内的消息最后统一推送
|
||||
// 2. 是否推送判断,使得仅勾选是的才进行推送
|
||||
// 3. 推送时间判断,使得仅今天未推送才进行推送,如果今天已推送就不再推送了,目的是可以一天不同时间段任意设置多个定时PUSH推送脚本
|
||||
// 4. 过期消息判断,如果运行时间是2天前的消息就不再推送了
|
||||
// 5. 时间不一致判断,更新时间和推送时间不一致才推送,此判断也可以使昨天成功且今天未成功的情况不推送。即只有今天成功且未推送的情况才进行推送
|
||||
// 6. 时间一致额外推送判断。即一天多次运行,并多次推送
|
||||
// console.log(msgCurrentDict.update) 2024/9/29 脚本运行时间
|
||||
// console.log(msgCurrentDict.date) // 2024/10/30 上一次推送时间
|
||||
// todayDate = "2024/11/1" // 测试
|
||||
|
||||
// // 计算是否能额外推送
|
||||
// msgDict.dailyPushLimit // 当日可推送次数
|
||||
// msgDict.remainingDailyPushes // 当日剩余推送次数
|
||||
|
||||
// 1. 消息池判断
|
||||
// 2. 是否推送判断
|
||||
if(msgCurrentDict.pool == "否" && msgCurrentDict.flagPush == "是")
|
||||
{
|
||||
// 独立推送
|
||||
// 3.进行消息检测
|
||||
// 4.进行过期消息判断
|
||||
if(msgCurrentDict.msg != "" && dateDistance(msgCurrentDict.update, todayDate) <= 2 && dateDistance(msgCurrentDict.update, todayDate) >= 0)
|
||||
{
|
||||
// 5.时间不一致判断
|
||||
if(msgCurrentDict.update != msgCurrentDict.date && msgCurrentDict.date != todayDate )
|
||||
{
|
||||
// 时间不一致说明未推送。消息为空不进行推送。今天未推送
|
||||
// 进行推送
|
||||
|
||||
// pushMessage(msgCurrentDict.msg, msgCurrentDict.methodPush, "【" + msgCurrentDict.note + "】",)
|
||||
sendMessage(msgCurrentDict)
|
||||
|
||||
// 写入推送的时间
|
||||
// Application.Range("H" + (i + 2)).Value = todayDate
|
||||
if(version == 1){
|
||||
Application.Range("H" + msgCurrentDict.pos).Value = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value = parseInt(msgCurrentDict.dailyPushLimit) - 1
|
||||
}else{
|
||||
Application.Range("H" + msgCurrentDict.pos).Value2 = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value2 = parseInt(msgCurrentDict.dailyPushLimit) - 1
|
||||
}
|
||||
|
||||
|
||||
}else{
|
||||
// 6.时间一致额外推送判断
|
||||
// 时间一致,计算是否推送
|
||||
if(parseInt(msgCurrentDict.remainingDailyPushes) > 0){
|
||||
sendMessage(msgCurrentDict)
|
||||
if(version == 1){
|
||||
// 写入推送的时间
|
||||
Application.Range("H" + msgCurrentDict.pos).Value = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value = parseInt(msgCurrentDict.remainingDailyPushes) - 1
|
||||
}else{
|
||||
// 写入推送的时间
|
||||
Application.Range("H" + msgCurrentDict.pos).Value2 = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value2 = parseInt(msgCurrentDict.remainingDailyPushes) - 1
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}else{
|
||||
if(msgCurrentDict.pool == "是" && msgCurrentDict.flagPush == "是"){
|
||||
// 消息池推送
|
||||
// 3.进行消息检测
|
||||
// 4.进行过期消息判断
|
||||
if(msgCurrentDict.msg != "" && dateDistance(msgCurrentDict.update, todayDate) <= 2 && dateDistance(msgCurrentDict.update, todayDate) >= 0)
|
||||
{
|
||||
// 5.时间不一致判断
|
||||
if(msgCurrentDict.update != msgCurrentDict.date && msgCurrentDict.date != todayDate ){
|
||||
// 时间不一致说明未推送。
|
||||
|
||||
// 进行消息池生成
|
||||
// 对分片消息进行特异化处理,只取第一条分片,后续分片放在消息池的末尾
|
||||
shards = msgCurrentDict.msg.split(separator); // // 分割符分片数据,一级分割
|
||||
// console.log(shards)
|
||||
msgPool += "【" + msgCurrentDict.note + "】" + shards[0] + "\n" // 取分割后的第一条
|
||||
for(let j=1; j<shards.length; j++){ // 后续一级分割分片数据放入追加数据当中
|
||||
msgAppend += "【" + msgCurrentDict.note + "】" + shards[j] + "\n" // 取分割后的第一条
|
||||
}
|
||||
|
||||
if(version == 1){
|
||||
// 写入推送的时间
|
||||
// Application.Range("H" + (i + 2)).Value = todayDate
|
||||
Application.Range("H" + msgCurrentDict.pos).Value = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value = parseInt(msgCurrentDict.dailyPushLimit) - 1
|
||||
}else{
|
||||
// 写入推送的时间
|
||||
// Application.Range("H" + (i + 2)).Value = todayDate
|
||||
Application.Range("H" + msgCurrentDict.pos).Value2 = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value2 = parseInt(msgCurrentDict.dailyPushLimit) - 1
|
||||
}
|
||||
|
||||
}else{
|
||||
// 6.时间一致额外推送判断
|
||||
// 时间一致,计算是否推送
|
||||
if(parseInt(msgCurrentDict.remainingDailyPushes) > 0){
|
||||
// 进行消息池生成
|
||||
// 对分片消息进行特异化处理,只取第一条分片,后续分片放在消息池的末尾
|
||||
shards = msgCurrentDict.msg.split(separator); // // 分割符分片数据,一级分割
|
||||
// console.log(shards)
|
||||
msgPool += "【" + msgCurrentDict.note + "】" + shards[0] + "\n" // 取分割后的第一条
|
||||
for(let j=1; j<shards.length; j++){ // 后续一级分割分片数据放入追加数据当中
|
||||
msgAppend += "【" + msgCurrentDict.note + "】" + shards[j] + "\n" // 取分割后的第一条
|
||||
}
|
||||
|
||||
if(version == 1){
|
||||
// 写入推送的时间
|
||||
Application.Range("H" + msgCurrentDict.pos).Value = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value = parseInt(msgCurrentDict.remainingDailyPushes) - 1
|
||||
}else{
|
||||
// 写入推送的时间
|
||||
Application.Range("H" + msgCurrentDict.pos).Value2 = todayDate
|
||||
// 更新推送次数。读取当日可推送次数,写入当日剩余推送次数。写入当日剩余推送次数 = 当日可推送次数 - 1
|
||||
Application.Range("N" + msgCurrentDict.pos).Value2 = parseInt(msgCurrentDict.remainingDailyPushes) - 1
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// console.log("🧩 加入消息池:" + msgCurrentDict.note)
|
||||
// msgPool += "【" + msgCurrentDict.note + "】" + msgCurrentDict.msg + "\n"
|
||||
|
||||
|
||||
|
||||
}else{
|
||||
// console.log("🍳 不进行推送:" + msgCurrentDict.note)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// console.log(msgPool)
|
||||
// 消息池推送,消息池默认以@all方式推送
|
||||
let msgPoolJuice = msgPool.replace(/\n/g, ''); // 判断消息池内是否有数据
|
||||
// console.log(msgPoolJuice)
|
||||
if(msgPoolJuice != ""){ // 消息池内有消息才推送
|
||||
|
||||
// pushMessage(msgPool, "@all", "【" + "艾默库消息池" + "】\n")
|
||||
sendMessage("", msgPool, msgAppend)
|
||||
|
||||
|
||||
}
|
||||
|
||||
console.log("🎉 推送结束")
|
||||
}
|
||||
|
||||
// 使用正则表达式匹配以'http://'或'https://'开头的字符串
|
||||
function isHttpOrHttpsUrl(url) {
|
||||
// '^'表示字符串的开始,'i'表示不区分大小写
|
||||
const regex = /^(http:\/\/|https:\/\/)/i;
|
||||
// match() 方法返回一个包含匹配结果的数组,如果没有匹配项则返回 null
|
||||
return url.match(regex) !== null;
|
||||
}
|
||||
|
||||
// 消息分割,返回消息推送方式数组
|
||||
function pushSplit(method){
|
||||
// console.log(method)
|
||||
let arry = []
|
||||
arry = method.split("&") // 使用&作为分隔符
|
||||
// console.log(arry)
|
||||
return arry
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function pushMessage(message, method, pushHeader){
|
||||
messagePushHeader = pushHeader
|
||||
if (method == "@all") { // 所有渠道都推送
|
||||
// console.log("🚀 所有渠道都推送");
|
||||
// message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let length = jsonPush.length;
|
||||
let name;
|
||||
let key;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
name = jsonPush[i].name;
|
||||
key = jsonPush[i].key;
|
||||
|
||||
let keySub = pushSplit(key)
|
||||
for (let i = 0; i < keySub.length; i++) {
|
||||
pushUnit(message, keySub[i], name)
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// console.log("🚀 多消息推送");
|
||||
let arry = pushSplit(method)
|
||||
let methodCurrent = ""
|
||||
|
||||
let length = jsonPush.length;
|
||||
let name;
|
||||
let key;
|
||||
|
||||
for (let i = 0; i < arry.length; i++) {
|
||||
methodCurrent = arry[i]
|
||||
// console.log(methodCurrent)
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if(name == methodCurrent){
|
||||
// console.log(methodCurrent)
|
||||
if (jsonPush[i].flag == 1) {
|
||||
key = jsonPush[i].key;
|
||||
|
||||
let keySub = pushSplit(key)
|
||||
for (let i = 0; i < keySub.length; i++) {
|
||||
pushUnit(message, keySub[i], name)
|
||||
}
|
||||
|
||||
}
|
||||
break; // 找到推送方式就提前退出
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送执行
|
||||
function pushUnit(message, key, name){
|
||||
try{
|
||||
if (name == "bark") {
|
||||
bark(message, key);
|
||||
} else if (name == "pushplus") {
|
||||
pushplus(message, key);
|
||||
} else if (name == "ServerChan") {
|
||||
serverchan(message, key);
|
||||
} else if (name == "email") {
|
||||
email(message);
|
||||
} else if (name == "dingtalk") {
|
||||
dingtalk(message, key);
|
||||
} else if (name == "discord") {
|
||||
discord(message, key);
|
||||
}else if (name == "qywx"){
|
||||
qywx(message, key);
|
||||
} else if (name == "xizhi") {
|
||||
xizhi(message, key);
|
||||
}else if (name == "jishida"){
|
||||
jishida(message, key);
|
||||
}else if (name == "wxpusher"){
|
||||
wxpusher(message, key)
|
||||
}
|
||||
}catch{
|
||||
console.log("📢 存在推送失败:" + name)
|
||||
}
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
message = encodeURIComponent(message)
|
||||
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key + "/" + message + "/" + "?icon=" + BARK_ICON
|
||||
}else{
|
||||
url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
|
||||
}
|
||||
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
// console.log(resp.json())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
message = encodeURIComponent(message)
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key + "&content=" + message + "&title=" + messagePushHeader;
|
||||
}else{
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + messagePushHeader; // 增加标题
|
||||
}
|
||||
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
// let resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// });
|
||||
headers = {}
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送serverchan消息,方糖
|
||||
function serverchan(message, key) {
|
||||
message = message.replace(/\n/g, '\n\n'); // 单独适配,将一个换行变成两个,以实现换行
|
||||
message = encodeURIComponent(message)
|
||||
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key + "?title=" + messagePushHeader + "&desp=" + message;
|
||||
}else{
|
||||
url = "https://sctapi.ftqq.com/" + key + ".send?title=" + messagePushHeader + "&desp=" + message;
|
||||
}
|
||||
|
||||
// let resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// });
|
||||
headers = {}
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("🍳 已发送邮件至:" + sender);
|
||||
console.log("🍳 已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
// console.log("🍳 开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1 || 1) { // 始终读取
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("🍳 开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key
|
||||
}else{
|
||||
url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
}
|
||||
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 企业微信群推送机器人
|
||||
function qywx(message, key) {
|
||||
message = messagePushHeader + "\n" + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key
|
||||
}else{
|
||||
url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=" + key;
|
||||
}
|
||||
|
||||
data = {
|
||||
"msgtype": "text",
|
||||
"text": {
|
||||
"content": message
|
||||
}
|
||||
}
|
||||
let resp = HTTP.post(url, data);
|
||||
// console.log(resp.json())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 息知 https://xizhi.qqoq.net/{key}.send?title=标题&content=内容
|
||||
function xizhi(message, key) {
|
||||
message = message.replace(/\n/g, '\n\n'); // 单独适配,将一个换行变成两个,以实现换行
|
||||
message = encodeURIComponent(message)
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key + "?title=" + messagePushHeader + "&content=" + message;
|
||||
}else{
|
||||
url = "https://xizhi.qqoq.net/" + key + ".send?title=" + messagePushHeader + "&content=" + message; // 增加标题
|
||||
}
|
||||
// let resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// });
|
||||
headers = {}
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// jishida http://push.ijingniu.cn/send?key=&head=&body=
|
||||
function jishida(message, key) {
|
||||
message = encodeURIComponent(message)
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key + "&head=" + messagePushHeader + "&body=" + message;
|
||||
}else{
|
||||
url = "http://push.ijingniu.cn/send?key=" + key + "&head=" + messagePushHeader + "&body=" + message; // 增加标题
|
||||
}
|
||||
// let resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// });
|
||||
headers = {}
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// wxpusher 适配两种模式:极简推送、标准推送
|
||||
function wxpusher(message, key) {
|
||||
message = message.replace(/\n/g, '<br>'); // 单独适配,将/n换行变成<br>,以实现换行
|
||||
message = encodeURIComponent(message)
|
||||
let keyarry= key.split("|") // 使用|作为分隔符
|
||||
if(keyarry.length == 1){
|
||||
// console.log("采用SPT极简推送")
|
||||
// https://wxpusher.zjiecode.com/api/send/message/你获取到的SPT/你要发送的内容
|
||||
// https://wxpusher.zjiecode.com/api/send/message/xxxx/ThisIsSendContent
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
// end = key.slice(-1)
|
||||
if(key.endsWith("/")){
|
||||
// 形如:https://wxpusher.zjiecode.com/api/send/message/你获取到的SPT/
|
||||
url = key + message
|
||||
}else if(key.endsWith("ThisIsSendContent")){
|
||||
// 形如:https://wxpusher.zjiecode.com/api/send/message/xxxx/ThisIsSendContent
|
||||
key = key.slice(0, -"ThisIsSendContent".length); // 去掉末尾的"ThisIsSendContent"
|
||||
url = key + message
|
||||
}else{
|
||||
// 形如:https://wxpusher.zjiecode.com/api/send/message/你获取到的SPT
|
||||
url = key + "/" + message
|
||||
}
|
||||
}else{
|
||||
// 形如:你获取到的SPT
|
||||
url = "https://wxpusher.zjiecode.com/api/send/message/" + key + "/" + message
|
||||
}
|
||||
// console.log(url)
|
||||
// let resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// });
|
||||
headers = {}
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
// console.log(resp.text())
|
||||
}else{
|
||||
// console.log("采用标准推送")
|
||||
let appToken = keyarry[0]
|
||||
let uid = keyarry[1]
|
||||
let url = ""
|
||||
if(isHttpOrHttpsUrl(key)){ // 以http开头
|
||||
url = key + "&verifyPayType=0&content=" + message
|
||||
}else{
|
||||
url = "https://wxpusher.zjiecode.com/api/send/message/?appToken=" + appToken + "&uid=" + uid + "&verifyPayType=0&content=" + message
|
||||
}
|
||||
// console.log(url)
|
||||
// let resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// });
|
||||
headers = {}
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
// console.log(resp.json())
|
||||
}
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,477 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/TEMPLATE.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/TEMPLATE.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/TEMPLATE.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: ca814940e5cbd3784e70cfaaa7afb736e723a557b0a6169c20fa88a55a484c90
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
// 某雪(修改这里,这里填是什么名称)
|
||||
// 20240512 (修改这里)
|
||||
|
||||
var sheetNameSubConfig = "mouxue"; // 分配置表名称(修改这里,这里填表的名称,需要和UPDATE文件中的一致,自定义的)
|
||||
var pushHeader = "【某雪论坛】"; //(修改这里,这里给自己看的,随便填)
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
|
||||
var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。
|
||||
var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识
|
||||
var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息
|
||||
var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
}; // 有效邮箱配置
|
||||
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("开始读取主配置表");
|
||||
let name; // 名称
|
||||
let onlyError;
|
||||
let nickname;
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
name = Application.Range("A" + i).Text;
|
||||
onlyError = Application.Range("C" + i).Text;
|
||||
nickname = Application.Range("D" + i).Text;
|
||||
if (name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
if (name == sheetNameSubConfig) {
|
||||
if (onlyError == "是") {
|
||||
messageOnlyError = 1;
|
||||
console.log("只推送错误消息");
|
||||
}
|
||||
|
||||
if (nickname == "是") {
|
||||
messageNickname = 1;
|
||||
console.log("单元格用昵称替代");
|
||||
}
|
||||
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
|
||||
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
|
||||
if (flagSubConfig == 1) {
|
||||
console.log("开始读取分配置表");
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
execHandle(cookie, i);
|
||||
}
|
||||
}
|
||||
|
||||
message = messageMerge()// 将消息数组融合为一条总消息
|
||||
push(message); // 推送消息
|
||||
}
|
||||
|
||||
// 将消息数组融合为一条总消息
|
||||
function messageMerge(){
|
||||
for(i=0; i<messageArray.length; i++){
|
||||
if(messageArray[i] != "" && messageArray[i] != null)
|
||||
{
|
||||
message += messageHeader[i] + messageArray[i] + " "; // 加上推送头
|
||||
}
|
||||
}
|
||||
if(message != "")
|
||||
{
|
||||
console.log(message) // 打印总消息
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function push(message) {
|
||||
if (message != "") {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let length = jsonPush.length;
|
||||
let name;
|
||||
let key;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
name = jsonPush[i].name;
|
||||
key = jsonPush[i].key;
|
||||
if (name == "bark") {
|
||||
bark(message, key);
|
||||
} else if (name == "pushplus") {
|
||||
pushplus(message, key);
|
||||
} else if (name == "ServerChan") {
|
||||
serverchan(message, key);
|
||||
} else if (name == "email") {
|
||||
email(message);
|
||||
} else if (name == "dingtalk") {
|
||||
dingtalk(message, key);
|
||||
} else if (name == "discord") {
|
||||
discord(message, key);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("消息为空不推送");
|
||||
}
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
if (key != "") {
|
||||
let url = "https://api.day.app/" + key + "/" + message;
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
if (key != "") {
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送serverchan消息
|
||||
function serverchan(message, key) {
|
||||
if (key != "") {
|
||||
url =
|
||||
"https://sctapi.ftqq.com/" +
|
||||
key +
|
||||
".send" +
|
||||
"?title=消息推送" +
|
||||
"&desp=" +
|
||||
message;
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("已发送邮件至:" + sender);
|
||||
console.log("已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
console.log("开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// cookie字符串转json格式
|
||||
function cookie_to_json(cookies) {
|
||||
var cookie_text = cookies;
|
||||
var arr = [];
|
||||
var text_to_split = cookie_text.split(";");
|
||||
for (var i in text_to_split) {
|
||||
var tmp = text_to_split[i].split("=");
|
||||
arr.push('"' + tmp.shift().trim() + '":"' + tmp.join(":").trim() + '"');
|
||||
}
|
||||
var res = "{\n" + arr.join(",\n") + "\n}";
|
||||
return JSON.parse(res);
|
||||
}
|
||||
|
||||
// 获取10 位时间戳
|
||||
function getts10() {
|
||||
var ts = Math.round(new Date().getTime() / 1000).toString();
|
||||
return ts;
|
||||
}
|
||||
|
||||
// 获取13位时间戳
|
||||
function getts13(){
|
||||
// var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳
|
||||
let ts = new Date().getTime()
|
||||
return ts
|
||||
}
|
||||
|
||||
// 符合UUID v4规范的随机字符串 b9ab98bb-b8a9-4a8a-a88a-9aab899a88b9
|
||||
function generateUUID() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||
var r = Math.random() * 16 | 0,
|
||||
v = c === 'x' ? r : (r & 0x3 | 0x8);
|
||||
return v.toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function getUUIDDigits(length) {
|
||||
var uuid = generateUUID();
|
||||
return uuid.replace(/-/g, '').substr(16, length);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 获取sign,返回小写
|
||||
function getsign(data) {
|
||||
var sign = Crypto.createHash("md5")
|
||||
.update(data, "utf8")
|
||||
.digest("hex")
|
||||
// .toUpperCase() // 大写
|
||||
.toString();
|
||||
return sign;
|
||||
}
|
||||
|
||||
|
||||
// 具体的执行函数
|
||||
function execHandle(cookie, pos) {
|
||||
let messageSuccess = "";
|
||||
let messageFail = "";
|
||||
let messageName = "";
|
||||
// 推送昵称或单元格,还是不推送位置标识
|
||||
if (messageNickname == 1) {
|
||||
// 推送昵称或单元格
|
||||
messageName = Application.Range("C" + pos).Text;
|
||||
if(messageName == "")
|
||||
{
|
||||
messageName = "单元格A" + pos + "";
|
||||
}
|
||||
}
|
||||
|
||||
posLabel = pos-2 ; // 存放下标,从0开始
|
||||
messageHeader[posLabel] = messageName
|
||||
|
||||
// =================修改这块区域,区域开始=================
|
||||
|
||||
url1 = "https://bbs.mouxue.com/user-signin.htm"; // url(修改这里,这里填抓包获取到的地址)
|
||||
|
||||
// (修改这里,这里填抓包获取header,全部抄进来就可以了,按照如下用引号包裹的格式,其中小写的cookie是从表格中读取到的值。)
|
||||
headers= {
|
||||
"Cookie": cookie,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70",
|
||||
}
|
||||
|
||||
// (修改这里,这里填抓包获取data,全部抄进来就可以了,按照如下用引号包裹的格式。POST请求才需要这个,GET请求就不用它了)
|
||||
data = {
|
||||
"csrf_token":"",
|
||||
}
|
||||
|
||||
// (修改这里,以下请求方式三选一即可)
|
||||
// 请求方式1:POST请求,抓包的data数据格式是 {"aaa":"xxx","bbb":"xxx"} 。则用这个
|
||||
resp = HTTP.post(
|
||||
url1,
|
||||
JSON.stringify(data),
|
||||
{ headers: headers }
|
||||
);
|
||||
|
||||
// // 请求方式2:POST请求,抓包的data数据格式是 aaa=xxx&bbb=xxx 。则用这个
|
||||
// resp = HTTP.post(
|
||||
// url1,
|
||||
// data,
|
||||
// { headers: headers }
|
||||
// );
|
||||
|
||||
// // 请求方式3:GET请求,无data数据。则用这个
|
||||
// resp = HTTP.get(
|
||||
// url1,
|
||||
// { headers: headers }
|
||||
// );
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
console.log(resp)
|
||||
|
||||
// (修改这里,这里就是自己写了,根据抓包的响应自行修改)
|
||||
|
||||
// 接收到的响应数据是json格式,如下,假设有2种情况
|
||||
// 情况1:{"code": "0","message": "签到成功"}
|
||||
// 情况2:{"code":"-1","message":"签到失败"}
|
||||
respcode = resp["code"] // 通过resp["键名"]的方式获取值.假设响应数据是情况1,则读取到数字“0”
|
||||
// respmsg = resp["message"] // 通过resp["键名"]的方式获取值,假设响应数据是情况1,这里取到的值就是“签到成功”
|
||||
if(respcode == 0) // 通过code值来判断是不是签到成功,由抓包的情况1知道,0代表签到成功了,所以让code与0比较
|
||||
{
|
||||
// 这里是签到成功
|
||||
content = "签到成功 " // // 给自己看的,双引号内可以随便写
|
||||
|
||||
messageSuccess += content;
|
||||
console.log(content)
|
||||
}
|
||||
else
|
||||
{
|
||||
// 这里是签到失败
|
||||
msg = "签到失败 " // 给自己看的,可以随便写,如 msg = "失败啦! " 。
|
||||
|
||||
content = msg + " "
|
||||
messageFail += content;
|
||||
console.log(content)
|
||||
}
|
||||
|
||||
} else {
|
||||
content = "签到失败 "
|
||||
messageFail += content;
|
||||
console.log(content);
|
||||
}
|
||||
|
||||
// =================修改这块区域,区域结束=================
|
||||
|
||||
sleep(2000);
|
||||
if (messageOnlyError == 1) {
|
||||
messageArray[posLabel] = messageFail;
|
||||
} else {
|
||||
messageArray[posLabel] = messageFail + " " + messageSuccess;
|
||||
}
|
||||
|
||||
if(messageArray[posLabel] != "")
|
||||
{
|
||||
console.log(messageArray[posLabel]);
|
||||
}
|
||||
}
|
||||
29
脚本库/web版/账密/bjxd/2025-06-28_bjxd_e4c2c483.js
Normal file
29
脚本库/web版/账密/bjxd/2025-06-28_bjxd_e4c2c483.js
Normal file
File diff suppressed because one or more lines are too long
758
脚本库/web版/账密/deepseek分析工具/2025-08-25_deepseek_127895dc.js
Normal file
758
脚本库/web版/账密/deepseek分析工具/2025-08-25_deepseek_127895dc.js
Normal file
File diff suppressed because one or more lines are too long
1116
脚本库/web版/账密/notify/2026-04-01_notify_76a2a83d.py
Normal file
1116
脚本库/web版/账密/notify/2026-04-01_notify_76a2a83d.py
Normal file
File diff suppressed because it is too large
Load Diff
786
脚本库/web版/账密/parsdata/2025-08-25_parsdata_45c06ac4.js
Normal file
786
脚本库/web版/账密/parsdata/2025-08-25_parsdata_45c06ac4.js
Normal file
File diff suppressed because one or more lines are too long
485
脚本库/web版/账密/vivo社区/2025-08-25_vivo_572c90bb.js
Normal file
485
脚本库/web版/账密/vivo社区/2025-08-25_vivo_572c90bb.js
Normal file
@@ -0,0 +1,485 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/vivo.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/vivo.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/vivo.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: 572c90bb000b944d156e0272a67a372ae37e710b553502a9a53dcf19d0bbc9c4
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
name: "vivo社区"
|
||||
cron: 45 0 9 * * *
|
||||
脚本兼容: 金山文档(1.0),金山文档(2.0)
|
||||
更新时间:20241226
|
||||
环境变量名:无
|
||||
环境变量值:无
|
||||
备注:需要Cookie。
|
||||
cookie填写vivo社区网页版中获取的refresh_token。F12 -> NetWork(中文名叫"网络") -> 按一下Ctrl+R -> newbbs/ -> cookie
|
||||
vivo社区网址:https://bbs.vivo.com.cn/newbbs/
|
||||
*/
|
||||
|
||||
var sheetNameSubConfig = "vivo"; // 分配置表名称
|
||||
var pushHeader = "【vivo社区】";
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
|
||||
var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。
|
||||
var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识
|
||||
var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息
|
||||
var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
}; // 有效邮箱配置
|
||||
|
||||
// =================青龙适配开始===================
|
||||
|
||||
qlSwitch = 0
|
||||
|
||||
// =================青龙适配结束===================
|
||||
|
||||
// =================金山适配开始===================
|
||||
// airscript检测版本
|
||||
function checkVesion(){
|
||||
try{
|
||||
let temp = Application.Range("A1").Text;
|
||||
Application.Range("A1").Value = temp
|
||||
console.log("😶🌫️ 检测到当前airscript版本为1.0,进行1.0适配")
|
||||
}catch{
|
||||
console.log("😶🌫️ 检测到当前airscript版本为2.0,进行2.0适配")
|
||||
version = 2
|
||||
}
|
||||
}
|
||||
|
||||
// 推送相关
|
||||
// 获取时间
|
||||
function getDate(){
|
||||
let currentDate = new Date();
|
||||
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
|
||||
return currentDate
|
||||
}
|
||||
|
||||
// 将消息写入CONFIG表中作为消息队列,之后统一发送
|
||||
function writeMessageQueue(message){
|
||||
// 当天时间
|
||||
let todayDate = getDate()
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("✨ 开始将结果写入主配置表");
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
if(version == 1){
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value2 = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value2 = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function push(message) {
|
||||
writeMessageQueue(message) // 将消息写入CONFIG表中
|
||||
// if (message != "") {
|
||||
// // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
// let length = jsonPush.length;
|
||||
// let name;
|
||||
// let key;
|
||||
// for (let i = 0; i < length; i++) {
|
||||
// if (jsonPush[i].flag == 1) {
|
||||
// name = jsonPush[i].name;
|
||||
// key = jsonPush[i].key;
|
||||
// if (name == "bark") {
|
||||
// bark(message, key);
|
||||
// } else if (name == "pushplus") {
|
||||
// pushplus(message, key);
|
||||
// } else if (name == "ServerChan") {
|
||||
// serverchan(message, key);
|
||||
// } else if (name == "email") {
|
||||
// email(message);
|
||||
// } else if (name == "dingtalk") {
|
||||
// dingtalk(message, key);
|
||||
// } else if (name == "discord") {
|
||||
// discord(message, key);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// console.log("🍳 消息为空不推送");
|
||||
// }
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
if (key != "") {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
message = encodeURIComponent(message)
|
||||
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
|
||||
let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
if (key != "") {
|
||||
message = encodeURIComponent(message)
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送serverchan消息
|
||||
function serverchan(message, key) {
|
||||
if (key != "") {
|
||||
url =
|
||||
"https://sctapi.ftqq.com/" +
|
||||
key +
|
||||
".send" +
|
||||
"?title=" + messagePushHeader +
|
||||
"&desp=" +
|
||||
message;
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("🍳 已发送邮件至:" + sender);
|
||||
console.log("🍳 已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
console.log("🍳 开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("🍳 开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// =================金山适配结束===================
|
||||
// =================共用开始===================
|
||||
// main() // 入口
|
||||
|
||||
// function main(){
|
||||
checkVesion() // 版本检测,以进行不同版本的适配
|
||||
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("🍳 开始读取主配置表");
|
||||
let name; // 名称
|
||||
let onlyError;
|
||||
let nickname;
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
name = Application.Range("A" + i).Text;
|
||||
onlyError = Application.Range("C" + i).Text;
|
||||
nickname = Application.Range("D" + i).Text;
|
||||
if (name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
if (name == sheetNameSubConfig) {
|
||||
if (onlyError == "是") {
|
||||
messageOnlyError = 1;
|
||||
console.log("🍳 只推送错误消息");
|
||||
}
|
||||
|
||||
if (nickname == "是") {
|
||||
messageNickname = 1;
|
||||
console.log("🍳 单元格用昵称替代");
|
||||
}
|
||||
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("🍳 开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
|
||||
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
|
||||
if (flagSubConfig == 1) {
|
||||
console.log("🍳 开始读取分配置表");
|
||||
|
||||
if(qlSwitch != 1){ // 金山文档
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
execHandle(cookie, i);
|
||||
}
|
||||
}
|
||||
message = messageMerge()// 将消息数组融合为一条总消息
|
||||
push(message); // 推送消息
|
||||
}else{
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
console.log("🧑 开始执行用户:" + "1" )
|
||||
execHandle(cookie, i);
|
||||
break; // 只取一个
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// }
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("🥚 激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("🍳 无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将消息数组融合为一条总消息
|
||||
function messageMerge(){
|
||||
// console.log(messageArray)
|
||||
let message = ""
|
||||
for(i=0; i<messageArray.length; i++){
|
||||
if(messageArray[i] != "" && messageArray[i] != null)
|
||||
{
|
||||
message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头
|
||||
}
|
||||
}
|
||||
if(message != "")
|
||||
{
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
console.log(message + "\n") // 打印总消息
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// 获取sign,返回小写
|
||||
function getsign(data) {
|
||||
var sign = Crypto.createHash("md5")
|
||||
.update(data, "utf8")
|
||||
.digest("hex")
|
||||
// .toUpperCase() // 大写
|
||||
.toString();
|
||||
return sign;
|
||||
}
|
||||
|
||||
// =================共用结束===================
|
||||
|
||||
// cookie字符串转json格式
|
||||
function cookie_to_json(cookies) {
|
||||
var cookie_text = cookies;
|
||||
var arr = [];
|
||||
var text_to_split = cookie_text.split(";");
|
||||
for (var i in text_to_split) {
|
||||
var tmp = text_to_split[i].split("=");
|
||||
arr.push('"' + tmp.shift().trim() + '":"' + tmp.join(":").trim() + '"');
|
||||
}
|
||||
var res = "{\n" + arr.join(",\n") + "\n}";
|
||||
return JSON.parse(res);
|
||||
}
|
||||
|
||||
// 获取10 位时间戳
|
||||
function getts10() {
|
||||
var ts = Math.round(new Date().getTime() / 1000).toString();
|
||||
return ts;
|
||||
}
|
||||
|
||||
// 获取13位时间戳
|
||||
function getts13(){
|
||||
// var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳
|
||||
let ts = new Date().getTime()
|
||||
return ts
|
||||
}
|
||||
|
||||
// 符合UUID v4规范的随机字符串 b9ab98bb-b8a9-4a8a-a88a-9aab899a88b9
|
||||
function generateUUID() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||
var r = Math.random() * 16 | 0,
|
||||
v = c === 'x' ? r : (r & 0x3 | 0x8);
|
||||
return v.toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function getUUIDDigits(length) {
|
||||
var uuid = generateUUID();
|
||||
return uuid.replace(/-/g, '').substr(16, length);
|
||||
}
|
||||
|
||||
function lottery(url,headers,data,count){messageSuccess="";messageFail="";resp=HTTP['\u0070\u006F\u0073\u0074'](url,JSON['\u0073\u0074\u0072\u0069\u006E\u0067\u0069\u0066\u0079'](data),{'\u0068\u0065\u0061\u0064\u0065\u0072\u0073':headers});if(resp['\u0073\u0074\u0061\u0074\u0075\u0073']==(194721^194665)){resp=resp['\u006A\u0073\u006F\u006E']();code=resp["code"];if(code==(666571^666571)){prizeName=resp["\u0064\u0061\u0074\u0061"]["data"]["prizeName"];content="\uD83C\uDF08\u0020"+"\u7B2C"+count+"\u62BD\u5956\uFF1A"+prizeName+"\u000A";messageSuccess+=content;console['\u006C\u006F\u0067'](content);}else{respmsg=resp["\u006D\u0073\u0067"];content=" \uDCE2\uD83D".split("").reverse().join("")+"\u7B2C"+count+"\u62BD\u5956"+respmsg+"\u000A";messageFail+=content;console['\u006C\u006F\u0067'](content);}}else{content=" \uDCE2\uD83D".split("").reverse().join("")+"\u7B2C"+count+"\u62BD\u5956\u5931\u8D25\u000A";messageFail+=content;console['\u006C\u006F\u0067'](content);}msg=[messageSuccess,messageFail];return msg;}
|
||||
function execHandle(cookie,pos,_0x2dfg,_0xdc9d8a,_0xbaf5ae){var _0x0180ga=(751269^751277)+(118745^118746);_0x2dfg="";_0x0180ga='\u0066\u0065\u0069\u006A\u006A\u0062';_0xdc9d8a="";_0xbaf5ae="";if(messageNickname==(335776^335777)){_0xbaf5ae=Application['\u0052\u0061\u006E\u0067\u0065']("\u0043"+pos)['\u0054\u0065\u0078\u0074'];if(_0xbaf5ae==""){_0xbaf5ae="\u5355\u5143\u683C\u0041"+pos+"";}}posLabel=pos-(660894^660892);messageHeader[posLabel]=" \uDE80\uD83D\u200D\uDC68\uD83D".split("").reverse().join("")+_0xbaf5ae;var _0x6d9fd="tsiLyrettol/nIngis/ytinummoc/ipa/nc.moc.oviv.sbb//:sptth".split("").reverse().join("");var _0x19a="\u0068\u0074\u0074\u0070\u0073\u003A\u002F\u002F\u0062\u0062\u0073\u002E\u0076\u0069\u0076\u006F\u002E\u0063\u006F\u006D\u002E\u0063\u006E\u002F\u0061\u0070\u0069\u002F\u0063\u006F\u006D\u006D\u0075\u006E\u0069\u0074\u0079\u002F\u0073\u0069\u0067\u006E\u0049\u006E\u002F\u0071\u0075\u0065\u0072\u0079\u0053\u0069\u0067\u006E\u0049\u006E\u0066\u006F";var _0x8fe=(158797^158792)+(899890^899899);var _0xf886cf="\u0068\u0074\u0074\u0070\u0073\u003A\u002F\u002F\u0062\u0062\u0073\u002E\u0076\u0069\u0076\u006F\u002E\u0063\u006F\u006D\u002E\u0063\u006E\u002F\u0061\u0070\u0069\u002F\u0063\u006F\u006D\u006D\u0075\u006E\u0069\u0074\u0079\u002F\u0073\u0069\u0067\u006E\u0049\u006E\u002F\u0073\u0069\u0067\u006E\u0049\u006E\u004C\u006F\u0074\u0074\u0065\u0072\u0079";_0x8fe="ajmhbe".split("").reverse().join("");lotteryNum=800031^800028;headers={"\u0048\u006F\u0073\u0074":"\u0062\u0062\u0073\u002E\u0076\u0069\u0076\u006F\u002E\u0063\u006F\u006D\u002E\u0063\u006E","\u0043\u006F\u006F\u006B\u0069\u0065":cookie,"Content-Type":"\u0061\u0070\u0070\u006C\u0069\u0063\u0061\u0074\u0069\u006F\u006E\u002F\u006A\u0073\u006F\u006E\u003B\u0063\u0068\u0061\u0072\u0073\u0065\u0074\u003D\u0075\u0074\u0066\u002D\u0038","User-Agent":"\u004D\u006F\u007A\u0069\u006C\u006C\u0061\u002F\u0035\u002E\u0030\u0020\u0028\u0057\u0069\u006E\u0064\u006F\u0077\u0073\u0020\u004E\u0054\u0020\u0031\u0030\u002E\u0030\u003B\u0020\u0057\u0069\u006E\u0036\u0034\u003B\u0020\u0078\u0036\u0034\u0029\u0020\u0041\u0070\u0070\u006C\u0065\u0057\u0065\u0062\u004B\u0069\u0074\u002F\u0035\u0033\u0037\u002E\u0033\u0036\u0020\u0028\u004B\u0048\u0054\u004D\u004C\u002C\u0020\u006C\u0069\u006B\u0065\u0020\u0047\u0065\u0063\u006B\u006F\u0029\u0020\u0043\u0068\u0072\u006F\u006D\u0065\u002F\u0034\u0036\u002E\u0030\u002E\u0032\u0034\u0038\u0036\u002E\u0030\u0020\u0053\u0061\u0066\u0061\u0072\u0069\u002F\u0035\u0033\u0037\u002E\u0033\u0036\u0020\u0045\u0064\u0067\u0065\u002F\u0031\u0033\u002E\u0031\u0030\u0035\u0038\u0036"};data={"signInId":1};resp=HTTP['\u0070\u006F\u0073\u0074'](_0x19a,JSON['\u0073\u0074\u0072\u0069\u006E\u0067\u0069\u0066\u0079'](data),{"headers":headers});if(resp['\u0073\u0074\u0061\u0074\u0075\u0073']==(716349^716533)){resp=resp['\u006A\u0073\u006F\u006E']();code=resp["\u0063\u006F\u0064\u0065"];if(code==(246515^246515)){content="\uD83C\uDF89\u0020"+" \u529F\u6210\u5230\u7B7E".split("").reverse().join("");_0x2dfg+=content;console['\u006C\u006F\u0067'](content);}else{content=" \u274C".split("").reverse().join("")+"\u7B7E\u5230\u5931\u8D25\u0020";_0xdc9d8a+=content;console['\u006C\u006F\u0067'](content);}}else{content="\u274C\u0020"+"\u7B7E\u5230\u5931\u8D25\u0020";_0xdc9d8a+=content;console['\u006C\u006F\u0067'](content);}data={"\u006C\u006F\u0074\u0074\u0065\u0072\u0079\u0041\u0063\u0074\u0069\u0076\u0069\u0074\u0079\u0049\u0064":1,"\u006C\u006F\u0074\u0074\u0065\u0072\u0079\u0054\u0079\u0070\u0065":0};for(i=830706^830706;i<lotteryNum;i++){console['\u006C\u006F\u0067']("\uD83C\uDF73\u0020\u7B2C"+(i+(563073^563072))+"\u6B21\u62BD\u5956");msg=lottery(_0xf886cf,headers,data,i+(922456^922457));_0x2dfg+=msg[227906^227906];_0xdc9d8a+=msg[110596^110597];}sleep(608555^610043);if(messageOnlyError==(140754^140755)){messageArray[posLabel]=_0xdc9d8a;}else{if(_0xdc9d8a!=""){messageArray[posLabel]=_0xdc9d8a+"\u0020"+_0x2dfg;}else{messageArray[posLabel]=_0x2dfg;}}if(messageArray[posLabel]!=""){console['\u006C\u006F\u0067'](messageArray[posLabel]);}}
|
||||
284
脚本库/web版/账密/vx植物星球/2025-06-28_植物星球_dc1b34d5.js
Normal file
284
脚本库/web版/账密/vx植物星球/2025-06-28_植物星球_dc1b34d5.js
Normal file
File diff suppressed because one or more lines are too long
378
脚本库/web版/账密/wangchao/2026-05-14_wangchao_5766bea9.py
Normal file
378
脚本库/web版/账密/wangchao/2026-05-14_wangchao_5766bea9.py
Normal file
@@ -0,0 +1,378 @@
|
||||
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/backup/wangchao.py
|
||||
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/backup/wangchao.py
|
||||
# Repo: smallfawn/QLScriptPublic
|
||||
# Path: backup/wangchao.py
|
||||
# UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
# SHA256: 5766bea96f254c536c58c331c970b56736855666f52792e2058a28daee3fa274
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
|
||||
|
||||
import hashlib
|
||||
from gmalg import SM2
|
||||
|
||||
import math
|
||||
import time
|
||||
import requests
|
||||
import datetime
|
||||
import os
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
import random
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
import base64
|
||||
from requests.adapters import HTTPAdapter
|
||||
from urllib3.util.retry import Retry
|
||||
import urllib.parse
|
||||
import json
|
||||
debug=0
|
||||
account_id = ""
|
||||
def jm(password):
|
||||
public_key_base64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6XO7e9YeAOs+cFqwa7ETJ+WXizPqQeXv68i5vqw9pFREsrqiBTRcg7wB0RIp3rJkDpaeVJLsZqYm5TW7FWx/iOiXFc+zCPvaKZric2dXCw27EvlH5rq+zwIPDAJHGAfnn1nmQH7wR3PCatEIb8pz5GFlTHMlluw4ZYmnOwg+thwIDAQAB"
|
||||
public_key_der = base64.b64decode(public_key_base64)
|
||||
key = RSA.importKey(public_key_der)
|
||||
cipher = PKCS1_v1_5.new(key)
|
||||
password_bytes = password.encode('utf-8')
|
||||
encrypted_password = cipher.encrypt(password_bytes)
|
||||
encrypted_password_base64 = base64.b64encode(encrypted_password).decode('utf-8')
|
||||
url_encoded_data = urllib.parse.quote(encrypted_password_base64)
|
||||
return url_encoded_data
|
||||
|
||||
#生成设备号
|
||||
def generate_random_uuid():
|
||||
# 设备号其实可以写死,保险起见选择随机生成
|
||||
uuid_str = '00000000-{:04x}-{:04x}-0000-0000{:08x}'.format(
|
||||
random.randint(0, 0xfff) | 0x4000,
|
||||
random.randint(0, 0x3fff) | 0x8000,
|
||||
random.getrandbits(32)
|
||||
)
|
||||
return uuid_str
|
||||
|
||||
# 签名并获取认证码
|
||||
def sign(phone, password):
|
||||
url_encoded_data = jm(password)
|
||||
url = "https://passport.tmuyun.com/web/oauth/credential_auth"
|
||||
payload = f"client_id=10019&password={url_encoded_data}&phone_number={phone}"
|
||||
print(payload)
|
||||
headers = {
|
||||
'User-Agent': "ANDROID;13;10019;6.0.2;1.0;null;MEIZU 20",
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Content-Type': "application/x-www-form-urlencoded",
|
||||
'Cache-Control': "no-cache",
|
||||
'X-SIGNATURE': "185d21c6f3e9ec4af43e0065079b8eb7f1bb054134481e57926fcc45e304b896",
|
||||
}
|
||||
|
||||
response = requests.post(url, data=payload, headers=headers)
|
||||
print(response.json())
|
||||
code = response.json()['data']['authorization_code']['code']
|
||||
|
||||
url = "https://vapp.taizhou.com.cn/api/zbtxz/login"
|
||||
payload = f"check_token=&code={code}&token=&type=-1&union_id="
|
||||
headers = {
|
||||
'User-Agent': "6.0.2;{deviceid};Meizu MEIZU 20;Android;13;tencent;6.10.0",
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Content-Type': "application/x-www-form-urlencoded",
|
||||
'X-SESSION-ID': "66586b383f293a7173e4c8f4",
|
||||
'X-REQUEST-ID': "110c1987-1637-4f4e-953e-e35272bb891e",
|
||||
'X-TIMESTAMP': "1717072109065",
|
||||
'X-SIGNATURE': "a69f171e284594a5ecc4baa1b2299c99167532b9795122bae308f27592e94381",
|
||||
'X-TENANT-ID': "64",
|
||||
'Cache-Control': "no-cache"
|
||||
}
|
||||
response = requests.post(url, data=payload, headers=headers)
|
||||
message = response.json()['message']
|
||||
account_id = response.json()['data']['account']['id']
|
||||
session_id = response.json()['data']['session']['id']
|
||||
name = response.json()['data']['account']['nick_name']
|
||||
|
||||
return message, account_id, session_id, name
|
||||
|
||||
|
||||
#生成验证码
|
||||
def generate_md5(input_str):
|
||||
md5_obj = hashlib.md5()
|
||||
input_str_encoded = input_str.encode('utf-8')
|
||||
md5_obj.update(input_str_encoded)
|
||||
return md5_obj.hexdigest()
|
||||
|
||||
#获取阅读的JSESSIONID
|
||||
def get_special_cookie():
|
||||
special_cookie_url = f'https://xmt.taizhou.com.cn/prod-api/user-read/app/login?id={account_id}&sessionId={session_id}&deviceId={deviceid}'
|
||||
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
}
|
||||
response = requests.get(special_cookie_url, headers=headers)
|
||||
if debug and response.status_code == 200:
|
||||
print('执行任务获取阅读jse')
|
||||
print('下面是访问的url\n',special_cookie_url)
|
||||
print('下面是访问的headers\n',headers)
|
||||
print('下面是返回的response\n',response.headers)
|
||||
if response.status_code == 200 and response.headers['Set-Cookie']:
|
||||
jsessionid1 =response.headers['Set-Cookie'].split(';')[0]+';'
|
||||
print('获取特殊cookie成功',jsessionid1)
|
||||
return response.headers['Set-Cookie']
|
||||
else:
|
||||
print('获取jsesesionid失败',response.headers)
|
||||
|
||||
#获取日期
|
||||
def get_current_date():
|
||||
now = datetime.datetime.now()
|
||||
year_str = str(now.year)
|
||||
month_str = f"0{now.month}" if now.month < 10 else str(now.month)
|
||||
day_str = f"0{now.day}" if now.day < 10 else str(now.day)
|
||||
print(f"当前日期{year_str}{month_str}{day_str}")
|
||||
return year_str + month_str + day_str
|
||||
|
||||
#获取阅读列表
|
||||
def fetch_article_list():
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'cookie': f'{special_cookie};'
|
||||
}
|
||||
url=f'https://xmt.taizhou.com.cn/prod-api/user-read/list/{get_current_date()}'
|
||||
response = requests.get(url, headers=headers)
|
||||
if debug and response.status_code == 200:
|
||||
print('执行任务获取阅读列表')
|
||||
print('下面是访问的url\n',url)
|
||||
print('下面是访问的headers\n',headers)
|
||||
print('下面是返回的response\n',response.headers)
|
||||
msg = response.json()['msg']
|
||||
print(msg)
|
||||
return response.json()
|
||||
def encrypt_with_sm2(article_id, account_id):
|
||||
# 获取当前时间戳
|
||||
timestamp = int(time.time() * 1000)
|
||||
# 构造数据
|
||||
data = {
|
||||
"timestamp": timestamp,
|
||||
"articleId": article_id,
|
||||
"accountId": account_id
|
||||
}
|
||||
# 将数据序列化为JSON字符串
|
||||
data_json = json.dumps(data, separators=(',', ':'))
|
||||
print("Data to be encrypted:", data_json)
|
||||
|
||||
# SM2公钥,确保公钥以04开头(未压缩格式)
|
||||
public_key_hex = "04A50803A27F000D6B310607EBA2A1C899E82872C0B538CA41DB6F0183B4C7E164DAFC6946ABF93C8AF1C0AD96D0E770D29264EF9F907DDBAE97A2A0BB1036D4AC"
|
||||
public_key = bytes.fromhex(public_key_hex)
|
||||
|
||||
# 创建SM2对象
|
||||
sm2_crypt = SM2(pk=public_key)
|
||||
|
||||
# 加密数据
|
||||
encrypted_data = sm2_crypt.encrypt(data_json.encode('utf-8'))
|
||||
print(len(encrypted_data.hex()))
|
||||
|
||||
|
||||
# 返回加密后的十六进制字符串
|
||||
encrypted_data_hex = encrypted_data.hex()
|
||||
#去掉前面两位
|
||||
encrypted_data_hex = encrypted_data_hex[2:]
|
||||
return encrypted_data_hex
|
||||
#阅读文章
|
||||
def mark_article_as_read(article_id,retry_count=3):
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'cookie': f'{special_cookie}',
|
||||
}
|
||||
timestamp_str = str(math.floor(time.time() * 1000))
|
||||
signature = encrypt_with_sm2(article_id,account_id)
|
||||
url = f'https://xmt.taizhou.com.cn/prod-api/already-read/article/new?signature={signature}'
|
||||
print(url)
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
response = session.get(url, headers=headers, timeout=10)
|
||||
if response.status_code == 200:
|
||||
print(response.text)
|
||||
return
|
||||
else:
|
||||
print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
|
||||
# 登录并获取抽奖JSESSIONID
|
||||
def login(account_id, session_id, retry_count=3):
|
||||
base_url = 'https://srv-app.taizhou.com.cn'
|
||||
url = f'{base_url}/tzrb/user/loginWC'
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7'
|
||||
}
|
||||
params = {
|
||||
'accountId': account_id,
|
||||
'sessionId': session_id
|
||||
}
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
response = session.get(url, params=params, headers=headers, timeout=10)
|
||||
if response.status_code == 200:
|
||||
cookies_dict = response.cookies.get_dict()
|
||||
s_JSESSIONID = '; '.join([f'{k}={v}' for k, v in cookies_dict.items()])
|
||||
return s_JSESSIONID
|
||||
else:
|
||||
print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
return None
|
||||
|
||||
#抽奖
|
||||
def cj(jsessionid, retry_count=3):
|
||||
url = "https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/saveUpdate"
|
||||
payload = "activityId=67&sessionId=undefined&sig=undefined&token=undefined"
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Content-Length': '63',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Content-type': 'application/x-www-form-urlencoded',
|
||||
'Accept': '*/*',
|
||||
'Origin': 'https://srv-app.taizhou.com.cn',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-ra-1/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': f'{jsessionid}'
|
||||
}
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=4, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
response = session.post(url, data=payload, headers=headers, timeout=10)
|
||||
if response.status_code == 200:
|
||||
print(response.text)
|
||||
display_draw_results(jsessionid)
|
||||
return # 成功则退出函数
|
||||
else:
|
||||
print(f"POST 请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"POST 请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
#查询抽奖结果
|
||||
def display_draw_results(cookies):
|
||||
draw_result_headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-awsc-231023/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': f'{cookies}',
|
||||
}
|
||||
result_url = 'https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/pageList?pageSize=10&pageNum=1&activityId=67'
|
||||
result_data = requests.get(result_url, headers=draw_result_headers).json()["data"]["records"]
|
||||
for record in result_data:
|
||||
create_time_str = str(record["createTime"])
|
||||
award_name_str = str(record["awardName"])
|
||||
print(f"{create_time_str}---------{award_name_str}")
|
||||
|
||||
# 从环境变量中读取账户和密码
|
||||
accounts = os.getenv("wangchaoAccount")
|
||||
if not accounts:
|
||||
print("❌未找到环境变量!")
|
||||
else:
|
||||
accounts_list = accounts.split("&")
|
||||
print(f"一共在环境变量中获取到 {len(accounts_list)} 个账号")
|
||||
for account in accounts_list:
|
||||
password, phone = account.split("#")
|
||||
message, account_id, session_id, name = sign(phone, password)
|
||||
deviceid = generate_random_uuid()
|
||||
print()
|
||||
if account_id and session_id:
|
||||
mobile = phone[:3] + "*" * 4 + phone[7:]
|
||||
print(f"账号 {mobile} 登录成功")
|
||||
special_cookie = get_special_cookie()
|
||||
print(f"账号 {mobile} 获取阅读列表")
|
||||
article_list = fetch_article_list()
|
||||
for article in article_list['data']['articleIsReadList']:
|
||||
article_title = article['title']
|
||||
if article['isRead'] == True :
|
||||
print(f"√文章{article_title}已读")
|
||||
time.sleep(0.5)
|
||||
continue
|
||||
else:
|
||||
time.sleep(random.uniform(3.5, 4.5))
|
||||
article_id = article['id']
|
||||
print(f"账号 {mobile} 阅读文章 {article_title}")
|
||||
mark_article_as_read(article_id)
|
||||
time.sleep(1)
|
||||
jsessionid = login(account_id, session_id)
|
||||
if jsessionid:
|
||||
print('去抽奖')
|
||||
cj(jsessionid)
|
||||
else:
|
||||
print(f"获取 JSESSIONID 失败")
|
||||
else:
|
||||
print(f"账号 {phone} 登录失败")
|
||||
|
||||
# 每个账号登录后延迟...
|
||||
print("等待 5 秒后继续下一个账号...")
|
||||
time.sleep(5)
|
||||
print("所有账号处理完毕")
|
||||
707
脚本库/web版/账密/万能福利吧/2025-08-25_wnflb_a0c784cb.js
Normal file
707
脚本库/web版/账密/万能福利吧/2025-08-25_wnflb_a0c784cb.js
Normal file
@@ -0,0 +1,707 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/wnflb.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/wnflb.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/wnflb.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: a0c784cb397ebb321cc918c6d14410bb2e9902d6e2236b6893b2c6fa2779cd01
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
name: "万能福利吧"
|
||||
cron: 45 0 9 * * *
|
||||
脚本兼容: 金山文档(1.0),金山文档(2.0)
|
||||
更新时间:20241226
|
||||
环境变量名:无
|
||||
环境变量值:无
|
||||
备注:需要cookie。F12 -> "NetWork"(中文名叫"网络") -> 按一下Ctrl+R -> www.wnflb2023.com -> cookie
|
||||
有门槛,没账号的不用折腾。
|
||||
万能福利吧网址:https://www.wnflb2023.com
|
||||
*/
|
||||
|
||||
var sheetNameSubConfig = "wnflb"; // 分配置表名称
|
||||
var pushHeader = "【万能福利吧】";
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
|
||||
var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。
|
||||
var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识
|
||||
var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息
|
||||
var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
}; // 有效邮箱配置
|
||||
|
||||
// =================青龙适配开始===================
|
||||
|
||||
qlSwitch = 0
|
||||
|
||||
// =================青龙适配结束===================
|
||||
|
||||
// =================金山适配开始===================
|
||||
// airscript检测版本
|
||||
function checkVesion(){
|
||||
try{
|
||||
let temp = Application.Range("A1").Text;
|
||||
Application.Range("A1").Value = temp
|
||||
console.log("😶🌫️ 检测到当前airscript版本为1.0,进行1.0适配")
|
||||
}catch{
|
||||
console.log("😶🌫️ 检测到当前airscript版本为2.0,进行2.0适配")
|
||||
version = 2
|
||||
}
|
||||
}
|
||||
|
||||
// 推送相关
|
||||
// 获取时间
|
||||
function getDate(){
|
||||
let currentDate = new Date();
|
||||
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
|
||||
return currentDate
|
||||
}
|
||||
|
||||
// 将消息写入CONFIG表中作为消息队列,之后统一发送
|
||||
function writeMessageQueue(message){
|
||||
// 当天时间
|
||||
let todayDate = getDate()
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("✨ 开始将结果写入主配置表");
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
if(version == 1){
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value2 = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value2 = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function push(message) {
|
||||
writeMessageQueue(message) // 将消息写入CONFIG表中
|
||||
// if (message != "") {
|
||||
// // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
// let length = jsonPush.length;
|
||||
// let name;
|
||||
// let key;
|
||||
// for (let i = 0; i < length; i++) {
|
||||
// if (jsonPush[i].flag == 1) {
|
||||
// name = jsonPush[i].name;
|
||||
// key = jsonPush[i].key;
|
||||
// if (name == "bark") {
|
||||
// bark(message, key);
|
||||
// } else if (name == "pushplus") {
|
||||
// pushplus(message, key);
|
||||
// } else if (name == "ServerChan") {
|
||||
// serverchan(message, key);
|
||||
// } else if (name == "email") {
|
||||
// email(message);
|
||||
// } else if (name == "dingtalk") {
|
||||
// dingtalk(message, key);
|
||||
// } else if (name == "discord") {
|
||||
// discord(message, key);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// console.log("🍳 消息为空不推送");
|
||||
// }
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
if (key != "") {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
message = encodeURIComponent(message)
|
||||
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
|
||||
let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
if (key != "") {
|
||||
message = encodeURIComponent(message)
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送serverchan消息
|
||||
function serverchan(message, key) {
|
||||
if (key != "") {
|
||||
url =
|
||||
"https://sctapi.ftqq.com/" +
|
||||
key +
|
||||
".send" +
|
||||
"?title=" + messagePushHeader +
|
||||
"&desp=" +
|
||||
message;
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("🍳 已发送邮件至:" + sender);
|
||||
console.log("🍳 已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
console.log("🍳 开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("🍳 开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// =================金山适配结束===================
|
||||
// =================共用开始===================
|
||||
// main() // 入口
|
||||
|
||||
// function main(){
|
||||
checkVesion() // 版本检测,以进行不同版本的适配
|
||||
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("🍳 开始读取主配置表");
|
||||
let name; // 名称
|
||||
let onlyError;
|
||||
let nickname;
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
name = Application.Range("A" + i).Text;
|
||||
onlyError = Application.Range("C" + i).Text;
|
||||
nickname = Application.Range("D" + i).Text;
|
||||
if (name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
if (name == sheetNameSubConfig) {
|
||||
if (onlyError == "是") {
|
||||
messageOnlyError = 1;
|
||||
console.log("🍳 只推送错误消息");
|
||||
}
|
||||
|
||||
if (nickname == "是") {
|
||||
messageNickname = 1;
|
||||
console.log("🍳 单元格用昵称替代");
|
||||
}
|
||||
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("🍳 开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
|
||||
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
|
||||
if (flagSubConfig == 1) {
|
||||
console.log("🍳 开始读取分配置表");
|
||||
|
||||
if(qlSwitch != 1){ // 金山文档
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
execHandle(cookie, i);
|
||||
}
|
||||
}
|
||||
message = messageMerge()// 将消息数组融合为一条总消息
|
||||
push(message); // 推送消息
|
||||
}else{
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
console.log("🧑 开始执行用户:" + "1" )
|
||||
execHandle(cookie, i);
|
||||
break; // 只取一个
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// }
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("🥚 激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("🍳 无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将消息数组融合为一条总消息
|
||||
function messageMerge(){
|
||||
// console.log(messageArray)
|
||||
let message = ""
|
||||
for(i=0; i<messageArray.length; i++){
|
||||
if(messageArray[i] != "" && messageArray[i] != null)
|
||||
{
|
||||
message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头
|
||||
}
|
||||
}
|
||||
if(message != "")
|
||||
{
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
console.log(message + "\n") // 打印总消息
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// 获取sign,返回小写
|
||||
function getsign(data) {
|
||||
var sign = Crypto.createHash("md5")
|
||||
.update(data, "utf8")
|
||||
.digest("hex")
|
||||
// .toUpperCase() // 大写
|
||||
.toString();
|
||||
return sign;
|
||||
}
|
||||
|
||||
// =================共用结束===================
|
||||
|
||||
// cookie字符串转json格式
|
||||
function cookie_to_json(cookies) {
|
||||
var cookie_text = cookies;
|
||||
var arr = [];
|
||||
var text_to_split = cookie_text.split(";");
|
||||
for (var i in text_to_split) {
|
||||
var tmp = text_to_split[i].split("=");
|
||||
arr.push('"' + tmp.shift().trim() + '":"' + tmp.join(":").trim() + '"');
|
||||
}
|
||||
var res = "{\n" + arr.join(",\n") + "\n}";
|
||||
return JSON.parse(res);
|
||||
}
|
||||
|
||||
// 获取10 位时间戳
|
||||
function getts10() {
|
||||
var ts = Math.round(new Date().getTime() / 1000).toString();
|
||||
return ts;
|
||||
}
|
||||
|
||||
// 获取13位时间戳
|
||||
function getts13(){
|
||||
// var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳
|
||||
let ts = new Date().getTime()
|
||||
return ts
|
||||
}
|
||||
|
||||
// 符合UUID v4规范的随机字符串 b9ab98bb-b8a9-4a8a-a88a-9aab899a88b9
|
||||
function generateUUID() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
||||
var r = Math.random() * 16 | 0,
|
||||
v = c === 'x' ? r : (r & 0x3 | 0x8);
|
||||
return v.toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
function getUUIDDigits(length) {
|
||||
var uuid = generateUUID();
|
||||
return uuid.replace(/-/g, '').substr(16, length);
|
||||
}
|
||||
|
||||
|
||||
|
||||
// 具体的执行函数
|
||||
function execHandle(cookie, pos) {
|
||||
let messageSuccess = "";
|
||||
let messageFail = "";
|
||||
let messageName = "";
|
||||
// 推送昵称或单元格,还是不推送位置标识
|
||||
if (messageNickname == 1) {
|
||||
// 推送昵称或单元格
|
||||
messageName = Application.Range("C" + pos).Text;
|
||||
if(messageName == "")
|
||||
{
|
||||
messageName = "单元格A" + pos + "";
|
||||
}
|
||||
}
|
||||
|
||||
posLabel = pos-2 ; // 存放下标,从0开始
|
||||
messageHeader[posLabel] = "👨🚀 " + messageName
|
||||
// try {
|
||||
var url1 = "https://www.wnflb2023.com/plugin.php?id=fx_checkin:list"; // 获取formhash、判断成功+获取积分
|
||||
var url2 = "https://www.wnflb2023.com/plugin.php?id=fx_checkin%3Acheckin&infloat=yes&handlekey=fx_checkin&inajax=1&ajaxtarget=fwin_content_fx_checkin" // 签到
|
||||
|
||||
headers={
|
||||
"Host": "www.wnflb2023.com",
|
||||
// "Content-Type": "application/x-www-form-urlencoded",
|
||||
"Cookie":cookie,
|
||||
// "Cookie":""
|
||||
}
|
||||
|
||||
// 获取formhash
|
||||
resp = HTTP.get(
|
||||
url1,
|
||||
{ headers: headers }
|
||||
);
|
||||
|
||||
// 正则匹配
|
||||
formhash = ""
|
||||
// const Reg = /你已经连续签到(.*?)天,再接再厉!/i;
|
||||
Reg = [
|
||||
/formhash=(.+?)&/i,
|
||||
/showmenu">积分: (.+?)<\/a>/i,
|
||||
]
|
||||
|
||||
valueName = [
|
||||
"formhash", "签到前积分",
|
||||
]
|
||||
|
||||
html = resp.text();
|
||||
// console.log(html)
|
||||
for(i=0; i< Reg.length; i++)
|
||||
{
|
||||
flagTrue = Reg[i].test(html); // 判断是否存在字符串
|
||||
if (flagTrue == true) {
|
||||
let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "]
|
||||
// result = result[0];
|
||||
result = result[1];
|
||||
if(i == 1){
|
||||
content = "🎉 " + valueName[i] + ":" + result + " "
|
||||
messageSuccess += content;
|
||||
}else
|
||||
{
|
||||
formhash = result
|
||||
content = "🍳 formhash:" + result + " "
|
||||
}
|
||||
console.log(content)
|
||||
} else {
|
||||
content = "❌ " + "formhash获取失败 "
|
||||
messageFail += content;
|
||||
}
|
||||
}
|
||||
|
||||
// 签到
|
||||
headers={
|
||||
"Host": "www.wnflb2023.com",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9",
|
||||
// "Content-Type": "application/x-www-form-urlencoded",
|
||||
"X-Requested-With":"XMLHttpRequest",
|
||||
"Cookie":cookie,
|
||||
"Referer":"https://www.wnflb2023.com/",
|
||||
"DNT":1,
|
||||
}
|
||||
params = "&formhash=" + formhash + "&" + formhash
|
||||
url2 = url2 + params
|
||||
// console.log(url2)
|
||||
|
||||
resp = HTTP.get(
|
||||
url2,
|
||||
{ headers: headers }
|
||||
);
|
||||
|
||||
// console.log(resp.text())
|
||||
|
||||
// <?xml version="1.0" encoding="utf-8"?>
|
||||
// <root><![CDATA[<h3 class="flb"><em>提示信息</em><span><a href="javascript:;" class="flbc" onclick="hideWindow('fx_checkin');" title="关闭">关闭</a></span></h3>
|
||||
// <div class="c altw">
|
||||
// <div class="alert_right"><script type="text/javascript" reload="1">if(typeof errorhandle_fx_checkin=='function') {errorhandle_fx_checkin('签到成功,您今日第3874个签到,累计签到2851天!', {});}hideWindow('fx_checkin');showDialog('签到成功,您今日第3874个签到,累计签到2851天!', 'right', null, null, 0, null, null, null, null, null, null);</script><script type="text/javascript">fx_chk_menu=true;$('fx_checkin_topb').innerHTML="<a href=\"plugin.php?id=fx_checkin:list\" onmouseover=\"fx_checkin_menu('fx_checkin_topb');\"><img id=\"fx_checkin_b\" src=\"source/plugin/fx_checkin/images/mini2.gif\" style=\"position:relative;top:5px;height:18px;\"></a>";$('fx_checkin_menut').innerHTML="<em>签到成功!</em><p>您今天第<i>3874</i>个签到,签到排名竞争激烈,记得每天都来签到哦!</p>";$('fx_checkin_menub').innerHTML="已连续签到:<i>8</i>天,累计签到:<i>2851</i>天";</script></div>
|
||||
// </div>
|
||||
// <p class="o pns">
|
||||
// <button type="button" class="pn pnc" id="closebtn" onclick="hideWindow('fx_checkin');"><strong>确定</strong></button>
|
||||
// <script type="text/javascript" reload="1">if($('closebtn')) {$('closebtn').focus();}</script>
|
||||
// </p>
|
||||
// ]]></root>
|
||||
|
||||
// <?xml version="1.0" encoding="utf-8"?>
|
||||
// <root><![CDATA[<h3 class="flb"><em>提示信息</em><span><a href="javascript:;" class="flbc" onclick="hideWindow('fx_checkin');" title="关闭">关闭</a></span></h3>
|
||||
// <div class="c altw">
|
||||
// <div class="alert_right"><script type="text/javascript" reload="1">if(typeof errorhandle_fx_checkin=='function') {errorhandle_fx_checkin('签名出错-2,请重新登陆后签到1!', {});}hideWindow('fx_checkin');showDialog('签名出错-2,请重新登陆后签到1!', 'right', null, null, 0, null, null, null, null, null, null);</script></div>
|
||||
// </div>
|
||||
// <p class="o pns">
|
||||
// <button type="button" class="pn pnc" id="closebtn" onclick="hideWindow('fx_checkin');"><strong>确定</strong></button>
|
||||
// <script type="text/javascript" reload="1">if($('closebtn')) {$('closebtn').focus();}</script>
|
||||
// </p>
|
||||
// ]]></root>
|
||||
|
||||
// 获取签到天数数据、获取积分
|
||||
headers={
|
||||
"Host": "www.wnflb2023.com",
|
||||
// "Content-Type": "application/x-www-form-urlencoded",
|
||||
"Cookie":cookie,
|
||||
// "Cookie":""
|
||||
}
|
||||
|
||||
resp = HTTP.get(
|
||||
url1,
|
||||
{ headers: headers }
|
||||
);
|
||||
// console.log(resp.text())
|
||||
// 正则匹配
|
||||
// const Reg = /你已经连续签到(.*?)天,再接再厉!/i;
|
||||
Reg = [
|
||||
/累计签到:<i>(.+?)<\/i>天/i,
|
||||
/已连续签到:<i>(.+?)<\/i>天/i,
|
||||
/showmenu">积分: (.+?)<\/a>/i,
|
||||
]
|
||||
|
||||
valueName = [
|
||||
"累计签天数", "已连签天数","当前积分",
|
||||
]
|
||||
|
||||
html = resp.text();
|
||||
// console.log(html)
|
||||
resultall = ""
|
||||
for(i=0; i< Reg.length; i++)
|
||||
{
|
||||
flagTrue = Reg[i].test(html); // 判断是否存在字符串
|
||||
if (flagTrue == true) {
|
||||
let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "]
|
||||
// result = result[0];
|
||||
result = result[1];
|
||||
if(result == "{days}" || result == "{constant}" ){
|
||||
|
||||
}else{
|
||||
content = "🎉 " + valueName[i] + ":" + result + " "
|
||||
messageSuccess += content;
|
||||
console.log(content)
|
||||
}
|
||||
|
||||
} else {
|
||||
content = "❌ " +"签到数据获取失败 "
|
||||
messageFail += content;
|
||||
}
|
||||
}
|
||||
|
||||
// // 获取积分
|
||||
// // 正则匹配,获取formhash
|
||||
// formhash = ""
|
||||
// // const Reg = /你已经连续签到(.*?)天,再接再厉!/i;
|
||||
// Reg = [
|
||||
// /formhash=(.+?)&/i,
|
||||
// /showmenu">积分: (.+?)<\/a>/i,
|
||||
|
||||
// ]
|
||||
|
||||
// valueName = [
|
||||
// "formhash", "当前积分",
|
||||
// ]
|
||||
|
||||
// // html = resp.text();
|
||||
// // console.log(html)
|
||||
// for(i=0; i< Reg.length; i++)
|
||||
// {
|
||||
// flagTrue = Reg[i].test(html); // 判断是否存在字符串
|
||||
// if (flagTrue == true) {
|
||||
// let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "]
|
||||
// // result = result[0];
|
||||
// result = result[1];
|
||||
// formhash = result
|
||||
// if(i == 1){
|
||||
// content = valueName[i] + ":" + result + " "
|
||||
// messageSuccess += content;
|
||||
// }else
|
||||
// {
|
||||
// content = "formhash:" + result + " "
|
||||
// }
|
||||
|
||||
// console.log(content)
|
||||
// } else {
|
||||
// content = "formhash获取失败 "
|
||||
// messageFail += content;
|
||||
// }
|
||||
// }
|
||||
|
||||
// } catch {
|
||||
// messageFail += messageName + "失败";
|
||||
// }
|
||||
|
||||
sleep(2000);
|
||||
if (messageOnlyError == 1) {
|
||||
messageArray[posLabel] = messageFail;
|
||||
} else {
|
||||
if(messageFail != ""){
|
||||
messageArray[posLabel] = messageFail + " " + messageSuccess;
|
||||
}else{
|
||||
messageArray[posLabel] = messageSuccess;
|
||||
}
|
||||
}
|
||||
|
||||
if(messageArray[posLabel] != "")
|
||||
{
|
||||
console.log(messageArray[posLabel]);
|
||||
}
|
||||
}
|
||||
494
脚本库/web版/账密/中兴商城/2025-08-25_ztemall_0a7d6031.js
Normal file
494
脚本库/web版/账密/中兴商城/2025-08-25_ztemall_0a7d6031.js
Normal file
File diff suppressed because one or more lines are too long
569
脚本库/web版/账密/中兴社区/2025-08-25_ql_ztebbs_4a429a41.js
Normal file
569
脚本库/web版/账密/中兴社区/2025-08-25_ql_ztebbs_4a429a41.js
Normal file
File diff suppressed because one or more lines are too long
646
脚本库/web版/账密/中国日报/2025-08-25_dailynewscn_75088baf.js
Normal file
646
脚本库/web版/账密/中国日报/2025-08-25_dailynewscn_75088baf.js
Normal file
File diff suppressed because one or more lines are too long
124
脚本库/web版/账密/中国移动APP/2026-05-14_chinaMobile_e5179e07.js
Normal file
124
脚本库/web版/账密/中国移动APP/2026-05-14_chinaMobile_e5179e07.js
Normal file
@@ -0,0 +1,124 @@
|
||||
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/chinaMobile.js
|
||||
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/chinaMobile.js
|
||||
// # Repo: smallfawn/QLScriptPublic
|
||||
// # Path: daily/chinaMobile.js
|
||||
// # UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
// # SHA256: e5179e073c2c16d19741c34ac5e61b83a965616f8437b5ca88a4916dc9d25dec
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
------------------------------------------
|
||||
@Author: sm
|
||||
@Date: 2024.06.07 19:15
|
||||
@Description: 中国移动APP签到
|
||||
cron: 30 7 * * *
|
||||
------------------------------------------
|
||||
#Notice:
|
||||
变量名:chinaMobile
|
||||
变量值:https://wx.10086.cn/qwhdhub/api/抓COOKIE中的QWHD_SESSION_TOKEN的值,多个账号用&或者换行分隔
|
||||
⚠️【免责声明】
|
||||
------------------------------------------
|
||||
1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。
|
||||
2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
|
||||
3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。
|
||||
4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
|
||||
5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。
|
||||
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。
|
||||
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。
|
||||
*/
|
||||
|
||||
const { Env } = require("../tools/env")
|
||||
const $ = new Env("中国移动APP");
|
||||
let ckName = `chinaMobile`;
|
||||
const strSplitor = "#";
|
||||
const axios = require("axios");
|
||||
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
|
||||
|
||||
|
||||
class Task {
|
||||
constructor(env) {
|
||||
this.index = $.userIdx++
|
||||
this.user = env.split(strSplitor);
|
||||
this.token = this.user[0];
|
||||
|
||||
}
|
||||
|
||||
async run() {
|
||||
|
||||
await this.signIn()
|
||||
}
|
||||
|
||||
async signIn() {
|
||||
let toDay = $.time("yyyyMMdd");
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: 'https://wx.10086.cn/qwhdhub/api/mark/mark31/domark',
|
||||
headers: {
|
||||
'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 16_7_15 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148/wkwebview leadeon/12.0.9/CMCCIT',
|
||||
'x-requested-with': 'XMLHttpRequest',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Content-Type': 'application/json;charset=UTF-8',
|
||||
'Origin': 'https://wx.10086.cn',
|
||||
'Referer': 'https://wx.10086.cn/qwhdhub/qwhdmark/1021122301?channelId=P00000057578&yx=9000239640&redCode=rec_feedHotZoneApp_P00000057578&token=QWHDSSOD20260403T185702396DU1021122301Htb7t4R457104',
|
||||
'login-check': '1',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Cookie': "QWHD_SESSION_TOKEN=" + this.token,
|
||||
},
|
||||
data: JSON.stringify({
|
||||
"date": toDay
|
||||
})
|
||||
};
|
||||
let { data: result } = await axios.request(options);
|
||||
if (result?.code == 'SUCCESS') {
|
||||
//打印签到结果
|
||||
$.log(`🌸账号[${this.index}]` + `🕊签到成功🎉`);
|
||||
} else {
|
||||
$.log(`🌸账号[${this.index}] 签到-失败:${result.msg}❌`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
await getNotice()
|
||||
$.checkEnv(ckName);
|
||||
|
||||
for (let user of $.userList) {
|
||||
await new Task(user).run();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done());
|
||||
|
||||
async function getNotice() {
|
||||
try {
|
||||
let options = {
|
||||
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
|
||||
headers: {
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
timeout:3000
|
||||
}
|
||||
let {
|
||||
data: res
|
||||
} = await axios.request(options);
|
||||
$.log(res)
|
||||
return res
|
||||
} catch (e) {}
|
||||
|
||||
}
|
||||
4324
脚本库/web版/账密/中国移动云盘/2026-05-14_ydyp_da3e5cb2.js
Normal file
4324
脚本库/web版/账密/中国移动云盘/2026-05-14_ydyp_da3e5cb2.js
Normal file
File diff suppressed because it is too large
Load Diff
604
脚本库/web版/账密/二维码生成/2025-08-25_qrcode_23c17b49.js
Normal file
604
脚本库/web版/账密/二维码生成/2025-08-25_qrcode_23c17b49.js
Normal file
File diff suppressed because one or more lines are too long
645
脚本库/web版/账密/人生倒计时/2025-08-25_rsdjs_744d40fb.js
Normal file
645
脚本库/web版/账密/人生倒计时/2025-08-25_rsdjs_744d40fb.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/人生话语/2025-08-25_rshy_7997ca48.js
Normal file
630
脚本库/web版/账密/人生话语/2025-08-25_rshy_7997ca48.js
Normal file
File diff suppressed because one or more lines are too long
561
脚本库/web版/账密/什么值得买抽奖/2025-08-25_ql_smzdm_7052d293.js
Normal file
561
脚本库/web版/账密/什么值得买抽奖/2025-08-25_ql_smzdm_7052d293.js
Normal file
File diff suppressed because one or more lines are too long
663
脚本库/web版/账密/今日油价/2025-08-25_oilprice_e5ab074d.js
Normal file
663
脚本库/web版/账密/今日油价/2025-08-25_oilprice_e5ab074d.js
Normal file
File diff suppressed because one or more lines are too long
770
脚本库/web版/账密/全国空气吸收剂量率/2025-08-25_airabsorbed_129ae07b.js
Normal file
770
脚本库/web版/账密/全国空气吸收剂量率/2025-08-25_airabsorbed_129ae07b.js
Normal file
File diff suppressed because one or more lines are too long
306
脚本库/web版/账密/冷酸灵牙膏/2025-06-28_冷酸灵牙膏_a528b252.js
Normal file
306
脚本库/web版/账密/冷酸灵牙膏/2025-06-28_冷酸灵牙膏_a528b252.js
Normal file
File diff suppressed because one or more lines are too long
656
脚本库/web版/账密/历史上的今天/2025-08-25_todayhistory_71ae3a46.js
Normal file
656
脚本库/web版/账密/历史上的今天/2025-08-25_todayhistory_71ae3a46.js
Normal file
File diff suppressed because one or more lines are too long
803
脚本库/web版/账密/叮咚鱼塘/2025-08-25_ddmc_ddyt_8848c2ac.js
Normal file
803
脚本库/web版/账密/叮咚鱼塘/2025-08-25_ddmc_ddyt_8848c2ac.js
Normal file
@@ -0,0 +1,803 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/ddmc_ddyt.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/ddmc_ddyt.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/ddmc_ddyt.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: 8848c2ac8c9c09a61d016a63d4ebba5937c435dca08666179c5a2be34ed1df8f
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
name: "叮咚鱼塘"
|
||||
cron: 45 0 9 * * *
|
||||
脚本兼容: 金山文档(1.0),金山文档(2.0)
|
||||
更新时间:20241025
|
||||
环境变量名:无
|
||||
环境变量值:无
|
||||
备注:需要Cookie、seedId、propsId。
|
||||
"叮咚买菜"APP,然后用抓包软件进行抓包,分别在叮咚鱼塘中点击喂饲料,在果园中点击浇水,就能抓到含有Cookie、seedId和propsId的包。
|
||||
*/
|
||||
|
||||
var sheetNameSubConfig = "ddmc"; // 分配置表名称
|
||||
let sheetNameSubConfig2 = "ddmc_ddyt";
|
||||
var pushHeader = "【叮咚鱼塘】";
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
|
||||
var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。
|
||||
var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识
|
||||
var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息
|
||||
var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
}; // 有效邮箱配置
|
||||
|
||||
// =================青龙适配开始===================
|
||||
|
||||
qlSwitch = 0
|
||||
|
||||
// =================青龙适配结束===================
|
||||
|
||||
// =================金山适配开始===================
|
||||
// airscript检测版本
|
||||
function checkVesion(){
|
||||
try{
|
||||
let temp = Application.Range("A1").Text;
|
||||
Application.Range("A1").Value = temp
|
||||
console.log("😶🌫️ 检测到当前airscript版本为1.0,进行1.0适配")
|
||||
}catch{
|
||||
console.log("😶🌫️ 检测到当前airscript版本为2.0,进行2.0适配")
|
||||
version = 2
|
||||
}
|
||||
}
|
||||
|
||||
// 推送相关
|
||||
// 获取时间
|
||||
function getDate(){
|
||||
let currentDate = new Date();
|
||||
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
|
||||
return currentDate
|
||||
}
|
||||
|
||||
// 将消息写入CONFIG表中作为消息队列,之后统一发送
|
||||
function writeMessageQueue(message){
|
||||
// 当天时间
|
||||
let todayDate = getDate()
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("✨ 开始将结果写入主配置表");
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig2){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function push(message) {
|
||||
writeMessageQueue(message) // 将消息写入CONFIG表中
|
||||
// if (message != "") {
|
||||
// // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
// let length = jsonPush.length;
|
||||
// let name;
|
||||
// let key;
|
||||
// for (let i = 0; i < length; i++) {
|
||||
// if (jsonPush[i].flag == 1) {
|
||||
// name = jsonPush[i].name;
|
||||
// key = jsonPush[i].key;
|
||||
// if (name == "bark") {
|
||||
// bark(message, key);
|
||||
// } else if (name == "pushplus") {
|
||||
// pushplus(message, key);
|
||||
// } else if (name == "ServerChan") {
|
||||
// serverchan(message, key);
|
||||
// } else if (name == "email") {
|
||||
// email(message);
|
||||
// } else if (name == "dingtalk") {
|
||||
// dingtalk(message, key);
|
||||
// } else if (name == "discord") {
|
||||
// discord(message, key);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// console.log("🍳 消息为空不推送");
|
||||
// }
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
if (key != "") {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
message = encodeURIComponent(message)
|
||||
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
|
||||
let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
if (key != "") {
|
||||
message = encodeURIComponent(message)
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送serverchan消息
|
||||
function serverchan(message, key) {
|
||||
if (key != "") {
|
||||
url =
|
||||
"https://sctapi.ftqq.com/" +
|
||||
key +
|
||||
".send" +
|
||||
"?title=" + messagePushHeader +
|
||||
"&desp=" +
|
||||
message;
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("🍳 已发送邮件至:" + sender);
|
||||
console.log("🍳 已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
console.log("🍳 开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("🍳 开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// =================金山适配结束===================
|
||||
// =================共用开始===================
|
||||
// main() // 入口
|
||||
|
||||
// function main(){
|
||||
checkVesion() // 版本检测,以进行不同版本的适配
|
||||
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("🍳 开始读取主配置表");
|
||||
let name; // 名称
|
||||
let onlyError;
|
||||
let nickname;
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
name = Application.Range("A" + i).Text;
|
||||
onlyError = Application.Range("C" + i).Text;
|
||||
nickname = Application.Range("D" + i).Text;
|
||||
if (name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
if (name == sheetNameSubConfig) {
|
||||
if (onlyError == "是") {
|
||||
messageOnlyError = 1;
|
||||
console.log("🍳 只推送错误消息");
|
||||
}
|
||||
|
||||
if (nickname == "是") {
|
||||
messageNickname = 1;
|
||||
console.log("🍳 单元格用昵称替代");
|
||||
}
|
||||
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("🍳 开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
|
||||
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
|
||||
if (flagSubConfig == 1) {
|
||||
console.log("🍳 开始读取分配置表");
|
||||
|
||||
if(qlSwitch != 1){ // 金山文档
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
execHandle(cookie, i);
|
||||
}
|
||||
}
|
||||
message = messageMerge()// 将消息数组融合为一条总消息
|
||||
push(message); // 推送消息
|
||||
}else{
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
console.log("🧑 开始执行用户:" + "1" )
|
||||
execHandle(cookie, i);
|
||||
break; // 只取一个
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// }
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("🥚 激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("🍳 无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将消息数组融合为一条总消息
|
||||
function messageMerge(){
|
||||
// console.log(messageArray)
|
||||
let message = ""
|
||||
for(i=0; i<messageArray.length; i++){
|
||||
if(messageArray[i] != "" && messageArray[i] != null)
|
||||
{
|
||||
message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头
|
||||
}
|
||||
}
|
||||
if(message != "")
|
||||
{
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
console.log(message + "\n") // 打印总消息
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// 获取sign,返回小写
|
||||
function getsign(data) {
|
||||
var sign = Crypto.createHash("md5")
|
||||
.update(data, "utf8")
|
||||
.digest("hex")
|
||||
// .toUpperCase() // 大写
|
||||
.toString();
|
||||
return sign;
|
||||
}
|
||||
|
||||
// =================共用结束===================
|
||||
|
||||
// 具体的执行函数
|
||||
function execHandle(cookie, pos) {
|
||||
let messageSuccess = "";
|
||||
let messageFail = "";
|
||||
let messageName = "";
|
||||
// 推送昵称或单元格,还是不推送位置标识
|
||||
if (messageNickname == 1) {
|
||||
// 推送昵称或单元格
|
||||
messageName = Application.Range("C" + pos).Text;
|
||||
if(messageName == "")
|
||||
{
|
||||
messageName = "单元格A" + pos + "";
|
||||
}
|
||||
}
|
||||
|
||||
posLabel = pos-2 ; // 存放下标,从0开始
|
||||
messageHeader[posLabel] = "👨🚀 " + messageName
|
||||
|
||||
try {
|
||||
let seedId = Application.Range("F" + pos).Text;
|
||||
let propsId = Application.Range("G" + pos).Text;
|
||||
|
||||
// 获取任务taskCode
|
||||
let taskCode = []
|
||||
// 领取任务奖励
|
||||
let userTaskLogId = []
|
||||
|
||||
let url = [
|
||||
'https://sunquan.api.ddxq.mobi/api/v2/user/signin/',// 积分
|
||||
'https://farm.api.ddxq.mobi/api/v2/task/achieve?api_version=9.1.0&app_client_id=1&station_id=&stationId=&native_version=&app_version=10.15.0&OSVersion=15&CityId=0201&uid=&latitude=40.123389&longitude=116.345477&lat=40.123389&lng=116.345477&device_token=&gameId=1&taskCode=DAILY_SIGN', // 每日
|
||||
'https://farm.api.ddxq.mobi/api/v2/task/achieve?api_version=9.1.0&app_client_id=1&station_id=&stationId=&native_version=&app_version=10.1.2&OSVersion=15&CityId=0201&uid=&latitude=40.123389&longitude=116.345477&lat=40.123389&lng=116.345477&device_token=&gameId=1&taskCode=CONTINUOUS_SIGN', // 每日2
|
||||
'https://farm.api.ddxq.mobi/api/v2/props/feed?api_version=9.1.0&app_client_id=1&station_id=&stationId=&native_version&app_version=10.0.1&OSVersion=15&CityId=0201&uid=&latitude=40.123389&longitude=116.345477&lat=40.123389&lng=116.345477&device_token=&gameId=1&propsId=' + propsId + '&seedId=' + seedId + '&cityCode=0201&feedPro=0&triggerMultiFeed=1',// 喂饲料
|
||||
'https://farm.api.ddxq.mobi/api/v2/task/list?latitude=40.123389&longitude=116.345477&env=PE&station_id=&city_number=0201&api_version=9.44.0&app_client_id=3&native_version=10.15.0&h5_source=&page_type=2&gameId=1', // 获取任务taskCode
|
||||
'https://farm.api.ddxq.mobi/api/v2/task/achieve?api_version=9.1.0&app_client_id=1&station_id=&stationId=&native_version=&app_version=10.15.0&OSVersion=15&CityId=0201&uid=&latitude=40.123389&longitude=116.345477&lat=40.123389&lng=116.345477&device_token=&gameId=1&taskCode=', // 完成任务
|
||||
'https://farm.api.ddxq.mobi/api/v2/task/reward?api_version=9.1.0&app_client_id=1&station_id=&stationId=&native_version=&app_version=10.15.1&OSVersion=15&CityId=0201&uid=&latitude=40.123389&longitude=116.345477&lat=40.123389&lng=116.345477&device_token=&userTaskLogId=',// 领取任务奖励
|
||||
]
|
||||
|
||||
headers = {
|
||||
'Host': 'farm.api.ddxq.mobi',
|
||||
'Origin': 'https://game.m.ddxq.mobi',
|
||||
'Cookie': cookie,
|
||||
'Accept': '*/*',
|
||||
// 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_7 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 xzone/10.0.1 station_id/' + station_id + ' device_id/' + device_id,
|
||||
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
|
||||
'Referer': 'https://game.m.ddxq.mobi/',
|
||||
};
|
||||
|
||||
headerintegral =
|
||||
{ // 积分
|
||||
'Host': 'sunquan.api.ddxq.mobi',
|
||||
'Cookie': cookie,
|
||||
'Referer': 'https://activity.m.ddxq.mobi/',
|
||||
'ddmc-city-number': '0201',
|
||||
'ddmc-api-version': '9.7.3',
|
||||
'Origin': 'https://activity.m.ddxq.mobi',
|
||||
'ddmc-build-version': '10.15.0',
|
||||
'ddmc-longitude': 114.345477,
|
||||
'ddmc-latitude': 40.123389,
|
||||
'ddmc-app-client-id': 3,
|
||||
'Accept-Language': 'zh-CN,zh-Hans;q=0.9',
|
||||
'ddmc-channel': ' ',
|
||||
'Accept': '*/*',
|
||||
'Content-Type': 'application/x-www-form-urlencoded',
|
||||
'ddmc-station-id': '',
|
||||
'ddmc-ip': '',
|
||||
},
|
||||
|
||||
dataintegral = {
|
||||
'api_version':'9.7.3',
|
||||
'app_client_id':3,
|
||||
'app_version':'2.14.5',
|
||||
'app_client_name':'activity',
|
||||
'station_id':'',
|
||||
'native_version':'10.15.0',
|
||||
'city_number':'0201',
|
||||
'device_token':'',
|
||||
'device_id':'',
|
||||
'latitude':'40.123389',
|
||||
'longitude':'116.345477',
|
||||
}
|
||||
// 积分签到
|
||||
resp = HTTP.fetch(url[0], {
|
||||
method: "post",
|
||||
headers: headerintegral,
|
||||
data : dataintegral
|
||||
});
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
console.log(resp);
|
||||
code = resp["code"];
|
||||
msg = resp["msg"];
|
||||
if(code == 0){
|
||||
content = "🎉 " + "积分签到成功\n"
|
||||
messageSuccess += content
|
||||
console.log(content);
|
||||
}else{
|
||||
// {"msg":"出了点问题哦,请稍后再试吧","code":119000001,"timestamp":"2023-08-10 21:06:53","success":false,"exec_time":{}}
|
||||
// content += "帐号:" + messageName + msg + " ";
|
||||
content += "📢 " + msg + "\n";
|
||||
messageFail += content;
|
||||
console.log(content);
|
||||
}
|
||||
} else {
|
||||
console.log(resp.text());
|
||||
// content = "帐号:" + messageName + "积分签到失败 "
|
||||
content = "❌ " + "积分签到失败\n"
|
||||
messageFail += content;
|
||||
console.log(content);
|
||||
}
|
||||
|
||||
// 领饲料
|
||||
let flagSign = 0; // 标识是否领取饲料
|
||||
let tempmessageFail = ""; // 记录临时失败的消息
|
||||
// resp = HTTP.fetch(url[1], {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url[1], {headers: headers,});
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
console.log(resp);
|
||||
code = resp["code"];
|
||||
msg = resp["msg"];
|
||||
if(code == 0){
|
||||
// messageSuccess += "帐号:" + messageName + "鱼塘签到成功 "
|
||||
flagSign = 1;
|
||||
console.log("🍳 帐号:" + messageName + "鱼塘签到成功 ");
|
||||
}else{
|
||||
// {"msg":"今日已完成任务,明日再来吧!","code":601,"timestamp":"2023-08-10 21:23:49","success":false,"exec_time":{}}
|
||||
// {"msg":"出了点问题哦,请稍后再试吧","code":119000001,"timestamp":"2023-08-10 21:06:53","success":false,"exec_time":{}}
|
||||
// messageFail += "帐号:" + messageName + msg + " ";
|
||||
console.log("🍳 帐号:" + messageName + msg + " ");
|
||||
}
|
||||
} else {
|
||||
console.log(resp.text());
|
||||
// messageFail += "帐号:" + messageName + "签到失败 ";
|
||||
console.log("🍳 帐号:" + messageName + "签到失败 ");
|
||||
}
|
||||
|
||||
// resp = HTTP.fetch(url[2], {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url[2], {headers: headers,});
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
console.log(resp);
|
||||
code = resp["code"];
|
||||
msg = resp["msg"];
|
||||
if(code == 0 ){
|
||||
flagSign = 1;
|
||||
console.log("🍳 帐号:" + messageName + "鱼塘签到成功 ");
|
||||
}else{
|
||||
if(code == 601){
|
||||
// 此不为错误消息
|
||||
// {"msg":"今日已完成任务,明日再来吧!","code":601,"timestamp":"2024-06-13 20:30:28","success":false}
|
||||
flagSign = 1;
|
||||
console.log("🍳 帐号:" + messageName + msg + " ");
|
||||
}else{
|
||||
// content = "帐号:" + messageName + msg + " ";
|
||||
content = "❌ " + msg + "\n";
|
||||
tempmessageFail = content;
|
||||
console.log(content);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
} else {
|
||||
console.log(resp.text());
|
||||
// content = "帐号:" + messageName + "签到失败 ";
|
||||
content = "❌ " + "签到失败\n";
|
||||
tempmessageFail = content;
|
||||
console.log(content);
|
||||
}
|
||||
|
||||
if(flagSign == 1){
|
||||
// content = "帐号:" + messageName + "鱼塘签到成功 "
|
||||
content = "🎉 " + "鱼塘签到成功\n"
|
||||
messageSuccess += content;
|
||||
}else{
|
||||
messageFail += tempmessageFail;
|
||||
}
|
||||
|
||||
// 获取任务列表
|
||||
// resp = HTTP.fetch(url[4], {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url[4], {headers: headers,});
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
// console.log(resp);
|
||||
code = resp["code"];
|
||||
if(code == 0){
|
||||
console.log("🍳 正在获取taskCode ");
|
||||
userTasks = resp["data"]["userTasks"];
|
||||
for (let j = 0; j < userTasks.length; j++) {
|
||||
taskCode[j] = userTasks[j]["taskCode"]
|
||||
}
|
||||
console.log(taskCode)
|
||||
}else{
|
||||
console.log("🍳 获取taskCode失败 ");
|
||||
}
|
||||
} else {
|
||||
console.log(resp.text());
|
||||
console.log("🍳 获取taskCode失败 ");
|
||||
}
|
||||
|
||||
// taskCode = ["ANY_ORDER","BROWSE_GOODS","BUY_GOODS","CONTINUOUS_SIGN","DAILY_SIGN","FIRST_ORDER","HARD_BOX","INVITATION","LOTTERY","LUCK_DRAW","MULTI_ORDER","STEAL_FEED"]
|
||||
// 完成任务
|
||||
if(taskCode.length > 0){
|
||||
console.log("🍳 尝试完成任务...")
|
||||
for (let j = 0; j < taskCode.length; j++) {
|
||||
urlTask = url[5] + taskCode[j]
|
||||
// console.log(urlTask)
|
||||
try{
|
||||
// resp = HTTP.fetch(urlTask, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(urlTask, {headers: headers,});
|
||||
// console.log(resp.text())
|
||||
sleep(2000)
|
||||
}catch{
|
||||
console.log("🍳 忽略任务:" + taskCode[j])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取奖励id
|
||||
// resp = HTTP.fetch(url[4], {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url[4], {headers: headers,});
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
// console.log(resp);
|
||||
code = resp["code"];
|
||||
if(code == 0){
|
||||
console.log("🍳 正在获取userTaskLogId ");
|
||||
userTasks = resp["data"]["userTasks"];
|
||||
let temp
|
||||
let num = 0
|
||||
for (let j = 0; j < userTasks.length; j++) {
|
||||
temp = userTasks[j]["userTaskLogId"]
|
||||
// console.log(typeof(temp))
|
||||
// console.log(temp.length) // 长度为18才是id
|
||||
if(typeof(temp) != "object"){ // || temp != "{}" || temp != "null" || temp != "" || temp != null
|
||||
userTaskLogId[num] = temp
|
||||
num += 1
|
||||
}
|
||||
}
|
||||
console.log(userTaskLogId)
|
||||
}else{
|
||||
console.log("🍳 获取userTaskLogId失败 ");
|
||||
}
|
||||
} else {
|
||||
console.log(resp.text());
|
||||
console.log("🍳 获取userTaskLogId失败 ");
|
||||
}
|
||||
|
||||
// 领取任务奖励
|
||||
if(userTaskLogId.length > 0){
|
||||
console.log("🍳 尝试领取任务奖励...")
|
||||
for (let j = 0; j < userTaskLogId.length; j++) {
|
||||
urlTask = url[6] + userTaskLogId[j]
|
||||
// console.log(urlTask)
|
||||
try{
|
||||
// resp = HTTP.fetch(urlTask, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(urlTask, {headers: headers,});
|
||||
// console.log(resp.text())
|
||||
sleep(2000)
|
||||
}catch{
|
||||
console.log("🍳 忽略任务:" + userTaskLogId[j])
|
||||
}
|
||||
}
|
||||
}else{
|
||||
console.log("🍳 没有可领取的奖励")
|
||||
}
|
||||
|
||||
// 喂饲料
|
||||
let amount = 10; // 记录剩余数目
|
||||
let amoutCount = 0; // 已喂饲料次数
|
||||
let flagAmount = 0; // 标志,1为饲料
|
||||
let countSeedId = 0; // 计算是不是每次浇花的剩余水量都一样,如果三次都一样,则认为seedid过期
|
||||
let lastamount = 0; // 记录上一次剩余水量
|
||||
while(amount >= 10){
|
||||
// resp = HTTP.fetch(url[3], {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url[3], {headers: headers,});
|
||||
|
||||
if (resp.status == 200) {
|
||||
resp = resp.json();
|
||||
// console.log(resp);
|
||||
code = resp["code"];
|
||||
msg = resp["msg"];
|
||||
if(code == 0){
|
||||
amount = resp["data"]["props"]["amount"];
|
||||
|
||||
// 用于判断seedId是否过期,也即浇水是否失败
|
||||
if(lastamount == amount){ // 和上次剩余水量一样,可能没浇水成功
|
||||
countSeedId += 1; // 记录相同次数
|
||||
}else{
|
||||
countSeedId = 0; // 水量不同,浇水成功,置零
|
||||
}
|
||||
lastamount = amount; // 记录水量,以便下一次循环使用
|
||||
if(countSeedId >=3){ // 浇了三次剩余水量都相同,则认为浇水失败,不再浇水,并提醒用户更换新的seedId值
|
||||
msg = "[❗❗❗提醒]seedId值可能过期,请抓包获取最新的值"
|
||||
messageFail += "[❗❗❗提醒]seedId值可能过期,请抓包获取最新的值"
|
||||
console.log("🍳 提前退出浇水,错误消息为:" + msg)
|
||||
amoutCount -= 3; // 减去浇水失败的次数
|
||||
break;
|
||||
}
|
||||
|
||||
flagAmount = 1;
|
||||
amoutCount += 1;
|
||||
console.log("🍳 喂饲料中... ,剩余饲料:" + amount)
|
||||
}else{
|
||||
console.log(resp);
|
||||
console.log("🍳 提前退出喂饲料,错误消息为:" + msg)
|
||||
amount = 0; // 直接置水为0 退出投喂
|
||||
}
|
||||
} else {
|
||||
console.log(resp.text());
|
||||
console.log("🍳 提前退出喂饲料")
|
||||
amount = 0; // 直接置水为0 退出投喂
|
||||
}
|
||||
|
||||
sleep(3000)
|
||||
}
|
||||
|
||||
if(flagAmount == 1){
|
||||
content = "🎉 " + "成功喂饲料" + amoutCount + "次\n"
|
||||
messageSuccess += content
|
||||
console.log(content);
|
||||
}else{
|
||||
// messageFail += "喂饲料日志:" + msg + " "; // 此错误消息无需推送
|
||||
console.log("📢 " + "喂饲料日志:" + msg + " ");
|
||||
}
|
||||
|
||||
|
||||
} catch {
|
||||
messageFail += "❌ " + messageName + "失败\n";
|
||||
}
|
||||
|
||||
sleep(2000);
|
||||
if (messageOnlyError == 1) {
|
||||
messageArray[posLabel] = messageFail;
|
||||
} else {
|
||||
if(messageFail != ""){
|
||||
messageArray[posLabel] = messageFail + " " + messageSuccess;
|
||||
}else{
|
||||
messageArray[posLabel] = messageSuccess;
|
||||
}
|
||||
}
|
||||
|
||||
if(messageArray[posLabel] != "")
|
||||
{
|
||||
console.log(messageArray[posLabel]);
|
||||
}
|
||||
}
|
||||
964
脚本库/web版/账密/吉利汽车/2026-04-01_jlqc_0104d80b.js
Normal file
964
脚本库/web版/账密/吉利汽车/2026-04-01_jlqc_0104d80b.js
Normal file
File diff suppressed because one or more lines are too long
598
脚本库/web版/账密/周安排/2025-08-25_weekplan_01ccb9a9.js
Normal file
598
脚本库/web版/账密/周安排/2025-08-25_weekplan_01ccb9a9.js
Normal file
File diff suppressed because one or more lines are too long
2074
脚本库/web版/账密/和风天气/2025-08-25_hfweather_8f48b643.js
Normal file
2074
脚本库/web版/账密/和风天气/2025-08-25_hfweather_8f48b643.js
Normal file
File diff suppressed because one or more lines are too long
586
脚本库/web版/账密/品赞HTTP代理签到/2025-06-28_品赞代理_79485dab.js
Normal file
586
脚本库/web版/账密/品赞HTTP代理签到/2025-06-28_品赞代理_79485dab.js
Normal file
@@ -0,0 +1,586 @@
|
||||
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%93%81%E8%B5%9E%E4%BB%A3%E7%90%86.js
|
||||
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%93%81%E8%B5%9E%E4%BB%A3%E7%90%86.js
|
||||
// # Repo: jdqlscript/toulu
|
||||
// # Path: 品赞代理.js
|
||||
// # UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
// # SHA256: 79485dab3ea3a29d4dd5a09f771328d406ba90e352bf93ec3b869eefca72a3bb
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/**
|
||||
* 品赞HTTP代理签到v1.1
|
||||
* const $ = new Env("品赞HTTP代理签到");
|
||||
* cron 0 0 * * 0 品赞HTTP代理签到.js
|
||||
* 注册地址:https://www.ipzan.com?pid=4k9aetvd
|
||||
|
||||
|
||||
有问题联系3288588344
|
||||
频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
|
||||
|
||||
*
|
||||
* ========= 青龙--配置文件 ===========
|
||||
* # 项目名称(两种配置二选一)
|
||||
* 推荐账号密码,token容易过期
|
||||
* export pzhttp='账号#密码'
|
||||
* 不推荐
|
||||
* export pzhttp='你抓包的token'
|
||||
|
||||
* 自己抓包协议头上的Authorization
|
||||
|
||||
* 多账号换行或&隔开
|
||||
|
||||
* 奖励:每周签到得3金币,大概500个IP,可在免费使用代理IP用于其他项目
|
||||
*
|
||||
* ====================================
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
|
||||
const _0xf1ea8 = new _0x299988("品赞HTTP签到");
|
||||
let _0x34f238 = "pzhttp",
|
||||
_0x44155b = ["\n", "&"],
|
||||
_0xa2efe3 = (_0xf1ea8.isNode() ? process.env[_0x34f238] : _0xf1ea8.getdata(_0x34f238)) || "",
|
||||
_0xd941b5 = [],
|
||||
_0x8a72a2 = 0;
|
||||
class _0x138232 {
|
||||
constructor(_0x61bdcb) {
|
||||
this.index = ++_0x8a72a2;
|
||||
this.points = 0;
|
||||
this.valid = false;
|
||||
_0x61bdcb?.["includes"]("#") ? [this.account, this.password] = _0x61bdcb?.["split"]("#") : this.activedAuthToken = _0x61bdcb;
|
||||
}
|
||||
async ["taskApi"](_0x15938b, _0x2b4597, _0x292c45, _0x4b21ba) {
|
||||
let _0x17737f = null;
|
||||
try {
|
||||
let _0x9d8394 = _0x292c45.replace("//", "/").split("/")[1],
|
||||
_0x41ba2f = {
|
||||
"url": _0x292c45,
|
||||
"headers": {
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9",
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
|
||||
"Host": _0x9d8394,
|
||||
"Connection": "Keep-Alive",
|
||||
"Origin": "https://kip.ipzan.com",
|
||||
"Authorization": "Bearer " + this.activedAuthToken,
|
||||
"Referer": "https://kip.ipzan.com/",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
"timeout": 60000
|
||||
};
|
||||
_0x4b21ba && (_0x41ba2f.body = _0x4b21ba, _0x41ba2f.headers["Content-Length"] = _0x4b21ba?.["length"]);
|
||||
await _0x58c2e5(_0x2b4597, _0x41ba2f).then(async _0x1fce27 => {
|
||||
if (_0x1fce27.resp?.["statusCode"] == 200) _0x1fce27.resp?.["body"] ? _0x17737f = JSON.parse(_0x1fce27.resp.body) : console.log("账号[" + this.index + "]调用" + _0x2b4597 + "[" + _0x15938b + "]出错,返回为空");else {
|
||||
console.log("账号[" + this.index + "]调用" + _0x2b4597 + "[" + _0x15938b + "]出错,返回状态码[" + (_0x1fce27.resp?.["statusCode"] || "") + "]");
|
||||
}
|
||||
});
|
||||
} catch (_0x2abedd) {
|
||||
console.log(_0x2abedd);
|
||||
} finally {
|
||||
return Promise.resolve(_0x17737f);
|
||||
}
|
||||
}
|
||||
async ["GetUserBalance"]() {
|
||||
try {
|
||||
let _0x181f92 = "GetUserBalance",
|
||||
_0x567f03 = "get",
|
||||
_0x23d272 = "https://service.ipzan.com/home/userWallet-find",
|
||||
_0x3f986e = "";
|
||||
await this.taskApi(_0x181f92, _0x567f03, _0x23d272, _0x3f986e).then(async _0x40fe24 => {
|
||||
if (_0x40fe24.code === 0) this.valid = true, this.points = _0x40fe24.data.balance, console.log("账号[" + this.index + "] 当前金币: " + this.points);else {
|
||||
_0xf1ea8.logAndNotify("账号[" + this.index + "]查询金币失败,可能Token无效");
|
||||
}
|
||||
});
|
||||
} catch (_0xc67e18) {
|
||||
console.log(_0xc67e18);
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
async ["Login"]() {
|
||||
try {
|
||||
let _0x1f2260 = "Login",
|
||||
_0x459f03 = "post",
|
||||
_0x3d2b06 = "https://service.ipzan.com/users-login",
|
||||
_0x3e4a5c = JSON.stringify(_0x3771fa(this.account, this.password));
|
||||
await this.taskApi(_0x1f2260, _0x459f03, _0x3d2b06, _0x3e4a5c).then(async _0x480963 => {
|
||||
if (_0x480963.code === 0) console.log("账号[" + this.index + "] 登录成功"), this.activedAuthToken = _0x480963?.["data"];else {
|
||||
console.log("账号[" + this.index + "] 登录失败:" + _0x480963?.["message"]);
|
||||
}
|
||||
});
|
||||
} catch (_0x573284) {
|
||||
console.log(_0x573284);
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
async ["SignInDaily"]() {
|
||||
try {
|
||||
let _0x28765f = "SignInDaily",
|
||||
_0x4735c6 = "get",
|
||||
_0x42ed00 = "https://service.ipzan.com/home/userWallet-receive",
|
||||
_0x299e34 = "";
|
||||
await this.taskApi(_0x28765f, _0x4735c6, _0x42ed00, _0x299e34).then(async _0x3f3169 => {
|
||||
if (_0x3f3169.code === 0) {
|
||||
console.log("账号[" + this.index + "] 签到成功:", _0x3f3169?.["data"]);
|
||||
} else console.log("账号[" + this.index + "] 签到失败:" + _0x3f3169?.["message"]);
|
||||
});
|
||||
} catch (_0x568f80) {
|
||||
console.log(_0x568f80);
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
async ["doTask"]() {
|
||||
try {
|
||||
await _0x241982(1000);
|
||||
console.log("\n============= 账号[" + this.index + "] 开始签到=============");
|
||||
await this.SignInDaily();
|
||||
} catch (_0x23c68c) {
|
||||
console.log(_0x23c68c);
|
||||
}
|
||||
}
|
||||
}
|
||||
!(async () => {
|
||||
if (typeof $request !== "undefined") {
|
||||
await _0x5e22b6();
|
||||
} else {
|
||||
if (!(await _0x76f888())) return;
|
||||
console.log("\n================ 开始执行 ================");
|
||||
for (let _0x59d06c of _0xd941b5) {
|
||||
console.log("----------- 执行 第 [" + _0x59d06c.index + "] 个账号 -----------");
|
||||
!_0x59d06c?.["activedAuthToken"] && (await _0x59d06c?.["Login"]());
|
||||
await _0x59d06c.GetUserBalance();
|
||||
}
|
||||
let _0x3737e6 = _0xd941b5.filter(_0x2aad38 => _0x2aad38.valid);
|
||||
if (_0x3737e6.length > 0) {
|
||||
console.log("\n================ 任务队列构建完毕 ================");
|
||||
for (let _0x434b43 of _0x3737e6) {
|
||||
console.log("----------- 账号[" + _0x434b43.index + "] -----------");
|
||||
await _0x434b43.doTask();
|
||||
}
|
||||
} else console.log("\n================ 未检测到帐号,请先注册:https://www.ipzan.com?pid=4k9aetvd ================");
|
||||
await _0xf1ea8.showmsg();
|
||||
}
|
||||
})().catch(_0x4c4062 => console.log(_0x4c4062)).finally(() => _0xf1ea8.done());
|
||||
function _0x416dc5(_0x3a97a0) {
|
||||
const _0x414c4d = /^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
||||
return _0x414c4d.test(_0x3a97a0);
|
||||
}
|
||||
function _0xb417d8(_0x2829c6 = true) {
|
||||
const _0x2334d0 = _0x2829c6 ? "1.1.1.1" : "0.0.0.0",
|
||||
_0x44facb = _0x2829c6 ? "223.255.255.255" : "255.255.255.255",
|
||||
_0xd9f504 = _0x2334d0.split(".").map(Number),
|
||||
_0x275c26 = _0x44facb.split(".").map(Number),
|
||||
_0x556be6 = _0xd9f504.map((_0xbf46cc, _0x2a9d1c) => {
|
||||
const _0x1ab328 = _0x275c26[_0x2a9d1c];
|
||||
return Math.floor(Math.random() * (_0x1ab328 - _0xbf46cc + 1)) + _0xbf46cc;
|
||||
});
|
||||
return _0x556be6.join(".");
|
||||
}
|
||||
function _0x157dd3(_0x2d7503, _0x42788a, _0x2e1e85) {
|
||||
const _0x36ac8a = {};
|
||||
_0x36ac8a[_0x42788a] = _0x2e1e85;
|
||||
const _0x1f7e27 = JSON.stringify(_0x36ac8a);
|
||||
try {
|
||||
fs.writeFileSync(_0x2d7503 + ".json", _0x1f7e27);
|
||||
} catch (_0x2fd9c9) {
|
||||
_0x2fd9c9.code === "ENOENT" ? fs.writeFileSync(_0x2d7503 + ".json", _0x1f7e27) : console.error("保存文件时发生错误:", _0x2fd9c9);
|
||||
}
|
||||
}
|
||||
function _0x35c695(_0x188ff0, _0x1924d1) {
|
||||
try {
|
||||
const _0x206e18 = fs.readFileSync(_0x188ff0 + ".json", "utf8"),
|
||||
_0x4e7920 = JSON.parse(_0x206e18);
|
||||
return _0x4e7920[_0x1924d1];
|
||||
} catch (_0x527dd9) {
|
||||
if (_0x527dd9.code === "ENOENT") return undefined;else {
|
||||
console.error("读取文件时发生错误:", _0x527dd9);
|
||||
}
|
||||
}
|
||||
}
|
||||
function _0x3771fa(_0x256ced, _0x59add5) {
|
||||
var _0x3b0e44 = {
|
||||
"table": ["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", "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", "+", "/"],
|
||||
"UTF16ToUTF8": function (_0x164874) {
|
||||
for (var _0x22d31c = [], _0x34b5d0 = _0x164874.length, _0x12ffe3 = 0; _0x12ffe3 < _0x34b5d0; _0x12ffe3++) {
|
||||
var _0x60360,
|
||||
_0x57e360,
|
||||
_0x243264 = _0x164874.charCodeAt(_0x12ffe3);
|
||||
0 < _0x243264 && _0x243264 <= 127 ? _0x22d31c.push(_0x164874.charAt(_0x12ffe3)) : 128 <= _0x243264 && _0x243264 <= 2047 ? (_0x60360 = 192 | _0x243264 >> 6 & 31, _0x57e360 = 128 | 63 & _0x243264, _0x22d31c.push(String.fromCharCode(_0x60360), String.fromCharCode(_0x57e360))) : 2048 <= _0x243264 && _0x243264 <= 65535 && (_0x60360 = 224 | _0x243264 >> 12 & 15, _0x57e360 = 128 | _0x243264 >> 6 & 63, _0x243264 = 128 | 63 & _0x243264, _0x22d31c.push(String.fromCharCode(_0x60360), String.fromCharCode(_0x57e360), String.fromCharCode(_0x243264)));
|
||||
}
|
||||
return _0x22d31c.join("");
|
||||
},
|
||||
"UTF8ToUTF16": function (_0x2f5e6d) {
|
||||
for (var _0x2e1ff5 = [], _0x1fe47c = _0x2f5e6d.length, _0x36c899 = 0, _0x36c899 = 0; _0x36c899 < _0x1fe47c; _0x36c899++) {
|
||||
var _0xddba5e,
|
||||
_0x1c66d1,
|
||||
_0x4e11bc = _0x2f5e6d.charCodeAt(_0x36c899);
|
||||
0 == (_0x4e11bc >> 7 & 255) ? _0x2e1ff5.push(_0x2f5e6d.charAt(_0x36c899)) : 6 == (_0x4e11bc >> 5 & 255) ? (_0x1c66d1 = (31 & _0x4e11bc) << 6 | 63 & (_0xddba5e = _0x2f5e6d.charCodeAt(++_0x36c899)), _0x2e1ff5.push(Sting.fromCharCode(_0x1c66d1))) : 14 == (_0x4e11bc >> 4 & 255) && (_0x1c66d1 = (255 & (_0x4e11bc << 4 | (_0xddba5e = _0x2f5e6d.charCodeAt(++_0x36c899)) >> 2 & 15)) << 8 | ((3 & _0xddba5e) << 6 | 63 & _0x2f5e6d.charCodeAt(++_0x36c899)), _0x2e1ff5.push(String.fromCharCode(_0x1c66d1)));
|
||||
}
|
||||
return _0x2e1ff5.join("");
|
||||
},
|
||||
"encode": function (_0x4440be) {
|
||||
if (!_0x4440be) return "";
|
||||
for (var _0x44c43a = this.UTF16ToUTF8(_0x4440be), _0xa978b5 = 0, _0x4f9c35 = _0x44c43a.length, _0x59ac5c = []; _0xa978b5 < _0x4f9c35;) {
|
||||
var _0x4a5bc7 = 255 & _0x44c43a.charCodeAt(_0xa978b5++);
|
||||
if (_0x59ac5c.push(this.table[_0x4a5bc7 >> 2]), _0xa978b5 == _0x4f9c35) {
|
||||
_0x59ac5c.push(this.table[(3 & _0x4a5bc7) << 4]);
|
||||
_0x59ac5c.push("==");
|
||||
break;
|
||||
}
|
||||
var _0x77e2fc = _0x44c43a.charCodeAt(_0xa978b5++);
|
||||
if (_0xa978b5 == _0x4f9c35) {
|
||||
_0x59ac5c.push(this.table[(3 & _0x4a5bc7) << 4 | _0x77e2fc >> 4 & 15]);
|
||||
_0x59ac5c.push(this.table[(15 & _0x77e2fc) << 2]);
|
||||
_0x59ac5c.push("=");
|
||||
break;
|
||||
}
|
||||
var _0xdaed0e = _0x44c43a.charCodeAt(_0xa978b5++);
|
||||
_0x59ac5c.push(this.table[(3 & _0x4a5bc7) << 4 | _0x77e2fc >> 4 & 15]);
|
||||
_0x59ac5c.push(this.table[(15 & _0x77e2fc) << 2 | (192 & _0xdaed0e) >> 6]);
|
||||
_0x59ac5c.push(this.table[63 & _0xdaed0e]);
|
||||
}
|
||||
return _0x59ac5c.join("");
|
||||
},
|
||||
"decode": function (_0x4de779) {
|
||||
if (!_0x4de779) return "";
|
||||
for (var _0x44177d = _0x4de779.length, _0x3286ef = 0, _0x5afdd4 = []; _0x3286ef < _0x44177d;) code1 = this.table.indexOf(_0x4de779.charAt(_0x3286ef++)), code2 = this.table.indexOf(_0x4de779.charAt(_0x3286ef++)), code3 = this.table.indexOf(_0x4de779.charAt(_0x3286ef++)), code4 = this.table.indexOf(_0x4de779.charAt(_0x3286ef++)), c1 = code1 << 2 | code2 >> 4, _0x5afdd4.push(String.fromCharCode(c1)), -1 != code3 && (c2 = (15 & code2) << 4 | code3 >> 2, _0x5afdd4.push(String.fromCharCode(c2))), -1 != code4 && (c3 = (3 & code3) << 6 | code4, _0x5afdd4.push(String.fromCharCode(c3)));
|
||||
return this.UTF8ToUTF16(_0x5afdd4.join(""));
|
||||
}
|
||||
};
|
||||
function _0x52233c(_0x5136e2, _0xe0d60f) {
|
||||
for (var _0x2ab4f3 = _0x3b0e44.encode("".concat(_0x5136e2, "QWERIPZAN1290QWER").concat(_0xe0d60f)), _0x4cc15c = "", _0x1675cf = 0; _0x1675cf < 80; _0x1675cf++) _0x4cc15c += Math.random().toString(16).slice(2);
|
||||
return _0x2ab4f3 = "".concat(_0x4cc15c.slice(0, 100)).concat(_0x2ab4f3.slice(0, 8)).concat(_0x4cc15c.slice(100, 200)).concat(_0x2ab4f3.slice(8, 20)).concat(_0x4cc15c.slice(200, 300)).concat(_0x2ab4f3.slice(20)).concat(_0x4cc15c.slice(300, 400)), _0x2ab4f3;
|
||||
}
|
||||
return {
|
||||
"account": _0x52233c(_0x256ced, _0x59add5),
|
||||
"source": "ipzan-home-one"
|
||||
};
|
||||
}
|
||||
async function _0x241982(_0x100501 = 3000) {
|
||||
return console.log("----------- 延迟 " + _0x100501 / 1000 + " s,请稍等 -----------"), await new Promise(_0x5783a5 => setTimeout(_0x5783a5, _0x100501));
|
||||
}
|
||||
async function _0x5e22b6() {}
|
||||
async function _0x76f888() {
|
||||
if (_0xa2efe3) {
|
||||
let _0x57de73 = _0x44155b[0];
|
||||
for (let _0x2979c7 of _0x44155b) {
|
||||
if (_0xa2efe3.indexOf(_0x2979c7) > -1) {
|
||||
_0x57de73 = _0x2979c7;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (let _0xf9d291 of _0xa2efe3.split(_0x57de73)) {
|
||||
if (_0xf9d291) _0xd941b5.push(new _0x138232(_0xf9d291));
|
||||
}
|
||||
userCount = _0xd941b5.length;
|
||||
} else {
|
||||
console.log("未找到 配置信息,请检查是否配置 变量:", _0x34f238);
|
||||
return;
|
||||
}
|
||||
return console.log("共找到" + userCount + "个账号"), true;
|
||||
}
|
||||
async function _0x58c2e5(_0x542f7d, _0x5679cd) {
|
||||
return httpErr = null, httpReq = null, httpResp = null, new Promise(_0x2ef8a3 => {
|
||||
_0xf1ea8.send(_0x542f7d, _0x5679cd, async (_0xb83695, _0x271317, _0x41aed5) => {
|
||||
httpErr = _0xb83695;
|
||||
httpReq = _0x271317;
|
||||
httpResp = _0x41aed5;
|
||||
_0x2ef8a3({
|
||||
"err": _0xb83695,
|
||||
"req": _0x271317,
|
||||
"resp": _0x41aed5
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
function _0x299988(_0x35c70e, _0xb9b557) {
|
||||
return "undefined" != typeof process && JSON.stringify(process.env).indexOf("GITHUB") > -1 && process.exit(0), new class {
|
||||
constructor(_0x26381d, _0x43202e) {
|
||||
this.name = _0x26381d;
|
||||
this.notifyStr = "";
|
||||
this.startTime = new Date().getTime();
|
||||
Object.assign(this, _0x43202e);
|
||||
console.log(this.name + " 开始运行:\n");
|
||||
}
|
||||
["isNode"]() {
|
||||
return "undefined" != typeof module && !!module.exports;
|
||||
}
|
||||
["isQuanX"]() {
|
||||
return "undefined" != typeof $task;
|
||||
}
|
||||
["isSurge"]() {
|
||||
return "undefined" != typeof $httpClient && "undefined" == typeof $loon;
|
||||
}
|
||||
["isLoon"]() {
|
||||
return "undefined" != typeof $loon;
|
||||
}
|
||||
["getdata"](_0x2d117f) {
|
||||
let _0x30f15c = this.getval(_0x2d117f);
|
||||
if (/^@/.test(_0x2d117f)) {
|
||||
const [, _0x1c3665, _0x103309] = /^@(.*?)\.(.*?)$/.exec(_0x2d117f),
|
||||
_0x2a7cde = _0x1c3665 ? this.getval(_0x1c3665) : "";
|
||||
if (_0x2a7cde) try {
|
||||
const _0x594976 = JSON.parse(_0x2a7cde);
|
||||
_0x30f15c = _0x594976 ? this.lodash_get(_0x594976, _0x103309, "") : _0x30f15c;
|
||||
} catch (_0x26da6d) {
|
||||
_0x30f15c = "";
|
||||
}
|
||||
}
|
||||
return _0x30f15c;
|
||||
}
|
||||
["setdata"](_0x411712, _0x5b20be) {
|
||||
let _0x170076 = false;
|
||||
if (/^@/.test(_0x5b20be)) {
|
||||
const [, _0x223398, _0x52b97d] = /^@(.*?)\.(.*?)$/.exec(_0x5b20be),
|
||||
_0x62b663 = this.getval(_0x223398),
|
||||
_0x57cf24 = _0x223398 ? "null" === _0x62b663 ? null : _0x62b663 || "{}" : "{}";
|
||||
try {
|
||||
const _0x1a909a = JSON.parse(_0x57cf24);
|
||||
this.lodash_set(_0x1a909a, _0x52b97d, _0x411712);
|
||||
_0x170076 = this.setval(JSON.stringify(_0x1a909a), _0x223398);
|
||||
} catch (_0x2da117) {
|
||||
const _0x5c5c9f = {};
|
||||
this.lodash_set(_0x5c5c9f, _0x52b97d, _0x411712);
|
||||
_0x170076 = this.setval(JSON.stringify(_0x5c5c9f), _0x223398);
|
||||
}
|
||||
} else _0x170076 = this.setval(_0x411712, _0x5b20be);
|
||||
return _0x170076;
|
||||
}
|
||||
["getval"](_0x5f389a) {
|
||||
return this.isSurge() || this.isLoon() ? $persistentStore.read(_0x5f389a) : this.isQuanX() ? $prefs.valueForKey(_0x5f389a) : this.isNode() ? (this.data = this.loaddata(), this.data[_0x5f389a]) : this.data && this.data[_0x5f389a] || null;
|
||||
}
|
||||
["setval"](_0x1b34bf, _0x28cdab) {
|
||||
return this.isSurge() || this.isLoon() ? $persistentStore.write(_0x1b34bf, _0x28cdab) : this.isQuanX() ? $prefs.setValueForKey(_0x1b34bf, _0x28cdab) : this.isNode() ? (this.data = this.loaddata(), this.data[_0x28cdab] = _0x1b34bf, this.writedata(), !0) : this.data && this.data[_0x28cdab] || null;
|
||||
}
|
||||
["send"](_0x38991d, _0x10122b, _0xf72ed5 = () => {}) {
|
||||
if (_0x38991d != "get" && _0x38991d != "post" && _0x38991d != "put" && _0x38991d != "delete") {
|
||||
console.log("无效的http方法:" + _0x38991d);
|
||||
return;
|
||||
}
|
||||
if (_0x38991d == "get" && _0x10122b.headers) delete _0x10122b.headers["Content-Type"], delete _0x10122b.headers["Content-Length"];else {
|
||||
if (_0x10122b.body && _0x10122b.headers) {
|
||||
if (!_0x10122b.headers["Content-Type"]) _0x10122b.headers["Content-Type"] = "application/x-www-form-urlencoded";
|
||||
}
|
||||
}
|
||||
if (this.isSurge() || this.isLoon()) {
|
||||
this.isSurge() && this.isNeedRewrite && (_0x10122b.headers = _0x10122b.headers || {}, Object.assign(_0x10122b.headers, {
|
||||
"X-Surge-Skip-Scripting": !1
|
||||
}));
|
||||
let _0x2f0893 = {
|
||||
"method": _0x38991d,
|
||||
"url": _0x10122b.url,
|
||||
"headers": _0x10122b.headers,
|
||||
"timeout": _0x10122b.timeout,
|
||||
"data": _0x10122b.body
|
||||
};
|
||||
if (_0x38991d == "get") delete _0x2f0893.data;
|
||||
$axios(_0x2f0893).then(_0x39a13c => {
|
||||
const {
|
||||
status: _0x53aa82,
|
||||
request: _0x141a34,
|
||||
headers: _0x2979d9,
|
||||
data: _0x2262bf
|
||||
} = _0x39a13c;
|
||||
_0xf72ed5(null, _0x141a34, {
|
||||
"statusCode": _0x53aa82,
|
||||
"headers": _0x2979d9,
|
||||
"body": _0x2262bf
|
||||
});
|
||||
}).catch(_0x3a5bbb => console.log(_0x3a5bbb));
|
||||
} else {
|
||||
if (this.isQuanX()) {
|
||||
_0x10122b.method = _0x38991d.toUpperCase();
|
||||
this.isNeedRewrite && (_0x10122b.opts = _0x10122b.opts || {}, Object.assign(_0x10122b.opts, {
|
||||
"hints": !1
|
||||
}));
|
||||
$task.fetch(_0x10122b).then(_0x538157 => {
|
||||
const {
|
||||
statusCode: _0x2101fb,
|
||||
request: _0x186259,
|
||||
headers: _0x452945,
|
||||
body: _0x5eb9cc
|
||||
} = _0x538157;
|
||||
_0xf72ed5(null, _0x186259, {
|
||||
"statusCode": _0x2101fb,
|
||||
"headers": _0x452945,
|
||||
"body": _0x5eb9cc
|
||||
});
|
||||
}, _0x467989 => _0xf72ed5(_0x467989));
|
||||
} else {
|
||||
if (this.isNode()) {
|
||||
this.got = this.got ? this.got : require("got");
|
||||
const {
|
||||
url: _0x5ee2a9,
|
||||
..._0x2ff382
|
||||
} = _0x10122b;
|
||||
this.instance = this.got.extend({
|
||||
"followRedirect": false
|
||||
});
|
||||
this.instance[_0x38991d](_0x5ee2a9, _0x2ff382).then(_0x5b094d => {
|
||||
const {
|
||||
statusCode: _0x2e12ae,
|
||||
request: _0x52d154,
|
||||
headers: _0x3a7327,
|
||||
body: _0x3cfb53
|
||||
} = _0x5b094d;
|
||||
_0xf72ed5(null, _0x52d154, {
|
||||
"statusCode": _0x2e12ae,
|
||||
"headers": _0x3a7327,
|
||||
"body": _0x3cfb53
|
||||
});
|
||||
}, _0x596487 => {
|
||||
const {
|
||||
message: _0x5e8d76,
|
||||
request: _0x115f17,
|
||||
response: _0x3fbe55
|
||||
} = _0x596487;
|
||||
_0xf72ed5(_0x5e8d76, _0x115f17, _0x3fbe55);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
["time"](_0x348195, _0x5bc6db = null) {
|
||||
let _0x4dac7b = _0x5bc6db ? new Date(_0x5bc6db) : new Date(),
|
||||
_0x587f4c = {
|
||||
"M+": _0x4dac7b.getMonth() + 1,
|
||||
"d+": _0x4dac7b.getDate(),
|
||||
"h+": _0x4dac7b.getHours(),
|
||||
"m+": _0x4dac7b.getMinutes(),
|
||||
"s+": _0x4dac7b.getSeconds(),
|
||||
"q+": Math.floor((_0x4dac7b.getMonth() + 3) / 3),
|
||||
"S": _0x4dac7b.getMilliseconds()
|
||||
};
|
||||
/(y+)/.test(_0x348195) && (_0x348195 = _0x348195.replace(RegExp.$1, (_0x4dac7b.getFullYear() + "").substr(4 - RegExp.$1.length)));
|
||||
for (let _0x5f41dc in _0x587f4c) new RegExp("(" + _0x5f41dc + ")").test(_0x348195) && (_0x348195 = _0x348195.replace(RegExp.$1, 1 == RegExp.$1.length ? _0x587f4c[_0x5f41dc] : ("00" + _0x587f4c[_0x5f41dc]).substr(("" + _0x587f4c[_0x5f41dc]).length)));
|
||||
return _0x348195;
|
||||
}
|
||||
async ["showmsg"]() {
|
||||
if (!this.notifyStr) return;
|
||||
let _0x28fba3 = this.name + " 运行通知\n\n" + this.notifyStr;
|
||||
if (_0xf1ea8.isNode()) {
|
||||
var _0x419448 = require("./sendNotify");
|
||||
console.log("\n============== 推送 ==============");
|
||||
await _0x419448.sendNotify(this.name, _0x28fba3);
|
||||
} else this.msg(_0x28fba3);
|
||||
}
|
||||
["logAndNotify"](_0x59ff05) {
|
||||
console.log(_0x59ff05);
|
||||
this.notifyStr += _0x59ff05;
|
||||
this.notifyStr += "\n";
|
||||
}
|
||||
["logAndNotifyWithTime"](_0x4a4431) {
|
||||
let _0x16db0f = "[" + this.time("hh:mm:ss.S") + "]" + _0x4a4431;
|
||||
console.log(_0x16db0f);
|
||||
this.notifyStr += _0x16db0f;
|
||||
this.notifyStr += "\n";
|
||||
}
|
||||
["logWithTime"](_0x248e8e) {
|
||||
console.log("[" + this.time("hh:mm:ss.S") + "]" + _0x248e8e);
|
||||
}
|
||||
["msg"](_0x5ccbaf = t, _0x5f2ea9 = "", _0x33a21d = "", _0x15d370) {
|
||||
const _0x26bf99 = _0x479142 => {
|
||||
if (!_0x479142) return _0x479142;
|
||||
if ("string" == typeof _0x479142) return this.isLoon() ? _0x479142 : this.isQuanX() ? {
|
||||
"open-url": _0x479142
|
||||
} : this.isSurge() ? {
|
||||
"url": _0x479142
|
||||
} : void 0;
|
||||
if ("object" == typeof _0x479142) {
|
||||
if (this.isLoon()) {
|
||||
let _0x1298eb = _0x479142.openUrl || _0x479142.url || _0x479142["open-url"],
|
||||
_0x21c7dc = _0x479142.mediaUrl || _0x479142["media-url"];
|
||||
return {
|
||||
"openUrl": _0x1298eb,
|
||||
"mediaUrl": _0x21c7dc
|
||||
};
|
||||
}
|
||||
if (this.isQuanX()) {
|
||||
let _0x599a1c = _0x479142["open-url"] || _0x479142.url || _0x479142.openUrl,
|
||||
_0x11d41a = _0x479142["media-url"] || _0x479142.mediaUrl;
|
||||
return {
|
||||
"open-url": _0x599a1c,
|
||||
"media-url": _0x11d41a
|
||||
};
|
||||
}
|
||||
if (this.isSurge()) {
|
||||
let _0x526793 = _0x479142.url || _0x479142.openUrl || _0x479142["open-url"];
|
||||
return {
|
||||
"url": _0x526793
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(_0x5ccbaf, _0x5f2ea9, _0x33a21d, _0x26bf99(_0x15d370)) : this.isQuanX() && $notify(_0x5ccbaf, _0x5f2ea9, _0x33a21d, _0x26bf99(_0x15d370)));
|
||||
let _0x5b72bc = ["", "============== 系统通知 =============="];
|
||||
_0x5b72bc.push(_0x5ccbaf);
|
||||
_0x5f2ea9 && _0x5b72bc.push(_0x5f2ea9);
|
||||
_0x33a21d && _0x5b72bc.push(_0x33a21d);
|
||||
console.log(_0x5b72bc.join("\n"));
|
||||
}
|
||||
["getMin"](_0x1e4c28, _0x1b3fed) {
|
||||
return _0x1e4c28 < _0x1b3fed ? _0x1e4c28 : _0x1b3fed;
|
||||
}
|
||||
["getMax"](_0x44257e, _0x5e7519) {
|
||||
return _0x44257e < _0x5e7519 ? _0x5e7519 : _0x44257e;
|
||||
}
|
||||
["padStr"](_0x42eadb, _0x4722e0, _0x520994 = "0") {
|
||||
let _0x325005 = String(_0x42eadb),
|
||||
_0x33179d = _0x4722e0 > _0x325005.length ? _0x4722e0 - _0x325005.length : 0,
|
||||
_0x15c189 = "";
|
||||
for (let _0xfe43c4 = 0; _0xfe43c4 < _0x33179d; _0xfe43c4++) {
|
||||
_0x15c189 += _0x520994;
|
||||
}
|
||||
return _0x15c189 += _0x325005, _0x15c189;
|
||||
}
|
||||
["json2str"](_0x300f3f, _0x2c0636, _0x37b9a0 = false) {
|
||||
let _0x2f13c4 = [];
|
||||
for (let _0xd689e of Object.keys(_0x300f3f).sort()) {
|
||||
let _0x546626 = _0x300f3f[_0xd689e];
|
||||
if (_0x546626 && _0x37b9a0) _0x546626 = encodeURIComponent(_0x546626);
|
||||
_0x2f13c4.push(_0xd689e + "=" + _0x546626);
|
||||
}
|
||||
return _0x2f13c4.join(_0x2c0636);
|
||||
}
|
||||
["str2json"](_0x407b63, _0x270666 = false) {
|
||||
let _0xd85dc6 = {};
|
||||
for (let _0x23e13a of _0x407b63.split("&")) {
|
||||
if (!_0x23e13a) continue;
|
||||
let _0x2388ac = _0x23e13a.indexOf("=");
|
||||
if (_0x2388ac == -1) continue;
|
||||
let _0x189560 = _0x23e13a.substr(0, _0x2388ac),
|
||||
_0x37af9c = _0x23e13a.substr(_0x2388ac + 1);
|
||||
if (_0x270666) _0x37af9c = decodeURIComponent(_0x37af9c);
|
||||
_0xd85dc6[_0x189560] = _0x37af9c;
|
||||
}
|
||||
return _0xd85dc6;
|
||||
}
|
||||
["randomString"](_0x58daa1, _0x2792a6 = "abcdef0123456789") {
|
||||
let _0x27ce4a = "";
|
||||
for (let _0x11c145 = 0; _0x11c145 < _0x58daa1; _0x11c145++) {
|
||||
_0x27ce4a += _0x2792a6.charAt(Math.floor(Math.random() * _0x2792a6.length));
|
||||
}
|
||||
return _0x27ce4a;
|
||||
}
|
||||
["randomList"](_0x2b61e8) {
|
||||
let _0xeea55d = Math.floor(Math.random() * _0x2b61e8.length);
|
||||
return _0x2b61e8[_0xeea55d];
|
||||
}
|
||||
["wait"](_0x2724d1) {
|
||||
return new Promise(_0x3418cd => setTimeout(_0x3418cd, _0x2724d1));
|
||||
}
|
||||
["done"](_0x37d9be = {}) {
|
||||
const _0x3487fc = new Date().getTime(),
|
||||
_0x58b1e9 = (_0x3487fc - this.startTime) / 1000;
|
||||
console.log("\n" + this.name + " 运行结束,共运行了 " + _0x58b1e9 + " 秒!");
|
||||
if (this.isSurge() || this.isQuanX() || this.isLoon()) $done(_0x37d9be);
|
||||
}
|
||||
}(_0x35c70e, _0xb9b557);
|
||||
}
|
||||
631
脚本库/web版/账密/哔哩哔哩热搜榜/2025-08-25_bilihot_1ef69980.js
Normal file
631
脚本库/web版/账密/哔哩哔哩热搜榜/2025-08-25_bilihot_1ef69980.js
Normal file
File diff suppressed because one or more lines are too long
565
脚本库/web版/账密/喜马拉雅/2025-08-25_ql_xmly_27dc10eb.js
Normal file
565
脚本库/web版/账密/喜马拉雅/2025-08-25_ql_xmly_27dc10eb.js
Normal file
File diff suppressed because one or more lines are too long
589
脚本库/web版/账密/图虫/2025-06-28_图虫_11833d7f.js
Normal file
589
脚本库/web版/账密/图虫/2025-06-28_图虫_11833d7f.js
Normal file
File diff suppressed because one or more lines are too long
535
脚本库/web版/账密/在线工具/2025-08-25_ql_toollu_49df7a6e.js
Normal file
535
脚本库/web版/账密/在线工具/2025-08-25_ql_toollu_49df7a6e.js
Normal file
File diff suppressed because one or more lines are too long
228
脚本库/web版/账密/天翼云盘/2025-06-28_天翼云盘_3c9fd20b.py
Normal file
228
脚本库/web版/账密/天翼云盘/2025-06-28_天翼云盘_3c9fd20b.py
Normal file
@@ -0,0 +1,228 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%A4%A9%E7%BF%BC%E4%BA%91%E7%9B%98.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 天翼云盘.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: 3c9fd20b74cc1a446cf8a8a4dc20b345f27ba2f121d6df5f0055e5f5b5bb87de
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
#有问题联系3288588344
|
||||
|
||||
# cron 30 9 * * *
|
||||
|
||||
#频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
#在我写的地方,填上账号密码就行,有问题联系上方
|
||||
|
||||
import notify
|
||||
import time
|
||||
import re
|
||||
import json
|
||||
import base64
|
||||
import hashlib
|
||||
import urllib.parse,hmac
|
||||
import rsa
|
||||
import requests
|
||||
import random
|
||||
|
||||
BI_RM = list("0123456789abcdefghijklmnopqrstuvwxyz")
|
||||
|
||||
B64MAP = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
|
||||
|
||||
s = requests.Session()
|
||||
|
||||
# 在下面两行的引号内贴上账号(仅支持手机号)和密码
|
||||
username = "这里填上你的天翼云盘账号"
|
||||
password = "这里填上你的天翼网盘密码"
|
||||
|
||||
_ = """
|
||||
if(username == "" or password == ""):
|
||||
username = input("账号:")
|
||||
password = input("密码:")
|
||||
# """
|
||||
|
||||
assert username and password, "在第23、24行填入有效账号和密码"
|
||||
|
||||
def int2char(a):
|
||||
return BI_RM[a]
|
||||
|
||||
|
||||
def b64tohex(a):
|
||||
d = ""
|
||||
e = 0
|
||||
c = 0
|
||||
for i in range(len(a)):
|
||||
if list(a)[i] != "=":
|
||||
v = B64MAP.index(list(a)[i])
|
||||
if 0 == e:
|
||||
e = 1
|
||||
d += int2char(v >> 2)
|
||||
c = 3 & v
|
||||
elif 1 == e:
|
||||
e = 2
|
||||
d += int2char(c << 2 | v >> 4)
|
||||
c = 15 & v
|
||||
elif 2 == e:
|
||||
e = 3
|
||||
d += int2char(c)
|
||||
d += int2char(v >> 2)
|
||||
c = 3 & v
|
||||
else:
|
||||
e = 0
|
||||
d += int2char(c << 2 | v >> 4)
|
||||
d += int2char(15 & v)
|
||||
if e == 1:
|
||||
d += int2char(c << 2)
|
||||
return d
|
||||
|
||||
|
||||
def rsa_encode(j_rsakey, string):
|
||||
rsa_key = f"-----BEGIN PUBLIC KEY-----\n{j_rsakey}\n-----END PUBLIC KEY-----"
|
||||
pubkey = rsa.PublicKey.load_pkcs1_openssl_pem(rsa_key.encode())
|
||||
result = b64tohex((base64.b64encode(rsa.encrypt(f'{string}'.encode(), pubkey))).decode())
|
||||
return result
|
||||
|
||||
|
||||
def calculate_md5_sign(params):
|
||||
return hashlib.md5('&'.join(sorted(params.split('&'))).encode('utf-8')).hexdigest()
|
||||
|
||||
|
||||
def login(username, password):
|
||||
#https://m.cloud.189.cn/login2014.jsp?redirectURL=https://m.cloud.189.cn/zhuanti/2021/shakeLottery/index.html
|
||||
url=""
|
||||
urlToken="https://m.cloud.189.cn/udb/udb_login.jsp?pageId=1&pageKey=default&clientType=wap&redirectURL=https://m.cloud.189.cn/zhuanti/2021/shakeLottery/index.html"
|
||||
s = requests.Session()
|
||||
r = s.get(urlToken)
|
||||
pattern = r"https?://[^\s'\"]+" # 匹配以http或https开头的url
|
||||
match = re.search(pattern, r.text) # 在文本中搜索匹配
|
||||
if match: # 如果找到匹配
|
||||
url = match.group() # 获取匹配的字符串
|
||||
# print(url) # 打印url
|
||||
else: # 如果没有找到匹配
|
||||
print("没有找到url")
|
||||
|
||||
r = s.get(url)
|
||||
# print(r.text)
|
||||
pattern = r"<a id=\"j-tab-login-link\"[^>]*href=\"([^\"]+)\"" # 匹配id为j-tab-login-link的a标签,并捕获href引号内的内容
|
||||
match = re.search(pattern, r.text) # 在文本中搜索匹配
|
||||
if match: # 如果找到匹配
|
||||
href = match.group(1) # 获取捕获的内容
|
||||
# print("href:" + href) # 打印href链接
|
||||
else: # 如果没有找到匹配
|
||||
print("没有找到href链接")
|
||||
|
||||
r = s.get(href)
|
||||
captchaToken = re.findall(r"captchaToken' value='(.+?)'", r.text)[0]
|
||||
lt = re.findall(r'lt = "(.+?)"', r.text)[0]
|
||||
returnUrl = re.findall(r"returnUrl= '(.+?)'", r.text)[0]
|
||||
paramId = re.findall(r'paramId = "(.+?)"', r.text)[0]
|
||||
j_rsakey = re.findall(r'j_rsaKey" value="(\S+)"', r.text, re.M)[0]
|
||||
s.headers.update({"lt": lt})
|
||||
|
||||
username = rsa_encode(j_rsakey, username)
|
||||
password = rsa_encode(j_rsakey, password)
|
||||
url = "https://open.e.189.cn/api/logbox/oauth2/loginSubmit.do"
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/76.0',
|
||||
'Referer': 'https://open.e.189.cn/',
|
||||
}
|
||||
data = {
|
||||
"appKey": "cloud",
|
||||
"accountType": '01',
|
||||
"userName": f"{{RSA}}{username}",
|
||||
"password": f"{{RSA}}{password}",
|
||||
"validateCode": "",
|
||||
"captchaToken": captchaToken,
|
||||
"returnUrl": returnUrl,
|
||||
"mailSuffix": "@189.cn",
|
||||
"paramId": paramId
|
||||
}
|
||||
r = s.post(url, data=data, headers=headers, timeout=5)
|
||||
if (r.json()['result'] == 0):
|
||||
print(r.json()['msg'])
|
||||
else:
|
||||
print(r.json()['msg'])
|
||||
redirect_url = r.json()['toUrl']
|
||||
r = s.get(redirect_url)
|
||||
return s
|
||||
|
||||
|
||||
def main():
|
||||
s=login(username, password)
|
||||
rand = str(round(time.time() * 1000))
|
||||
surl = f'https://api.cloud.189.cn/mkt/userSign.action?rand={rand}&clientType=TELEANDROID&version=8.6.3&model=SM-G930K'
|
||||
url = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN&activityId=ACT_SIGNIN'
|
||||
url2 = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_SIGNIN_PHOTOS&activityId=ACT_SIGNIN'
|
||||
url3 = f'https://m.cloud.189.cn/v2/drawPrizeMarketDetails.action?taskId=TASK_2022_FLDFS_KJ&activityId=ACT_SIGNIN'
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; SM-G930K Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 Ecloud/8.6.3 Android/22 clientId/355325117317828 clientModel/SM-G930K imsi/460071114317824 clientChannelId/qq proVersion/1.0.6',
|
||||
"Referer": "https://m.cloud.189.cn/zhuanti/2016/sign/index.jsp?albumBackupOpened=1",
|
||||
"Host": "m.cloud.189.cn",
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
}
|
||||
response = s.get(surl, headers=headers)
|
||||
netdiskBonus = response.json()['netdiskBonus']
|
||||
if (response.json()['isSign'] == "false"):
|
||||
print(f"未签到,签到获得{netdiskBonus}M空间")
|
||||
res1 = f"未签到,签到获得{netdiskBonus}M空间"
|
||||
else:
|
||||
print(f"已经签到过了,签到获得{netdiskBonus}M空间")
|
||||
res1 = f"已经签到过了,签到获得{netdiskBonus}M空间"
|
||||
|
||||
headers = {
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 5.1.1; SM-G930K Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.136 Mobile Safari/537.36 Ecloud/8.6.3 Android/22 clientId/355325117317828 clientModel/SM-G930K imsi/460071114317824 clientChannelId/qq proVersion/1.0.6',
|
||||
"Referer": "https://m.cloud.189.cn/zhuanti/2016/sign/index.jsp?albumBackupOpened=1",
|
||||
"Host": "m.cloud.189.cn",
|
||||
"Accept-Encoding": "gzip, deflate",
|
||||
}
|
||||
response = s.get(url, headers=headers)
|
||||
if ("errorCode" in response.text):
|
||||
print(response.text)
|
||||
res2 = ""
|
||||
else:
|
||||
description = response.json()['description']
|
||||
print(f"抽奖获得{description}")
|
||||
res2 = f"抽奖获得{description}"
|
||||
response = s.get(url2, headers=headers)
|
||||
if ("errorCode" in response.text):
|
||||
print(response.text)
|
||||
res3 = ""
|
||||
else:
|
||||
description = response.json()['description']
|
||||
print(f"抽奖获得{description}")
|
||||
res3 = f"抽奖获得{description}"
|
||||
|
||||
response = s.get(url3, headers=headers)
|
||||
if ("errorCode" in response.text):
|
||||
print(response.text)
|
||||
res4 = ""
|
||||
else:
|
||||
description = response.json()['description']
|
||||
print(f"链接3抽奖获得{description}")
|
||||
res4 = f"链接3抽奖获得{description}"
|
||||
|
||||
title = "天翼云签到"
|
||||
content = f"""
|
||||
{res1}
|
||||
{res2}
|
||||
{res3}
|
||||
{res4}
|
||||
"""
|
||||
notify.send(title, content)
|
||||
|
||||
def lambda_handler(event, context): # aws default
|
||||
main()
|
||||
|
||||
|
||||
def main_handler(event, context): # tencent default
|
||||
main()
|
||||
|
||||
|
||||
def handler(event, context): # aliyun default
|
||||
main()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
time.sleep(random.randint(5, 30))
|
||||
467
脚本库/web版/账密/夸克网盘/2025-08-25_ql_quark_f2d5bcba.js
Normal file
467
脚本库/web版/账密/夸克网盘/2025-08-25_ql_quark_f2d5bcba.js
Normal file
File diff suppressed because one or more lines are too long
712
脚本库/web版/账密/夸克订阅更新自动转存/2025-08-25_quarksave_84f33509.js
Normal file
712
脚本库/web版/账密/夸克订阅更新自动转存/2025-08-25_quarksave_84f33509.js
Normal file
File diff suppressed because one or more lines are too long
243
脚本库/web版/账密/奇瑞汽车/2026-05-14_chery_022b783a.js
Normal file
243
脚本库/web版/账密/奇瑞汽车/2026-05-14_chery_022b783a.js
Normal file
@@ -0,0 +1,243 @@
|
||||
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/chery.js
|
||||
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/chery.js
|
||||
// # Repo: smallfawn/QLScriptPublic
|
||||
// # Path: daily/chery.js
|
||||
// # UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
// # SHA256: 022b783a47c38858a3c9a7afaa031098896163fabfd32345ac93d1c3333c4edb
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
------------------------------------------
|
||||
@Author: sm
|
||||
@Date: 2024.06.07 19:15
|
||||
@Description: 奇瑞汽车
|
||||
cron: 30 8 * * *
|
||||
------------------------------------------
|
||||
#Notice:
|
||||
APP 抓包的登录接口uaa2c.chery.cn 里面的返回的access_token就是环境变量需要的token,多个账号换行或者&
|
||||
自助获取变量
|
||||
https://logintools.smallfawn.top/chery.html
|
||||
⚠️【免责声明】
|
||||
------------------------------------------
|
||||
1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。
|
||||
2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
|
||||
3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。
|
||||
4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
|
||||
5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。
|
||||
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。
|
||||
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。
|
||||
*/
|
||||
|
||||
const { Env } = require("../tools/env")
|
||||
const $ = new Env("奇瑞汽车");
|
||||
let ckName = `chery`;
|
||||
const strSplitor = "#";
|
||||
const axios = require("axios");
|
||||
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
|
||||
|
||||
const CryptoJS = require("crypto-js");
|
||||
class Task {
|
||||
constructor(env) {
|
||||
this.index = $.userIdx++
|
||||
this.user = env.split(strSplitor);
|
||||
this.token = this.user[0];
|
||||
this.ckStatus = false;
|
||||
this.articleIdList = []
|
||||
|
||||
}
|
||||
encryptParams(e) {
|
||||
const t = CryptoJS.enc.Base64.parse("vVfnp9ozfDQyonMKuqgZUWjtdV+7PtBqtMCwJqz2HKQ=")
|
||||
, n = CryptoJS.lib.WordArray.random(16)
|
||||
, o = CryptoJS.AES.encrypt(e, t, {
|
||||
iv: n,
|
||||
mode: CryptoJS.mode.CBC,
|
||||
padding: CryptoJS.pad.Pkcs7
|
||||
})
|
||||
, i = CryptoJS.lib.WordArray.create();
|
||||
return i.concat(n),
|
||||
i.concat(o.ciphertext),
|
||||
CryptoJS.enc.Base64.stringify(i).replace(/\+/g, "-")
|
||||
}
|
||||
|
||||
async run() {
|
||||
|
||||
await this.info()
|
||||
if (this.ckStatus == true) {
|
||||
await this.signIn()
|
||||
await this.contentsList()
|
||||
for (let articleId of this.articleIdList) {
|
||||
await this.taskShare(articleId)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
async signIn() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://mobile-consumer-sapp.chery.cn/web/event/trigger?encryptParam=${encodeURIComponent(this.encryptParams(`access_token=${this.token}&terminal=3`))}`,
|
||||
headers: {
|
||||
"user-agent": "Dart/2.19 (dart:io)",
|
||||
"appversioncode": "26030901",
|
||||
"accept": "application/json, text/plain, */*",
|
||||
"appversion": "3.6.9",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"accept-encoding": "gzip, deflate",
|
||||
"host": "mobile-consumer-sapp.chery.cn",
|
||||
"content-type": "application/json; charset=UTF-8",
|
||||
"agent": "android",
|
||||
"encryptflag": "true",
|
||||
"request-channel": "app"
|
||||
},
|
||||
data:
|
||||
Buffer.from(this.encryptParams(JSON.stringify({ "eventCode": "SJ10002" })), "utf-8"),
|
||||
transformRequest: [(d, headers) => d]
|
||||
};
|
||||
let { data: result } = await axios.request(options);
|
||||
if (result.status == 200) {
|
||||
$.log(`✅账号[${this.index}] 【签到】[${result.message}]🎉`);
|
||||
} else {
|
||||
$.log(`❌账号[${this.index}] 【签到】[${result.message}]`);
|
||||
//console.log(result);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
async info() {
|
||||
let options = {
|
||||
method: 'GET',
|
||||
url: `https://mobile-consumer-sapp.chery.cn/web/user/current/details?encryptParam=${encodeURIComponent(this.encryptParams(`access_token=${this.token}&terminal=3`))}`,
|
||||
headers: {
|
||||
"user-agent": "Dart/2.19 (dart:io)",
|
||||
"appversioncode": "26030901",
|
||||
"accept": "application/json, text/plain, */*",
|
||||
"appversion": "3.6.9",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"accept-encoding": "gzip, deflate",
|
||||
"host": "mobile-consumer-sapp.chery.cn",
|
||||
"content-type": "application/json; charset=UTF-8",
|
||||
"agent": "android",
|
||||
"encryptflag": "true",
|
||||
"request-channel": "app"
|
||||
},
|
||||
}
|
||||
let { data: result } = await axios.request(options);
|
||||
if (result.status == 200) {
|
||||
$.log(`✅账号[${this.index}] 【昵称】[${result.data.displayName}] 【积分】[${result.data.pointAccount.payableBalance}]🎉`);
|
||||
this.userName = result.data.displayName
|
||||
this.userPoint = result.data.pointAccount.payableBalance
|
||||
this.ckStatus = true;
|
||||
} else {
|
||||
$.log(`❌账号[${this.index}] [${result.message}]`);
|
||||
this.ckStatus = false;
|
||||
//console.log(result);
|
||||
}
|
||||
}
|
||||
|
||||
async taskShare(articleId) {
|
||||
|
||||
try {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://mobile-consumer-sapp.chery.cn/web/community/contents/${articleId}/share?encryptParams=${this.encryptParams(`access_token=${this.token}&terminal=3`)}`,
|
||||
headers: {
|
||||
"user-agent": "Dart/2.19 (dart:io)",
|
||||
"appversioncode": "26030901",
|
||||
"accept": "application/json, text/plain, */*",
|
||||
"appversion": "3.6.9",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"accept-encoding": "gzip, deflate",
|
||||
"host": "mobile-consumer-sapp.chery.cn",
|
||||
"content-type": "application/json; charset=UTF-8",
|
||||
"agent": "android",
|
||||
"encryptflag": "true",
|
||||
"request-channel": "app"
|
||||
},
|
||||
data: Buffer.from(this.encryptParams(JSON.stringify({ "contentId": articleId })), "utf-8")
|
||||
, transformRequest: [(d, headers) => d]
|
||||
}
|
||||
let { data: result } = await axios.request(options);
|
||||
if (result.status == 200) {
|
||||
$.log(`✅账号[${this.index}] 【分享】[${result.message}]🎉`);
|
||||
} else {
|
||||
$.log(`❌账号[${this.index}] 【分享】[${result.message}]`);
|
||||
//console.log(result);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
async contentsList() {
|
||||
|
||||
try {
|
||||
let options = {
|
||||
method: 'GET',
|
||||
url: `https://mobile-consumer-sapp.chery.cn/web/community/recommend/contents?encryptParam=${encodeURIComponent(this.encryptParams(`pageNo=1&pageSize=10&access_token=${this.token}&terminal=3`))}`,
|
||||
headers: {
|
||||
"user-agent": "Dart/2.19 (dart:io)",
|
||||
"appversioncode": "26030901",
|
||||
"accept": "application/json, text/plain, */*",
|
||||
"appversion": "3.6.9",
|
||||
"accept-language": "zh-CN,zh;q=0.9",
|
||||
"accept-encoding": "gzip, deflate",
|
||||
"host": "mobile-consumer-sapp.chery.cn",
|
||||
"content-type": "application/json; charset=UTF-8",
|
||||
"agent": "android",
|
||||
"encryptflag": "true",
|
||||
"request-channel": "app"
|
||||
},
|
||||
|
||||
}
|
||||
|
||||
let { data: result } = await axios.request(options);
|
||||
if (result.status == 200) {
|
||||
$.log(`✅账号[${this.index}] 【获取文章】[${result.message}]🎉`);
|
||||
this.articleIdList = [result.data.data[0].content.id, result.data.data[1].content.id]
|
||||
} else {
|
||||
$.log(`❌账号[${this.index}] 【获取文章】[${result.message}]`);
|
||||
//console.log(result);
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
await getNotice()
|
||||
$.checkEnv(ckName);
|
||||
|
||||
for (let user of $.userList) {
|
||||
await new Task(user).run();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done());
|
||||
|
||||
async function getNotice() {
|
||||
try {
|
||||
let options = {
|
||||
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
|
||||
headers: {
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
timeout:3000
|
||||
}
|
||||
let {
|
||||
data: res
|
||||
} = await axios.request(options);
|
||||
$.log(res)
|
||||
return res
|
||||
} catch (e) {}
|
||||
|
||||
}
|
||||
304
脚本库/web版/账密/宝骏汽车视频/2025-06-28_宝骏汽车视频_6330e990.py
Normal file
304
脚本库/web版/账密/宝骏汽车视频/2025-06-28_宝骏汽车视频_6330e990.py
Normal file
@@ -0,0 +1,304 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%AE%9D%E9%AA%8F%E6%B1%BD%E8%BD%A6%E8%A7%86%E9%A2%91.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%AE%9D%E9%AA%8F%E6%B1%BD%E8%BD%A6%E8%A7%86%E9%A2%91.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 宝骏汽车视频.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: 6330e990dc2b7001e0109b13ebcc739afaef1a6a9408b768f0c428e55b2430d4
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
"""
|
||||
TL库:https://github.com/3288588344/toulu.git
|
||||
tg频道:https://t.me/TLtoulu
|
||||
QQ频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
单点登录,会被顶号;体现公众号手动绑定,绑定链接打不开则用浏览器打开绑定即可;提现次日到账
|
||||
"""
|
||||
import requests, json, re, os, sys, time, random, datetime, hashlib
|
||||
response = requests.get("https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt")
|
||||
response.encoding = 'utf-8'
|
||||
txt = response.text
|
||||
print(txt)
|
||||
environ = "bjsp"
|
||||
name = "宝骏༒视频"
|
||||
session = requests.session()
|
||||
#---------------------主代码区块---------------------
|
||||
|
||||
def lookVideo(accessToken,postid):
|
||||
timestamp = int(time.time() * 1000)
|
||||
oauthConsumerKey = "20200113181123916714"
|
||||
nonce = "4857289347289375"
|
||||
other = f"{nonce}JNWSY6RXYGXIWR2YCI2HOAGYG9LVQXYZ8d33d72c27994bdc9a9e9fdda2545690"
|
||||
md5_str = f"{accessToken}{oauthConsumerKey}{timestamp}{other}"
|
||||
signatrue = hashlib.md5(md5_str.encode('utf-8')).hexdigest()
|
||||
url = 'https://hapi.baojun.net/base/activity/fission/lookVideo'
|
||||
header = {
|
||||
"Host": "hapi.baojun.net",
|
||||
"Connection": "keep-alive",
|
||||
"Content-Length": "17",
|
||||
"accessToken": accessToken,
|
||||
"nonce": nonce,
|
||||
"signatrue": signatrue,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11581",
|
||||
"oauthConsumerKey": oauthConsumerKey,
|
||||
"Content-Type": "application/json",
|
||||
"timestamp": str(timestamp),
|
||||
"xweb_xhr": "1",
|
||||
"platformNo": "Wx_mini",
|
||||
"Accept": "*/*",
|
||||
"Sec-Fetch-Site": "cross-site",
|
||||
"Sec-Fetch-Mode": "cors",
|
||||
"Sec-Fetch-Dest": "empty",
|
||||
"Referer": "https://servicewechat.com/wx58774bbe5cd15ebb/409/page-frame.html",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9"
|
||||
}
|
||||
data = {"postId":postid}
|
||||
try:
|
||||
response = session.post(url=url, headers=header, json=data)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def money(accessToken):
|
||||
timestamp = int(time.time() * 1000)
|
||||
oauthConsumerKey = "20200113181123916714"
|
||||
nonce = "1736572213106_5833612"
|
||||
other = f"{nonce}JNWSY6RXYGXIWR2YCI2HOAGYG9LVQXYZ8d33d72c27994bdc9a9e9fdda2545690"
|
||||
md5_str = f"{accessToken}{oauthConsumerKey}{timestamp}{other}"
|
||||
signatrue = hashlib.md5(md5_str.encode('utf-8')).hexdigest()
|
||||
url = 'https://hapi.baojun.net/base/account/pocket/money/draw'
|
||||
header = {
|
||||
"Host": "hapi.baojun.net",
|
||||
"Connection": "keep-alive",
|
||||
"Content-Length": "2",
|
||||
"sec-ch-ua-platform": "Android",
|
||||
"timestamp": str(timestamp),
|
||||
"accessToken": accessToken,
|
||||
"nonce": nonce,
|
||||
"signatrue": signatrue,
|
||||
"sec-ch-ua": 'Chromium";v="130", "Android WebView";v="130", "Not?A_Brand";v="99',
|
||||
"sec-ch-ua-mobile": "?1",
|
||||
"platformNo": "Wx_mini",
|
||||
"deviceType": "html5",
|
||||
"oauthConsumerKey": oauthConsumerKey,
|
||||
"Content-Type": "application/json;charset=UTF-8",
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Encoding": "gzip, deflate, br, zstd",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
|
||||
"Referer": "https://m.baojun.net",
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11581",
|
||||
"Sec-Fetch-Site": "cross-site",
|
||||
"Sec-Fetch-Mode": "cors",
|
||||
"Sec-Fetch-Dest": "empty",
|
||||
"X-Requested-With": "com.tencent.mm",
|
||||
}
|
||||
data = {}
|
||||
try:
|
||||
response = session.post(url=url, headers=header, json=data).json()
|
||||
if "核查" in response["errorMessage"]:
|
||||
print(f'🌈提现:已提交,待核查后发放')
|
||||
elif "没有余额" in response["errorMessage"]:
|
||||
print(f'⭕余额不足,无法提现')
|
||||
else:
|
||||
print(f'{response["errorMessage"]}')
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def info(accessToken):
|
||||
timestamp = int(time.time() * 1000)
|
||||
nonce = "1736560276274_7143758"
|
||||
other = f"{nonce}JNWSY6RXYGXIWR2YCI2HOAGYG9LVQXYZ8d33d72c27994bdc9a9e9fdda2545690"
|
||||
oauthConsumerKey = "20200113181123916714"
|
||||
md5_str = f"{accessToken}{oauthConsumerKey}{timestamp}{other}"
|
||||
signatrue = hashlib.md5(md5_str.encode('utf-8')).hexdigest()
|
||||
url = 'https://hapi.baojun.net/base/account/pocket/draw/info'
|
||||
header = {
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9",
|
||||
"Host": "hapi.baojun.net",
|
||||
"deviceType": "html5",
|
||||
"Connection": "keep-alive",
|
||||
"accessToken": accessToken,
|
||||
"nonce": nonce,
|
||||
"signatrue": signatrue,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11581",
|
||||
"oauthConsumerKey": oauthConsumerKey,
|
||||
"timestamp": str(timestamp),
|
||||
"platformNo": "Wx_mini",
|
||||
"Sec-Fetch-Site": "cross-site",
|
||||
"Sec-Fetch-Mode": "cors",
|
||||
"Sec-Fetch-Dest": "empty",
|
||||
"Referer": "https://m.baojun.net/",
|
||||
}
|
||||
try:
|
||||
response = session.get(url=url, headers=header)
|
||||
response = json.loads(response.text)
|
||||
coin = response['data']['noDrawMoney']
|
||||
|
||||
timestamp = int(time.time() * 1000)
|
||||
nonce = "1736638919609_4282954"
|
||||
other = f"{nonce}JNWSY6RXYGXIWR2YCI2HOAGYG9LVQXYZ8d33d72c27994bdc9a9e9fdda2545690"
|
||||
oauthConsumerKey = "20200113181123916714"
|
||||
md5_str = f"{accessToken}{oauthConsumerKey}{timestamp}{other}"
|
||||
signatrue = hashlib.md5(md5_str.encode('utf-8')).hexdigest()
|
||||
url = 'https://hapi.baojun.net/base/ucenter/user/wallet/detail/v2?pocketClassType=1&pageNo=1&pageSize=40'
|
||||
header = {
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9",
|
||||
"Host": "hapi.baojun.net",
|
||||
"deviceType": "html5",
|
||||
"Connection": "keep-alive",
|
||||
"accessToken": accessToken,
|
||||
"nonce": nonce,
|
||||
"signatrue": signatrue,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11581",
|
||||
"oauthConsumerKey": oauthConsumerKey,
|
||||
"timestamp": str(timestamp),
|
||||
"platformNo": "Wx_mini",
|
||||
"Sec-Fetch-Site": "cross-site",
|
||||
"Sec-Fetch-Mode": "cors",
|
||||
"Sec-Fetch-Dest": "empty",
|
||||
"Referer": "https://m.baojun.net/",
|
||||
}
|
||||
response = session.get(url=url, headers=header)
|
||||
response = json.loads(response.text)
|
||||
count = 0
|
||||
for tc in response['data']:
|
||||
date_time3 = datetime.datetime.strptime(tc["expireDateStr"], "%Y-%m-%d %H:%M:%S").day
|
||||
today_date3 = datetime.datetime.now().day - 1
|
||||
if date_time3 == today_date3:
|
||||
count = count + 1
|
||||
|
||||
|
||||
timestamp = int(time.time() * 1000)
|
||||
nonce = "1736566937191_1825450"
|
||||
other = f"{nonce}JNWSY6RXYGXIWR2YCI2HOAGYG9LVQXYZ8d33d72c27994bdc9a9e9fdda2545690"
|
||||
oauthConsumerKey = "20200113181123916714"
|
||||
md5_str = f"{accessToken}{oauthConsumerKey}{timestamp}{other}"
|
||||
signatrue = hashlib.md5(md5_str.encode('utf-8')).hexdigest()
|
||||
url = 'https://hapi.baojun.net/base/ucenter/user/wallet/detail/v2?pocketClassType=2&pageNo=2&pageSize=20'
|
||||
header = {
|
||||
"Accept": "application/json, text/plain, */*",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9",
|
||||
"Host": "hapi.baojun.net",
|
||||
"deviceType": "html5",
|
||||
"Connection": "keep-alive",
|
||||
"accessToken": accessToken,
|
||||
"nonce": nonce,
|
||||
"signatrue": signatrue,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11581",
|
||||
"oauthConsumerKey": oauthConsumerKey,
|
||||
"timestamp": str(timestamp),
|
||||
"platformNo": "Wx_mini",
|
||||
"Sec-Fetch-Site": "cross-site",
|
||||
"Sec-Fetch-Mode": "cors",
|
||||
"Sec-Fetch-Dest": "empty",
|
||||
"Referer": "https://m.baojun.net/",
|
||||
}
|
||||
response = session.get(url=url, headers=header)
|
||||
response = json.loads(response.text)
|
||||
txall = 0
|
||||
for t2 in response['data']:
|
||||
date_time2 = datetime.datetime.strptime(t2["expireDateStr"], "%Y-%m-%d %H:%M:%S").day
|
||||
today_date2 = datetime.datetime.now().day - 1
|
||||
if date_time2 == today_date2:
|
||||
txall = 1
|
||||
break
|
||||
return txall, coin, count
|
||||
except:
|
||||
e = 2
|
||||
return e, e, e
|
||||
|
||||
def getpostid(accessToken):
|
||||
txall, coin, count = info(accessToken)
|
||||
if txall == 2:
|
||||
print(f"accessToken失效")
|
||||
return
|
||||
if txall == 1:
|
||||
print(f"☁️刷前:提现判定")
|
||||
elif coin == 0:
|
||||
print(f"☁️刷前:0 元,已刷{count}/30")
|
||||
else:
|
||||
print(f"☁️刷前:{coin / 100}元,已刷{count}/30次")
|
||||
for mm in range(10000):
|
||||
if count >= 30 or txall == 1:
|
||||
if txall == 1:
|
||||
print(f"☁️判定:今日已提现,中止")
|
||||
else:
|
||||
print(f"☁️刷后:{coin / 100}元,已刷{count}/30次")
|
||||
money(accessToken)
|
||||
break
|
||||
else:
|
||||
timestamp = int(time.time() * 1000)
|
||||
oauthConsumerKey = "20200113181123916714"
|
||||
nonce = "4857289347289375"
|
||||
other = f"{nonce}JNWSY6RXYGXIWR2YCI2HOAGYG9LVQXYZ8d33d72c27994bdc9a9e9fdda2545690"
|
||||
md5_str = f"{accessToken}{oauthConsumerKey}{timestamp}{other}"
|
||||
signatrue = hashlib.md5(md5_str.encode('utf-8')).hexdigest()
|
||||
url = f'https://hapi.baojun.net/base/community/post/postList?postTypeId=1&postClassifyId=61&publishSmallProgram=2&pageNo={mm}&pageSize=35 '
|
||||
header = {
|
||||
"Host": "hapi.baojun.net",
|
||||
"Connection": "keep-alive",
|
||||
"accessToken": accessToken,
|
||||
"nonce": nonce,
|
||||
"signatrue": signatrue,
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 MicroMessenger/7.0.20.1781(0x6700143B) NetType/WIFI MiniProgramEnv/Windows WindowsWechat/WMPF WindowsWechat(0x63090b13)XWEB/11581",
|
||||
"oauthConsumerKey": oauthConsumerKey,
|
||||
"Content-Type": "application/json",
|
||||
"timestamp": str(timestamp),
|
||||
"xweb_xhr": "1",
|
||||
"platformNo": "Wx_mini",
|
||||
"Accept": "*/*",
|
||||
"Sec-Fetch-Site": "cross-site",
|
||||
"Sec-Fetch-Mode": "cors",
|
||||
"Sec-Fetch-Dest": "empty",
|
||||
"Referer": "https://servicewechat.com/wx58774bbe5cd15ebb/409/page-frame.html",
|
||||
"Accept-Encoding": "gzip, deflate, br",
|
||||
"Accept-Language": "zh-CN,zh;q=0.9"
|
||||
}
|
||||
try:
|
||||
response = session.get(url=url, headers=header)
|
||||
response = json.loads(response.text)
|
||||
for i in response["data"]:
|
||||
postid = i["postId"]
|
||||
postTitle = i["postTitle"]
|
||||
txall, coin, count = info(accessToken)
|
||||
if count >= 30 or txall == 1:
|
||||
break
|
||||
lookVideo(accessToken, postid)
|
||||
txallb, coinb, countb = info(accessToken)
|
||||
if int(coinb)-int(coin)==0:
|
||||
continue
|
||||
time.sleep(0.1)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def main():
|
||||
if os.environ.get(environ):
|
||||
ck = os.environ.get(environ)
|
||||
else:
|
||||
ck = ""
|
||||
if ck == "":
|
||||
print("请设置变量")
|
||||
sys.exit()
|
||||
ck_run = ck.split('\n')
|
||||
ck_run = [item for item in ck_run if item]
|
||||
print(f"{' ' * 10}꧁༺ {name} ༻꧂\n")
|
||||
for i, ck_run_n in enumerate(ck_run):
|
||||
print(f'\n----------- 🍺账号【{i + 1}/{len(ck_run)}】执行🍺 -----------')
|
||||
try:
|
||||
id,two = ck_run_n.split('#',2)
|
||||
#id = id[:3] + "*****" + id[-3:]
|
||||
print(f"📱:{id}")
|
||||
getpostid(two)
|
||||
time.sleep(random.randint(1, 2))
|
||||
except Exception as e:
|
||||
print(e)
|
||||
#notify.send('title', 'message')
|
||||
print(f'\n----------- 🎊 执 行 结 束 🎊 -----------')
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
645
脚本库/web版/账密/宽带技术网/2025-08-25_chinadsl_db342b3d.js
Normal file
645
脚本库/web版/账密/宽带技术网/2025-08-25_chinadsl_db342b3d.js
Normal file
@@ -0,0 +1,645 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/chinadsl.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/chinadsl.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/chinadsl.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: db342b3d6f7631919c5ae6ae460906610890366a47ee9173a951925dad84bc82
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
name: "宽带技术网"
|
||||
cron: 45 0 9 * * *
|
||||
脚本兼容: 金山文档(1.0),金山文档(2.0)
|
||||
更新时间:20241226
|
||||
环境变量名:无
|
||||
环境变量值:无
|
||||
备注:cookie填写宽带技术网网页版中获取的refresh_token。F12 -> NetWork(中文名叫"网络") ->https://www.chinadsl.net -> cookie
|
||||
宽带技术网网址:https://www.chinadsl.net
|
||||
*/
|
||||
|
||||
var sheetNameSubConfig = "chinadsl"; // 分配置表名称
|
||||
var pushHeader = "【宽带技术网】";
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
|
||||
var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。
|
||||
var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识
|
||||
var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息
|
||||
var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
}; // 有效邮箱配置
|
||||
|
||||
// =================青龙适配开始===================
|
||||
|
||||
qlSwitch = 0
|
||||
|
||||
// =================青龙适配结束===================
|
||||
|
||||
// =================金山适配开始===================
|
||||
// airscript检测版本
|
||||
function checkVesion(){
|
||||
try{
|
||||
let temp = Application.Range("A1").Text;
|
||||
Application.Range("A1").Value = temp
|
||||
console.log("😶🌫️ 检测到当前airscript版本为1.0,进行1.0适配")
|
||||
}catch{
|
||||
console.log("😶🌫️ 检测到当前airscript版本为2.0,进行2.0适配")
|
||||
version = 2
|
||||
}
|
||||
}
|
||||
|
||||
// 推送相关
|
||||
// 获取时间
|
||||
function getDate(){
|
||||
let currentDate = new Date();
|
||||
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
|
||||
return currentDate
|
||||
}
|
||||
|
||||
// 将消息写入CONFIG表中作为消息队列,之后统一发送
|
||||
function writeMessageQueue(message){
|
||||
// 当天时间
|
||||
let todayDate = getDate()
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("✨ 开始将结果写入主配置表");
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
if(version == 1){
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value2 = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value2 = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function push(message) {
|
||||
writeMessageQueue(message) // 将消息写入CONFIG表中
|
||||
// if (message != "") {
|
||||
// // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
// let length = jsonPush.length;
|
||||
// let name;
|
||||
// let key;
|
||||
// for (let i = 0; i < length; i++) {
|
||||
// if (jsonPush[i].flag == 1) {
|
||||
// name = jsonPush[i].name;
|
||||
// key = jsonPush[i].key;
|
||||
// if (name == "bark") {
|
||||
// bark(message, key);
|
||||
// } else if (name == "pushplus") {
|
||||
// pushplus(message, key);
|
||||
// } else if (name == "ServerChan") {
|
||||
// serverchan(message, key);
|
||||
// } else if (name == "email") {
|
||||
// email(message);
|
||||
// } else if (name == "dingtalk") {
|
||||
// dingtalk(message, key);
|
||||
// } else if (name == "discord") {
|
||||
// discord(message, key);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// console.log("🍳 消息为空不推送");
|
||||
// }
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
if (key != "") {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
message = encodeURIComponent(message)
|
||||
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
|
||||
let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
if (key != "") {
|
||||
message = encodeURIComponent(message)
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送serverchan消息
|
||||
function serverchan(message, key) {
|
||||
if (key != "") {
|
||||
url =
|
||||
"https://sctapi.ftqq.com/" +
|
||||
key +
|
||||
".send" +
|
||||
"?title=" + messagePushHeader +
|
||||
"&desp=" +
|
||||
message;
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("🍳 已发送邮件至:" + sender);
|
||||
console.log("🍳 已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
console.log("🍳 开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("🍳 开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// =================金山适配结束===================
|
||||
// =================共用开始===================
|
||||
// main() // 入口
|
||||
|
||||
// function main(){
|
||||
checkVesion() // 版本检测,以进行不同版本的适配
|
||||
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("🍳 开始读取主配置表");
|
||||
let name; // 名称
|
||||
let onlyError;
|
||||
let nickname;
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
name = Application.Range("A" + i).Text;
|
||||
onlyError = Application.Range("C" + i).Text;
|
||||
nickname = Application.Range("D" + i).Text;
|
||||
if (name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
if (name == sheetNameSubConfig) {
|
||||
if (onlyError == "是") {
|
||||
messageOnlyError = 1;
|
||||
console.log("🍳 只推送错误消息");
|
||||
}
|
||||
|
||||
if (nickname == "是") {
|
||||
messageNickname = 1;
|
||||
console.log("🍳 单元格用昵称替代");
|
||||
}
|
||||
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("🍳 开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
|
||||
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
|
||||
if (flagSubConfig == 1) {
|
||||
console.log("🍳 开始读取分配置表");
|
||||
|
||||
if(qlSwitch != 1){ // 金山文档
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
execHandle(cookie, i);
|
||||
}
|
||||
}
|
||||
message = messageMerge()// 将消息数组融合为一条总消息
|
||||
push(message); // 推送消息
|
||||
}else{
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
console.log("🧑 开始执行用户:" + "1" )
|
||||
execHandle(cookie, i);
|
||||
break; // 只取一个
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// }
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("🥚 激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("🍳 无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将消息数组融合为一条总消息
|
||||
function messageMerge(){
|
||||
// console.log(messageArray)
|
||||
let message = ""
|
||||
for(i=0; i<messageArray.length; i++){
|
||||
if(messageArray[i] != "" && messageArray[i] != null)
|
||||
{
|
||||
message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头
|
||||
}
|
||||
}
|
||||
if(message != "")
|
||||
{
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
console.log(message + "\n") // 打印总消息
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// 获取sign,返回小写
|
||||
function getsign(data) {
|
||||
var sign = Crypto.createHash("md5")
|
||||
.update(data, "utf8")
|
||||
.digest("hex")
|
||||
// .toUpperCase() // 大写
|
||||
.toString();
|
||||
return sign;
|
||||
}
|
||||
|
||||
// =================共用结束===================
|
||||
|
||||
// 具体的执行函数
|
||||
function execHandle(cookie, pos) {
|
||||
let messageSuccess = "";
|
||||
let messageFail = "";
|
||||
let messageName = "";
|
||||
|
||||
// 推送昵称或单元格,还是不推送位置标识
|
||||
if (messageNickname == 1) {
|
||||
// 推送昵称或单元格
|
||||
messageName = Application.Range("C" + pos).Text;
|
||||
if(messageName == "")
|
||||
{
|
||||
messageName = "单元格A" + pos + "";
|
||||
}
|
||||
}
|
||||
|
||||
posLabel = pos-2 ; // 存放下标,从0开始
|
||||
messageHeader[posLabel] = "👨🚀 " + messageName
|
||||
|
||||
//try {
|
||||
var url1;
|
||||
url1 = "https://www.chinadsl.net/"
|
||||
|
||||
headers = {
|
||||
"Cookie":cookie,
|
||||
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.71 Safari/537.36 Core/1.94.225.400 QQBrowser/12.2.5544.400"
|
||||
}
|
||||
|
||||
// 登录
|
||||
|
||||
// resp = HTTP.fetch(url1, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url1, {headers: headers,});
|
||||
|
||||
// 正则匹配
|
||||
Reg = [
|
||||
/title="访问我的空间">(.*?)<\/a>/i,
|
||||
// /showmenu">积分: (.*?)<\/a>/i,
|
||||
]
|
||||
valueName = [
|
||||
"用户", //"当前积分",
|
||||
]
|
||||
valueArry = []
|
||||
|
||||
html = resp.text();
|
||||
// console.log(html)
|
||||
|
||||
for(i=0; i< Reg.length; i++)
|
||||
{
|
||||
flagTrue = Reg[i].test(html); // 判断是否存在字符串
|
||||
if (flagTrue == true) {
|
||||
let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "]
|
||||
// result = result[0];
|
||||
result = result[1];
|
||||
valueArry[i] = result
|
||||
content = valueName[i] + ":" + valueArry[i] + " "
|
||||
messageSuccess += content;
|
||||
console.log(content)
|
||||
} else {
|
||||
valueArry[i] = "获取失败"
|
||||
content = "❌ " + valueName[i] + "获取失败\n"
|
||||
messageFail += content;
|
||||
}
|
||||
}
|
||||
messageSuccess += "🎉 " + "获得登录奖励\n"
|
||||
|
||||
sleep(2000)
|
||||
|
||||
url = "https://www.chinadsl.net/home.php?mod=task&do=apply&id=1"
|
||||
|
||||
// 做任务
|
||||
// resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
|
||||
sleep(2000)
|
||||
// 领取奖励
|
||||
url = "https://www.chinadsl.net/home.php?mod=task&do=draw&id=1"
|
||||
// resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
sleep(2000)
|
||||
|
||||
// 查询奖励积分
|
||||
url = "https://www.chinadsl.net/home.php?mod=task&item=done"
|
||||
// resp = HTTP.fetch(url, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url, {headers: headers,});
|
||||
|
||||
// 积分 猫粮 10 </td>
|
||||
// 正则匹配
|
||||
Reg = [
|
||||
/积分 猫粮 (.*?) <\/td>/i,
|
||||
]
|
||||
valueName = [
|
||||
"做任务获得积分",
|
||||
]
|
||||
valueArry = []
|
||||
|
||||
html = resp.text();
|
||||
// console.log(html)
|
||||
|
||||
for(i=0; i< Reg.length; i++)
|
||||
{
|
||||
flagTrue = Reg[i].test(html); // 判断是否存在字符串
|
||||
if (flagTrue == true) {
|
||||
let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "]
|
||||
// result = result[0];
|
||||
result = result[1];
|
||||
valueArry[i] = result
|
||||
content = "🎉 " + valueName[i] + ":" + valueArry[i] + "\n"
|
||||
messageSuccess += content;
|
||||
console.log(content)
|
||||
} else {
|
||||
valueArry[i] = "获取失败"
|
||||
content = "❌ " + valueName[i] + "获取失败\n"
|
||||
messageFail += content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
sleep(2000)
|
||||
// 登录,获取积分
|
||||
// resp = HTTP.fetch(url1, {
|
||||
// method: "get",
|
||||
// headers: headers,
|
||||
// });
|
||||
resp = HTTP.get(url1, {headers: headers,});
|
||||
|
||||
// 显示积分
|
||||
// 正则匹配
|
||||
Reg = [
|
||||
// /title="访问我的空间">(.*?)<\/a>/i,
|
||||
/showmenu">积分: (.*?)<\/a>/i,
|
||||
]
|
||||
valueName = [
|
||||
//"用户",
|
||||
"当前积分",
|
||||
]
|
||||
valueArry = []
|
||||
|
||||
html = resp.text();
|
||||
// console.log(html)
|
||||
|
||||
for(i=0; i< Reg.length; i++)
|
||||
{
|
||||
flagTrue = Reg[i].test(html); // 判断是否存在字符串
|
||||
if (flagTrue == true) {
|
||||
let result = Reg[i].exec(html); // 提取匹配的字符串,["你已经连续签到 1 天,再接再厉!"," 1 "]
|
||||
// result = result[0];
|
||||
result = result[1];
|
||||
valueArry[i] = result
|
||||
content = "🎉 " + valueName[i] + ":" + valueArry[i] + "\n"
|
||||
messageSuccess += content;
|
||||
console.log(content)
|
||||
} else {
|
||||
valueArry[i] = "获取失败"
|
||||
content = "❌ " + valueName[i] + "获取失败\n"
|
||||
messageFail += content;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// // 将数据写入表格中
|
||||
// writeColoums = ["D", "E", "F", "G"] // 写入的列
|
||||
// for(i=0; i<valueName.length;i++){
|
||||
// if(valueArry[i] != "")
|
||||
// {
|
||||
// Application.Range(writeColoums[i] + pos).Value = valueArry[i]
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
//} catch {
|
||||
// messageFail += messageName + "失败";
|
||||
//}
|
||||
|
||||
sleep(2000);
|
||||
if (messageOnlyError == 1) {
|
||||
messageArray[posLabel] = messageFail;
|
||||
} else {
|
||||
if(messageFail != ""){
|
||||
messageArray[posLabel] = messageFail + " " + messageSuccess;
|
||||
}else{
|
||||
messageArray[posLabel] = messageSuccess;
|
||||
}
|
||||
}
|
||||
|
||||
if(messageArray[posLabel] != "")
|
||||
{
|
||||
console.log(messageArray[posLabel]);
|
||||
}
|
||||
}
|
||||
468
脚本库/web版/账密/小米商城做任务/2025-08-25_mi_d69613f3.js
Normal file
468
脚本库/web版/账密/小米商城做任务/2025-08-25_mi_d69613f3.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/少数派热榜/2025-08-25_ssphot_1e4b9eda.js
Normal file
630
脚本库/web版/账密/少数派热榜/2025-08-25_ssphot_1e4b9eda.js
Normal file
File diff suppressed because one or more lines are too long
562
脚本库/web版/账密/希沃白板/2025-08-25_ql_easinote_ecd9a632.js
Normal file
562
脚本库/web版/账密/希沃白板/2025-08-25_ql_easinote_ecd9a632.js
Normal file
File diff suppressed because one or more lines are too long
909
脚本库/web版/账密/广汽埃安/2025-06-28_广汽埃安_d765e765.js
Normal file
909
脚本库/web版/账密/广汽埃安/2025-06-28_广汽埃安_d765e765.js
Normal file
@@ -0,0 +1,909 @@
|
||||
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E5%B9%BF%E6%B1%BD%E5%9F%83%E5%AE%89.js
|
||||
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E5%B9%BF%E6%B1%BD%E5%9F%83%E5%AE%89.js
|
||||
// # Repo: jdqlscript/toulu
|
||||
// # Path: 广汽埃安.js
|
||||
// # UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
// # SHA256: d765e765b7ca3dc06d021f6976d185f9ff299510be351238783213b618e7399b
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
广汽埃安 v1.02
|
||||
扫码下载注册: https://raw.githubusercontent.com/leafTheFish/DeathNote/main/gqaa.jpg
|
||||
|
||||
每天签到和开连签盲盒, 车主有额外的点赞积分任务
|
||||
积分可以换充电卡等, 毛不大, 自己决定要不要玩
|
||||
|
||||
捉 www.gacne.com.cn 域名请求的Cookie, 把PHPSESSID的值(如PHPSESSID=xxxxxxxx;)填到变量 gqaaCookie 里面
|
||||
嫌麻烦的也可以把整个cookie扔进去
|
||||
多账号换行或&或@隔开
|
||||
export PHPSESSID="xxxxxxxx"
|
||||
|
||||
|
||||
有问题联系3288588344
|
||||
频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
|
||||
|
||||
cron: 51 6,16 * * *
|
||||
const $ = new Env("广汽埃安");
|
||||
*/
|
||||
const _0x57726e = _0xafb67f("广汽埃安"),
|
||||
_0x157252 = require("got"),
|
||||
{
|
||||
CookieJar: _0x39b841
|
||||
} = require("tough-cookie"),
|
||||
_0x12a3af = "gqaa",
|
||||
_0x27935e = /[\n\&\@]/,
|
||||
_0x570313 = [_0x12a3af + "Cookie"],
|
||||
_0x1f66ac = 8000,
|
||||
_0x41a616 = 3;
|
||||
|
||||
const _0x620eeb = 1.02,
|
||||
_0x5cb507 = "gqaa",
|
||||
_0xd58e67 = "https://leafxcy.coding.net/api/user/leafxcy/project/validcode/shared-depot/validCode/git/blob/master/code.json",
|
||||
_0x571d42 = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_1_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 StatusHeight/20 BundleId/com.gacne.www Version/3.3.9",
|
||||
_0x3a15c9 = "https://www.gacne.com.cn",
|
||||
_0x223773 = "https://www.gacne.com.cn/web/app/sign_in.html",
|
||||
_0x79e5b9 = 5,
|
||||
_0x1a60e5 = 13,
|
||||
_0x149fb5 = 1000,
|
||||
_0x5a59fa = 3600000,
|
||||
_0x2aa689 = 0,
|
||||
_0x327956 = 3,
|
||||
_0x3dd66a = ["顶一下", "打卡", "每日打打卡", "嘿嘿", "哈哈", "积分积分", "顶顶顶"];
|
||||
|
||||
class _0x1e527a {
|
||||
constructor() {
|
||||
this.index = _0x57726e.userIdx++;
|
||||
this.name = "";
|
||||
this.valid = false;
|
||||
const _0x627300 = {
|
||||
limit: 0
|
||||
};
|
||||
const _0x2f158b = {
|
||||
Connection: "keep-alive"
|
||||
};
|
||||
const _0x3d9864 = {
|
||||
retry: _0x627300,
|
||||
timeout: _0x1f66ac,
|
||||
followRedirect: false,
|
||||
headers: _0x2f158b
|
||||
};
|
||||
this.got = _0x157252.extend(_0x3d9864);
|
||||
}
|
||||
|
||||
log(_0x4ff667, _0x55786f = {}) {
|
||||
let _0x1f3278 = "",
|
||||
_0x49dff4 = _0x57726e.userCount.toString().length;
|
||||
|
||||
if (this.index) {
|
||||
_0x1f3278 += "账号[" + _0x57726e.padStr(this.index, _0x49dff4) + "]";
|
||||
}
|
||||
|
||||
if (this.name) {
|
||||
_0x1f3278 += "[" + this.name + "]";
|
||||
}
|
||||
|
||||
_0x57726e.log(_0x1f3278 + _0x4ff667, _0x55786f);
|
||||
}
|
||||
|
||||
async request(_0x43dfdb) {
|
||||
let _0x463e9e = null,
|
||||
_0x35402b = 0,
|
||||
_0x44adfc = _0x43dfdb.fn || _0x43dfdb.url;
|
||||
|
||||
_0x43dfdb.method = _0x43dfdb?.["method"]?.["toUpperCase"]() || "GET";
|
||||
|
||||
while (_0x35402b++ < _0x41a616) {
|
||||
try {
|
||||
await this.got(_0x43dfdb).then(_0x4f51f0 => {
|
||||
_0x463e9e = _0x4f51f0;
|
||||
}, _0x2322a7 => {
|
||||
_0x463e9e = _0x2322a7.response;
|
||||
});
|
||||
|
||||
if ((_0x463e9e?.["statusCode"] / 100 | 0) <= 4) {
|
||||
break;
|
||||
}
|
||||
} catch (_0x4633ef) {
|
||||
_0x4633ef.name == "TimeoutError" ? this.log("[" + _0x44adfc + "]请求超时,重试第" + _0x35402b + "次") : this.log("[" + _0x44adfc + "]请求错误(" + _0x4633ef.message + "),重试第" + _0x35402b + "次");
|
||||
}
|
||||
}
|
||||
|
||||
const _0x4beaf6 = {
|
||||
statusCode: -1,
|
||||
headers: null,
|
||||
result: null
|
||||
};
|
||||
|
||||
if (_0x463e9e == null) {
|
||||
return Promise.resolve(_0x4beaf6);
|
||||
}
|
||||
|
||||
let {
|
||||
statusCode: _0x21acad,
|
||||
headers: _0x20212f,
|
||||
body: _0x5aae68
|
||||
} = _0x463e9e;
|
||||
|
||||
if (_0x5aae68) {
|
||||
try {
|
||||
_0x5aae68 = JSON.parse(_0x5aae68);
|
||||
} catch {}
|
||||
}
|
||||
|
||||
const _0x274316 = {
|
||||
statusCode: _0x21acad,
|
||||
headers: _0x20212f,
|
||||
result: _0x5aae68
|
||||
};
|
||||
return Promise.resolve(_0x274316);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
let _0x1c4970 = new _0x1e527a();
|
||||
|
||||
class _0x61a68c extends _0x1e527a {
|
||||
constructor(_0x2e700e) {
|
||||
super();
|
||||
this.cookieJar = new _0x39b841();
|
||||
|
||||
let _0x2753be = _0x2e700e?.["match"](/PHPSESSID=(\w+)/);
|
||||
|
||||
this.PHPSESSID = _0x2753be ? _0x2753be[1] : _0x2e700e;
|
||||
this.set_cookie("PHPSESSID", this.PHPSESSID);
|
||||
const _0x1937af = {
|
||||
"User-Agent": _0x571d42,
|
||||
Origin: _0x3a15c9,
|
||||
Referer: _0x223773
|
||||
};
|
||||
this.got = this.got.extend({
|
||||
cookieJar: this.cookieJar,
|
||||
headers: _0x1937af
|
||||
});
|
||||
}
|
||||
|
||||
set_cookie(_0x280e6f, _0x2a073f, _0x2cf8a7 = {}) {
|
||||
let _0x33c9fb = _0x2cf8a7.domain || "gacne.com.cn",
|
||||
_0x980b19 = _0x2cf8a7.url || "https://www.gacne.com.cn";
|
||||
|
||||
this.cookieJar.setCookieSync(_0x280e6f + "=" + _0x2a073f + "; Domain=" + _0x33c9fb + ";", "" + _0x980b19);
|
||||
}
|
||||
|
||||
async checkLogin(_0x2e5a5a = {}) {
|
||||
let _0x2aa514 = false;
|
||||
|
||||
try {
|
||||
const _0x41dd56 = {
|
||||
fn: "checkLogin",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/index/Madepost/checkLogin"
|
||||
};
|
||||
|
||||
let {
|
||||
result: _0x5564ff
|
||||
} = await this.request(_0x57726e.copy(_0x41dd56)),
|
||||
_0x3adeb3 = _0x57726e.get(_0x5564ff, "code", -1);
|
||||
|
||||
if (_0x3adeb3 == 200) {
|
||||
this.valid = true;
|
||||
let {
|
||||
device_id: _0x5e0723,
|
||||
tel: _0x1d8c34,
|
||||
token: _0x3df494
|
||||
} = _0x5564ff?.["data"];
|
||||
this.deviceId = _0x5e0723;
|
||||
this.deviceId && this.set_cookie("deviceId", this.deviceId);
|
||||
this.name = _0x1d8c34;
|
||||
this.token = _0x3df494;
|
||||
_0x2aa514 = await this.refresh();
|
||||
} else {
|
||||
let _0x4d294d = _0x57726e.get(_0x5564ff, "msg", "");
|
||||
|
||||
this.log("登录失败[" + _0x3adeb3 + "]: " + _0x4d294d);
|
||||
}
|
||||
} catch (_0x56cd2f) {
|
||||
console.log(_0x56cd2f);
|
||||
} finally {
|
||||
return _0x2aa514;
|
||||
}
|
||||
}
|
||||
|
||||
async refresh(_0x37f45f = {}) {
|
||||
let _0x446dd1 = false;
|
||||
|
||||
try {
|
||||
const _0x3c91b7 = {
|
||||
fn: "refresh",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/lifemain/insurance-mapi/order/had-insurance-order"
|
||||
};
|
||||
|
||||
let {
|
||||
result: _0x58b7f2
|
||||
} = await this.request(_0x57726e.copy(_0x3c91b7)),
|
||||
_0x5050a9 = _0x57726e.get(_0x58b7f2, "code", -1);
|
||||
|
||||
if (_0x5050a9 == "0000") {
|
||||
_0x446dd1 = true;
|
||||
} else {
|
||||
let _0x1222de = _0x57726e.get(_0x58b7f2, "msg", "");
|
||||
|
||||
this.log("刷新CK失败[" + _0x5050a9 + "]: " + _0x1222de);
|
||||
}
|
||||
} catch (_0xcde42a) {
|
||||
console.log(_0xcde42a);
|
||||
} finally {
|
||||
return _0x446dd1;
|
||||
}
|
||||
}
|
||||
|
||||
async sign_in(_0x3918cf = {}) {
|
||||
try {
|
||||
const _0x4c2257 = {
|
||||
taskTypeCode: "TASK-INTEGRAL-SIGN-IN"
|
||||
};
|
||||
const _0xa4570a = {
|
||||
fn: "sign_in",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/lifemain/task-mapi/sign-in",
|
||||
json: _0x4c2257
|
||||
};
|
||||
{
|
||||
let {
|
||||
result: _0x2765ad
|
||||
} = await this.request(_0x57726e.copy(_0xa4570a)),
|
||||
_0x43ae24 = _0x57726e.get(_0x2765ad, "code", -1);
|
||||
|
||||
if (_0x43ae24 == "0000") {
|
||||
let {
|
||||
isFirstSign: _0xada6da
|
||||
} = _0x2765ad?.["data"];
|
||||
_0xada6da ? this.log("签到成功") : this.log("今天已签到");
|
||||
} else {
|
||||
let _0x405d4e = _0x57726e.get(_0x2765ad, "msg", "");
|
||||
|
||||
this.log("查询签到失败[" + _0x43ae24 + "]: " + _0x405d4e);
|
||||
}
|
||||
}
|
||||
{
|
||||
let {
|
||||
result: _0x436816
|
||||
} = await this.request(_0x57726e.copy(_0xa4570a)),
|
||||
_0x2412e4 = _0x57726e.get(_0x436816, "code", -1);
|
||||
|
||||
if (_0x2412e4 == "0000") {
|
||||
let {
|
||||
days: _0x2cb92f,
|
||||
nextBoxTotalDay: _0x5644ae,
|
||||
boxList: _0x249f7a
|
||||
} = _0x436816?.["data"];
|
||||
this.log("盲盒进度: " + _0x2cb92f + "/" + _0x5644ae);
|
||||
|
||||
for (let _0x14c86c of (_0x249f7a || []).filter(_0x8bef3 => _0x8bef3.status == 1)) {
|
||||
for (let _0x4b5bcf = 0; _0x4b5bcf < _0x14c86c.openAmount; _0x4b5bcf++) {
|
||||
await this.box_draw(_0x14c86c);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let _0x3639bf = _0x57726e.get(_0x436816, "msg", "");
|
||||
|
||||
this.log("查询盲盒进度失败[" + _0x2412e4 + "]: " + _0x3639bf);
|
||||
}
|
||||
}
|
||||
} catch (_0x578aae) {
|
||||
console.log(_0x578aae);
|
||||
}
|
||||
}
|
||||
|
||||
async box_draw(_0x3e3b3c, _0x2ca7ed = {}) {
|
||||
try {
|
||||
const _0x16465b = {
|
||||
boxId: _0x3e3b3c.boxId,
|
||||
type: 0
|
||||
};
|
||||
const _0x1f5e4c = {
|
||||
fn: "box_draw",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/lifemain/frontend/box/draw",
|
||||
json: _0x16465b
|
||||
};
|
||||
|
||||
let {
|
||||
result: _0x2cb490
|
||||
} = await this.request(_0x57726e.copy(_0x1f5e4c)),
|
||||
_0x5f56d2 = _0x57726e.get(_0x2cb490, "code", -1);
|
||||
|
||||
if (_0x5f56d2 == "0000") {
|
||||
let {
|
||||
prizeName: _0x5c4c9d,
|
||||
boxName: _0x477b46
|
||||
} = _0x2cb490?.["data"];
|
||||
const _0x5805b9 = {
|
||||
notify: true
|
||||
};
|
||||
this.log("开启[" + _0x477b46 + "]: " + _0x5c4c9d, _0x5805b9);
|
||||
} else {
|
||||
let _0x1aad43 = _0x57726e.get(_0x2cb490, "msg", "");
|
||||
|
||||
this.log("开启[" + _0x3e3b3c.boxName + "]失败[" + _0x5f56d2 + "]: " + _0x1aad43);
|
||||
}
|
||||
} catch (_0x3a3ced) {
|
||||
console.log(_0x3a3ced);
|
||||
}
|
||||
}
|
||||
|
||||
async check_integral(_0x26a1ff = {}) {
|
||||
try {
|
||||
const _0x5bb117 = {
|
||||
fn: "check_integral",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/lifemain/task-mapi/sign-in",
|
||||
json: {}
|
||||
};
|
||||
_0x5bb117.json.taskTypeCode = "TASK-INTEGRAL-SIGN-IN";
|
||||
|
||||
let {
|
||||
result: _0x15f240
|
||||
} = await this.request(_0x57726e.copy(_0x5bb117)),
|
||||
_0x348985 = _0x57726e.get(_0x15f240, "code", -1);
|
||||
|
||||
if (_0x348985 == "0000") {
|
||||
this.integral = _0x15f240?.["data"]?.["totalIntegral"] || 0;
|
||||
const _0x5967f7 = {
|
||||
notify: true
|
||||
};
|
||||
this.log("积分: " + this.integral, _0x5967f7);
|
||||
} else {
|
||||
let _0x4449e3 = _0x57726e.get(_0x15f240, "msg", "");
|
||||
|
||||
this.log("查询积分失败[" + _0x348985 + "]: " + _0x4449e3);
|
||||
}
|
||||
} catch (_0xb1012) {
|
||||
console.log(_0xb1012);
|
||||
}
|
||||
}
|
||||
|
||||
async detail_new(_0x28fa51 = {}) {
|
||||
try {
|
||||
const _0x3cf3e2 = {
|
||||
fn: "detail_new",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/lifemain/task-mapi/sign-in/detail-new",
|
||||
json: {}
|
||||
};
|
||||
_0x3cf3e2.json.taskTypeCode = "TASK-INTEGRAL-SIGN-IN";
|
||||
|
||||
let {
|
||||
result: _0xfcaa2d
|
||||
} = await this.request(_0x57726e.copy(_0x3cf3e2)),
|
||||
_0x5086a5 = _0x57726e.get(_0xfcaa2d, "code", -1);
|
||||
|
||||
if (_0x5086a5 == "0000") {
|
||||
for (let _0x1b6428 of _0xfcaa2d?.["data"]?.["banners"] || []) {
|
||||
for (let _0x1d600a of _0x1b6428?.["contents"] || []) {
|
||||
for (let _0x2fb095 of (_0x1d600a?.["tasks"] || []).filter(_0x1aba03 => _0x1aba03.buttonStatus === 0)) {
|
||||
await this.process_task(_0x2fb095);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
let _0x1e19c9 = _0x57726e.get(_0xfcaa2d, "msg", "");
|
||||
|
||||
this.log("查询任务失败[" + _0x5086a5 + "]: " + _0x1e19c9);
|
||||
}
|
||||
} catch (_0x37e189) {
|
||||
console.log(_0x37e189);
|
||||
}
|
||||
}
|
||||
|
||||
async process_task(_0x2181b7, _0x543497 = {}) {
|
||||
try {
|
||||
switch (_0x2181b7.taskId) {
|
||||
case 62:
|
||||
{
|
||||
let _0x2d9cbd = Math.floor(Math.random() * 10000) + 45000;
|
||||
|
||||
for (let _0x19f914 = 0; _0x19f914 < 5; _0x19f914++) {
|
||||
await this.article_like(_0x2d9cbd + _0x19f914);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (_0x4cd91a) {
|
||||
console.log(_0x4cd91a);
|
||||
}
|
||||
}
|
||||
|
||||
async comment_add(_0x4bea91, _0x1ef972 = {}) {
|
||||
try {
|
||||
let _0x340015 = _0x57726e.randomList(_0x3dd66a),
|
||||
_0x2b9f20 = {
|
||||
fn: "comment_add",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/cms/frontend/comment/add",
|
||||
json: {
|
||||
sourceId: _0x4bea91.toString(),
|
||||
type: "104",
|
||||
content: _0x340015,
|
||||
contentExt: _0x340015,
|
||||
atFriendsList: []
|
||||
}
|
||||
},
|
||||
{
|
||||
result: _0x24af06
|
||||
} = await this.request(_0x57726e.copy(_0x2b9f20)),
|
||||
_0x377dcc = _0x57726e.get(_0x24af06, "code", -1);
|
||||
|
||||
if (_0x377dcc == "0000") {
|
||||
let _0x376cad = _0x24af06?.["data"]?.["id"] || 0;
|
||||
|
||||
this.log("评论文章[" + _0x4bea91 + "]成功: 评论id=" + _0x376cad);
|
||||
_0x376cad && (await this.comment_delete(_0x376cad));
|
||||
} else {
|
||||
let _0x4dd834 = _0x57726e.get(_0x24af06, "msg", "");
|
||||
|
||||
this.log("评论失败[" + _0x377dcc + "]: " + _0x4dd834);
|
||||
}
|
||||
} catch (_0x33db3f) {
|
||||
console.log(_0x33db3f);
|
||||
}
|
||||
}
|
||||
|
||||
async comment_delete(_0x2d86d7, _0x3148a6 = {}) {
|
||||
try {
|
||||
let _0x1100b5 = {
|
||||
fn: "comment_add",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/cms/frontend/comment/delete",
|
||||
json: {
|
||||
commentId: _0x2d86d7.toString(),
|
||||
version: "3.3.9"
|
||||
}
|
||||
},
|
||||
{
|
||||
result: _0x47dabf
|
||||
} = await this.request(_0x57726e.copy(_0x1100b5)),
|
||||
_0x50c004 = _0x57726e.get(_0x47dabf, "code", -1);
|
||||
|
||||
if (_0x50c004 == "0000") {
|
||||
this.log("删除评论[" + _0x2d86d7 + "]成功");
|
||||
} else {
|
||||
let _0x1c1b85 = _0x57726e.get(_0x47dabf, "msg", "");
|
||||
|
||||
this.log("删除评论[" + _0x2d86d7 + "]失败[" + _0x50c004 + "]: " + _0x1c1b85);
|
||||
}
|
||||
} catch (_0x283137) {
|
||||
console.log(_0x283137);
|
||||
}
|
||||
}
|
||||
|
||||
async article_like(_0x3f7a7b, _0x5c0c91 = true, _0x468fdd = 0, _0x2f05f6 = {}) {
|
||||
try {
|
||||
const _0x2237b0 = {
|
||||
fn: "comment_add",
|
||||
method: "post",
|
||||
url: "https://www.gacne.com.cn/newv1/cms/frontend/like/like",
|
||||
json: {}
|
||||
};
|
||||
_0x2237b0.json.businessType = "104";
|
||||
_0x2237b0.json.businessId = _0x3f7a7b;
|
||||
|
||||
let {
|
||||
result: _0x89b536
|
||||
} = await this.request(_0x57726e.copy(_0x2237b0)),
|
||||
_0x5bff9e = _0x57726e.get(_0x89b536, "code", -1);
|
||||
|
||||
if (_0x5bff9e == "0000") {
|
||||
_0x89b536?.["data"] == true ? (this.log("点赞文章[" + _0x3f7a7b + "]成功"), await this.article_like(_0x3f7a7b, false)) : _0x5c0c91 ? _0x468fdd < _0x327956 ? await this.article_like(_0x3f7a7b, true, _0x468fdd + 1) : this.log("点赞文章[" + _0x3f7a7b + "]失败") : this.log("取消点赞文章[" + _0x3f7a7b + "]成功");
|
||||
} else {
|
||||
let _0x2317e8 = _0x57726e.get(_0x89b536, "msg", "");
|
||||
|
||||
this.log("点赞文章[" + _0x3f7a7b + "]失败[" + _0x5bff9e + "]: " + _0x2317e8);
|
||||
}
|
||||
} catch (_0x423adf) {
|
||||
console.log(_0x423adf);
|
||||
}
|
||||
}
|
||||
|
||||
async userTask(_0x332f3a = {}) {
|
||||
if (!(await this.checkLogin())) {
|
||||
return;
|
||||
}
|
||||
|
||||
await this.sign_in();
|
||||
await this.detail_new();
|
||||
await this.check_integral();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
//if (!(await _0x54e8ac())) {
|
||||
// return;
|
||||
//}
|
||||
|
||||
_0x57726e.read_env(_0x61a68c);
|
||||
|
||||
for (let _0x1682e4 of _0x57726e.userList) {
|
||||
await _0x1682e4.userTask();
|
||||
}
|
||||
})().catch(_0x30e3bb => _0x57726e.log(_0x30e3bb)).finally(() => _0x57726e.exitNow());
|
||||
|
||||
async function _0x54e8ac(_0x24bc02 = 0) {
|
||||
let _0xbe6122 = false;
|
||||
|
||||
try {
|
||||
const _0x2bdf7d = {
|
||||
fn: "auth",
|
||||
method: "get",
|
||||
url: _0xd58e67,
|
||||
timeout: 20000
|
||||
};
|
||||
let {
|
||||
statusCode: _0x3b94f2,
|
||||
result: _0xccbbf5
|
||||
} = await _0x1c4970.request(_0x2bdf7d);
|
||||
|
||||
if (_0x3b94f2 != 200) {
|
||||
_0x24bc02++ < _0x79e5b9 && (_0xbe6122 = await _0x54e8ac(_0x24bc02));
|
||||
return _0xbe6122;
|
||||
}
|
||||
|
||||
if (_0xccbbf5?.["code"] == 0) {
|
||||
_0xccbbf5 = JSON.parse(_0xccbbf5.data.file.data);
|
||||
|
||||
if (_0xccbbf5?.["commonNotify"] && _0xccbbf5.commonNotify.length > 0) {
|
||||
const _0x2920c3 = {
|
||||
notify: true
|
||||
};
|
||||
|
||||
_0x57726e.log(_0xccbbf5.commonNotify.join("\n") + "\n", _0x2920c3);
|
||||
}
|
||||
|
||||
_0xccbbf5?.["commonMsg"] && _0xccbbf5.commonMsg.length > 0 && _0x57726e.log(_0xccbbf5.commonMsg.join("\n") + "\n");
|
||||
|
||||
if (_0xccbbf5[_0x5cb507]) {
|
||||
let _0x3e76d7 = _0xccbbf5[_0x5cb507];
|
||||
_0x3e76d7.status == 0 ? _0x620eeb >= _0x3e76d7.version ? (_0xbe6122 = true, _0x57726e.log(_0x3e76d7.msg[_0x3e76d7.status]), _0x57726e.log(_0x3e76d7.updateMsg), _0x57726e.log("现在运行的脚本版本是:" + _0x620eeb + ",最新脚本版本:" + _0x3e76d7.latestVersion)) : _0x57726e.log(_0x3e76d7.versionMsg) : _0x57726e.log(_0x3e76d7.msg[_0x3e76d7.status]);
|
||||
} else {
|
||||
_0x57726e.log(_0xccbbf5.errorMsg);
|
||||
}
|
||||
} else {
|
||||
_0x24bc02++ < _0x79e5b9 && (_0xbe6122 = await _0x54e8ac(_0x24bc02));
|
||||
}
|
||||
} catch (_0x3351ef) {
|
||||
_0x57726e.log(_0x3351ef);
|
||||
} finally {
|
||||
return _0xbe6122;
|
||||
}
|
||||
}
|
||||
|
||||
function _0xafb67f(_0x1769fd) {
|
||||
return new class {
|
||||
constructor(_0x256e2d) {
|
||||
this.name = _0x256e2d;
|
||||
this.startTime = Date.now();
|
||||
const _0x5c5246 = {
|
||||
time: true
|
||||
};
|
||||
this.log("[" + this.name + "]开始运行\n", _0x5c5246);
|
||||
this.notifyStr = [];
|
||||
this.notifyFlag = true;
|
||||
this.userIdx = 0;
|
||||
this.userList = [];
|
||||
this.userCount = 0;
|
||||
}
|
||||
|
||||
log(_0x3a7bbe, _0x5948a5 = {}) {
|
||||
const _0x5dcf03 = {
|
||||
console: true
|
||||
};
|
||||
Object.assign(_0x5dcf03, _0x5948a5);
|
||||
|
||||
if (_0x5dcf03.time) {
|
||||
let _0x39f680 = _0x5dcf03.fmt || "hh:mm:ss";
|
||||
|
||||
_0x3a7bbe = "[" + this.time(_0x39f680) + "]" + _0x3a7bbe;
|
||||
}
|
||||
|
||||
if (_0x5dcf03.notify) {
|
||||
this.notifyStr.push(_0x3a7bbe);
|
||||
}
|
||||
|
||||
if (_0x5dcf03.console) {
|
||||
console.log(_0x3a7bbe);
|
||||
}
|
||||
}
|
||||
|
||||
get(_0x39951a, _0x25a1a2, _0x4d4fc7 = "") {
|
||||
let _0x4e7345 = _0x4d4fc7;
|
||||
_0x39951a?.["hasOwnProperty"](_0x25a1a2) && (_0x4e7345 = _0x39951a[_0x25a1a2]);
|
||||
return _0x4e7345;
|
||||
}
|
||||
|
||||
pop(_0x2e950f, _0x7c0dad, _0x359351 = "") {
|
||||
let _0x13a1bb = _0x359351;
|
||||
_0x2e950f?.["hasOwnProperty"](_0x7c0dad) && (_0x13a1bb = _0x2e950f[_0x7c0dad], delete _0x2e950f[_0x7c0dad]);
|
||||
return _0x13a1bb;
|
||||
}
|
||||
|
||||
copy(_0x49edda) {
|
||||
return Object.assign({}, _0x49edda);
|
||||
}
|
||||
|
||||
read_env(_0x10092d) {
|
||||
let _0x51da5d = _0x570313.map(_0x24b37d => process.env[_0x24b37d]);
|
||||
|
||||
for (let _0x29db68 of _0x51da5d.filter(_0x5a7143 => !!_0x5a7143)) {
|
||||
for (let _0x158a73 of _0x29db68.split(_0x27935e).filter(_0x376b1c => !!_0x376b1c)) {
|
||||
if (this.userList.includes(_0x158a73)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
this.userList.push(new _0x10092d(_0x158a73));
|
||||
}
|
||||
}
|
||||
|
||||
this.userCount = this.userList.length;
|
||||
|
||||
if (!this.userCount) {
|
||||
const _0x222b1f = {
|
||||
notify: true
|
||||
};
|
||||
this.log("未找到变量,请检查变量" + _0x570313.map(_0x271334 => "[" + _0x271334 + "]").join("或"), _0x222b1f);
|
||||
return false;
|
||||
}
|
||||
|
||||
this.log("共找到" + this.userCount + "个账号");
|
||||
return true;
|
||||
}
|
||||
|
||||
async threads(_0x4949f6, _0x584e43, _0x5a910f = {}) {
|
||||
while (_0x584e43.idx < _0x57726e.userList.length) {
|
||||
let _0x2ac950 = _0x57726e.userList[_0x584e43.idx++];
|
||||
|
||||
if (!_0x2ac950.valid) {
|
||||
continue;
|
||||
}
|
||||
|
||||
await _0x2ac950[_0x4949f6](_0x5a910f);
|
||||
}
|
||||
}
|
||||
|
||||
async threadTask(_0x2dea71, _0xc5fc20) {
|
||||
let _0x50bab2 = [];
|
||||
const _0x57c126 = {
|
||||
idx: 0
|
||||
};
|
||||
|
||||
while (_0xc5fc20--) {
|
||||
_0x50bab2.push(this.threads(_0x2dea71, _0x57c126));
|
||||
}
|
||||
|
||||
await Promise.all(_0x50bab2);
|
||||
}
|
||||
|
||||
time(_0xd7b6ec, _0x470f66 = null) {
|
||||
let _0x1f2c33 = _0x470f66 ? new Date(_0x470f66) : new Date(),
|
||||
_0x5a2523 = {
|
||||
"M+": _0x1f2c33.getMonth() + 1,
|
||||
"d+": _0x1f2c33.getDate(),
|
||||
"h+": _0x1f2c33.getHours(),
|
||||
"m+": _0x1f2c33.getMinutes(),
|
||||
"s+": _0x1f2c33.getSeconds(),
|
||||
"q+": Math.floor((_0x1f2c33.getMonth() + 3) / 3),
|
||||
S: this.padStr(_0x1f2c33.getMilliseconds(), 3)
|
||||
};
|
||||
|
||||
/(y+)/.test(_0xd7b6ec) && (_0xd7b6ec = _0xd7b6ec.replace(RegExp.$1, (_0x1f2c33.getFullYear() + "").substr(4 - RegExp.$1.length)));
|
||||
|
||||
for (let _0x28cc52 in _0x5a2523) new RegExp("(" + _0x28cc52 + ")").test(_0xd7b6ec) && (_0xd7b6ec = _0xd7b6ec.replace(RegExp.$1, 1 == RegExp.$1.length ? _0x5a2523[_0x28cc52] : ("00" + _0x5a2523[_0x28cc52]).substr(("" + _0x5a2523[_0x28cc52]).length)));
|
||||
|
||||
return _0xd7b6ec;
|
||||
}
|
||||
|
||||
async showmsg() {
|
||||
if (!this.notifyFlag) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.notifyStr.length) {
|
||||
return;
|
||||
}
|
||||
|
||||
let _0x1d4fbc = require("./sendNotify");
|
||||
|
||||
this.log("\n============== 推送 ==============");
|
||||
await _0x1d4fbc.sendNotify(this.name, this.notifyStr.join("\n"));
|
||||
}
|
||||
|
||||
padStr(_0x3ad858, _0x529cdd, _0x52f10e = {}) {
|
||||
let _0x430a77 = _0x52f10e.padding || "0",
|
||||
_0x2f3ffe = _0x52f10e.mode || "l",
|
||||
_0x20e6f5 = String(_0x3ad858),
|
||||
_0x35ef26 = _0x529cdd > _0x20e6f5.length ? _0x529cdd - _0x20e6f5.length : 0,
|
||||
_0x28c19f = "";
|
||||
|
||||
for (let _0x178519 = 0; _0x178519 < _0x35ef26; _0x178519++) {
|
||||
_0x28c19f += _0x430a77;
|
||||
}
|
||||
|
||||
_0x2f3ffe == "r" ? _0x20e6f5 = _0x20e6f5 + _0x28c19f : _0x20e6f5 = _0x28c19f + _0x20e6f5;
|
||||
return _0x20e6f5;
|
||||
}
|
||||
|
||||
json2str(_0x359dfc, _0x55e160, _0xe089a1 = false) {
|
||||
let _0x209a05 = [];
|
||||
|
||||
for (let _0x25a87e of Object.keys(_0x359dfc).sort()) {
|
||||
let _0x490db8 = _0x359dfc[_0x25a87e];
|
||||
|
||||
if (_0x490db8 && _0xe089a1) {
|
||||
_0x490db8 = encodeURIComponent(_0x490db8);
|
||||
}
|
||||
|
||||
_0x209a05.push(_0x25a87e + "=" + _0x490db8);
|
||||
}
|
||||
|
||||
return _0x209a05.join(_0x55e160);
|
||||
}
|
||||
|
||||
str2json(_0x17b2a4, _0x272cec = false) {
|
||||
let _0x162d31 = {};
|
||||
|
||||
for (let _0x3c5246 of _0x17b2a4.split("&")) {
|
||||
if (!_0x3c5246) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let _0x2f91c5 = _0x3c5246.indexOf("=");
|
||||
|
||||
if (_0x2f91c5 == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
let _0x1ab288 = _0x3c5246.substr(0, _0x2f91c5),
|
||||
_0x162db1 = _0x3c5246.substr(_0x2f91c5 + 1);
|
||||
|
||||
if (_0x272cec) {
|
||||
_0x162db1 = decodeURIComponent(_0x162db1);
|
||||
}
|
||||
|
||||
_0x162d31[_0x1ab288] = _0x162db1;
|
||||
}
|
||||
|
||||
return _0x162d31;
|
||||
}
|
||||
|
||||
randomPattern(_0x5f3c83, _0x19f9c5 = "abcdef0123456789") {
|
||||
let _0x4fa6d4 = "";
|
||||
|
||||
for (let _0x348d6c of _0x5f3c83) {
|
||||
if (_0x348d6c == "x") {
|
||||
_0x4fa6d4 += _0x19f9c5.charAt(Math.floor(Math.random() * _0x19f9c5.length));
|
||||
} else {
|
||||
_0x348d6c == "X" ? _0x4fa6d4 += _0x19f9c5.charAt(Math.floor(Math.random() * _0x19f9c5.length)).toUpperCase() : _0x4fa6d4 += _0x348d6c;
|
||||
}
|
||||
}
|
||||
|
||||
return _0x4fa6d4;
|
||||
}
|
||||
|
||||
randomUuid() {
|
||||
return this.randomPattern("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
|
||||
}
|
||||
|
||||
randomString(_0x343b03, _0x324233 = "abcdef0123456789") {
|
||||
let _0x30330 = "";
|
||||
|
||||
for (let _0x4135c1 = 0; _0x4135c1 < _0x343b03; _0x4135c1++) {
|
||||
_0x30330 += _0x324233.charAt(Math.floor(Math.random() * _0x324233.length));
|
||||
}
|
||||
|
||||
return _0x30330;
|
||||
}
|
||||
|
||||
randomList(_0x13e9bb) {
|
||||
let _0x110f62 = Math.floor(Math.random() * _0x13e9bb.length);
|
||||
|
||||
return _0x13e9bb[_0x110f62];
|
||||
}
|
||||
|
||||
wait(_0x24952c) {
|
||||
return new Promise(_0x34f73f => setTimeout(_0x34f73f, _0x24952c));
|
||||
}
|
||||
|
||||
async exitNow() {
|
||||
await this.showmsg();
|
||||
|
||||
let _0x2d8959 = Date.now(),
|
||||
_0x46c8c7 = (_0x2d8959 - this.startTime) / 1000;
|
||||
|
||||
this.log("");
|
||||
const _0x4e1a23 = {
|
||||
time: true
|
||||
};
|
||||
this.log("[" + this.name + "]运行结束,共运行了" + _0x46c8c7 + "秒", _0x4e1a23);
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
normalize_time(_0x53b538, _0x1faa00 = {}) {
|
||||
let _0x37b02e = _0x1faa00.len || _0x1a60e5;
|
||||
|
||||
_0x53b538 = _0x53b538.toString();
|
||||
let _0x166c58 = _0x53b538.length;
|
||||
|
||||
while (_0x166c58 < _0x37b02e) {
|
||||
_0x53b538 += "0";
|
||||
}
|
||||
|
||||
_0x166c58 > _0x37b02e && (_0x53b538 = _0x53b538.slice(0, 13));
|
||||
return parseInt(_0x53b538);
|
||||
}
|
||||
|
||||
async wait_until(_0x218619, _0x55d35f = {}) {
|
||||
let _0x52ea23 = _0x55d35f.logger || this,
|
||||
_0x40b0a3 = _0x55d35f.interval || _0x149fb5,
|
||||
_0x321fe6 = _0x55d35f.limit || _0x5a59fa,
|
||||
_0x43d134 = _0x55d35f.ahead || _0x2aa689;
|
||||
|
||||
if (typeof _0x218619 == "string" && _0x218619.includes(":")) {
|
||||
if (_0x218619.includes("-")) {
|
||||
_0x218619 = new Date(_0x218619).getTime();
|
||||
} else {
|
||||
let _0x4570db = this.time("yyyy-MM-dd ");
|
||||
|
||||
_0x218619 = new Date(_0x4570db + _0x218619).getTime();
|
||||
}
|
||||
}
|
||||
|
||||
let _0x213726 = this.normalize_time(_0x218619) - _0x43d134,
|
||||
_0x15f711 = this.time("hh:mm:ss.S", _0x213726),
|
||||
_0x64038d = Date.now();
|
||||
|
||||
_0x64038d > _0x213726 && (_0x213726 += 86400000);
|
||||
|
||||
let _0x2300fa = _0x213726 - _0x64038d;
|
||||
|
||||
if (_0x2300fa > _0x321fe6) {
|
||||
const _0x472762 = {
|
||||
time: true
|
||||
};
|
||||
|
||||
_0x52ea23.log("离目标时间[" + _0x15f711 + "]大于" + _0x321fe6 / 1000 + "秒,不等待", _0x472762);
|
||||
} else {
|
||||
const _0x51bb43 = {
|
||||
time: true
|
||||
};
|
||||
|
||||
_0x52ea23.log("离目标时间[" + _0x15f711 + "]还有" + _0x2300fa / 1000 + "秒,开始等待", _0x51bb43);
|
||||
|
||||
while (_0x2300fa > 0) {
|
||||
let _0x35d2f8 = Math.min(_0x2300fa, _0x40b0a3);
|
||||
|
||||
await this.wait(_0x35d2f8);
|
||||
_0x64038d = Date.now();
|
||||
_0x2300fa = _0x213726 - _0x64038d;
|
||||
}
|
||||
|
||||
const _0x50a2dc = {
|
||||
time: true
|
||||
};
|
||||
|
||||
_0x52ea23.log("已完成等待", _0x50a2dc);
|
||||
}
|
||||
}
|
||||
|
||||
async wait_gap_interval(_0x4b224a, _0x63b7f5) {
|
||||
let _0x33918a = Date.now() - _0x4b224a;
|
||||
|
||||
_0x33918a < _0x63b7f5 && (await this.wait(_0x63b7f5 - _0x33918a));
|
||||
}
|
||||
|
||||
}(_0x1769fd);
|
||||
}
|
||||
631
脚本库/web版/账密/废文小说/2025-08-25_ql_fwxs_95659ed7.js
Normal file
631
脚本库/web版/账密/废文小说/2025-08-25_ql_fwxs_95659ed7.js
Normal file
File diff suppressed because one or more lines are too long
646
脚本库/web版/账密/微博热搜榜/2025-08-25_wbhot_04ee263f.js
Normal file
646
脚本库/web版/账密/微博热搜榜/2025-08-25_wbhot_04ee263f.js
Normal file
File diff suppressed because one or more lines are too long
620
脚本库/web版/账密/恩山无线论坛/2025-08-25_eswxlt_dc458728.js
Normal file
620
脚本库/web版/账密/恩山无线论坛/2025-08-25_eswxlt_dc458728.js
Normal file
File diff suppressed because one or more lines are too long
569
脚本库/web版/账密/手机号归属地/2025-08-25_telgsd_45e96639.js
Normal file
569
脚本库/web版/账密/手机号归属地/2025-08-25_telgsd_45e96639.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/抖音热搜榜/2025-08-25_dyhot_4af8123c.js
Normal file
630
脚本库/web版/账密/抖音热搜榜/2025-08-25_dyhot_4af8123c.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/挑战古诗词/2025-08-25_tzgsc_2717fabb.js
Normal file
630
脚本库/web版/账密/挑战古诗词/2025-08-25_tzgsc_2717fabb.js
Normal file
File diff suppressed because one or more lines are too long
464
脚本库/web版/账密/无锡观察/2025-06-28_无锡观察_75d1a9e7.js
Normal file
464
脚本库/web版/账密/无锡观察/2025-06-28_无锡观察_75d1a9e7.js
Normal file
@@ -0,0 +1,464 @@
|
||||
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%97%A0%E9%94%A1%E8%A7%82%E5%AF%9F.js
|
||||
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%97%A0%E9%94%A1%E8%A7%82%E5%AF%9F.js
|
||||
// # Repo: jdqlscript/toulu
|
||||
// # Path: 无锡观察.js
|
||||
// # UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
// # SHA256: 75d1a9e750c86e36d648c26a2df29dd860711cc296266f3998347a115cf7f104
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
|
||||
TL库:https://github.com/3288588344/toulu.git
|
||||
tg频道:https://t.me/TLtoulu
|
||||
QQ频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
软件:无锡观察
|
||||
入口:http://app.wxrb.com/wxgc-h5/invitation.html?invitCode=FB2190
|
||||
邀请码:FB2190
|
||||
完成 签到、日常任务获得积分,积分在商城兑换话费
|
||||
变量名:wxgcck
|
||||
手机号注册登录,设置好密码后填入变量,手机号@密码,多账号用&隔开
|
||||
定时:每天运行一次就可以了
|
||||
cron: 14 8 * * *
|
||||
const $ = new Env('无锡观察')
|
||||
*/
|
||||
NAME = "无锡观察";
|
||||
VALY = ["wxgcck"];
|
||||
LOGS = 0;
|
||||
CK = "";
|
||||
var userList = [];
|
||||
usid = 0;
|
||||
class Bar {
|
||||
constructor(_0x59ea97) {
|
||||
this._ = ++usid;
|
||||
this.f = "账号 [" + this._ + "] ";
|
||||
this.o = _0x59ea97.split("@")[0];
|
||||
this.p = _0x59ea97.split("@")[1];
|
||||
}
|
||||
async task() {
|
||||
console.log("TL库频道:https://t.me/TLtoulu");
|
||||
await this.login();
|
||||
}
|
||||
async login() {
|
||||
let _0x54564a = times(10),
|
||||
_0x75ef22 = SJS(44),
|
||||
_0x290169 = SJSxx(20),
|
||||
_0x36c9ca = MD5Encrypt("" + this.p),
|
||||
_0x4f3bf6 = MD5Encrypt(this.p + "ytj_ym@2010"),
|
||||
_0x43122d = MD5Encrypt("appversion=6.2.4&devicetoken=" + _0x75ef22 + "&devicetype=02&mobile=" + this.o + "&nonce=" + _0x290169 + "&password=" + _0x36c9ca + "&saltpasword=" + _0x4f3bf6 + "×tamp=" + _0x54564a + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
|
||||
_0x19106b = "mobile=" + this.o + "&password=" + _0x36c9ca + "&saltpasword=" + _0x4f3bf6 + "&devicetoken=" + _0x75ef22 + "&appversion=6.2.4&devicetype=02&nonce=" + _0x290169 + "×tamp=" + _0x54564a,
|
||||
_0x30c0f7 = {
|
||||
sign: "" + _0x43122d,
|
||||
requester: "wxgc-app-android"
|
||||
},
|
||||
_0x47f086 = await task("post", "http://app.wxrb.com/wxgc/user/bus/user/loginByPassword", _0x30c0f7, _0x19106b);
|
||||
_0x47f086.code == "000000" ? (console.log(this.f + " 登陆成功"), this.uid = _0x47f086.result.userId, this.token = _0x47f086.result.accessToken, this.name = _0x47f086.result.mobile, await this.tasklist(), await this.userinfo()) : console.log(this.f + " " + _0x47f086.message + " 登陆失败");
|
||||
}
|
||||
async tasklist() {
|
||||
let _0x32e24a = times(10),
|
||||
_0x173708 = SJSxx(20),
|
||||
_0x78096 = MD5Encrypt("nonce=" + _0x173708 + "×tamp=" + _0x32e24a + "&userId=" + this.uid + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
|
||||
_0x41d430 = "{\"userId\":\"" + this.uid + "\",\"nonce\":\"" + _0x173708 + "\",\"timestamp\":\"" + _0x32e24a + "\"}",
|
||||
_0xe43701 = {
|
||||
sign: "" + _0x78096,
|
||||
Authorization: "" + this.token,
|
||||
userId: "" + this.uid,
|
||||
requester: "wxgc-app-android"
|
||||
},
|
||||
_0x212bd5 = await task("post", "http://app.wxrb.com/wxgc/integral/bus/integral/account/listPointsTask", _0xe43701, _0x41d430);
|
||||
if (_0x212bd5.code == "000000") {
|
||||
console.log(this.f + " 任务列表获取成功 ");
|
||||
for (let _0x2b0598 of _0x212bd5.result.dailyTasks) {
|
||||
this.dailyid = _0x2b0598.id;
|
||||
this.dailyn = _0x2b0598.productDesc;
|
||||
for (let _0x481969 = 0; _0x481969 < 5; _0x481969++) {
|
||||
await this.dodailytask();
|
||||
await wait(10000);
|
||||
}
|
||||
}
|
||||
for (let _0x1ce9e0 of _0x212bd5.result.signTasks) {
|
||||
this.signid = _0x1ce9e0.id;
|
||||
await this.dosigntask();
|
||||
}
|
||||
} else {
|
||||
console.log(this.f + " " + _0x212bd5.message + " ");
|
||||
}
|
||||
}
|
||||
async dosigntask() {
|
||||
let _0xc27b9c = times(10),
|
||||
_0x5cc8e5 = SJSxx(20),
|
||||
_0xf524ab = MD5Encrypt("nonce=" + _0x5cc8e5 + "&productId=" + this.signid + "×tamp=" + _0xc27b9c + "&userId=" + this.uid + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
|
||||
_0x1c0060 = "{\"productId\":\"" + this.signid + "\",\"userId\":\"" + this.uid + "\",\"nonce\":\"" + _0x5cc8e5 + "\",\"timestamp\":\"" + _0xc27b9c + "\"}",
|
||||
_0x6d1eb0 = {
|
||||
sign: "" + _0xf524ab,
|
||||
Authorization: "" + this.token,
|
||||
userId: "" + this.uid,
|
||||
requester: "wxgc-app-android"
|
||||
},
|
||||
_0x271556 = await task("post", "http://app.wxrb.com/wxgc/integral/bus/integral/account/pointsEntry", _0x6d1eb0, _0x1c0060);
|
||||
_0x271556.code == "000000" && console.log(this.f + " 完成 【签到】任务 成功 ");
|
||||
}
|
||||
async dodailytask() {
|
||||
let _0x51f654 = times(10),
|
||||
_0x5b95f1 = SJSxx(20),
|
||||
_0x5726df = MD5Encrypt("nonce=" + _0x5b95f1 + "&productId=" + this.dailyid + "×tamp=" + _0x51f654 + "&userId=" + this.uid + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
|
||||
_0xab7580 = "{\"productId\":\"" + this.dailyid + "\",\"userId\":\"" + this.uid + "\",\"nonce\":\"" + _0x5b95f1 + "\",\"timestamp\":\"" + _0x51f654 + "\"}",
|
||||
_0x5ba413 = {
|
||||
sign: "" + _0x5726df,
|
||||
Authorization: "" + this.token,
|
||||
userId: "" + this.uid,
|
||||
requester: "wxgc-app-android"
|
||||
},
|
||||
_0xb86250 = await task("post", "http://app.wxrb.com/wxgc/integral/bus/integral/account/pointsEntry", _0x5ba413, _0xab7580);
|
||||
_0xb86250.code == "000000" ? console.log(this.f + " 完成 【" + this.dailyn + "】任务 成功 ") : console.log(this.f + " " + _0xb86250.message + " ");
|
||||
}
|
||||
async userinfo() {
|
||||
let _0x5dc372 = times(10),
|
||||
_0x53969e = SJSxx(20),
|
||||
_0x4a4ccd = MD5Encrypt("nonce=" + _0x53969e + "×tamp=" + _0x5dc372 + "&userId=" + this.uid + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
|
||||
_0x26277d = "userId=" + this.uid + "&nonce=" + _0x53969e + "×tamp=" + _0x5dc372,
|
||||
_0x3d39f3 = {
|
||||
sign: "" + _0x4a4ccd,
|
||||
Authorization: "" + this.token,
|
||||
userId: "" + this.uid,
|
||||
requester: "wxgc-app-android"
|
||||
},
|
||||
_0x286ec0 = await task("post", "http://app.wxrb.com/wxgc/integral/bus/integral/account/getAccountDetail", _0x3d39f3, _0x26277d);
|
||||
_0x286ec0.code == "000000" ? console.log(this.f + ":" + this.name + "==>等级" + _0x286ec0.result.level + "==>总积分" + _0x286ec0.result.totalPoints) : console.log(this.f + " " + _0x286ec0.message + " ");
|
||||
}
|
||||
}
|
||||
!(async () => {
|
||||
if (!(await checkEnv())) {
|
||||
return;
|
||||
}
|
||||
for (let _0x54fb58 of userList) await _0x54fb58.task();
|
||||
})().catch(_0x5695c1 => {
|
||||
console.log(_0x5695c1);
|
||||
}).finally(() => {});
|
||||
function RT(_0x2172bb, _0x3d8139) {
|
||||
return Math.round(Math.random() * (_0x3d8139 - _0x2172bb) + _0x2172bb);
|
||||
}
|
||||
function times(_0x392abf) {
|
||||
if (_0x392abf == 10) {
|
||||
let _0x188efa = Math.round(new Date().getTime() / 1000).toString();
|
||||
return _0x188efa;
|
||||
} else {
|
||||
let _0x1f5aef = new Date().getTime();
|
||||
return _0x1f5aef;
|
||||
}
|
||||
}
|
||||
async function task(_0x2c2732, _0x50f7d9, _0x18696e, _0x5494fa) {
|
||||
_0x2c2732 == "delete" ? _0x2c2732 = _0x2c2732.toUpperCase() : _0x2c2732 = _0x2c2732;
|
||||
const _0x47b834 = require("request");
|
||||
_0x2c2732 == "post" && (delete _0x18696e["content-type"], delete _0x18696e["Content-type"], delete _0x18696e["content-Type"], safeGet(_0x5494fa) ? _0x18696e["Content-Type"] = "application/json;charset=UTF-8" : _0x18696e["Content-Type"] = "application/x-www-form-urlencoded", _0x5494fa && (_0x18696e["Content-Length"] = lengthInUtf8Bytes(_0x5494fa)));
|
||||
_0x18696e.Host = _0x50f7d9.replace("//", "/").split("/")[1];
|
||||
if (_0x2c2732.indexOf("T") < 0) {
|
||||
var _0x30c5b2 = {
|
||||
url: _0x50f7d9,
|
||||
headers: _0x18696e,
|
||||
body: _0x5494fa
|
||||
};
|
||||
} else {
|
||||
var _0x30c5b2 = {
|
||||
url: _0x50f7d9,
|
||||
headers: _0x18696e,
|
||||
form: JSON.parse(_0x5494fa)
|
||||
};
|
||||
}
|
||||
return new Promise(async _0x289fad => {
|
||||
_0x47b834[_0x2c2732.toLowerCase()](_0x30c5b2, (_0x2de78e, _0x219fe1, _0x546cb6) => {
|
||||
try {
|
||||
LOGS == 1 && (console.log("==================请求=================="), console.log(_0x30c5b2), console.log("==================返回=================="), console.log(JSON.parse(_0x546cb6)));
|
||||
} catch (_0x96dcbd) {} finally {
|
||||
!_0x2de78e ? safeGet(_0x546cb6) ? _0x546cb6 = JSON.parse(_0x546cb6) : _0x546cb6 = _0x546cb6 : _0x546cb6 = _0x50f7d9 + " API请求失败,请检查网络重试\n" + _0x2de78e;
|
||||
return _0x289fad(_0x546cb6);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
function SJS(_0x2e788e) {
|
||||
_0x2e788e = _0x2e788e || 32;
|
||||
var _0x2a1d6c = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890",
|
||||
_0x21ffad = _0x2a1d6c.length,
|
||||
_0x1c080b = "";
|
||||
for (i = 0; i < _0x2e788e; i++) {
|
||||
_0x1c080b += _0x2a1d6c.charAt(Math.floor(Math.random() * _0x21ffad));
|
||||
}
|
||||
return _0x1c080b;
|
||||
}
|
||||
function SJSxx(_0x1f8b54) {
|
||||
_0x1f8b54 = _0x1f8b54 || 32;
|
||||
var _0x14d0d7 = "abcdefghijklmnopqrstuvwxyz1234567890",
|
||||
_0x307e14 = _0x14d0d7.length,
|
||||
_0x1bef07 = "";
|
||||
for (i = 0; i < _0x1f8b54; i++) {
|
||||
_0x1bef07 += _0x14d0d7.charAt(Math.floor(Math.random() * _0x307e14));
|
||||
}
|
||||
return _0x1bef07;
|
||||
}
|
||||
function safeGet(_0x5bca30) {
|
||||
try {
|
||||
if (typeof JSON.parse(_0x5bca30) == "object") {
|
||||
return true;
|
||||
}
|
||||
} catch (_0xee7894) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function lengthInUtf8Bytes(_0x400bb3) {
|
||||
let _0x482334 = encodeURIComponent(_0x400bb3).match(/%[89ABab]/g);
|
||||
return _0x400bb3.length + (_0x482334 ? _0x482334.length : 0);
|
||||
}
|
||||
async function checkEnv() {
|
||||
let _0x4b8bc4 = process.env[VALY] || CK,
|
||||
_0x1abb5e = 0;
|
||||
if (_0x4b8bc4) {
|
||||
for (let _0x119fdb of _0x4b8bc4.split("&").filter(_0x4a2a4f => !!_0x4a2a4f)) {
|
||||
userList.push(new Bar(_0x119fdb));
|
||||
}
|
||||
_0x1abb5e = userList.length;
|
||||
} else {
|
||||
console.log("\n【" + NAME + "】:未填写变量: " + VALY);
|
||||
}
|
||||
console.log("共找到" + _0x1abb5e + "个账号");
|
||||
return userList;
|
||||
}
|
||||
function wait(_0x5d26ce) {
|
||||
return new Promise(_0x1a7717 => setTimeout(_0x1a7717, _0x5d26ce));
|
||||
}
|
||||
function stringToBase64(_0x5de683) {
|
||||
var _0x27a913 = Buffer.from(_0x5de683).toString("base64");
|
||||
return _0x27a913;
|
||||
}
|
||||
function SHA256(_0x1bdf5d) {
|
||||
const _0x5b282d = 8,
|
||||
_0xca3192 = 0;
|
||||
function _0x2a6233(_0xfca968, _0x2ba273) {
|
||||
const _0x40c958 = (65535 & _0xfca968) + (65535 & _0x2ba273);
|
||||
return (_0xfca968 >> 16) + (_0x2ba273 >> 16) + (_0x40c958 >> 16) << 16 | 65535 & _0x40c958;
|
||||
}
|
||||
function _0x1e0037(_0x24b6c9, _0x3452ab) {
|
||||
return _0x24b6c9 >>> _0x3452ab | _0x24b6c9 << 32 - _0x3452ab;
|
||||
}
|
||||
function _0x3bfb9d(_0x50aaa2, _0x1d3dbf) {
|
||||
return _0x50aaa2 >>> _0x1d3dbf;
|
||||
}
|
||||
function _0xcf36ef(_0x199d40, _0xaf94b6, _0x1c1069) {
|
||||
return _0x199d40 & _0xaf94b6 ^ ~_0x199d40 & _0x1c1069;
|
||||
}
|
||||
function _0x23114a(_0x35bd40, _0x554bff, _0x5abeba) {
|
||||
return _0x35bd40 & _0x554bff ^ _0x35bd40 & _0x5abeba ^ _0x554bff & _0x5abeba;
|
||||
}
|
||||
function _0x18d67e(_0x16cff9) {
|
||||
return _0x1e0037(_0x16cff9, 2) ^ _0x1e0037(_0x16cff9, 13) ^ _0x1e0037(_0x16cff9, 22);
|
||||
}
|
||||
function _0x2e0fb(_0x205813) {
|
||||
return _0x1e0037(_0x205813, 6) ^ _0x1e0037(_0x205813, 11) ^ _0x1e0037(_0x205813, 25);
|
||||
}
|
||||
function _0xea2e73(_0xce2581) {
|
||||
return _0x1e0037(_0xce2581, 7) ^ _0x1e0037(_0xce2581, 18) ^ _0x3bfb9d(_0xce2581, 3);
|
||||
}
|
||||
return function (_0x2b0322) {
|
||||
const _0x4efe0e = _0xca3192 ? "0123456789ABCDEF" : "0123456789abcdef";
|
||||
let _0x22a715 = "";
|
||||
for (let _0x62e4d3 = 0; _0x62e4d3 < 4 * _0x2b0322.length; _0x62e4d3++) {
|
||||
_0x22a715 += _0x4efe0e.charAt(_0x2b0322[_0x62e4d3 >> 2] >> 8 * (3 - _0x62e4d3 % 4) + 4 & 15) + _0x4efe0e.charAt(_0x2b0322[_0x62e4d3 >> 2] >> 8 * (3 - _0x62e4d3 % 4) & 15);
|
||||
}
|
||||
return _0x22a715;
|
||||
}(function (_0x367953, _0x36b0b2) {
|
||||
const _0x15f78 = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298],
|
||||
_0x1c9517 = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225],
|
||||
_0x36e180 = new Array(64);
|
||||
let _0x1487ef, _0x19f51a, _0x5554e6, _0xe26b11, _0xc713e4, _0x1da9e5, _0x2334bd, _0x5c631b, _0x5cbac5, _0x12b326, _0xba7344, _0x3f836a;
|
||||
for (_0x367953[_0x36b0b2 >> 5] |= 128 << 24 - _0x36b0b2 % 32, _0x367953[15 + (_0x36b0b2 + 64 >> 9 << 4)] = _0x36b0b2, _0x5cbac5 = 0; _0x5cbac5 < _0x367953.length; _0x5cbac5 += 16) {
|
||||
for (_0x1487ef = _0x1c9517[0], _0x19f51a = _0x1c9517[1], _0x5554e6 = _0x1c9517[2], _0xe26b11 = _0x1c9517[3], _0xc713e4 = _0x1c9517[4], _0x1da9e5 = _0x1c9517[5], _0x2334bd = _0x1c9517[6], _0x5c631b = _0x1c9517[7], _0x12b326 = 0; _0x12b326 < 64; _0x12b326++) {
|
||||
_0x36e180[_0x12b326] = _0x12b326 < 16 ? _0x367953[_0x12b326 + _0x5cbac5] : _0x2a6233(_0x2a6233(_0x2a6233(_0x1e0037(_0x3b1156 = _0x36e180[_0x12b326 - 2], 17) ^ _0x1e0037(_0x3b1156, 19) ^ _0x3bfb9d(_0x3b1156, 10), _0x36e180[_0x12b326 - 7]), _0xea2e73(_0x36e180[_0x12b326 - 15])), _0x36e180[_0x12b326 - 16]);
|
||||
_0xba7344 = _0x2a6233(_0x2a6233(_0x2a6233(_0x2a6233(_0x5c631b, _0x2e0fb(_0xc713e4)), _0xcf36ef(_0xc713e4, _0x1da9e5, _0x2334bd)), _0x15f78[_0x12b326]), _0x36e180[_0x12b326]);
|
||||
_0x3f836a = _0x2a6233(_0x18d67e(_0x1487ef), _0x23114a(_0x1487ef, _0x19f51a, _0x5554e6));
|
||||
_0x5c631b = _0x2334bd;
|
||||
_0x2334bd = _0x1da9e5;
|
||||
_0x1da9e5 = _0xc713e4;
|
||||
_0xc713e4 = _0x2a6233(_0xe26b11, _0xba7344);
|
||||
_0xe26b11 = _0x5554e6;
|
||||
_0x5554e6 = _0x19f51a;
|
||||
_0x19f51a = _0x1487ef;
|
||||
_0x1487ef = _0x2a6233(_0xba7344, _0x3f836a);
|
||||
}
|
||||
_0x1c9517[0] = _0x2a6233(_0x1487ef, _0x1c9517[0]);
|
||||
_0x1c9517[1] = _0x2a6233(_0x19f51a, _0x1c9517[1]);
|
||||
_0x1c9517[2] = _0x2a6233(_0x5554e6, _0x1c9517[2]);
|
||||
_0x1c9517[3] = _0x2a6233(_0xe26b11, _0x1c9517[3]);
|
||||
_0x1c9517[4] = _0x2a6233(_0xc713e4, _0x1c9517[4]);
|
||||
_0x1c9517[5] = _0x2a6233(_0x1da9e5, _0x1c9517[5]);
|
||||
_0x1c9517[6] = _0x2a6233(_0x2334bd, _0x1c9517[6]);
|
||||
_0x1c9517[7] = _0x2a6233(_0x5c631b, _0x1c9517[7]);
|
||||
}
|
||||
var _0x3b1156;
|
||||
return _0x1c9517;
|
||||
}(function (_0x5ae319) {
|
||||
const _0x25af03 = [],
|
||||
_0x59befe = (1 << _0x5b282d) - 1;
|
||||
for (let _0x160818 = 0; _0x160818 < _0x5ae319.length * _0x5b282d; _0x160818 += _0x5b282d) {
|
||||
_0x25af03[_0x160818 >> 5] |= (_0x5ae319.charCodeAt(_0x160818 / _0x5b282d) & _0x59befe) << 24 - _0x160818 % 32;
|
||||
}
|
||||
return _0x25af03;
|
||||
}(_0x1bdf5d = function (_0x12196e) {
|
||||
_0x12196e = _0x12196e.replace(/\r\n/g, "\n");
|
||||
let _0x32cc3b = "";
|
||||
for (let _0x131813 = 0; _0x131813 < _0x12196e.length; _0x131813++) {
|
||||
const _0x5eff66 = _0x12196e.charCodeAt(_0x131813);
|
||||
_0x5eff66 < 128 ? _0x32cc3b += String.fromCharCode(_0x5eff66) : _0x5eff66 > 127 && _0x5eff66 < 2048 ? (_0x32cc3b += String.fromCharCode(_0x5eff66 >> 6 | 192), _0x32cc3b += String.fromCharCode(63 & _0x5eff66 | 128)) : (_0x32cc3b += String.fromCharCode(_0x5eff66 >> 12 | 224), _0x32cc3b += String.fromCharCode(_0x5eff66 >> 6 & 63 | 128), _0x32cc3b += String.fromCharCode(63 & _0x5eff66 | 128));
|
||||
}
|
||||
return _0x32cc3b;
|
||||
}(_0x1bdf5d)), _0x1bdf5d.length * _0x5b282d));
|
||||
}
|
||||
function MD5Encrypt(_0x411801) {
|
||||
function _0xebbfc6(_0x1d6596, _0x205bae) {
|
||||
return _0x1d6596 << _0x205bae | _0x1d6596 >>> 32 - _0x205bae;
|
||||
}
|
||||
function _0x380581(_0x58ecca, _0x4649e0) {
|
||||
var _0x37158b, _0x48c532, _0x5779fd, _0x494273, _0x96a8a9;
|
||||
_0x5779fd = 2147483648 & _0x58ecca;
|
||||
_0x494273 = 2147483648 & _0x4649e0;
|
||||
_0x37158b = 1073741824 & _0x58ecca;
|
||||
_0x48c532 = 1073741824 & _0x4649e0;
|
||||
_0x96a8a9 = (1073741823 & _0x58ecca) + (1073741823 & _0x4649e0);
|
||||
return _0x37158b & _0x48c532 ? 2147483648 ^ _0x96a8a9 ^ _0x5779fd ^ _0x494273 : _0x37158b | _0x48c532 ? 1073741824 & _0x96a8a9 ? 3221225472 ^ _0x96a8a9 ^ _0x5779fd ^ _0x494273 : 1073741824 ^ _0x96a8a9 ^ _0x5779fd ^ _0x494273 : _0x96a8a9 ^ _0x5779fd ^ _0x494273;
|
||||
}
|
||||
function _0x158610(_0x4419f1, _0x412d83, _0x1b2226, _0x42e4ea, _0x46b4a7, _0x5eff94, _0x542a7e) {
|
||||
var _0x3324df, _0x1939b8;
|
||||
_0x4419f1 = _0x380581(_0x4419f1, _0x380581(_0x380581((_0x3324df = _0x412d83) & (_0x1939b8 = _0x1b2226) | ~_0x3324df & _0x42e4ea, _0x46b4a7), _0x542a7e));
|
||||
return _0x380581(_0xebbfc6(_0x4419f1, _0x5eff94), _0x412d83);
|
||||
}
|
||||
function _0x278aa8(_0x1e6f61, _0x29da1d, _0x2d16a1, _0x21a023, _0x561501, _0x5c53ad, _0xd53b23) {
|
||||
var _0x3b5dca, _0x38758a, _0x5b2d8f;
|
||||
_0x1e6f61 = _0x380581(_0x1e6f61, _0x380581(_0x380581((_0x3b5dca = _0x29da1d, _0x38758a = _0x2d16a1, _0x3b5dca & (_0x5b2d8f = _0x21a023) | _0x38758a & ~_0x5b2d8f), _0x561501), _0xd53b23));
|
||||
return _0x380581(_0xebbfc6(_0x1e6f61, _0x5c53ad), _0x29da1d);
|
||||
}
|
||||
function _0x18e3f4(_0x150f2f, _0x22daac, _0x89a5e4, _0x5b5aa2, _0x1bb038, _0x7caed7, _0x36e73e) {
|
||||
var _0xe46f52, _0x5a4e96;
|
||||
_0x150f2f = _0x380581(_0x150f2f, _0x380581(_0x380581((_0xe46f52 = _0x22daac) ^ (_0x5a4e96 = _0x89a5e4) ^ _0x5b5aa2, _0x1bb038), _0x36e73e));
|
||||
return _0x380581(_0xebbfc6(_0x150f2f, _0x7caed7), _0x22daac);
|
||||
}
|
||||
function _0x22590f(_0xf495bf, _0x3467f1, _0x49b39a, _0x1c0e58, _0xe6626, _0x58eb7c, _0x24fa3d) {
|
||||
var _0x45c1e2, _0x29d6ce;
|
||||
_0xf495bf = _0x380581(_0xf495bf, _0x380581(_0x380581((_0x45c1e2 = _0x3467f1, (_0x29d6ce = _0x49b39a) ^ (_0x45c1e2 | ~_0x1c0e58)), _0xe6626), _0x24fa3d));
|
||||
return _0x380581(_0xebbfc6(_0xf495bf, _0x58eb7c), _0x3467f1);
|
||||
}
|
||||
function _0x1cf88a(_0x49d5c0) {
|
||||
var _0x72ad13,
|
||||
_0x2751dc = "",
|
||||
_0x222495 = "";
|
||||
for (_0x72ad13 = 0; 3 >= _0x72ad13; _0x72ad13++) {
|
||||
_0x2751dc += (_0x222495 = "0" + (_0x49d5c0 >>> 8 * _0x72ad13 & 255).toString(16)).substr(_0x222495.length - 2, 2);
|
||||
}
|
||||
return _0x2751dc;
|
||||
}
|
||||
var _0x1e1258,
|
||||
_0x42b638,
|
||||
_0x1c926e,
|
||||
_0x4d5a57,
|
||||
_0xcc86c7,
|
||||
_0x1b337a,
|
||||
_0x29e4be,
|
||||
_0x49cac4,
|
||||
_0x4a8185,
|
||||
_0x4a4089 = [];
|
||||
for (_0x4a4089 = function (_0x3024e4) {
|
||||
for (var _0x185bbb, _0x26b50e = _0x3024e4.length, _0x220965 = _0x26b50e + 8, _0x3328fe = 16 * ((_0x220965 - _0x220965 % 64) / 64 + 1), _0x3f89b0 = Array(_0x3328fe - 1), _0xe68527 = 0, _0x312b24 = 0; _0x26b50e > _0x312b24;) {
|
||||
_0x185bbb = (_0x312b24 - _0x312b24 % 4) / 4;
|
||||
_0xe68527 = _0x312b24 % 4 * 8;
|
||||
_0x3f89b0[_0x185bbb] = _0x3f89b0[_0x185bbb] | _0x3024e4.charCodeAt(_0x312b24) << _0xe68527;
|
||||
_0x312b24++;
|
||||
}
|
||||
_0x185bbb = (_0x312b24 - _0x312b24 % 4) / 4;
|
||||
_0xe68527 = _0x312b24 % 4 * 8;
|
||||
_0x3f89b0[_0x185bbb] = _0x3f89b0[_0x185bbb] | 128 << _0xe68527;
|
||||
_0x3f89b0[_0x3328fe - 2] = _0x26b50e << 3;
|
||||
_0x3f89b0[_0x3328fe - 1] = _0x26b50e >>> 29;
|
||||
return _0x3f89b0;
|
||||
}(_0x411801 = function (_0x50b1d7) {
|
||||
_0x50b1d7 = _0x50b1d7.replace(/\r\n/g, "\n");
|
||||
for (var _0x2b8994 = "", _0x353651 = 0; _0x353651 < _0x50b1d7.length; _0x353651++) {
|
||||
var _0x5b6ad7 = _0x50b1d7.charCodeAt(_0x353651);
|
||||
128 > _0x5b6ad7 ? _0x2b8994 += String.fromCharCode(_0x5b6ad7) : _0x5b6ad7 > 127 && 2048 > _0x5b6ad7 ? (_0x2b8994 += String.fromCharCode(_0x5b6ad7 >> 6 | 192), _0x2b8994 += String.fromCharCode(63 & _0x5b6ad7 | 128)) : (_0x2b8994 += String.fromCharCode(_0x5b6ad7 >> 12 | 224), _0x2b8994 += String.fromCharCode(_0x5b6ad7 >> 6 & 63 | 128), _0x2b8994 += String.fromCharCode(63 & _0x5b6ad7 | 128));
|
||||
}
|
||||
return _0x2b8994;
|
||||
}(_0x411801)), _0x1b337a = 1732584193, _0x29e4be = 4023233417, _0x49cac4 = 2562383102, _0x4a8185 = 271733878, _0x1e1258 = 0; _0x1e1258 < _0x4a4089.length; _0x1e1258 += 16) {
|
||||
_0x42b638 = _0x1b337a;
|
||||
_0x1c926e = _0x29e4be;
|
||||
_0x4d5a57 = _0x49cac4;
|
||||
_0xcc86c7 = _0x4a8185;
|
||||
_0x1b337a = _0x158610(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 0], 7, 3614090360);
|
||||
_0x4a8185 = _0x158610(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 1], 12, 3905402710);
|
||||
_0x49cac4 = _0x158610(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 2], 17, 606105819);
|
||||
_0x29e4be = _0x158610(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 3], 22, 3250441966);
|
||||
_0x1b337a = _0x158610(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 4], 7, 4118548399);
|
||||
_0x4a8185 = _0x158610(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 5], 12, 1200080426);
|
||||
_0x49cac4 = _0x158610(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 6], 17, 2821735955);
|
||||
_0x29e4be = _0x158610(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 7], 22, 4249261313);
|
||||
_0x1b337a = _0x158610(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 8], 7, 1770035416);
|
||||
_0x4a8185 = _0x158610(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 9], 12, 2336552879);
|
||||
_0x49cac4 = _0x158610(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 10], 17, 4294925233);
|
||||
_0x29e4be = _0x158610(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 11], 22, 2304563134);
|
||||
_0x1b337a = _0x158610(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 12], 7, 1804603682);
|
||||
_0x4a8185 = _0x158610(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 13], 12, 4254626195);
|
||||
_0x49cac4 = _0x158610(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 14], 17, 2792965006);
|
||||
_0x29e4be = _0x158610(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 15], 22, 1236535329);
|
||||
_0x1b337a = _0x278aa8(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 1], 5, 4129170786);
|
||||
_0x4a8185 = _0x278aa8(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 6], 9, 3225465664);
|
||||
_0x49cac4 = _0x278aa8(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 11], 14, 643717713);
|
||||
_0x29e4be = _0x278aa8(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 0], 20, 3921069994);
|
||||
_0x1b337a = _0x278aa8(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 5], 5, 3593408605);
|
||||
_0x4a8185 = _0x278aa8(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 10], 9, 38016083);
|
||||
_0x49cac4 = _0x278aa8(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 15], 14, 3634488961);
|
||||
_0x29e4be = _0x278aa8(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 4], 20, 3889429448);
|
||||
_0x1b337a = _0x278aa8(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 9], 5, 568446438);
|
||||
_0x4a8185 = _0x278aa8(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 14], 9, 3275163606);
|
||||
_0x49cac4 = _0x278aa8(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 3], 14, 4107603335);
|
||||
_0x29e4be = _0x278aa8(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 8], 20, 1163531501);
|
||||
_0x1b337a = _0x278aa8(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 13], 5, 2850285829);
|
||||
_0x4a8185 = _0x278aa8(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 2], 9, 4243563512);
|
||||
_0x49cac4 = _0x278aa8(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 7], 14, 1735328473);
|
||||
_0x29e4be = _0x278aa8(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 12], 20, 2368359562);
|
||||
_0x1b337a = _0x18e3f4(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 5], 4, 4294588738);
|
||||
_0x4a8185 = _0x18e3f4(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 8], 11, 2272392833);
|
||||
_0x49cac4 = _0x18e3f4(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 11], 16, 1839030562);
|
||||
_0x29e4be = _0x18e3f4(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 14], 23, 4259657740);
|
||||
_0x1b337a = _0x18e3f4(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 1], 4, 2763975236);
|
||||
_0x4a8185 = _0x18e3f4(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 4], 11, 1272893353);
|
||||
_0x49cac4 = _0x18e3f4(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 7], 16, 4139469664);
|
||||
_0x29e4be = _0x18e3f4(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 10], 23, 3200236656);
|
||||
_0x1b337a = _0x18e3f4(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 13], 4, 681279174);
|
||||
_0x4a8185 = _0x18e3f4(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 0], 11, 3936430074);
|
||||
_0x49cac4 = _0x18e3f4(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 3], 16, 3572445317);
|
||||
_0x29e4be = _0x18e3f4(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 6], 23, 76029189);
|
||||
_0x1b337a = _0x18e3f4(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 9], 4, 3654602809);
|
||||
_0x4a8185 = _0x18e3f4(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 12], 11, 3873151461);
|
||||
_0x49cac4 = _0x18e3f4(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 15], 16, 530742520);
|
||||
_0x29e4be = _0x18e3f4(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 2], 23, 3299628645);
|
||||
_0x1b337a = _0x22590f(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 0], 6, 4096336452);
|
||||
_0x4a8185 = _0x22590f(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 7], 10, 1126891415);
|
||||
_0x49cac4 = _0x22590f(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 14], 15, 2878612391);
|
||||
_0x29e4be = _0x22590f(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 5], 21, 4237533241);
|
||||
_0x1b337a = _0x22590f(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 12], 6, 1700485571);
|
||||
_0x4a8185 = _0x22590f(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 3], 10, 2399980690);
|
||||
_0x49cac4 = _0x22590f(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 10], 15, 4293915773);
|
||||
_0x29e4be = _0x22590f(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 1], 21, 2240044497);
|
||||
_0x1b337a = _0x22590f(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 8], 6, 1873313359);
|
||||
_0x4a8185 = _0x22590f(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 15], 10, 4264355552);
|
||||
_0x49cac4 = _0x22590f(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 6], 15, 2734768916);
|
||||
_0x29e4be = _0x22590f(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 13], 21, 1309151649);
|
||||
_0x1b337a = _0x22590f(_0x1b337a, _0x29e4be, _0x49cac4, _0x4a8185, _0x4a4089[_0x1e1258 + 4], 6, 4149444226);
|
||||
_0x4a8185 = _0x22590f(_0x4a8185, _0x1b337a, _0x29e4be, _0x49cac4, _0x4a4089[_0x1e1258 + 11], 10, 3174756917);
|
||||
_0x49cac4 = _0x22590f(_0x49cac4, _0x4a8185, _0x1b337a, _0x29e4be, _0x4a4089[_0x1e1258 + 2], 15, 718787259);
|
||||
_0x29e4be = _0x22590f(_0x29e4be, _0x49cac4, _0x4a8185, _0x1b337a, _0x4a4089[_0x1e1258 + 9], 21, 3951481745);
|
||||
_0x1b337a = _0x380581(_0x1b337a, _0x42b638);
|
||||
_0x29e4be = _0x380581(_0x29e4be, _0x1c926e);
|
||||
_0x49cac4 = _0x380581(_0x49cac4, _0x4d5a57);
|
||||
_0x4a8185 = _0x380581(_0x4a8185, _0xcc86c7);
|
||||
}
|
||||
return (_0x1cf88a(_0x1b337a) + _0x1cf88a(_0x29e4be) + _0x1cf88a(_0x49cac4) + _0x1cf88a(_0x4a8185)).toLowerCase();
|
||||
}
|
||||
645
脚本库/web版/账密/日期提醒/2025-08-25_remind_a1656667.js
Normal file
645
脚本库/web版/账密/日期提醒/2025-08-25_remind_a1656667.js
Normal file
File diff suppressed because one or more lines are too long
631
脚本库/web版/账密/早安问候语/2025-08-25_zaoan_22a29697.js
Normal file
631
脚本库/web版/账密/早安问候语/2025-08-25_zaoan_22a29697.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/星座运势/2025-08-25_xingzuo_fc96e27b.js
Normal file
630
脚本库/web版/账密/星座运势/2025-08-25_xingzuo_fc96e27b.js
Normal file
File diff suppressed because one or more lines are too long
525
脚本库/web版/账密/星芽短剧脚本(解密版)/2025-06-28_星芽短剧脚本(解密版)_aa45bfb7.js
Normal file
525
脚本库/web版/账密/星芽短剧脚本(解密版)/2025-06-28_星芽短剧脚本(解密版)_aa45bfb7.js
Normal file
@@ -0,0 +1,525 @@
|
||||
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%98%9F%E8%8A%BD%E7%9F%AD%E5%89%A7%E8%84%9A%E6%9C%AC%EF%BC%88%E8%A7%A3%E5%AF%86%E7%89%88%EF%BC%89.js
|
||||
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%98%9F%E8%8A%BD%E7%9F%AD%E5%89%A7%E8%84%9A%E6%9C%AC%EF%BC%88%E8%A7%A3%E5%AF%86%E7%89%88%EF%BC%89.js
|
||||
// # Repo: jdqlscript/toulu
|
||||
// # Path: 星芽短剧脚本(解密版).js
|
||||
// # UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
// # SHA256: aa45bfb7967543fb4fe09a6e15cb37f51d304667e3cc21da39c2b399095fcd93
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
//星芽免费短剧脚本
|
||||
//来自TL库:https://github.com/3288588344/toulu.git
|
||||
/*
|
||||
* 星芽免费短剧 cron 一天一次 15点前运行
|
||||
* cron: 0 0 6,12,18 * *
|
||||
|
||||
|
||||
QQ频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
|
||||
抓包pay.whjzjx.cn域名下的device_id和authorization用#隔开
|
||||
|
||||
以下是WxPusher通知设置
|
||||
*WxPusher官网: https://wxpusher.zjiecode.com/admin/main/app/appInfo
|
||||
|
||||
后台新建应用,获取appToken,获取appToken ,微信扫描关注后在公众号获取uuid
|
||||
* export appToken='apptoken#uid'
|
||||
*/
|
||||
|
||||
|
||||
NAME = "星芽免费短剧";
|
||||
VALY = ["xymfdj"];
|
||||
CK = "";
|
||||
let _0x514890 = process.env.weixinToken,
|
||||
_0x475b4f = process.env.kxsssdl,
|
||||
_0x2fbf07 = "https://speciesweb.whjzjx.cn";
|
||||
const _0x327f58 = "1.1",
|
||||
_0x1b47ef = ["\n", "@"],
|
||||
_0x123507 = 0;
|
||||
usid = 0;
|
||||
class _0xb7dbde {
|
||||
constructor(_0x43aa90) {
|
||||
this.device_id = _0x43aa90.split("#")[0];
|
||||
this.authorization11 = _0x43aa90.split("#")[1];
|
||||
this.num = ++usid;
|
||||
this.headers2 = {
|
||||
"authorization": this.authorization11,
|
||||
"user_agent": "Mozilla/5.0 (Linux; Android 13; 23013RK75C Build/TKQ1.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/104.0.5112.97 Mobile Safari/537.36",
|
||||
"device_id": this.device_id,
|
||||
"user-agent": "okhttp/4.10.0"
|
||||
};
|
||||
}
|
||||
async ["hqdl"]() {
|
||||
let _0x2a8938 = await $.task("get", _0x475b4f, {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36"
|
||||
});
|
||||
this.dlip = _0x2a8938.split("\n")[0];
|
||||
console.log("账号" + this.num + ":代理IP:" + this.dlip);
|
||||
}
|
||||
async ["user_task_list"]() {
|
||||
await $.wait(3000);
|
||||
await this.baoxing();
|
||||
await this.kanshipinid();
|
||||
}
|
||||
async ["login"]() {
|
||||
let _0x16cd21 = await this.task("post", "https://app.whjzjx.cn/v1/account/login", this.headers2, "device=" + this.device_id);
|
||||
_0x16cd21.status == 0 ? (this.login = true, this.authorization = _0x16cd21.data.token, console.log("data:" + this.authorization), await this.login11()) : (this.login = false, console.log("账号" + this.num + ":" + _0x16cd21.msg), await this.wxpusher(_0x16cd21.msg));
|
||||
}
|
||||
async ["login11"]() {
|
||||
this.headers = {
|
||||
"User-Agent": "Mozilla/5.0 (Linux; Android 13; 23013RK75C Build/TKQ1.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/104.0.5112.97 Mobile Safari/537.36 _dsbridge",
|
||||
"device_id": this.device_id,
|
||||
"authorization": this.authorization,
|
||||
"user_agent": "Mozilla/5.0 (Linux; Android 13; 23013RK75C Build/TKQ1.220905.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/104.0.5112.97 Mobile Safari/537.36 _dsbridge"
|
||||
};
|
||||
let _0x4f3e8b = await this.task("get", _0x2fbf07 + "/v1/sign/info?device_id=" + this.device_id, this.headers);
|
||||
if (_0x4f3e8b.code == "ok") {
|
||||
this.login = true;
|
||||
this.num = _0x4f3e8b.data.account_id;
|
||||
console.log("账号:" + this.num + " 金额:" + _0x4f3e8b.data.cash_remain);
|
||||
} else this.login = false, console.log("账号" + this.num + ":" + _0x4f3e8b.msg), await this.wxpusher(_0x4f3e8b.msg);
|
||||
}
|
||||
async ["wxpusher"](_0x568a06) {
|
||||
let _0x206f16 = {
|
||||
"X-Requested-With": "com.tencent.mm",
|
||||
"User-Agent": "Dalvik/2.1.0 (Linux; U; Android 13; M2012K11AC Build/TKQ1.220829.002)"
|
||||
},
|
||||
_0x1c4743 = await this.task("get", "https://wxpusher.zjiecode.com/api/send/message/?appToken=" + _0x514890.split("#")[0] + "&content=" + encodeURI("" + NAME + _0x568a06) + "&uid=" + _0x514890.split("#")[1], _0x206f16);
|
||||
if (_0x1c4743.code == 1000) {
|
||||
console.log("微信通知" + _0x1c4743.msg);
|
||||
} else console.log("微信通知失败");
|
||||
}
|
||||
async ["baoxing"]() {
|
||||
for (let _0x1cb07e = 1; _0x1cb07e <= 10; _0x1cb07e++) {
|
||||
await this.qiandaoguafen();
|
||||
}
|
||||
}
|
||||
async ["qiandaoguafen"]() {
|
||||
let _0x1b7d7a = await this.task("post", _0x2fbf07 + "/v1/box/open", this.headers, "{\"config_id\":3}");
|
||||
_0x1b7d7a.code == "ok" ? (console.log(this.num + ":宝箱" + _0x1b7d7a.data.coin_val + "金币"), await $.wait($.RT(1000, 3000)), await this.baoxiangguang(_0x1b7d7a.data.coin_val)) : console.log(this.num + ":宝箱" + _0x1b7d7a.msg);
|
||||
}
|
||||
async ["baoxiangguang"](_0x46b7a) {
|
||||
let _0x41ae56 = await this.task("post", _0x2fbf07 + "/v1/box/view_ad", this.headers, "{\"config_id\":3,\"coin_val\":" + _0x46b7a + ",\"ad_num\":1}");
|
||||
if (_0x41ae56.code == "ok") console.log(this.num + ":宝箱广告" + _0x41ae56.data.coin_val + "金币"), await $.wait(30000);else {
|
||||
console.log("账号" + this.num + ":宝箱广告" + _0x41ae56.msg);
|
||||
}
|
||||
}
|
||||
async ["kanjuqing"]() {
|
||||
let _0x355c86 = await this.task("post", _0x2fbf07 + "/v1/sign/report", this.headers, "{\"type\":2}");
|
||||
if (_0x355c86.code == "ok") {
|
||||
let _0x185df0 = 0;
|
||||
for (let _0x44cc4e = 0; _0x44cc4e < _0x355c86.data.info.length; _0x44cc4e++) {
|
||||
if (_0x355c86.data.info[_0x44cc4e].is_use) {
|
||||
_0x185df0++;
|
||||
}
|
||||
}
|
||||
await this.kanju(_0x185df0 + 2);
|
||||
} else console.log("账号" + this.num + ":看剧情况" + _0x355c86.msg);
|
||||
}
|
||||
async ["kanju"](_0x129ba5) {
|
||||
let _0x5e6032 = await this.task("post", _0x2fbf07 + "/v1/sign", this.headers, "{\"type\":2,\"make\":" + _0x129ba5 + "}");
|
||||
if (_0x5e6032.code == "ok") console.log(this.num + ":看剧" + _0x5e6032.data.coin_val + "金币");else {
|
||||
console.log("账号" + this.num + ":看剧" + _0x5e6032.msg);
|
||||
}
|
||||
}
|
||||
async ["chifanbutei"]() {
|
||||
let _0x5c7b8d = await this.task("post", _0x2fbf07 + "/v1/task/meal", this.headers, "{\"type\":3,\"claim_status\":2}");
|
||||
_0x5c7b8d.code == "ok" ? console.log(this.num + ":吃饭" + _0x5c7b8d.data.coin_val + "金币") : console.log("账号" + this.num + ":吃饭" + _0x5c7b8d.msg);
|
||||
}
|
||||
async ["chifanbuteiguangguao"]() {
|
||||
let _0x3c6b47 = await this.task("post", _0x2fbf07 + "/v1/task/meal/ad", this.headers, "{\"type\":3,\"claim_status\":2}");
|
||||
_0x3c6b47.code == "ok" ? console.log(this.num + ":吃饭广告" + _0x3c6b47.data.coin_val + "金币") : console.log("账号" + this.num + ":吃饭广告" + _0x3c6b47.msg);
|
||||
}
|
||||
async ["kanshipinid"]() {
|
||||
for (let _0x2e021d = 1; _0x2e021d <= 10; _0x2e021d++) {
|
||||
await this.kanshipin(_0x2e021d);
|
||||
}
|
||||
}
|
||||
async ["kanshipin"](_0x1e4c35) {
|
||||
let _0x4d638b = await this.task("post", _0x2fbf07 + "/v1/sign", this.headers, "{\"type\":4,\"mark\":" + _0x1e4c35 + "}");
|
||||
_0x4d638b.code == "ok" ? console.log(this.num + ":看视频" + _0x4d638b.data.species + "金币") : console.log("账号" + this.num + ":看视频" + _0x4d638b.msg);
|
||||
}
|
||||
async ["xinxi"]() {
|
||||
let _0x405e0c = await this.task("get", _0x2fbf07 + "/v1/sign/info?device_id=" + this.device_id, this.headers);
|
||||
if (_0x405e0c.code == "ok") console.log("账号:" + this.num + " 今日" + _0x405e0c.data.species + "金币,金额:" + _0x405e0c.data.cash_remain);else {
|
||||
console.log("账号" + this.num + ":" + _0x405e0c);
|
||||
}
|
||||
}
|
||||
async ["task"](_0x2861a6, _0x37dd8c, _0x5a0e49, _0x50185e) {
|
||||
_0x2861a6 == "delete" ? _0x2861a6 = _0x2861a6.toUpperCase() : _0x2861a6 = _0x2861a6;
|
||||
const _0x3e62c3 = require("request");
|
||||
_0x2861a6 == "post" && (delete _0x5a0e49["Content-Type"], delete _0x5a0e49["content-type"], delete _0x5a0e49["Content-Length"], delete _0x5a0e49["content-length"], $.safeGet(_0x50185e) ? _0x5a0e49["content-type"] = "application/json;charset=utf-8" : _0x5a0e49["content-type"] = "application/x-www-form-urlencoded", _0x50185e && (_0x5a0e49["content-length"] = $.lengthInUtf8Bytes(_0x50185e)));
|
||||
_0x2861a6 == "get" && (delete _0x5a0e49["Content-Type"], delete _0x5a0e49["content-length"], delete _0x5a0e49["content-type"], delete _0x5a0e49["Content-Length"]);
|
||||
_0x5a0e49.Host = _0x37dd8c.replace("//", "/").split("/")[1];
|
||||
if (_0x475b4f == undefined) {
|
||||
if (_0x2861a6.indexOf("T") < 0) var _0x42cae7 = {
|
||||
"url": _0x37dd8c,
|
||||
"headers": _0x5a0e49,
|
||||
"body": _0x50185e,
|
||||
"timeout": 20000
|
||||
};else {
|
||||
var _0x42cae7 = {
|
||||
"url": _0x37dd8c,
|
||||
"headers": _0x5a0e49,
|
||||
"form": JSON.parse(_0x50185e),
|
||||
"timeout": 20000
|
||||
};
|
||||
}
|
||||
} else {
|
||||
if (_0x2861a6.indexOf("T") < 0) var _0x42cae7 = {
|
||||
"url": _0x37dd8c,
|
||||
"headers": _0x5a0e49,
|
||||
"body": _0x50185e,
|
||||
"proxy": "http://" + this.dlip,
|
||||
"timeout": 20000
|
||||
};else var _0x42cae7 = {
|
||||
"url": _0x37dd8c,
|
||||
"headers": _0x5a0e49,
|
||||
"form": JSON.parse(_0x50185e),
|
||||
"proxy": "http://" + this.dlip,
|
||||
"timeout": 20000
|
||||
};
|
||||
}
|
||||
return new Promise(async _0xda06a3 => {
|
||||
_0x3e62c3[_0x2861a6.toLowerCase()](_0x42cae7, async (_0x3e7a9a, _0x9eb20f, _0x1c115e) => {
|
||||
try {
|
||||
_0x123507 == 1 && (console.log("==================请求=================="), console.log(JSON.stringify(_0x42cae7)), console.log("==================返回=================="), console.log(_0x1c115e));
|
||||
} catch (_0x577526) {} finally {
|
||||
return !_0x3e7a9a ? $.safeGet(_0x1c115e) ? _0x1c115e = JSON.parse(_0x1c115e) : _0x1c115e = _0x1c115e : _0x475b4f == undefined ? (console.log("请检查网络设置"), _0x1c115e = JSON.parse("{\"code\":\"99\"}")) : (await this.hqdl(), _0x1c115e = await this.task(_0x2861a6, _0x37dd8c, _0x5a0e49, _0x50185e)), _0xda06a3(_0x1c115e);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
$ = _0x5a1661();
|
||||
!(async () => {
|
||||
console.log("[" + NAME + "] " + $.timenow(3) + ":" + $.timenow(4) + ":" + $.timenow(5));
|
||||
await $.ExamineCookie();
|
||||
if (_0x475b4f == undefined) {
|
||||
console.log("当前使用本地网络运行脚本");
|
||||
console.log("\n-------- 用户信息 --------");
|
||||
await $.Multithreading("login");
|
||||
let _0x2900ec = $.cookie_list.filter(_0x232c5 => _0x232c5.login == true);
|
||||
if (_0x2900ec.length == 0) {
|
||||
console.log("Cookie格式错误 或 账号被禁封");
|
||||
return;
|
||||
} else {
|
||||
console.log("\n-------- 任务列表 --------");
|
||||
await $.Multithreading("user_task_list");
|
||||
console.log("\n-------- 运行结果 --------");
|
||||
}
|
||||
for (let _0x405429 of $.cookie_list) {
|
||||
_0x405429.xinxi();
|
||||
}
|
||||
} else {
|
||||
console.log("当前使用代理网络运行脚本");
|
||||
await $.Multithreading("hqdl");
|
||||
console.log("\n-------- 用户信息 --------");
|
||||
await $.Multithreading("login");
|
||||
let _0x3420cb = $.cookie_list.filter(_0xf4b5f7 => _0xf4b5f7.login == true);
|
||||
if (_0x3420cb.length == 0) {
|
||||
console.log("Cookie格式错误 或 账号被禁封");
|
||||
return;
|
||||
} else console.log("\n-------- 任务列表 --------"), await $.Multithreading("user_task_list"), console.log("\n-------- 运行结果 --------");
|
||||
for (let _0xd4ad8a of $.cookie_list) {
|
||||
_0xd4ad8a.xinxi();
|
||||
}
|
||||
}
|
||||
})().catch(_0x5ce62d => {
|
||||
console.log(_0x5ce62d);
|
||||
}).finally(() => {});
|
||||
function _0x5a1661() {
|
||||
return new class {
|
||||
constructor() {
|
||||
this.cookie_list = [];
|
||||
this.message = "";
|
||||
this.CryptoJS = require("crypto-js");
|
||||
this.NodeRSA = require("node-rsa");
|
||||
this.request = require("request");
|
||||
this.Sha_Rsa = require("jsrsasign");
|
||||
}
|
||||
async ["Multithreading"](_0x59427b, _0x390014, _0x19e114) {
|
||||
let _0x214547 = [];
|
||||
!_0x19e114 && (_0x19e114 = 1);
|
||||
while (_0x19e114--) {
|
||||
for (let _0x5ada64 of $.cookie_list) {
|
||||
_0x214547.push(_0x5ada64[_0x59427b](_0x390014));
|
||||
}
|
||||
}
|
||||
await Promise.allSettled(_0x214547);
|
||||
}
|
||||
["ExamineCookie"]() {
|
||||
let _0xe3fd2 = process.env[VALY] || CK,
|
||||
_0x80080d = 0;
|
||||
if (_0xe3fd2) {
|
||||
for (let _0x8a8755 of _0x1b47ef) {
|
||||
if (_0xe3fd2.includes(_0x8a8755)) {
|
||||
this.splitor = _0x8a8755;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for (let _0x1945a8 of _0xe3fd2.split(this.splitor).filter(_0x175e48 => !!_0x175e48)) {
|
||||
$.cookie_list.push(new _0xb7dbde(_0x1945a8));
|
||||
}
|
||||
_0x80080d = $.cookie_list.length;
|
||||
} else {
|
||||
console.log("\n【" + NAME + "】:未填写变量: " + VALY);
|
||||
}
|
||||
return console.log("共找到" + _0x80080d + "个账号"), $.cookie_list;
|
||||
}
|
||||
["task"](_0x501030, _0xe5e338, _0x23a6e4, _0x26da24, _0x46dda4) {
|
||||
if (_0x501030 == "delete") _0x501030 = _0x501030.toUpperCase();else {
|
||||
_0x501030 = _0x501030;
|
||||
}
|
||||
return _0x501030 == "post" && (delete _0x23a6e4["content-type"], delete _0x23a6e4["Content-type"], delete _0x23a6e4["content-Type"], $.safeGet(_0x26da24) ? _0x23a6e4["Content-Type"] = "application/json;charset=UTF-8" : _0x23a6e4["Content-Type"] = "application/x-www-form-urlencoded", _0x26da24 && (_0x23a6e4["Content-Length"] = $.lengthInUtf8Bytes(_0x26da24))), _0x501030 == "get" && (delete _0x23a6e4["content-type"], delete _0x23a6e4["Content-type"], delete _0x23a6e4["content-Type"], delete _0x23a6e4["Content-Length"]), _0x23a6e4.Host = _0xe5e338.replace("//", "/").split("/")[1], new Promise(async _0x371980 => {
|
||||
if (_0x501030.indexOf("T") < 0) var _0x43be02 = {
|
||||
"url": _0xe5e338,
|
||||
"headers": _0x23a6e4,
|
||||
"body": _0x26da24,
|
||||
"proxy": "http://" + _0x46dda4
|
||||
};else var _0x43be02 = {
|
||||
"url": _0xe5e338,
|
||||
"headers": _0x23a6e4,
|
||||
"form": JSON.parse(_0x26da24),
|
||||
"proxy": "http://" + _0x46dda4
|
||||
};
|
||||
!_0x46dda4 && delete _0x43be02.proxy;
|
||||
this.request[_0x501030.toLowerCase()](_0x43be02, (_0x42f51a, _0x3c508c, _0x5bf7fb) => {
|
||||
try {
|
||||
_0x5bf7fb && _0x123507 == 1 && (console.log("================ 请求 ================"), console.log(_0x43be02), console.log("================ 返回 ================"), $.safeGet(_0x5bf7fb) ? console.log(JSON.parse(_0x5bf7fb)) : console.log(_0x5bf7fb));
|
||||
} catch (_0x577b62) {
|
||||
console.log(_0x577b62, _0xe5e338 + "\n" + _0x23a6e4);
|
||||
} finally {
|
||||
let _0x2bd6c4 = "";
|
||||
if (!_0x42f51a) {
|
||||
if ($.safeGet(_0x5bf7fb)) _0x2bd6c4 = JSON.parse(_0x5bf7fb);else _0x5bf7fb.indexOf("/") != -1 && _0x5bf7fb.indexOf("+") != -1 ? _0x2bd6c4 = $.decrypts(_0x5bf7fb) : _0x2bd6c4 = _0x5bf7fb;
|
||||
} else _0x2bd6c4 = _0xe5e338 + " API请求失败,请检查网络重试\n" + _0x42f51a;
|
||||
return _0x371980(_0x2bd6c4);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
["task2"](_0xf56364, _0x370cc3, _0x4e9003, _0x20afaa, _0x3aef67) {
|
||||
_0xf56364 == "delete" ? _0xf56364 = _0xf56364.toUpperCase() : _0xf56364 = _0xf56364;
|
||||
_0xf56364 == "post" && (delete _0x4e9003["content-type"], delete _0x4e9003["Content-type"], delete _0x4e9003["content-Type"], $.safeGet(_0x20afaa) ? _0x4e9003["Content-Type"] = "application/json;charset=UTF-8" : _0x4e9003["Content-Type"] = "application/x-www-form-urlencoded", _0x20afaa && (_0x4e9003["Content-Length"] = $.lengthInUtf8Bytes(_0x20afaa)));
|
||||
_0xf56364 == "get" && (delete _0x4e9003["content-type"], delete _0x4e9003["Content-type"], delete _0x4e9003["content-Type"], delete _0x4e9003["Content-Length"]);
|
||||
_0x4e9003.Host = _0x370cc3.replace("//", "/").split("/")[1];
|
||||
if (_0xf56364.indexOf("T") < 0) var _0x211884 = {
|
||||
"url": _0x370cc3,
|
||||
"headers": _0x4e9003,
|
||||
"body": _0x20afaa
|
||||
};else var _0x211884 = {
|
||||
"url": _0x370cc3,
|
||||
"headers": _0x4e9003,
|
||||
"form": JSON.parse(_0x20afaa)
|
||||
};
|
||||
return new Promise(async _0x1212a4 => {
|
||||
this.request[_0xf56364.toLowerCase()](_0x211884, (_0x1bb8c5, _0x5dc1c2, _0x3fb179) => {
|
||||
try {
|
||||
if (_0x3fb179) {
|
||||
_0x123507 == 1 && (console.log("================ 请求 ================"), console.log(_0x211884), console.log("================ 返回 ================"), $.safeGet(_0x3fb179) ? console.log(JSON.parse(_0x3fb179)) : console.log(_0x3fb179));
|
||||
}
|
||||
} catch (_0x4d512a) {
|
||||
console.log(_0x4d512a, _0x370cc3 + "\n" + _0x4e9003);
|
||||
} finally {
|
||||
let _0x3f4c58 = "";
|
||||
if (!_0x1bb8c5) {
|
||||
if ($.safeGet(_0x3fb179)) {
|
||||
_0x3f4c58 = _0x3fb179;
|
||||
} else {
|
||||
if (_0x3fb179.indexOf("/") != -1 && _0x3fb179.indexOf("+") != -1) _0x3f4c58 = $.decrypts(_0x3fb179);else {
|
||||
_0x3f4c58 = _0x3fb179;
|
||||
}
|
||||
}
|
||||
} else _0x3f4c58 = _0x370cc3 + " API请求失败,请检查网络重试\n" + _0x1bb8c5;
|
||||
return _0x1212a4(_0x3f4c58);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
["lengthInUtf8Bytes"](_0x4dc573) {
|
||||
let _0x10d9b6 = encodeURIComponent(_0x4dc573).match(/%[89ABab]/g);
|
||||
return _0x4dc573.length + (_0x10d9b6 ? _0x10d9b6.length : 0);
|
||||
}
|
||||
["randomArr"](_0x489317) {
|
||||
return _0x489317[parseInt(Math.random() * _0x489317.length, 10)];
|
||||
}
|
||||
["wait"](_0x2a66f2) {
|
||||
return new Promise(_0x54ad06 => setTimeout(_0x54ad06, _0x2a66f2));
|
||||
}
|
||||
["time"](_0x1b5821) {
|
||||
return _0x1b5821 == 10 ? Math.round(+new Date() / 1000) : +new Date();
|
||||
}
|
||||
["timenow"](_0x52581e) {
|
||||
let _0x211c6a = new Date();
|
||||
if (_0x52581e == undefined) {
|
||||
let _0x289934 = new Date(),
|
||||
_0x21d5a3 = _0x289934.getFullYear() + "-",
|
||||
_0x219b8a = (_0x289934.getMonth() + 1 < 10 ? "0" + (_0x289934.getMonth() + 1) : _0x289934.getMonth() + 1) + "-",
|
||||
_0x2c7c45 = _0x289934.getDate() + " ",
|
||||
_0x1746d8 = _0x289934.getHours() + ":",
|
||||
_0x5af394 = _0x289934.getMinutes() + ":",
|
||||
_0x426a84 = _0x289934.getSeconds() + 1 < 10 ? "0" + _0x289934.getSeconds() : _0x289934.getSeconds();
|
||||
return _0x21d5a3 + _0x219b8a + _0x2c7c45 + _0x1746d8 + _0x5af394 + _0x426a84;
|
||||
} else {
|
||||
if (_0x52581e == 0) return _0x211c6a.getFullYear();else {
|
||||
if (_0x52581e == 1) return _0x211c6a.getMonth() + 1 < 10 ? "0" + (_0x211c6a.getMonth() + 1) : _0x211c6a.getMonth() + 1;else {
|
||||
if (_0x52581e == 2) return _0x211c6a.getDate();else {
|
||||
if (_0x52581e == 3) {
|
||||
return _0x211c6a.getHours();
|
||||
} else {
|
||||
if (_0x52581e == 4) {
|
||||
return _0x211c6a.getMinutes();
|
||||
} else {
|
||||
if (_0x52581e == 5) return _0x211c6a.getSeconds() + 1 < 10 ? "0" + _0x211c6a.getSeconds() : _0x211c6a.getSeconds();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
["safeGet"](_0x58035f) {
|
||||
try {
|
||||
if (typeof JSON.parse(_0x58035f) == "object") {
|
||||
return true;
|
||||
}
|
||||
} catch (_0x1da0e1) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
["SJS"](_0x4b919c, _0x3394c8) {
|
||||
if (_0x3394c8 == 0) {
|
||||
let _0x912190 = "QWERTYUIOPASDFGHJKLZXCVBNM01234567890123456789",
|
||||
_0xe7cc4d = _0x912190.length,
|
||||
_0x27da32 = "";
|
||||
for (let _0x20f52c = 0; _0x20f52c < _0x4b919c; _0x20f52c++) {
|
||||
_0x27da32 += _0x912190.charAt(Math.floor(Math.random() * _0xe7cc4d));
|
||||
}
|
||||
return _0x27da32;
|
||||
} else {
|
||||
if (_0x3394c8 == 1) {
|
||||
let _0x1b1241 = "qwertyuiopasdfghjklzxcvbnm0123456789",
|
||||
_0x6f774 = _0x1b1241.length,
|
||||
_0x5cb043 = "";
|
||||
for (let _0x352bc8 = 0; _0x352bc8 < _0x4b919c; _0x352bc8++) {
|
||||
_0x5cb043 += _0x1b1241.charAt(Math.floor(Math.random() * _0x6f774));
|
||||
}
|
||||
return _0x5cb043;
|
||||
} else {
|
||||
let _0x425a1c = "0123456789",
|
||||
_0x3352d2 = _0x425a1c.length,
|
||||
_0xf36bd = "";
|
||||
for (let _0x21ee9f = 0; _0x21ee9f < _0x4b919c; _0x21ee9f++) {
|
||||
_0xf36bd += _0x425a1c.charAt(Math.floor(Math.random() * _0x3352d2));
|
||||
}
|
||||
return _0xf36bd;
|
||||
}
|
||||
}
|
||||
}
|
||||
["udid"](_0x12b656) {
|
||||
function _0x50d641() {
|
||||
return ((1 + Math.random()) * 65536 | 0).toString(16).substring(1);
|
||||
}
|
||||
let _0x294a84 = _0x50d641() + _0x50d641() + "-" + _0x50d641() + "-" + _0x50d641() + "-" + _0x50d641() + "-" + _0x50d641() + _0x50d641() + _0x50d641();
|
||||
return _0x12b656 == 0 ? _0x294a84.toUpperCase() : _0x294a84.toLowerCase();
|
||||
}
|
||||
["encodeUnicode"](_0x5c233f) {
|
||||
var _0x22dd4c = [];
|
||||
for (var _0x1ee173 = 0; _0x1ee173 < _0x5c233f.length; _0x1ee173++) {
|
||||
_0x22dd4c[_0x1ee173] = ("00" + _0x5c233f.charCodeAt(_0x1ee173).toString(16)).slice(-4);
|
||||
}
|
||||
return "\\u" + _0x22dd4c.join("\\u");
|
||||
}
|
||||
["decodeUnicode"](_0x5d7874) {
|
||||
return _0x5d7874 = _0x5d7874.replace(/\\u/g, "%u"), unescape(unescape(_0x5d7874));
|
||||
}
|
||||
["RT"](_0x467148, _0x81c592) {
|
||||
return Math.round(Math.random() * (_0x81c592 - _0x467148) + _0x467148);
|
||||
}
|
||||
["arrNull"](_0x557054) {
|
||||
var _0x28aa06 = _0x557054.filter(_0x5a20f1 => {
|
||||
return _0x5a20f1 && _0x5a20f1.trim();
|
||||
});
|
||||
return _0x28aa06;
|
||||
}
|
||||
["nowtime"]() {
|
||||
return new Date(new Date().getTime() + new Date().getTimezoneOffset() * 60 * 1000 + 8 * 60 * 60 * 1000);
|
||||
}
|
||||
["timecs"]() {
|
||||
let _0x1cc9a1 = $.nowtime();
|
||||
return JSON.stringify(_0x1cc9a1).indexOf(" ") >= 0 && (_0x1cc9a1 = _0x1cc9a1.replace(" ", "T")), new Date(_0x1cc9a1).getTime() - 8 * 60 * 60 * 1000;
|
||||
}
|
||||
["rtjson"](_0x102f0d, _0x4168e4, _0x5d82b1, _0x38ff8e) {
|
||||
return _0x38ff8e == 0 ? JSON.stringify(_0x102f0d.split(_0x4168e4).reduce((_0x401b9e, _0x32ba63) => {
|
||||
let _0x4dc1bd = _0x32ba63.split(_0x5d82b1);
|
||||
return _0x401b9e[_0x4dc1bd[0].trim()] = _0x4dc1bd[1].trim(), _0x401b9e;
|
||||
}, {})) : _0x102f0d.split(_0x4168e4).reduce((_0x428cc3, _0x50c191) => {
|
||||
let _0x571c01 = _0x50c191.split(_0x5d82b1);
|
||||
return _0x428cc3[_0x571c01[0].trim()] = _0x571c01[1].trim(), _0x428cc3;
|
||||
}, {});
|
||||
}
|
||||
["MD5Encrypt"](_0x1fd140, _0x17153a) {
|
||||
if (_0x1fd140 == 0) return this.CryptoJS.MD5(_0x17153a).toString().toLowerCase();else {
|
||||
if (_0x1fd140 == 1) {
|
||||
return this.CryptoJS.MD5(_0x17153a).toString().toUpperCase();
|
||||
} else {
|
||||
if (_0x1fd140 == 2) {
|
||||
return this.CryptoJS.MD5(_0x17153a).toString().substring(8, 24).toLowerCase();
|
||||
} else {
|
||||
if (_0x1fd140 == 3) return this.CryptoJS.MD5(_0x17153a).toString().substring(8, 24).toUpperCase();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
["SHA_Encrypt"](_0x3f80d3, _0x418745, _0x5a8e8a) {
|
||||
if (_0x3f80d3 == 0) {
|
||||
return this.CryptoJS[_0x418745](_0x5a8e8a).toString(this.CryptoJS.enc.Base64);
|
||||
} else return this.CryptoJS[_0x418745](_0x5a8e8a).toString();
|
||||
}
|
||||
["HmacSHA_Encrypt"](_0x29871a, _0x47c575, _0x34ea2f, _0xb9ee76) {
|
||||
return _0x29871a == 0 ? this.CryptoJS[_0x47c575](_0x34ea2f, _0xb9ee76).toString(this.CryptoJS.enc.Base64) : this.CryptoJS[_0x47c575](_0x34ea2f, _0xb9ee76).toString();
|
||||
}
|
||||
["Base64"](_0x4b8f6f, _0x4d0281) {
|
||||
if (_0x4b8f6f == 0) {
|
||||
return this.CryptoJS.enc.Base64.stringify(this.CryptoJS.enc.Utf8.parse(_0x4d0281));
|
||||
} else return this.CryptoJS.enc.Utf8.stringify(this.CryptoJS.enc.Base64.parse(_0x4d0281));
|
||||
}
|
||||
["DecryptCrypto"](_0x1c10d5, _0x523afd, _0x4f9d01, _0x557b38, _0x54742b, _0x2979c1, _0x216d2e) {
|
||||
if (_0x1c10d5 == 0) {
|
||||
const _0x312c17 = this.CryptoJS[_0x523afd].encrypt(this.CryptoJS.enc.Utf8.parse(_0x54742b), this.CryptoJS.enc.Utf8.parse(_0x2979c1), {
|
||||
"iv": this.CryptoJS.enc.Utf8.parse(_0x216d2e),
|
||||
"mode": this.CryptoJS.mode[_0x4f9d01],
|
||||
"padding": this.CryptoJS.pad[_0x557b38]
|
||||
});
|
||||
return _0x312c17.toString();
|
||||
} else {
|
||||
const _0xd83f01 = this.CryptoJS[_0x523afd].decrypt(_0x54742b, this.CryptoJS.enc.Utf8.parse(_0x2979c1), {
|
||||
"iv": this.CryptoJS.enc.Utf8.parse(_0x216d2e),
|
||||
"mode": this.CryptoJS.mode[_0x4f9d01],
|
||||
"padding": this.CryptoJS.pad[_0x557b38]
|
||||
});
|
||||
return _0xd83f01.toString(this.CryptoJS.enc.Utf8);
|
||||
}
|
||||
}
|
||||
["RSA"](_0x371397, _0x2413fe) {
|
||||
const _0x23417f = require("node-rsa");
|
||||
let _0xad78e6 = new _0x23417f("-----BEGIN PUBLIC KEY-----\n" + _0x2413fe + "\n-----END PUBLIC KEY-----");
|
||||
return _0xad78e6.setOptions({
|
||||
"encryptionScheme": "pkcs1"
|
||||
}), _0xad78e6.encrypt(_0x371397, "base64", "utf8");
|
||||
}
|
||||
["SHA_RSA"](_0x2a993a, _0x2b0378) {
|
||||
let _0x450908 = this.Sha_Rsa.KEYUTIL.getKey("-----BEGIN PRIVATE KEY-----\n" + $.getNewline(_0x2b0378, 76) + "\n-----END PRIVATE KEY-----"),
|
||||
_0x2df3cb = new this.Sha_Rsa.KJUR.crypto.Signature({
|
||||
"alg": "SHA256withRSA"
|
||||
});
|
||||
_0x2df3cb.init(_0x450908);
|
||||
_0x2df3cb.updateString(_0x2a993a);
|
||||
let _0x52fe2c = _0x2df3cb.sign(),
|
||||
_0x175154 = this.Sha_Rsa.hextob64u(_0x52fe2c);
|
||||
return _0x175154;
|
||||
}
|
||||
}();
|
||||
}
|
||||
631
脚本库/web版/账密/晚安问候语/2025-08-25_wanan_b25f6959.js
Normal file
631
脚本库/web版/账密/晚安问候语/2025-08-25_wanan_b25f6959.js
Normal file
File diff suppressed because one or more lines are too long
639
脚本库/web版/账密/望潮/2025-06-28_望潮_e2d725b7.js
Normal file
639
脚本库/web版/账密/望潮/2025-06-28_望潮_e2d725b7.js
Normal file
File diff suppressed because one or more lines are too long
351
脚本库/web版/账密/望潮py版/2025-06-28_望潮py版_7e3e4c49.py
Normal file
351
脚本库/web版/账密/望潮py版/2025-06-28_望潮py版_7e3e4c49.py
Normal file
@@ -0,0 +1,351 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%9C%9B%E6%BD%AEpy%E7%89%88.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%9C%9B%E6%BD%AEpy%E7%89%88.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 望潮py版.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: 7e3e4c490c027ab9d226e97579a969b25819e35cbec98bd2987e6fce14620f10
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
# --------------------------------注释区--------------------------------
|
||||
# 变量:wangchaoAccount ,格式:密码#账号,多号&分割
|
||||
# corn: 每天跑一次就行 22 10 * * *
|
||||
|
||||
# 有问题联系3288588344
|
||||
# 频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
#长期套餐大额流量电话卡办理地址:https://hk.yunhaoka.cn/#/pages/micro_store/index?agent_id=669709
|
||||
#望潮可改密码版(不要更新):https://www.123pan.com/s/TGXSVv-G9p8A.html
|
||||
|
||||
import hashlib
|
||||
import math
|
||||
import time
|
||||
import requests
|
||||
import datetime
|
||||
import os
|
||||
from urllib.parse import urlparse, parse_qs
|
||||
import random
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
import base64
|
||||
from requests.adapters import HTTPAdapter
|
||||
from urllib3.util.retry import Retry
|
||||
import urllib.parse
|
||||
debug=0
|
||||
def jm(password):
|
||||
public_key_base64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6XO7e9YeAOs+cFqwa7ETJ+WXizPqQeXv68i5vqw9pFREsrqiBTRcg7wB0RIp3rJkDpaeVJLsZqYm5TW7FWx/iOiXFc+zCPvaKZric2dXCw27EvlH5rq+zwIPDAJHGAfnn1nmQH7wR3PCatEIb8pz5GFlTHMlluw4ZYmnOwg+thwIDAQAB"
|
||||
public_key_der = base64.b64decode(public_key_base64)
|
||||
key = RSA.importKey(public_key_der)
|
||||
cipher = PKCS1_v1_5.new(key)
|
||||
password_bytes = password.encode('utf-8')
|
||||
encrypted_password = cipher.encrypt(password_bytes)
|
||||
encrypted_password_base64 = base64.b64encode(encrypted_password).decode('utf-8')
|
||||
url_encoded_data = urllib.parse.quote(encrypted_password_base64)
|
||||
return url_encoded_data
|
||||
|
||||
#生成设备号
|
||||
def generate_random_uuid():
|
||||
# 设备号其实可以写死,保险起见选择随机生成
|
||||
uuid_str = '00000000-{:04x}-{:04x}-0000-0000{:08x}'.format(
|
||||
random.randint(0, 0xfff) | 0x4000,
|
||||
random.randint(0, 0x3fff) | 0x8000,
|
||||
random.getrandbits(32)
|
||||
)
|
||||
return uuid_str
|
||||
|
||||
# 签名并获取认证码
|
||||
def sign(phone, password):
|
||||
url_encoded_data = jm(password)
|
||||
url = "https://passport.tmuyun.com/web/oauth/credential_auth"
|
||||
payload = f"client_id=10019&password={url_encoded_data}&phone_number={phone}"
|
||||
headers = {
|
||||
'User-Agent': "ANDROID;13;10019;6.0.2;1.0;null;MEIZU 20",
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Content-Type': "application/x-www-form-urlencoded",
|
||||
'Cache-Control': "no-cache",
|
||||
'X-SIGNATURE': "185d21c6f3e9ec4af43e0065079b8eb7f1bb054134481e57926fcc45e304b896",
|
||||
}
|
||||
|
||||
response = requests.post(url, data=payload, headers=headers)
|
||||
try:
|
||||
code = response.json()['data']['authorization_code']['code']
|
||||
url = "https://vapp.taizhou.com.cn/api/zbtxz/login"
|
||||
payload = f"check_token=&code={code}&token=&type=-1&union_id="
|
||||
headers = {
|
||||
'User-Agent': "6.0.2;{deviceid};Meizu MEIZU 20;Android;13;tencent;6.10.0",
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Content-Type': "application/x-www-form-urlencoded",
|
||||
'X-SESSION-ID': "66586b383f293a7173e4c8f4",
|
||||
'X-REQUEST-ID': "110c1987-1637-4f4e-953e-e35272bb891e",
|
||||
'X-TIMESTAMP': "1717072109065",
|
||||
'X-SIGNATURE': "a69f171e284594a5ecc4baa1b2299c99167532b9795122bae308f27592e94381",
|
||||
'X-TENANT-ID': "64",
|
||||
'Cache-Control': "no-cache"
|
||||
}
|
||||
response = requests.post(url, data=payload, headers=headers)
|
||||
message = response.json()['message']
|
||||
account_id = response.json()['data']['account']['id']
|
||||
session_id = response.json()['data']['session']['id']
|
||||
name = response.json()['data']['account']['nick_name']
|
||||
return message, account_id, session_id, name
|
||||
except Exception:
|
||||
print('出错啦!')
|
||||
return None, None, None, None
|
||||
|
||||
#生成验证码
|
||||
def generate_md5(input_str):
|
||||
md5_obj = hashlib.md5()
|
||||
input_str_encoded = input_str.encode('utf-8')
|
||||
md5_obj.update(input_str_encoded)
|
||||
return md5_obj.hexdigest()
|
||||
|
||||
#获取阅读的JSESSIONID
|
||||
def get_special_cookie():
|
||||
special_cookie_url = f'https://xmt.taizhou.com.cn/prod-api/user-read/app/login?id={account_id}&sessionId={session_id}&deviceId={deviceid}'
|
||||
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
}
|
||||
response = requests.get(special_cookie_url, headers=headers)
|
||||
if debug and response.status_code == 200:
|
||||
print('执行任务获取阅读jse')
|
||||
print('下面是访问的url\n',special_cookie_url)
|
||||
print('下面是访问的headers\n',headers)
|
||||
print('下面是返回的response\n',response.headers)
|
||||
if response.status_code == 200 and response.headers['Set-Cookie']:
|
||||
jsessionid1 =response.headers['Set-Cookie'].split(';')[0]+';'
|
||||
print('获取特殊cookie成功',jsessionid1)
|
||||
return response.headers['Set-Cookie']
|
||||
else:
|
||||
print('获取jsesesionid失败',response.headers)
|
||||
|
||||
#获取日期
|
||||
def get_current_date():
|
||||
now = datetime.datetime.now()
|
||||
year_str = str(now.year)
|
||||
month_str = f"0{now.month}" if now.month < 10 else str(now.month)
|
||||
day_str = f"0{now.day}" if now.day < 10 else str(now.day)
|
||||
print(f"当前日期{year_str}{month_str}{day_str}")
|
||||
return year_str + month_str + day_str
|
||||
|
||||
#获取阅读列表
|
||||
def fetch_article_list():
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'cookie': f'{special_cookie};'
|
||||
}
|
||||
url=f'https://xmt.taizhou.com.cn/prod-api/user-read/list/{get_current_date()}'
|
||||
response = requests.get(url, headers=headers)
|
||||
if debug and response.status_code == 200:
|
||||
print('执行任务获取阅读列表')
|
||||
print('下面是访问的url\n',url)
|
||||
print('下面是访问的headers\n',headers)
|
||||
print('下面是返回的response\n',response.headers)
|
||||
msg = response.json()['msg']
|
||||
print(msg)
|
||||
return response.json()
|
||||
|
||||
#阅读文章
|
||||
def mark_article_as_read(article_id,retry_count=3):
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward-v7-3/?gaze_control=01',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'cookie': f'{special_cookie}',
|
||||
}
|
||||
timestamp_str = str(math.floor(time.time() * 1000))
|
||||
signature = generate_md5('&&' + str(article_id) + '&&TlGFQAOlCIVxnKopQnW&&' + timestamp_str)
|
||||
url = f'https://xmt.taizhou.com.cn/prod-api/already-read/article?articid={article_id}×tamp={timestamp_str}&signature={signature}'
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
response = session.get(url, headers=headers, timeout=10)
|
||||
if response.status_code == 200:
|
||||
print(response.text)
|
||||
return
|
||||
else:
|
||||
print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
|
||||
# 登录并获取抽奖JSESSIONID
|
||||
def login(account_id, session_id, retry_count=3):
|
||||
base_url = 'https://srv-app.taizhou.com.cn'
|
||||
url = f'{base_url}/tzrb/user/loginWC'
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7'
|
||||
}
|
||||
params = {
|
||||
'accountId': account_id,
|
||||
'sessionId': session_id
|
||||
}
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
response = session.get(url, params=params, headers=headers, timeout=10)
|
||||
if response.status_code == 200:
|
||||
cookies_dict = response.cookies.get_dict()
|
||||
s_JSESSIONID = '; '.join([f'{k}={v}' for k, v in cookies_dict.items()])
|
||||
return s_JSESSIONID
|
||||
else:
|
||||
print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
return None
|
||||
|
||||
#抽奖
|
||||
def cj(jsessionid, retry_count=3):
|
||||
url = "https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/saveUpdate"
|
||||
payload = "activityId=67&sessionId=undefined&sig=undefined&token=undefined"
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Content-Length': '63',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Content-type': 'application/x-www-form-urlencoded',
|
||||
'Accept': '*/*',
|
||||
'Origin': 'https://srv-app.taizhou.com.cn',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-ra-1/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': f'{jsessionid}'
|
||||
}
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=4, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
response = session.post(url, data=payload, headers=headers, timeout=10)
|
||||
if response.status_code == 200:
|
||||
print(response.text)
|
||||
display_draw_results(jsessionid)
|
||||
return # 成功则退出函数
|
||||
else:
|
||||
print(f"POST 请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"POST 请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
#查询抽奖结果
|
||||
def display_draw_results(cookies):
|
||||
draw_result_headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 13; MEIZU 20 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-awsc-231023/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': f'{cookies}',
|
||||
}
|
||||
result_url = 'https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/pageList?pageSize=10&pageNum=1&activityId=67'
|
||||
result_data = requests.get(result_url, headers=draw_result_headers).json()["data"]["records"]
|
||||
for record in result_data:
|
||||
create_time_str = str(record["createTime"])
|
||||
award_name_str = str(record["awardName"])
|
||||
print(f"{create_time_str}---------{award_name_str}")
|
||||
|
||||
# 从环境变量中读取账户和密码
|
||||
accounts = os.getenv("wangchaoAccount")
|
||||
|
||||
if not accounts:
|
||||
print("❌未找到环境变量!")
|
||||
else:
|
||||
accounts_list = accounts.split("&")
|
||||
print(f"一共在环境变量中获取到 {len(accounts_list)} 个账号")
|
||||
for account in accounts_list:
|
||||
password, phone = account.split("#")
|
||||
message, account_id, session_id, name = sign(phone, password)
|
||||
deviceid = generate_random_uuid()
|
||||
if account_id and session_id:
|
||||
mobile = phone[:3] + "*" * 4 + phone[7:]
|
||||
print(f"账号 {mobile} 登录成功")
|
||||
special_cookie = get_special_cookie()
|
||||
print(f"账号 {mobile} 获取阅读列表")
|
||||
article_list = fetch_article_list()
|
||||
for article in article_list['data']['articleIsReadList']:
|
||||
article_title = article['title']
|
||||
if article['isRead'] == True :
|
||||
print(f"√文章{article_title}已读")
|
||||
time.sleep(0.5)
|
||||
continue
|
||||
else:
|
||||
time.sleep(random.uniform(3.5, 4.5))
|
||||
article_id = article['id']
|
||||
print(f"账号 {mobile} 阅读文章 {article_title}")
|
||||
mark_article_as_read(article_id)
|
||||
time.sleep(1)
|
||||
jsessionid = login(account_id, session_id)
|
||||
if jsessionid:
|
||||
print('去抽奖')
|
||||
cj(jsessionid)
|
||||
else:
|
||||
print(f"获取 JSESSIONID 失败")
|
||||
else:
|
||||
print(f"账号 {phone} 登录失败")
|
||||
|
||||
# 每个账号登录后延迟...
|
||||
print("等待 5 秒后继续下一个账号...")
|
||||
time.sleep(5)
|
||||
print("所有账号处理完毕")
|
||||
645
脚本库/web版/账密/望潮代理版/2025-06-28_望潮代理版_cfe0f499.py
Normal file
645
脚本库/web版/账密/望潮代理版/2025-06-28_望潮代理版_cfe0f499.py
Normal file
@@ -0,0 +1,645 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E6%9C%9B%E6%BD%AE%E4%BB%A3%E7%90%86%E7%89%88.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E6%9C%9B%E6%BD%AE%E4%BB%A3%E7%90%86%E7%89%88.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 望潮代理版.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: cfe0f499ae9b30709066b3ecac2125243fa8628a40e6e9a298b5664fb4d0d347
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
#有问题联系3288588344
|
||||
#频道:https://pd.qq.com/s/672fku8ge
|
||||
|
||||
#长期套餐大额流量电话卡办理地址:https://hk.yunhaoka.cn/#/pages/micro_store/index?agent_id=669709
|
||||
|
||||
|
||||
dlurl = '' # 记得加白
|
||||
# 代理的url 不写为不用代理
|
||||
|
||||
print("""
|
||||
二改的 谁的本我也不知道!!!
|
||||
修复抽奖!!!!!!!
|
||||
修复抽奖!!!!!!!
|
||||
修复抽奖!!!!!!!
|
||||
修复抽奖!!!!!!!
|
||||
修复抽奖!!!!!!!
|
||||
修复抽奖!!!!!!!
|
||||
修复抽奖!!!!!!!
|
||||
每天早上九点运行就行 cron:0 0 9 * * *
|
||||
注册后改密码
|
||||
环境变量wangchao 多号新建或&隔
|
||||
手机号密码
|
||||
奥特曼插件订阅:3288588344 QQ频道:98do10s246
|
||||
""")
|
||||
import hashlib
|
||||
import random
|
||||
import string
|
||||
import time
|
||||
import re
|
||||
import requests
|
||||
from os import environ, path
|
||||
from functools import partial
|
||||
from datetime import datetime
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
import base64
|
||||
import urllib.parse
|
||||
|
||||
|
||||
def load_send():
|
||||
global send
|
||||
cur_path = path.abspath(path.dirname(__file__))
|
||||
if path.exists(cur_path + "/SendNotify.py"):
|
||||
try:
|
||||
from SendNotify import send
|
||||
print("加载通知服务成功!")
|
||||
except Exception as e:
|
||||
send = False
|
||||
print(e)
|
||||
print(
|
||||
'''加载通知服务失败~\n请自行补全SendNotify依赖"''')
|
||||
else:
|
||||
send = False
|
||||
print(
|
||||
'''加载通知服务失败~\n请自行补全SendNotify依赖"''')
|
||||
|
||||
|
||||
def get_environ(key, default="", output=True):
|
||||
def no_read():
|
||||
if output:
|
||||
print(f"未填写环境变量 {key} 请添加")
|
||||
#exit(0)
|
||||
|
||||
return default
|
||||
|
||||
return environ.get(key) if environ.get(key) else no_read()
|
||||
|
||||
|
||||
def generate_random_string(length):
|
||||
letters_and_digits = string.ascii_lowercase + string.digits
|
||||
return ''.join(random.choice(letters_and_digits) for i in range(length))
|
||||
|
||||
|
||||
def pd1(ck):
|
||||
plaintext = ck
|
||||
public_key_base64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6XO7e9YeAOs+cFqwa7ETJ+WXizPqQeXv68i5vqw9pFREsrqiBTRcg7wB0RIp3rJkDpaeVJLsZqYm5TW7FWx/iOiXFc+zCPvaKZric2dXCw27EvlH5rq+zwIPDAJHGAfnn1nmQH7wR3PCatEIb8pz5GFlTHMlluw4ZYmnOwg+thwIDAQAB"
|
||||
|
||||
public_key = RSA.import_key(base64.b64decode(public_key_base64))
|
||||
cipher = PKCS1_v1_5.new(public_key)
|
||||
cipher_text = cipher.encrypt(plaintext.encode('utf-8'))
|
||||
encrypted_data_base64 = base64.b64encode(cipher_text).decode('utf-8')
|
||||
cipher_text = encrypted_data_base64
|
||||
url_safe_cipher_text = urllib.parse.quote(cipher_text, safe='')
|
||||
return url_safe_cipher_text
|
||||
|
||||
|
||||
class Ghdy:
|
||||
|
||||
def __init__(self, ck):
|
||||
url = "https://passport.tmuyun.com/web/oauth/credential_auth"
|
||||
url_d = 'https://vapp.taizhou.com.cn/api/zbtxz/login'
|
||||
m = pd1(ck[1])
|
||||
s = ck[0]
|
||||
head = {
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'ANDROID;9;10019;5.3.1;1.0;null;16T',
|
||||
'X-REQUEST-ID': '2120678b-84a7-40f1-8c92-df789980f821',
|
||||
'X-SIGNATURE': '06152b2984fd2b976e183cba4d588693c55b9ebc46814c59ac49b0e7bb63e946',
|
||||
'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
|
||||
'COOKIE': 'SESSION=YTVlNTllZmUtNjliNy00YjZiLWI0MjUtMmExZjFhYzRlYzQ5; Path=/; HttpOnly; SameSite=Lax',
|
||||
'Connection': 'Keep-Alive',
|
||||
'Accept-Encoding': 'gzip',
|
||||
'Content-Length': '232',
|
||||
}
|
||||
head_d = {
|
||||
"X-SESSION-ID": "6498052ebf15a44961f350e1",
|
||||
"X-REQUEST-ID": "7c549049-a97b-4acb-96c6-3e2db706667d",
|
||||
"X-TIMESTAMP": "1687685127765",
|
||||
"X-SIGNATURE": "50e1530a02086535f5f0c2c58e7bbdea521468d3e5a2874541456da7755bbd6e",
|
||||
"X-TENANT-ID": "64",
|
||||
"User-Agent": "5.3.1;00000000-699e-76bc-ffff-ffff9e3d172a;Meizu 16T;Android;9;huawei",
|
||||
"Cache-Control": "no-cache",
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"Content-Length": "67",
|
||||
"Host": "vapp.taizhou.com.cn",
|
||||
"Connection": "Keep-Alive",
|
||||
"Accept-Encoding": "gzip"
|
||||
}
|
||||
data = f'client_id=10019&password={m}&phone_number={s}'
|
||||
# print(data)
|
||||
|
||||
r = requests.post(url, headers=head, data=data)
|
||||
time.sleep(2)
|
||||
if r.json()['code'] == 0:
|
||||
yzm = r.json()['data']['authorization_code']['code']
|
||||
data_d = f'check_token=&code={yzm}&token=&type=-1&union_id='
|
||||
# print(data_d)
|
||||
r_d = requests.post(url=url_d, headers=head_d, data=data_d)
|
||||
if r_d.json()['code'] == 0:
|
||||
sessid = r_d.json()['data']['session']['id']
|
||||
accid = r_d.json()['data']['account']['id']
|
||||
else:
|
||||
print('账号或密码错误:具体报错', r_d.text)
|
||||
|
||||
elif r.json()['code'] == 100:
|
||||
print(r.json()['message'])
|
||||
return
|
||||
else:
|
||||
print('未知错误具体看响应:', r.text)
|
||||
return
|
||||
|
||||
self.account = accid
|
||||
self.session = sessid
|
||||
self.id_dict = {}
|
||||
self.JSESSIONID = ''
|
||||
self.s_JSESSIONID = ''
|
||||
self.msg = ''
|
||||
|
||||
def login(self):
|
||||
try:
|
||||
time.sleep(0.5)
|
||||
url = "https://xmt.taizhou.com.cn/prod-api/user-read/app/login"
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward/',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
}
|
||||
params = {
|
||||
'id': self.account,
|
||||
'sessionId': self.session,
|
||||
'deviceId': '00000000-699e-76bc-ffff-ffff9e3d172a'
|
||||
}
|
||||
r = requests.get(url, params=params, headers=headers)
|
||||
if '成功' in r.json()['msg']:
|
||||
# xx = f'🚀登录成功:{r.json()["data"]["nickName"]}'
|
||||
# self.msg += xx + '\n'
|
||||
# print(xx)
|
||||
jsessionid = r.cookies
|
||||
cookies_dict = jsessionid.get_dict()
|
||||
for k, y in cookies_dict.items():
|
||||
self.JSESSIONID = f'{k}={y}'
|
||||
elif '失败' in r.json()['msg']:
|
||||
xx = f'⛔️{r.json()["msg"]}'
|
||||
self.msg += xx + '\n'
|
||||
print(xx)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def get_id(self):
|
||||
try:
|
||||
today = datetime.today().strftime('%Y%m%d')
|
||||
url = f'https://xmt.taizhou.com.cn/prod-api/user-read/list/{today}'
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward/',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': self.JSESSIONID,
|
||||
}
|
||||
|
||||
r = requests.get(url, headers=headers)
|
||||
if '成功' in r.json()['msg']:
|
||||
r_list = r.json()['data']['articleIsReadList']
|
||||
id_dict = {}
|
||||
for i in r_list:
|
||||
id_dict[i['id']] = i['newsId']
|
||||
self.id_dict = id_dict
|
||||
if self.id_dict:
|
||||
xx = "✅文章加载成功"
|
||||
self.msg += xx + '\n'
|
||||
print(xx)
|
||||
elif '重新' in r.json()['msg']:
|
||||
xx = f'⛔️文章加载失败:{r.json()["msg"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
|
||||
else:
|
||||
xx = f'⛔️请求异常:{r.json()["msg"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def look(self):
|
||||
try:
|
||||
for idd, new_id in self.id_dict.items():
|
||||
a8 = generate_random_string(8)
|
||||
b4 = generate_random_string(4)
|
||||
c4 = generate_random_string(4)
|
||||
d4 = generate_random_string(4)
|
||||
e12 = generate_random_string(12)
|
||||
request = f'{a8}-{b4}-{c4}-{d4}-{e12}'
|
||||
current_timestamp = int(time.time() * 1000)
|
||||
sha = f'/api/article/detail&&{self.session}&&{request}&&{current_timestamp}&&FR*r!isE5W&&64'
|
||||
sha256 = hashlib.sha256()
|
||||
sha256.update(sha.encode('utf-8'))
|
||||
signature = sha256.hexdigest()
|
||||
url = 'https://vapp.taizhou.com.cn/api/article/detail'
|
||||
headers = {
|
||||
'X-SESSION-ID': self.session,
|
||||
'X-REQUEST-ID': f'{request}',
|
||||
'X-TIMESTAMP': f'{current_timestamp}',
|
||||
'X-SIGNATURE': f'{signature}',
|
||||
'X-TENANT-ID': '64',
|
||||
'User-Agent': '5.3.1;00000000-699e-0680-ffff-ffffc24c26a8;Xiaomi Redmi Note 8 Pro;Android;11;tencent',
|
||||
'X-ACCOUNT-ID': self.session,
|
||||
'Cache-Control': 'no-cache',
|
||||
'Host': 'vapp.taizhou.com.cn',
|
||||
'Connection': 'Keep-Alive',
|
||||
'Accept-Encoding': 'gzip',
|
||||
}
|
||||
|
||||
params = {
|
||||
'id': new_id,
|
||||
}
|
||||
r = requests.get(url, params=params, headers=headers)
|
||||
if r.json()['message'] == 'success':
|
||||
xx = f'✅开始浏览《{r.json()["data"]["article"]["list_title"]}》'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
time.sleep(3)
|
||||
current_timestamp = int(time.time() * 1000)
|
||||
sha = f'&&{idd}&&TlGFQAOlCIVxnKopQnW&&{current_timestamp}'
|
||||
md5 = hashlib.md5()
|
||||
md5.update(sha.encode('utf-8'))
|
||||
signature = md5.hexdigest()
|
||||
headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': self.JSESSIONID,
|
||||
}
|
||||
params = {
|
||||
'articid': idd,
|
||||
'timestamp': current_timestamp,
|
||||
'signature': signature,
|
||||
}
|
||||
r = requests.get(
|
||||
'https://xmt.taizhou.com.cn/prod-api/already-read/article',
|
||||
params=params,
|
||||
headers=headers,
|
||||
)
|
||||
if '成功' in r.json()['msg']:
|
||||
xx = f'✅浏览完成'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
elif '重新' in r.json()['msg']:
|
||||
xx = f'⛔️浏览失败:{r.json()["msg"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
else:
|
||||
xx = f'⛔️浏览异常:{r.json()["msg"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
elif '不存在' in r.json()['msg']:
|
||||
xx = f'⛔️浏览失败:{r.json()["msg"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
|
||||
else:
|
||||
xx = f'⛔️浏览异常:{r.json()["msg"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
|
||||
c_headers = {
|
||||
'Host': 'xmt.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://xmt.taizhou.com.cn/readingAward/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': self.JSESSIONID,
|
||||
}
|
||||
today = datetime.today().strftime('%Y%m%d')
|
||||
c_r = requests.get(f'https://xmt.taizhou.com.cn/prod-api/user-read-count/count/{today}', headers=c_headers)
|
||||
if '成功' in c_r.json()['msg']:
|
||||
xx = f'✅全部浏览完成,准备开始抽红包吧!'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
else:
|
||||
xx = c_r.json()['msg']
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
def chou(self):
|
||||
try:
|
||||
c_headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': '',
|
||||
}
|
||||
c_params = {
|
||||
'accountId': self.account,
|
||||
'sessionId': self.session,
|
||||
}
|
||||
c_r = requests.get('https://srv-app.taizhou.com.cn/tzrb/user/loginWC', params=c_params, headers=c_headers)
|
||||
jsessionid = c_r.cookies
|
||||
cookies_dict = jsessionid.get_dict()
|
||||
for k, y in cookies_dict.items():
|
||||
JSESSIONID = f'{k}={y}'
|
||||
self.s_JSESSIONID = JSESSIONID
|
||||
url = 'https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/save'
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Content-Length': '13',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Content-type': 'application/x-www-form-urlencoded',
|
||||
'Accept': '*/*',
|
||||
'Origin': 'https://srv-app.taizhou.com.cn',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': self.s_JSESSIONID,
|
||||
}
|
||||
data = {
|
||||
'activityId': '67',
|
||||
}
|
||||
r = requests.post(url, headers=headers, data=data)
|
||||
if '成功' in r.json()['message']:
|
||||
xx = f'✅抽奖成功'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
elif '明天' in r.json()['message']:
|
||||
xx = f'❌{r.json()["message"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
else:
|
||||
print(r.text)
|
||||
xx = f'⛔️{r.json()["message"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
jl_headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': self.s_JSESSIONID,
|
||||
}
|
||||
jl_params = {
|
||||
'pageSize': '10',
|
||||
'pageNum': '1',
|
||||
'activityId': '67',
|
||||
}
|
||||
jl_r = requests.get('https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/pageList', params=jl_params,
|
||||
headers=jl_headers)
|
||||
if '成功' in jl_r.json()['message']:
|
||||
jl_list = jl_r.json()['data']['records']
|
||||
xx = '🎁抽奖记录🎁'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
for i in jl_list:
|
||||
xx = f'⏰{i["createTime"]}: {i["awardName"]}'
|
||||
print(xx)
|
||||
self.msg += xx + '\n'
|
||||
send("🔔原神启动", self.msg)
|
||||
else:
|
||||
send("🔔原神启动", self.msg)
|
||||
except Exception as e:
|
||||
print(e)
|
||||
|
||||
|
||||
def choujiang(account, dlurl):
|
||||
import os
|
||||
import requests
|
||||
from requests.adapters import HTTPAdapter
|
||||
from requests.packages.urllib3.util.retry import Retry
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
import base64
|
||||
import urllib.parse
|
||||
import time
|
||||
def dl():
|
||||
response = requests.get(dlurl)
|
||||
print(response.text)
|
||||
proxies = {
|
||||
'http': f'http://{response.text}',
|
||||
'https': f'http://{response.text}',
|
||||
}
|
||||
return proxies
|
||||
|
||||
if dlurl != '':
|
||||
try:
|
||||
proxies = dl()
|
||||
except Exception:
|
||||
dlurl = ''
|
||||
|
||||
# 加密密码
|
||||
def jm(password):
|
||||
public_key_base64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD6XO7e9YeAOs+cFqwa7ETJ+WXizPqQeXv68i5vqw9pFREsrqiBTRcg7wB0RIp3rJkDpaeVJLsZqYm5TW7FWx/iOiXFc+zCPvaKZric2dXCw27EvlH5rq+zwIPDAJHGAfnn1nmQH7wR3PCatEIb8pz5GFlTHMlluw4ZYmnOwg+thwIDAQAB"
|
||||
public_key_der = base64.b64decode(public_key_base64)
|
||||
key = RSA.importKey(public_key_der)
|
||||
cipher = PKCS1_v1_5.new(key)
|
||||
password_bytes = password.encode('utf-8')
|
||||
encrypted_password = cipher.encrypt(password_bytes)
|
||||
encrypted_password_base64 = base64.b64encode(encrypted_password).decode('utf-8')
|
||||
url_encoded_data = urllib.parse.quote(encrypted_password_base64)
|
||||
return url_encoded_data
|
||||
|
||||
# 签名并获取认证码
|
||||
def sign(phone, password):
|
||||
url_encoded_data = jm(password)
|
||||
url = "https://passport.tmuyun.com/web/oauth/credential_auth"
|
||||
payload = f"client_id=10019&password={url_encoded_data}&phone_number={phone}"
|
||||
headers = {
|
||||
'User-Agent': "ANDROID;13;10019;6.0.2;1.0;null;MEIZU 20",
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Content-Type': "application/x-www-form-urlencoded",
|
||||
'Cache-Control': "no-cache",
|
||||
'X-SIGNATURE': "185d21c6f3e9ec4af43e0065079b8eb7f1bb054134481e57926fcc45e304b896",
|
||||
}
|
||||
|
||||
response = requests.post(url, data=payload, headers=headers)
|
||||
try:
|
||||
code = response.json()['data']['authorization_code']['code']
|
||||
url = "https://vapp.taizhou.com.cn/api/zbtxz/login"
|
||||
payload = f"check_token=&code={code}&token=&type=-1&union_id="
|
||||
headers = {
|
||||
'User-Agent': "6.0.2;00000000-67e9-2a58-0000-000010724a65;Meizu MEIZU 20;Android;13;tencent;6.10.0",
|
||||
'Connection': "Keep-Alive",
|
||||
'Accept-Encoding': "gzip",
|
||||
'Content-Type': "application/x-www-form-urlencoded",
|
||||
'X-SESSION-ID': "66586b383f293a7173e4c8f4",
|
||||
'X-REQUEST-ID': "110c1987-1637-4f4e-953e-e35272bb891e",
|
||||
'X-TIMESTAMP': "1717072109065",
|
||||
'X-SIGNATURE': "a69f171e284594a5ecc4baa1b2299c99167532b9795122bae308f27592e94381",
|
||||
'X-TENANT-ID': "64",
|
||||
'Cache-Control': "no-cache"
|
||||
}
|
||||
if dlurl == '':
|
||||
response = requests.post(url, data=payload, headers=headers)
|
||||
else:
|
||||
response = requests.post(url, data=payload, headers=headers, proxies=proxies)
|
||||
|
||||
message = response.json()['message']
|
||||
account_id = response.json()['data']['account']['id']
|
||||
session_id = response.json()['data']['session']['id']
|
||||
name = response.json()['data']['account']['nick_name']
|
||||
return message, account_id, session_id, name
|
||||
except Exception:
|
||||
print('出错啦!')
|
||||
return None, None, None, None
|
||||
|
||||
# 登录并获取 JSESSIONID
|
||||
def login(account_id, session_id, retry_count=3):
|
||||
base_url = 'https://srv-app.taizhou.com.cn'
|
||||
url = f'{base_url}/tzrb/user/loginWC'
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Pragma': 'no-cache',
|
||||
'Cache-Control': 'no-cache',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 11; Redmi Note 8 Pro Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/87.0.4280.141 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;5.3.1;native_app',
|
||||
'Accept': '*/*',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7'
|
||||
}
|
||||
params = {
|
||||
'accountId': account_id,
|
||||
'sessionId': session_id
|
||||
}
|
||||
|
||||
# 创建一个包含重试策略的会话
|
||||
session = requests.Session()
|
||||
retries = Retry(total=5, backoff_factor=1, status_forcelist=[502, 503, 504])
|
||||
session.mount('https://', HTTPAdapter(max_retries=retries))
|
||||
|
||||
for attempt in range(retry_count):
|
||||
try:
|
||||
if dlurl == '':
|
||||
response = session.get(url, params=params, headers=headers, timeout=10)
|
||||
else:
|
||||
response = session.get(url, params=params, headers=headers, timeout=10, proxies=proxies)
|
||||
if response.status_code == 200:
|
||||
cookies_dict = response.cookies.get_dict()
|
||||
s_JSESSIONID = '; '.join([f'{k}={v}' for k, v in cookies_dict.items()])
|
||||
return s_JSESSIONID
|
||||
else:
|
||||
print(f"请求失败,状态码: {response.status_code}, 响应内容: {response.text}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"请求失败 (尝试 {attempt + 1}/{retry_count}): {e}")
|
||||
time.sleep(2) # 在重试前增加延迟
|
||||
|
||||
return None
|
||||
|
||||
def cj(jsessionid, retry_count=3):
|
||||
url = "https://srv-app.taizhou.com.cn/tzrb/userAwardRecordUpgrade/saveUpdate"
|
||||
payload = "activityId=67&sessionId=undefined&sig=undefined&token=undefined"
|
||||
headers = {
|
||||
'Host': 'srv-app.taizhou.com.cn',
|
||||
'Connection': 'keep-alive',
|
||||
'Content-Length': '63',
|
||||
'User-Agent': 'Mozilla/5.0 (Linux; Android 10; MI 8 Build/QKQ1.190828.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36;xsb_wangchao;xsb_wangchao;6.0.2;native_app;6.10.0',
|
||||
'Content-type': 'application/x-www-form-urlencoded',
|
||||
'Accept': '*/*',
|
||||
'Origin': 'https://srv-app.taizhou.com.cn',
|
||||
'X-Requested-With': 'com.shangc.tiennews.taizhou',
|
||||
'Sec-Fetch-Site': 'same-origin',
|
||||
'Sec-Fetch-Mode': 'cors',
|
||||
'Sec-Fetch-Dest': 'empty',
|
||||
'Referer': 'https://srv-app.taizhou.com.cn/luckdraw-ra-1/',
|
||||
'Accept-Encoding': 'gzip, deflate',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'Cookie': f'{jsessionid}'
|
||||
}
|
||||
if dlurl == '':
|
||||
response = requests.post(url, data=payload, headers=headers, timeout=10)
|
||||
else:
|
||||
response = requests.post(url, data=payload, headers=headers, timeout=10, proxies=proxies)
|
||||
print(response.text)
|
||||
|
||||
phone, password = account.split("#")
|
||||
message, account_id, session_id, name = sign(phone, password)
|
||||
if account_id and session_id:
|
||||
mobile = phone[:3] + "*" * 4 + phone[7:]
|
||||
jsessionid = login(account_id, session_id)
|
||||
if jsessionid:
|
||||
cj(jsessionid)
|
||||
else:
|
||||
print(f"获取 JSESSIONID 失败")
|
||||
else:
|
||||
print(f"账号 {phone} 登录失败")
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
print = partial(print, flush=True)
|
||||
token = get_environ("wangchao", '17633912479#lxg021002')
|
||||
cks = token.split("&")
|
||||
print("🔔检测到{}个ck记录\n🔔".format(len(cks)))
|
||||
for ck_all in cks:
|
||||
ck = ck_all.split("#")
|
||||
run = Ghdy(ck)
|
||||
print()
|
||||
run.login()
|
||||
run.get_id()
|
||||
run.look()
|
||||
choujiang(ck_all, dlurl)
|
||||
621
脚本库/web版/账密/模板_修改这里/2025-08-25_TEMPLATE_ql_b4f0835b.js
Normal file
621
脚本库/web版/账密/模板_修改这里/2025-08-25_TEMPLATE_ql_b4f0835b.js
Normal file
File diff suppressed because one or more lines are too long
635
脚本库/web版/账密/每天60秒读懂世界/2025-08-25_day60s_5a7eddd6.js
Normal file
635
脚本库/web版/账密/每天60秒读懂世界/2025-08-25_day60s_5a7eddd6.js
Normal file
File diff suppressed because one or more lines are too long
527
脚本库/web版/账密/游侠网/2025-06-28_游侠网_f8654a12.js
Normal file
527
脚本库/web版/账密/游侠网/2025-06-28_游侠网_f8654a12.js
Normal file
File diff suppressed because one or more lines are too long
460
脚本库/web版/账密/熊猫网络/2025-08-25_xmdl_0cddb80d.js
Normal file
460
脚本库/web版/账密/熊猫网络/2025-08-25_xmdl_0cddb80d.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/王者荣耀英雄介绍/2025-08-25_wangzhe_92cce1aa.js
Normal file
630
脚本库/web版/账密/王者荣耀英雄介绍/2025-08-25_wangzhe_92cce1aa.js
Normal file
File diff suppressed because one or more lines are too long
2239
脚本库/web版/账密/电信营业厅并发/2025-06-28_电信营业厅任务_f76f6ee3.js
Normal file
2239
脚本库/web版/账密/电信营业厅并发/2025-06-28_电信营业厅任务_f76f6ee3.js
Normal file
File diff suppressed because it is too large
Load Diff
520
脚本库/web版/账密/电信金豆换话费/2025-06-28_电信金豆换话费_7d539458.py
Normal file
520
脚本库/web版/账密/电信金豆换话费/2025-06-28_电信金豆换话费_7d539458.py
Normal file
@@ -0,0 +1,520 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%94%B5%E4%BF%A1%E9%87%91%E8%B1%86%E6%8D%A2%E8%AF%9D%E8%B4%B9.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%94%B5%E4%BF%A1%E9%87%91%E8%B1%86%E6%8D%A2%E8%AF%9D%E8%B4%B9.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 电信金豆换话费.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: 7d5394589ec768e19394fab8d9bc08c50942d0c9889f7899e01b59f1ed4651be
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
#TL库:https://github.com/3288588344/toulu.git
|
||||
#tg频道:https://t.me/TLtoulu
|
||||
#QQ频道:https://pd.qq.com/s/672fku8ge
|
||||
#微信机器人:kckl6688
|
||||
#公众号:哆啦A梦的藏宝箱
|
||||
|
||||
import requests
|
||||
import re
|
||||
import time
|
||||
import json
|
||||
import random
|
||||
import datetime
|
||||
import base64
|
||||
import threading
|
||||
import ssl
|
||||
import execjs
|
||||
import os
|
||||
import sys
|
||||
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
from Crypto.PublicKey import RSA
|
||||
from Crypto.Cipher import PKCS1_v1_5
|
||||
from Crypto.Cipher import DES3
|
||||
from Crypto.Util.Padding import pad, unpad
|
||||
from Crypto.Util.strxor import strxor
|
||||
from Crypto.Cipher import AES
|
||||
from http import cookiejar # Python 2: import cookielib as cookiejar
|
||||
from requests.adapters import HTTPAdapter
|
||||
from requests.packages.urllib3.util.ssl_ import create_urllib3_context
|
||||
|
||||
|
||||
class BlockAll(cookiejar.CookiePolicy):
|
||||
return_ok = set_ok = domain_return_ok = path_return_ok = lambda self, *args, **kwargs: False
|
||||
netscape = True
|
||||
rfc2965 = hide_cookie2 = False
|
||||
|
||||
def printn(m):
|
||||
print(f'\n{m}')
|
||||
ORIGIN_CIPHERS = ('DEFAULT@SECLEVEL=1')
|
||||
|
||||
ip_list = []
|
||||
class DESAdapter(HTTPAdapter):
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""
|
||||
A TransportAdapter that re-enables 3DES support in Requests.
|
||||
"""
|
||||
CIPHERS = ORIGIN_CIPHERS.split(':')
|
||||
random.shuffle(CIPHERS)
|
||||
CIPHERS = ':'.join(CIPHERS)
|
||||
self.CIPHERS = CIPHERS + ':!aNULL:!eNULL:!MD5'
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def init_poolmanager(self, *args, **kwargs):
|
||||
context = create_urllib3_context(ciphers=self.CIPHERS)
|
||||
kwargs['ssl_context'] = context
|
||||
return super(DESAdapter, self).init_poolmanager(*args, **kwargs)
|
||||
|
||||
def proxy_manager_for(self, *args, **kwargs):
|
||||
context = create_urllib3_context(ciphers=self.CIPHERS)
|
||||
kwargs['ssl_context'] = context
|
||||
return super(DESAdapter, self).proxy_manager_for(*args, **kwargs)
|
||||
|
||||
|
||||
requests.packages.urllib3.disable_warnings()
|
||||
ssl_context = ssl.create_default_context()
|
||||
ssl_context.check_hostname = False
|
||||
ssl_context.verify_mode = ssl.CERT_NONE
|
||||
ssl_context.set_ciphers('DEFAULT@SECLEVEL=0')
|
||||
ss = requests.session()
|
||||
ss.ssl=ssl_context
|
||||
ss.headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36","Referer":"https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"}
|
||||
ss.mount('https://', DESAdapter())
|
||||
yc = 0.1
|
||||
wt = 0
|
||||
kswt = -3
|
||||
yf = datetime.datetime.now().strftime("%Y%m")
|
||||
|
||||
|
||||
jp = {"9":{},"12":{},"13":{},"23":{}}
|
||||
|
||||
|
||||
try:
|
||||
with open('电信金豆换话费.log') as fr:
|
||||
dhjl = json.load(fr)
|
||||
except:
|
||||
dhjl = {}
|
||||
if yf not in dhjl:
|
||||
dhjl[yf] = {}
|
||||
|
||||
|
||||
|
||||
|
||||
wxp={}
|
||||
errcode = {
|
||||
"0":"兑换成功",
|
||||
"412":"兑换次数已达上限",
|
||||
"413":"商品已兑完",
|
||||
"420":"未知错误",
|
||||
"410":"该活动已失效~",
|
||||
"Y0001":"当前等级不足,去升级兑当前话费",
|
||||
"Y0002":"使用翼相连网络600分钟或连接并拓展网络500分钟可兑换此奖品",
|
||||
"Y0003":"使用翼相连共享流量400M或共享WIFI:2GB可兑换此奖品",
|
||||
"Y0004":"使用翼相连共享流量2GB可兑换此奖品",
|
||||
"Y0005":"当前等级不足,去升级兑当前话费",
|
||||
"E0001":"您的网龄不足10年,暂不能兑换"
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#加密参数
|
||||
key = b'1234567`90koiuyhgtfrdews'
|
||||
iv = 8 * b'\0'
|
||||
|
||||
public_key_b64 = '''-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDBkLT15ThVgz6/NOl6s8GNPofdWzWbCkWnkaAm7O2LjkM1H7dMvzkiqdxU02jamGRHLX/ZNMCXHnPcW/sDhiFCBN18qFvy8g6VYb9QtroI09e176s+ZCtiv7hbin2cCTj99iUpnEloZm19lwHyo69u5UMiPMpq0/XKBO8lYhN/gwIDAQAB
|
||||
-----END PUBLIC KEY-----'''
|
||||
|
||||
public_key_data = '''-----BEGIN PUBLIC KEY-----
|
||||
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+ugG5A8cZ3FqUKDwM57GM4io6JGcStivT8UdGt67PEOihLZTw3P7371+N47PrmsCpnTRzbTgcupKtUv8ImZalYk65dU8rjC/ridwhw9ffW2LBwvkEnDkkKKRi2liWIItDftJVBiWOh17o6gfbPoNrWORcAdcbpk2L+udld5kZNwIDAQAB
|
||||
-----END PUBLIC KEY-----'''
|
||||
|
||||
|
||||
def t(h):
|
||||
date = datetime.datetime.now()
|
||||
date_zero = datetime.datetime.now().replace(year=date.year, month=date.month, day=date.day, hour=h, minute=59, second=59)
|
||||
date_zero_time = int(time.mktime(date_zero.timetuple()))
|
||||
return date_zero_time
|
||||
|
||||
|
||||
|
||||
def encrypt(text):
|
||||
cipher = DES3.new(key, DES3.MODE_CBC, iv)
|
||||
ciphertext = cipher.encrypt(pad(text.encode(), DES3.block_size))
|
||||
return ciphertext.hex()
|
||||
|
||||
def decrypt(text):
|
||||
ciphertext = bytes.fromhex(text)
|
||||
cipher = DES3.new(key, DES3.MODE_CBC, iv)
|
||||
plaintext = unpad(cipher.decrypt(ciphertext), DES3.block_size)
|
||||
return plaintext.decode()
|
||||
|
||||
|
||||
|
||||
def b64(plaintext):
|
||||
public_key = RSA.import_key(public_key_b64)
|
||||
cipher = PKCS1_v1_5.new(public_key)
|
||||
ciphertext = cipher.encrypt(plaintext.encode())
|
||||
return base64.b64encode(ciphertext).decode()
|
||||
|
||||
def encrypt_para(plaintext):
|
||||
public_key = RSA.import_key(public_key_data)
|
||||
cipher = PKCS1_v1_5.new(public_key)
|
||||
ciphertext = cipher.encrypt(plaintext.encode())
|
||||
return ciphertext.hex()
|
||||
|
||||
|
||||
def encode_phone(text):
|
||||
encoded_chars = []
|
||||
for char in text:
|
||||
encoded_chars.append(chr(ord(char) + 2))
|
||||
return ''.join(encoded_chars)
|
||||
|
||||
def ophone(t):
|
||||
key = b'34d7cb0bcdf07523'
|
||||
utf8_key = key.decode('utf-8')
|
||||
utf8_t = t.encode('utf-8')
|
||||
cipher = AES.new(key, AES.MODE_ECB)
|
||||
ciphertext = cipher.encrypt(pad(utf8_t, AES.block_size))
|
||||
return ciphertext.hex()
|
||||
|
||||
def send(uid,content):
|
||||
r = requests.post('https://wxpusher.zjiecode.com/api/send/message',json={"appToken":"AT_3hr0wdZn5QzPNBbpTHFXawoDIsSUmPkN","content":content,"contentType":1,"uids":[uid]}).json()
|
||||
return r
|
||||
|
||||
|
||||
def userLoginNormal(phone,password):
|
||||
alphabet = 'abcdef0123456789'
|
||||
uuid = [''.join(random.sample(alphabet, 8)),''.join(random.sample(alphabet, 4)),'4'+''.join(random.sample(alphabet, 3)),''.join(random.sample(alphabet, 4)),''.join(random.sample(alphabet, 12))]
|
||||
timestamp=datetime.datetime.now().strftime("%Y%m%d%H%M%S")
|
||||
loginAuthCipherAsymmertric = 'iPhone 14 15.4.' + uuid[0] + uuid[1] + phone + timestamp + password[:6] + '0$$$0.'
|
||||
|
||||
r = ss.post('https://appgologin.189.cn:9031/login/client/userLoginNormal',json={"headerInfos": {"code": "userLoginNormal", "timestamp": timestamp, "broadAccount": "", "broadToken": "", "clientType": "#9.6.1#channel50#iPhone 14 Pro Max#", "shopId": "20002", "source": "110003", "sourcePassword": "Sid98s", "token": "", "userLoginName": phone}, "content": {"attach": "test", "fieldData": {"loginType": "4", "accountType": "", "loginAuthCipherAsymmertric": b64(loginAuthCipherAsymmertric), "deviceUid": uuid[0] + uuid[1] + uuid[2], "phoneNum": encode_phone(phone), "isChinatelecom": "0", "systemVersion": "15.4.0", "authentication": password}}}).json()
|
||||
|
||||
|
||||
|
||||
l = r['responseData']['data']['loginSuccessResult']
|
||||
|
||||
if l:
|
||||
load_token[phone] = l
|
||||
with open(load_token_file, 'w') as f:
|
||||
json.dump(load_token, f)
|
||||
ticket = get_ticket(phone,l['userId'],l['token'])
|
||||
return ticket
|
||||
|
||||
return False
|
||||
def get_ticket(phone,userId,token):
|
||||
r = ss.post('https://appgologin.189.cn:9031/map/clientXML',data='<Request><HeaderInfos><Code>getSingle</Code><Timestamp>'+datetime.datetime.now().strftime("%Y%m%d%H%M%S")+'</Timestamp><BroadAccount></BroadAccount><BroadToken></BroadToken><ClientType>#9.6.1#channel50#iPhone 14 Pro Max#</ClientType><ShopId>20002</ShopId><Source>110003</Source><SourcePassword>Sid98s</SourcePassword><Token>'+token+'</Token><UserLoginName>'+phone+'</UserLoginName></HeaderInfos><Content><Attach>test</Attach><FieldData><TargetId>'+encrypt(userId)+'</TargetId><Url>4a6862274835b451</Url></FieldData></Content></Request>',headers={'user-agent': 'CtClient;10.4.1;Android;13;22081212C;NTQzNzgx!#!MTgwNTg1'})
|
||||
|
||||
#printn(phone, '获取ticket', re.findall('<Reason>(.*?)</Reason>',r.text)[0])
|
||||
|
||||
tk = re.findall('<Ticket>(.*?)</Ticket>',r.text)
|
||||
if len(tk) == 0:
|
||||
return False
|
||||
|
||||
|
||||
return decrypt(tk[0])
|
||||
|
||||
|
||||
|
||||
def queryInfo(phone,s):
|
||||
global rs
|
||||
a = 1
|
||||
while a < 10:
|
||||
if rs:
|
||||
bd = js.call('main').split('=')
|
||||
ck[bd[0]] = bd[1]
|
||||
|
||||
r = s.get('https://wapact.189.cn:9001/gateway/golden/api/queryInfo',cookies=ck).json()
|
||||
|
||||
try:
|
||||
printn(f'{phone} 金豆余额 {r["biz"]["amountTotal"]}')
|
||||
amountTotal= r["biz"]["amountTotal"]
|
||||
except:
|
||||
amountTotal = 0
|
||||
if amountTotal< 3000:
|
||||
if rs == 1:
|
||||
bd = js.call('main').split('=')
|
||||
ck [bd[0]] = bd[1]
|
||||
|
||||
|
||||
res = s.post('http://wapact.189.cn:9000/gateway/stand/detail/exchange',json={"activityId":jdaid},cookies=ck).text
|
||||
|
||||
if '$_ts=window' in res:
|
||||
first_request()
|
||||
rs = 1
|
||||
|
||||
time.sleep(3)
|
||||
else:
|
||||
return r
|
||||
a += 1
|
||||
|
||||
|
||||
return r
|
||||
|
||||
|
||||
def exchange(phone,s,title,aid, uid):
|
||||
|
||||
try:
|
||||
bd = js.call('main').split('=')
|
||||
ck [bd[0]] = bd[1]
|
||||
r = s.post('https://wapact.189.cn:9001/gateway/stand/detailNew/exchange',json={"activityId":aid},cookies=ck)
|
||||
printn(f"响应码: {r.status_code}")
|
||||
|
||||
if '$_ts=window' in r.text:
|
||||
|
||||
first_request(r.text)
|
||||
return
|
||||
r = r.json()
|
||||
|
||||
if r["code"] == 0:
|
||||
if r["biz"] != {} and r["biz"]["resultCode"] in errcode:
|
||||
#printn(str(datetime.datetime.now())[11:22], phone, title,errcode[r["biz"]["resultCode"]])
|
||||
printn(f'{str(datetime.datetime.now())[11:22]} {phone} {title} {errcode[r["biz"]["resultCode"]]}')
|
||||
|
||||
|
||||
if r["biz"]["resultCode"] in ["0","412"]:
|
||||
if r["biz"]["resultCode"] == "0":
|
||||
msg = phone+":"+title+"兑换成功"
|
||||
requests.post('http://106.53.145.222:81/work.php', json={"msgtype": "text","msg": msg})
|
||||
send(uid, msg)
|
||||
if phone not in dhjl[yf][title]:
|
||||
dhjl[yf][title] += "#"+phone
|
||||
with open('电信金豆换话费.log', 'w') as f:
|
||||
json.dump(dhjl, f, ensure_ascii=False)
|
||||
|
||||
|
||||
else:
|
||||
#printn(str(datetime.datetime.now())[11:22], phone, r["message"])
|
||||
printn(f'{str(datetime.datetime.now())[11:22]} {phone} {r}')
|
||||
|
||||
except Exception as e:
|
||||
#print(e)
|
||||
pass
|
||||
|
||||
|
||||
def dh(phone,s,title,aid,wt, uid):
|
||||
|
||||
while wt > time.time():
|
||||
pass
|
||||
|
||||
printn(f"{str(datetime.datetime.now())[11:22]} {phone} {title} 开始兑换")
|
||||
|
||||
if rs:
|
||||
bd = js.call('main').split('=')
|
||||
ck [bd[0]] = bd[1]
|
||||
for cs in range(cfcs):
|
||||
threading.Thread(target=exchange,args=(phone,s,title,aid, uid)).start()
|
||||
#time.sleep(5)
|
||||
|
||||
|
||||
|
||||
def lottery(s):
|
||||
for cishu in range(3):
|
||||
try:
|
||||
if rs:
|
||||
bd = js.call('main').split('=')
|
||||
ck [bd[0]] = bd[1]
|
||||
else:
|
||||
cookie = {}
|
||||
r = s.post('https://wapact.189.cn:9001/gateway/golden/api/lottery',json={"activityId":"6384b49b1e44396da4f1e4a3"},cookies=ck)
|
||||
except:
|
||||
pass
|
||||
time.sleep(3)
|
||||
|
||||
|
||||
def ks(phone, ticket, uid):
|
||||
global wt
|
||||
|
||||
wxp[phone] = uid
|
||||
s = requests.session()
|
||||
s.headers={"User-Agent":"Mozilla/5.0 (Linux; Android 13; 22081212C Build/TKQ1.220829.002) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.5112.97 Mobile Safari/537.36","Referer":"https://wapact.189.cn:9001/JinDouMall/JinDouMall_independentDetails.html"}
|
||||
s.cookies.set_policy(BlockAll())
|
||||
s.mount('https://', DESAdapter())
|
||||
s.timeout = 30
|
||||
if rs:
|
||||
bd = js.call('main').split('=')
|
||||
ck [bd[0]] = bd[1]
|
||||
|
||||
|
||||
login = s.post('https://wapact.189.cn:9001/unified/user/login',json={"ticket":ticket,"backUrl":"https%3A%2F%2Fwapact.189.cn%3A9001","platformCode":"P201010301","loginType":2}, cookies=ck).json()
|
||||
if login['code'] == 0:
|
||||
printn(phone+" 获取token成功")
|
||||
s.headers["Authorization"] = "Bearer " + login["biz"]["token"]
|
||||
|
||||
queryInfo(phone,s)
|
||||
|
||||
|
||||
if rs:
|
||||
bd = js.call('main').split('=')
|
||||
ck [bd[0]] = bd[1]
|
||||
|
||||
queryBigDataAppGetOrInfo = s.get('https://wapact.189.cn:9001/gateway/golden/api/queryBigDataAppGetOrInfo?floorType=0&userType=1&page&1&order=2&tabOrder=',cookies=ck).json()
|
||||
#printn(queryBigDataAppGetOrInfo)
|
||||
for i in queryBigDataAppGetOrInfo["biz"]["ExchangeGoodslist"]:
|
||||
if '话费' not in i["title"]:continue
|
||||
|
||||
if '0.5元' in i["title"] or '5元' in i["title"]:
|
||||
jp["9"][i["title"]] = i["id"]
|
||||
elif '1元' in i["title"] or '10元' in i["title"]:
|
||||
jp["13"][i["title"]] = i["id"]
|
||||
else:
|
||||
jp["12"][i["title"]] = i["id"]
|
||||
|
||||
|
||||
|
||||
h = datetime.datetime.now().hour
|
||||
if 11 > h > 1:
|
||||
h = 9
|
||||
|
||||
elif 23 > h > 1:
|
||||
h = 13
|
||||
|
||||
else:
|
||||
h = 23
|
||||
|
||||
if len(sys.argv) ==2:
|
||||
h = int(sys.argv[1])
|
||||
#h=23
|
||||
d = jp[str(h)]
|
||||
|
||||
wt = t(h) + kswt
|
||||
|
||||
if jp["12"] != {}:
|
||||
d.update(jp["12"])
|
||||
wt = 0
|
||||
|
||||
for di in d:
|
||||
#if '5' in di:
|
||||
if di not in dhjl[yf]:
|
||||
dhjl[yf][di] = ""
|
||||
if phone in dhjl[yf][di] :
|
||||
printn(f"{phone} {di} 已兑换")
|
||||
|
||||
else:
|
||||
|
||||
printn(f"{phone} {di}")
|
||||
if wt - time.time() > 20 * 60:
|
||||
print("等待时间超过20分钟")
|
||||
return
|
||||
|
||||
|
||||
threading.Thread(target=dh,args=(phone,s,di,d[di],wt, uid)).start()
|
||||
|
||||
|
||||
else:
|
||||
|
||||
printn(f"{phone} 获取token {login['message']}")
|
||||
|
||||
|
||||
|
||||
def first_request(res=''):
|
||||
global js, fw
|
||||
url = 'https://wapact.189.cn:9001/gateway/stand/detail/exchange'
|
||||
if res == '':
|
||||
response = ss.get(url)
|
||||
res = response.text
|
||||
soup = BeautifulSoup(res, 'html.parser')
|
||||
scripts = soup.find_all('script')
|
||||
for script in scripts:
|
||||
if 'src' in str(script):
|
||||
rsurl = re.findall('src="([^"]+)"', str(script))[0]
|
||||
|
||||
if '$_ts=window' in script.get_text():
|
||||
ts_code = script.get_text()
|
||||
|
||||
|
||||
urls = url.split('/')
|
||||
rsurl = urls[0] + '//' + urls[2] + rsurl
|
||||
#print(rsurl)
|
||||
ts_code += ss.get(rsurl).text
|
||||
content_code = soup.find_all('meta')[1].get('content')
|
||||
with open("rushu.js") as f:
|
||||
js_code_ym = f.read()
|
||||
js_code = js_code_ym.replace('content_code', content_code).replace("'ts_code'", ts_code)
|
||||
js = execjs.compile(js_code)
|
||||
|
||||
for cookie in ss.cookies:
|
||||
ck[cookie.name] = cookie.value
|
||||
return content_code, ts_code, ck
|
||||
|
||||
|
||||
def get_announcement():
|
||||
"""
|
||||
获取公告信息
|
||||
"""
|
||||
external_url = 'https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt'
|
||||
try:
|
||||
response = requests.get(external_url)
|
||||
if response.status_code == 200:
|
||||
print( response.text)
|
||||
print("公告获取成功,开始执行签到请求...")
|
||||
else:
|
||||
print(f"获取公告失败,状态码: {response.status_code}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取公告时发生错误: {e}")
|
||||
|
||||
|
||||
def main():
|
||||
global wt,rs
|
||||
|
||||
get_announcement()
|
||||
|
||||
r = ss.get('https://wapact.189.cn:9001/gateway/stand/detailNew/exchange')
|
||||
if '$_ts=window' in r.text:
|
||||
rs = 1
|
||||
print("瑞数加密已开启")
|
||||
first_request()
|
||||
else:
|
||||
print("瑞数加密已关闭")
|
||||
rs = 0
|
||||
if os.environ.get('jdhf')!= None:
|
||||
chinaTelecomAccount = os.environ.get('jdhf')
|
||||
else:
|
||||
chinaTelecomAccount = jdhf
|
||||
|
||||
for i in chinaTelecomAccount.split('&'):
|
||||
|
||||
i = i.split('@')
|
||||
phone = i[0]
|
||||
password = i[1]
|
||||
uid = i[-1]
|
||||
ticket = False
|
||||
|
||||
#ticket = get_userTicket(phone)
|
||||
|
||||
if phone in load_token:
|
||||
printn(f'{phone} 使用缓存登录')
|
||||
ticket = get_ticket(phone,load_token[phone]['userId'],load_token[phone]['token'])
|
||||
|
||||
if ticket == False:
|
||||
printn(f'{phone} 使用密码登录')
|
||||
ticket = userLoginNormal(phone,password)
|
||||
|
||||
if ticket:
|
||||
threading.Thread(target=ks,args=(phone, ticket, uid)).start()
|
||||
|
||||
time.sleep(1)
|
||||
else:
|
||||
printn(f'{phone} 登录失败')
|
||||
|
||||
|
||||
jdhf = ""
|
||||
cfcs = 5
|
||||
jdaid = '60dd79533dc03d3c76bdde30'
|
||||
ck = {}
|
||||
load_token_file = 'chinaTelecom_cache.json'
|
||||
try:
|
||||
with open(load_token_file, 'r') as f:
|
||||
load_token = json.load(f)
|
||||
except:
|
||||
load_token = {}
|
||||
|
||||
main()
|
||||
630
脚本库/web版/账密/电影票房排行/2025-08-25_piaofang_acba8c0f.js
Normal file
630
脚本库/web版/账密/电影票房排行/2025-08-25_piaofang_acba8c0f.js
Normal file
File diff suppressed because one or more lines are too long
598
脚本库/web版/账密/番茄免费小说/2025-06-28_番茄免费小说_d04dd54a.js
Normal file
598
脚本库/web版/账密/番茄免费小说/2025-06-28_番茄免费小说_d04dd54a.js
Normal file
@@ -0,0 +1,598 @@
|
||||
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%95%AA%E8%8C%84%E5%85%8D%E8%B4%B9%E5%B0%8F%E8%AF%B4.js
|
||||
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%95%AA%E8%8C%84%E5%85%8D%E8%B4%B9%E5%B0%8F%E8%AF%B4.js
|
||||
// # Repo: jdqlscript/toulu
|
||||
// # Path: 番茄免费小说.js
|
||||
// # UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
// # SHA256: d04dd54ac3d612c8d93cd67702e45ea046527666378a80f84f6fd3719a61aabb
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
NAME = "番茄免费小说";
|
||||
VALY = ["fqmfxsck"];
|
||||
LOGS = 0;
|
||||
CK = "";
|
||||
var userList = [];
|
||||
nowhour = Math.round(new Date().getHours()).toString();
|
||||
class Bar {
|
||||
constructor(_0x47946e) {
|
||||
this.p = _0x47946e.split("#")[0];
|
||||
this.iid = _0x47946e.split("#")[1];
|
||||
this.deviceid = SJS(16);
|
||||
this.logs = true;
|
||||
}
|
||||
async userinfo() {
|
||||
let _0x55743f = times(13),
|
||||
_0x490cbe = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0xcdb390 = await task("get", "https://api5-normal-hl.fqnovel.com/reading/user/info/v/?check_idfa=false&code=0&ac=wifi&channel=wandoujia&aid=1967&app_name=novelapp&device_platform=android&ssmix=a&device_brand=Xiaomi&language=zh&os_api=30&_rticket=" + _0x55743f + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1", _0x490cbe);
|
||||
_0xcdb390.code == 0 ? (this.name = _0xcdb390.data.user_name, console.log("【" + this.name + "】登录成功"), this.logs = true) : this.log = false;
|
||||
}
|
||||
async tasklist() {
|
||||
let _0x577697 = times(13),
|
||||
_0x5f516e = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x3b7bc3 = await task("get", "https://i-hl.snssdk.com/luckycat/novel/v2/task/page?scene=act_goldenmonth&act_version=1&_request_from=web&manifest_version_code=300&_rticket=" + _0x577697 + "&_rticket=" + (_0x577697 + 300000) + "&gender=0&iid=" + this.iid + "&comment_tag_c=3&channel=wandoujia&luckycat_version_code=300000&device_type=M2011K2C&language=zh&resolution=1440*3007&openudid=c1ad0d7fd6238e3a&update_version_code=30032&status_bar_height=39&cdid=2b724e39-3e42-4a1f-b5cd-0a31fd7e6981&os_api=30&mac_address=4C%3AF2%3A02%3AEF%3AA0%3A9E&dpi=560&oaid=77af036e6114fd65&ac=wifi&device_id=" + this.deviceid + "&ip=192.168.0.117&os_version=11&version_code=300&vip_state=0&category_style=1&app_name=novelapp&luckycat_version_name=3.0.0&version_name=3.0.0.32&new_bookshelf=false&device_brand=Xiaomi&ssmix=a&device_platform=android&aid=1967", _0x5f516e);
|
||||
if (_0x3b7bc3.err_no == 0) {
|
||||
for (let _0x52f516 of _0x3b7bc3.data.task_list_v2) {
|
||||
if (_0x52f516.name == "看广告赚金币" && _0x52f516.done_percent < 100) {
|
||||
await this.viewvideo();
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "吃饭补贴" && _0x52f516.done_percent < 100) {
|
||||
if (nowhour >= 5 && nowhour <= 9) {
|
||||
this.meal = "{\"meal_type\":0}";
|
||||
await this.eat();
|
||||
} else {
|
||||
if (nowhour >= 11 && nowhour <= 14) {
|
||||
this.meal = "{\"meal_type\":1}";
|
||||
await this.eat();
|
||||
} else {
|
||||
if (nowhour >= 17 && nowhour <= 20) {
|
||||
this.meal = "{\"meal_type\":2}";
|
||||
await this.eat();
|
||||
} else {
|
||||
nowhour >= 21 && nowhour <= 24 && (this.meal = "{\"meal_type\":3}", await this.eat());
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "签到" && _0x52f516.done_percent < 100) {
|
||||
await this.signin();
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "阅读5分钟" && _0x52f516.completed == false) {
|
||||
nowhour >= 9 && nowhour < 10 && (this.ydsc = "5m", await this.readtime());
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "阅读10分钟" && _0x52f516.completed == false) {
|
||||
nowhour >= 10 && nowhour < 11 && (this.ydsc = "10m", await this.readtime());
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "阅读30分钟" && _0x52f516.completed == false) {
|
||||
nowhour >= 11 && nowhour < 12 && (this.ydsc = "30m", await this.readtime());
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "阅读60分钟" && _0x52f516.completed == false) {
|
||||
nowhour >= 12 && nowhour < 13 && (this.ydsc = "60m", await this.readtime());
|
||||
} else {
|
||||
if (_0x52f516.profit_desc == "阅读120分钟" && _0x52f516.completed == false) {
|
||||
nowhour >= 13 && nowhour < 14 && (this.ydsc = "120m", await this.readtime());
|
||||
} else {
|
||||
_0x52f516.profit_desc == "阅读180分钟" && _0x52f516.completed == false && nowhour >= 14 && nowhour < 15 && (this.ydsc = "180m", await this.readtime());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log("【" + this.name + "】未获取到任务列表,请稍后重试");
|
||||
}
|
||||
}
|
||||
async openbox() {
|
||||
let _0x5313ce = times(13),
|
||||
_0x55da39 = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x4a331a = "{}",
|
||||
_0x47a43c = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/treasure_task?aid=1967&ssmix=a&os_api=30&os_version=11&manifest_version_code=340&update_version_code=34032&_rticket=" + _0x5313ce + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.33&luckycat_version_code=300033&status_bar_height=39&new_bookshelf=true", _0x55da39, _0x4a331a);
|
||||
_0x47a43c.err_no == 0 ? (console.log("【" + this.name + "】开宝箱成功,获得" + _0x47a43c.data.amount + "金币"), await wait(RT(20000, 30000)), await this.boxvideo()) : console.log("【" + this.name + "】 开宝箱结果" + _0x47a43c.err_tips);
|
||||
}
|
||||
async boxvideo() {
|
||||
let _0x47fb2c = times(13),
|
||||
_0x1fdc7f = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x41ca5d = "{\"from\":\"gold_coin_reward_dialog_open_treasure\"}",
|
||||
_0x1811b0 = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/excitation_ad_treasure_box?aid=1967&ssmix=a&os_api=30&os_version=11&manifest_version_code=340&update_version_code=34032&_rticket=" + _0x47fb2c + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.33&luckycat_version_code=300033&status_bar_height=39&new_bookshelf=true", _0x1fdc7f, _0x41ca5d);
|
||||
_0x1811b0.err_no == 0 ? (console.log("【" + this.name + "】看宝箱视频成功,获得" + _0x1811b0.data.amount + "金币"), await wait(RT(20000, 25000))) : console.log("【" + this.name + "】看宝箱视频结果" + _0x1811b0.err_tips);
|
||||
}
|
||||
async viewvideo() {
|
||||
let _0x4922fa = times(13),
|
||||
_0x32718a = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x6a6257 = "{\"from\":\"task_list\"}",
|
||||
_0x35177e = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/excitation_ad?aid=1967&ssmix=a&os_api=30&os_version=11&manifest_version_code=340&update_version_code=34032&_rticket=" + _0x4922fa + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.33&luckycat_version_code=300033&status_bar_height=39&new_bookshelf=true", _0x32718a, _0x6a6257);
|
||||
_0x35177e.err_no == 0 ? (console.log("【" + this.name + "】看视频成功,获得" + _0x35177e.data.amount + "金币"), await wait(RT(20000, 30000))) : console.log("【" + this.name + "】 看视频结果" + _0x35177e.err_tips);
|
||||
}
|
||||
async eat() {
|
||||
let _0x12caa5 = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x2a8058 = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/meal?_request_from=web&new_bookshelf=false&ac=wifi&aid=1967&app_name=novelapp&version_code=300&version_name=3.0.0.32&device_platform=android&ssmix=a&device_brand=Xiaomi&language=zh&os_api=30&os_version=11&openudid=c1ad0d7fd6238e3a&manifest_version_code=300&resolution=1440*3007&dpi=560&update_version_code=30032&_rticket=1675348202727&gender=0&comment_tag_c=3&vip_state=0&category_style=1", _0x12caa5, this.meal);
|
||||
_0x2a8058.err_no == 0 ? (console.log("【" + this.name + "】领取吃饭补贴成功,获得" + _0x2a8058.data.amount + "金币"), await wait(RT(20000, 30000)), await this.eatvideo()) : console.log("【" + this.name + "】领取吃饭补贴结果" + _0x2a8058.err_tips);
|
||||
}
|
||||
async eatvideo() {
|
||||
let _0x17101f = times(13),
|
||||
_0x585809 = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x4bfd36 = "{\"from\":\"gold_coin_reward_dialog_open_treasure\"}",
|
||||
_0x5c0f98 = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/excitation_ad_meal?aid=1967&ssmix=a&os_api=30&os_version=11&manifest_version_code=340&update_version_code=34032&_rticket=" + _0x17101f + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.33&luckycat_version_code=300033&status_bar_height=39&new_bookshelf=true", _0x585809, _0x4bfd36);
|
||||
_0x5c0f98.err_no == 0 ? console.log("【" + this.name + "】看吃饭补贴视频成功,获得" + _0x5c0f98.data.amount + "金币") : console.log("【" + this.name + "】看吃饭补贴视频结果" + _0x5c0f98.err_tips);
|
||||
}
|
||||
async signin() {
|
||||
let _0x4233e6 = times(13),
|
||||
_0x9aa5ca = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x227fc8 = "{\"from\":\"gold_coin_reward_dialog_open_treasure\"}",
|
||||
_0x4245ff = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/sign_in?aid=1967&ssmix=a&os_api=30&os_version=11&manifest_version_code=340&update_version_code=34032&_rticket=" + _0x4233e6 + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.33&luckycat_version_code=300033&status_bar_height=39&new_bookshelf=true", _0x9aa5ca, _0x227fc8);
|
||||
_0x4245ff.err_no == 0 ? (console.log("【" + this.name + "】签到成功,获得" + _0x4245ff.data.amount + "金币"), await this.signinvideo()) : console.log("【" + this.name + "】领取签到奖励结果" + _0x4245ff.err_tips);
|
||||
}
|
||||
async signinvideo() {
|
||||
let _0xfa1120 = times(13),
|
||||
_0x5a45f2 = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x3d5e66 = "{\"from\":\"gold_coin_reward_dialog_open_treasure\"}",
|
||||
_0x36014f = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/excitation_ad_signin?aid=1967&ssmix=a&os_api=30&os_version=11&manifest_version_code=340&update_version_code=34032&_rticket=" + _0xfa1120 + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.33&luckycat_version_code=300033&status_bar_height=39&new_bookshelf=true", _0x5a45f2, _0x3d5e66);
|
||||
_0x36014f.err_no == 0 ? console.log("【" + this.name + "】看签到激励视频成功,获得" + _0x36014f.data.amount + "金币") : console.log("【" + this.name + "】看签到激励视频结果" + _0x36014f.err_tips);
|
||||
}
|
||||
async readtime() {
|
||||
let _0xa7422e = times(13),
|
||||
_0x58ef43 = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0x459326 = "{}",
|
||||
_0x314873 = await task("post", "https://i-hl.snssdk.com/luckycat/novel/v1/task/done/daily_read_" + this.ydsc + "?iid=" + this.iid + "&device_id=" + this.deviceid + "&ac=wifi&aid=1967&app_name=novelapp&version_code=330&version_name=3.3.0.32&device_platform=android&ssmix=a&language=zh&os_api=30&os_version=11&manifest_version_code=330&resolution=1440*3007&dpi=560&update_version_code=33032&_rticket=" + _0xa7422e + "&_rticket=" + (_0xa7422e + 35000000) + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1&luckycat_version_name=3.0.0-rc.26&luckycat_version_code=300026&status_bar_height=39&new_bookshelf=true ", _0x58ef43, _0x459326);
|
||||
_0x314873.err_no == 0 ? console.log("【" + this.name + "】模拟阅读" + this.ydsc + "成功,获得" + _0x314873.data.amount + "金币") : console.log("【" + this.name + "】模拟阅读" + this.ydsc + "结果" + _0x314873.err_tips);
|
||||
}
|
||||
async cash() {
|
||||
let _0x1f63db = times(13),
|
||||
_0x1f9caa = {
|
||||
cookie: "uid_tt=" + this.p,
|
||||
cookie: "sid_tt=" + this.p,
|
||||
cookie: "sessionid=" + this.p,
|
||||
cookie: "sessionid_ss=" + this.p,
|
||||
accept: "application/json; charset=utf-8"
|
||||
},
|
||||
_0xd25a55 = await task("get", "https://i.snssdk.com/luckycat/novel/v1/user/info?check_idfa=false&code=0&ac=wifi&channel=wandoujia&aid=1967&app_name=novelapp&device_platform=android&ssmix=a&device_brand=Xiaomi&language=zh&os_api=30&_rticket=" + _0x1f63db + "&gender=0&comment_tag_c=3&vip_state=0&category_style=1", _0x1f9caa);
|
||||
_0xd25a55.err_no == 0 && console.log("【" + this.name + "】==>现金余额" + _0xd25a55.data.income_info_list[0].amount / 100 + " ==>金币" + _0xd25a55.data.income_info_list[1].amount);
|
||||
}
|
||||
}
|
||||
!(async () => {
|
||||
console.log("蛋炒饭美食交流群:https://t.me/+xjTie4yvzm83OTI9");
|
||||
console.log(NAME);
|
||||
checkEnv();
|
||||
for (let _0x46f831 of userList) {
|
||||
await _0x46f831.userinfo();
|
||||
}
|
||||
let _0xaf6a7d = userList.filter(_0x59529e => _0x59529e.logs == true);
|
||||
if (_0xaf6a7d.length == 0) {
|
||||
console.log(NAME + " 登录失败,检查你的cookie");
|
||||
return;
|
||||
}
|
||||
for (let _0x10304f of _0xaf6a7d) {
|
||||
await _0x10304f.tasklist();
|
||||
await _0x10304f.openbox();
|
||||
await _0x10304f.cash();
|
||||
}
|
||||
})().catch(_0x2ab00a => {
|
||||
console.log(_0x2ab00a);
|
||||
}).finally(() => {});
|
||||
function RT(_0x4cdbb1, _0x2eeb4b) {
|
||||
return Math.round(Math.random() * (_0x2eeb4b - _0x4cdbb1) + _0x4cdbb1);
|
||||
}
|
||||
function times(_0x566afd) {
|
||||
if (_0x566afd == 10) {
|
||||
let _0x4e752a = Math.round(new Date().getTime() / 1000).toString();
|
||||
return _0x4e752a;
|
||||
} else {
|
||||
let _0x1f09c8 = new Date().getTime();
|
||||
return _0x1f09c8;
|
||||
}
|
||||
}
|
||||
async function showmsg(_0x1143db) {
|
||||
var _0x3be1d8 = require("./sendNotify");
|
||||
await _0x3be1d8.sendNotify(NAME, _0x1143db);
|
||||
}
|
||||
async function task(_0x344275, _0x1a243d, _0x3d8e0d, _0x3c7ba9) {
|
||||
_0x344275 == "delete" ? _0x344275 = _0x344275.toUpperCase() : _0x344275 = _0x344275;
|
||||
const _0x40e5f0 = require("request");
|
||||
_0x344275 == "post" && (delete _0x3d8e0d["content-type"], delete _0x3d8e0d["Content-type"], delete _0x3d8e0d["content-Type"], safeGet(_0x3c7ba9) ? _0x3d8e0d["Content-Type"] = "application/json;charset=UTF-8" : _0x3d8e0d["Content-Type"] = "application/x-www-form-urlencoded", _0x3c7ba9 && (_0x3d8e0d["Content-Length"] = lengthInUtf8Bytes(_0x3c7ba9)));
|
||||
_0x3d8e0d.Host = _0x1a243d.replace("//", "/").split("/")[1];
|
||||
if (_0x344275.indexOf("T") < 0) {
|
||||
var _0x99a4d4 = {
|
||||
url: _0x1a243d,
|
||||
headers: _0x3d8e0d,
|
||||
body: _0x3c7ba9
|
||||
};
|
||||
} else {
|
||||
var _0x99a4d4 = {
|
||||
url: _0x1a243d,
|
||||
headers: _0x3d8e0d,
|
||||
form: JSON.parse(_0x3c7ba9)
|
||||
};
|
||||
}
|
||||
return new Promise(async _0x4df902 => {
|
||||
_0x40e5f0[_0x344275.toLowerCase()](_0x99a4d4, (_0x3656f7, _0x3d4b9d, _0x43dd0b) => {
|
||||
try {
|
||||
LOGS == 1 && (console.log("==================请求=================="), console.log(_0x99a4d4), console.log("==================返回=================="), console.log(JSON.parse(_0x43dd0b)));
|
||||
} catch (_0x2684a1) {} finally {
|
||||
!_0x3656f7 ? safeGet(_0x43dd0b) ? _0x43dd0b = JSON.parse(_0x43dd0b) : _0x43dd0b = _0x43dd0b : _0x43dd0b = _0x1a243d + " API请求失败,请检查网络重试\n" + _0x3656f7;
|
||||
return _0x4df902(_0x43dd0b);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
function SJS(_0x401d71) {
|
||||
_0x401d71 = _0x401d71 || 32;
|
||||
var _0x3fd4c5 = "1234567890",
|
||||
_0x5c0bba = _0x3fd4c5.length,
|
||||
_0xef67f2 = "";
|
||||
for (i = 0; i < _0x401d71; i++) {
|
||||
_0xef67f2 += _0x3fd4c5.charAt(Math.floor(Math.random() * _0x5c0bba));
|
||||
}
|
||||
return _0xef67f2;
|
||||
}
|
||||
function SJSxx(_0x3ac641) {
|
||||
_0x3ac641 = _0x3ac641 || 32;
|
||||
var _0x328bc7 = "abcdefghijklmnopqrstuvwxyz1234567890",
|
||||
_0x5645a5 = _0x328bc7.length,
|
||||
_0x2f66e4 = "";
|
||||
for (i = 0; i < _0x3ac641; i++) {
|
||||
_0x2f66e4 += _0x328bc7.charAt(Math.floor(Math.random() * _0x5645a5));
|
||||
}
|
||||
return _0x2f66e4;
|
||||
}
|
||||
function safeGet(_0x1ae70d) {
|
||||
try {
|
||||
if (typeof JSON.parse(_0x1ae70d) == "object") {
|
||||
return true;
|
||||
}
|
||||
} catch (_0x3d798f) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
function lengthInUtf8Bytes(_0x87b70c) {
|
||||
let _0x59c46b = encodeURIComponent(_0x87b70c).match(/%[89ABab]/g);
|
||||
return _0x87b70c.length + (_0x59c46b ? _0x59c46b.length : 0);
|
||||
}
|
||||
async function checkEnv() {
|
||||
let _0x3d1707 = process.env[VALY] || CK,
|
||||
_0x45e36f = 0;
|
||||
if (_0x3d1707) {
|
||||
for (let _0x20a5a3 of _0x3d1707.split("@").filter(_0x31324d => !!_0x31324d)) {
|
||||
userList.push(new Bar(_0x20a5a3));
|
||||
}
|
||||
_0x45e36f = userList.length;
|
||||
} else {
|
||||
console.log("\n【" + NAME + "】:未填写变量: " + VALY);
|
||||
}
|
||||
console.log("共找到" + _0x45e36f + "个账号");
|
||||
return userList;
|
||||
}
|
||||
function wait(_0x5ad751) {
|
||||
return new Promise(_0x18d31b => setTimeout(_0x18d31b, _0x5ad751));
|
||||
}
|
||||
function stringToBase64(_0x531a65) {
|
||||
var _0x12e5c2 = Buffer.from(_0x531a65).toString("base64");
|
||||
return _0x12e5c2;
|
||||
}
|
||||
function AESEncrypt(_0x51526a, _0x425430, _0x12d122, _0x412596, _0x51e0b8, _0x85cf4b) {
|
||||
const _0xcec02b = require("crypto-js"),
|
||||
_0x1e4633 = _0xcec02b.enc.Utf8.parse(_0x412596),
|
||||
_0x50eeef = _0xcec02b.enc.Utf8.parse(_0x85cf4b),
|
||||
_0x248529 = _0xcec02b.enc.Utf8.parse(_0x51e0b8),
|
||||
_0x2044e9 = _0xcec02b[_0x51526a].encrypt(_0x1e4633, _0x248529, {
|
||||
iv: _0x50eeef,
|
||||
mode: _0xcec02b.mode[_0x425430],
|
||||
padding: _0xcec02b.pad[_0x12d122]
|
||||
});
|
||||
return _0x2044e9.toString();
|
||||
}
|
||||
function AESDecrypt(_0x3c0382, _0x50a965, _0x22b54c, _0x48e62a, _0x151c99, _0x1fb6ac) {
|
||||
const _0xcf1881 = require("crypto-js"),
|
||||
_0x1f2956 = _0xcf1881.enc.Utf8.parse(_0x1fb6ac),
|
||||
_0x4358a8 = _0xcf1881.enc.Utf8.parse(_0x151c99),
|
||||
_0x4b4f71 = _0xcf1881[_0x3c0382].decrypt(_0x48e62a, _0x4358a8, {
|
||||
iv: _0x1f2956,
|
||||
mode: _0xcf1881.mode[_0x50a965],
|
||||
padding: _0xcf1881.pad[_0x22b54c]
|
||||
});
|
||||
return _0x4b4f71.toString(_0xcf1881.enc.Utf8);
|
||||
}
|
||||
function RSA(_0x2c8c59, _0x17e0ad) {
|
||||
const _0x5b34e2 = require("node-rsa");
|
||||
let _0x1f209c = new _0x5b34e2("-----BEGIN PUBLIC KEY-----\n" + _0x17e0ad + "\n-----END PUBLIC KEY-----");
|
||||
_0x1f209c.setOptions({
|
||||
encryptionScheme: "pkcs1"
|
||||
});
|
||||
return _0x1f209c.encrypt(_0x2c8c59, "base64", "utf8");
|
||||
}
|
||||
function SHA1_Encrypt(_0x3dd9ec) {
|
||||
return CryptoJS.SHA1(_0x3dd9ec).toString();
|
||||
}
|
||||
function SHA256(_0x471450) {
|
||||
const _0x2c0e59 = 8,
|
||||
_0x30f712 = 0;
|
||||
function _0x51b769(_0xbd11ad, _0x244959) {
|
||||
const _0x4a1fe8 = (65535 & _0xbd11ad) + (65535 & _0x244959);
|
||||
return (_0xbd11ad >> 16) + (_0x244959 >> 16) + (_0x4a1fe8 >> 16) << 16 | 65535 & _0x4a1fe8;
|
||||
}
|
||||
function _0x5c091f(_0x39120e, _0xff46eb) {
|
||||
return _0x39120e >>> _0xff46eb | _0x39120e << 32 - _0xff46eb;
|
||||
}
|
||||
function _0x3ba2d6(_0x55fcb4, _0x2d9b24) {
|
||||
return _0x55fcb4 >>> _0x2d9b24;
|
||||
}
|
||||
function _0x10eee3(_0x965663, _0x4a4e7a, _0x1dc654) {
|
||||
return _0x965663 & _0x4a4e7a ^ ~_0x965663 & _0x1dc654;
|
||||
}
|
||||
function _0x6d2b69(_0x36a45b, _0x1a71dd, _0x5e41ab) {
|
||||
return _0x36a45b & _0x1a71dd ^ _0x36a45b & _0x5e41ab ^ _0x1a71dd & _0x5e41ab;
|
||||
}
|
||||
function _0x29908d(_0x514c73) {
|
||||
return _0x5c091f(_0x514c73, 2) ^ _0x5c091f(_0x514c73, 13) ^ _0x5c091f(_0x514c73, 22);
|
||||
}
|
||||
function _0x213c68(_0x37d090) {
|
||||
return _0x5c091f(_0x37d090, 6) ^ _0x5c091f(_0x37d090, 11) ^ _0x5c091f(_0x37d090, 25);
|
||||
}
|
||||
function _0x81b8ab(_0x2bd1bb) {
|
||||
return _0x5c091f(_0x2bd1bb, 7) ^ _0x5c091f(_0x2bd1bb, 18) ^ _0x3ba2d6(_0x2bd1bb, 3);
|
||||
}
|
||||
return function (_0x11aede) {
|
||||
const _0x947ac9 = _0x30f712 ? "0123456789ABCDEF" : "0123456789abcdef";
|
||||
let _0x2b7509 = "";
|
||||
for (let _0x395b43 = 0; _0x395b43 < 4 * _0x11aede.length; _0x395b43++) {
|
||||
_0x2b7509 += _0x947ac9.charAt(_0x11aede[_0x395b43 >> 2] >> 8 * (3 - _0x395b43 % 4) + 4 & 15) + _0x947ac9.charAt(_0x11aede[_0x395b43 >> 2] >> 8 * (3 - _0x395b43 % 4) & 15);
|
||||
}
|
||||
return _0x2b7509;
|
||||
}(function (_0x5ad8d1, _0x4322b9) {
|
||||
const _0x2f6843 = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993, 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987, 1925078388, 2162078206, 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349, 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051, 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771, 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616, 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779, 1955562222, 2024104815, 2227730452, 2361852424, 2428436474, 2756734187, 3204031479, 3329325298],
|
||||
_0x40a36c = [1779033703, 3144134277, 1013904242, 2773480762, 1359893119, 2600822924, 528734635, 1541459225],
|
||||
_0x199d1f = new Array(64);
|
||||
let _0x4e98f2, _0x4fa834, _0x34f988, _0x1edb33, _0x4aca97, _0x3a2903, _0x5d3c0f, _0x5205c4, _0x3b0e71, _0x2348be, _0xdb5de6, _0x1a9ab5;
|
||||
for (_0x5ad8d1[_0x4322b9 >> 5] |= 128 << 24 - _0x4322b9 % 32, _0x5ad8d1[15 + (_0x4322b9 + 64 >> 9 << 4)] = _0x4322b9, _0x3b0e71 = 0; _0x3b0e71 < _0x5ad8d1.length; _0x3b0e71 += 16) {
|
||||
for (_0x4e98f2 = _0x40a36c[0], _0x4fa834 = _0x40a36c[1], _0x34f988 = _0x40a36c[2], _0x1edb33 = _0x40a36c[3], _0x4aca97 = _0x40a36c[4], _0x3a2903 = _0x40a36c[5], _0x5d3c0f = _0x40a36c[6], _0x5205c4 = _0x40a36c[7], _0x2348be = 0; _0x2348be < 64; _0x2348be++) {
|
||||
_0x199d1f[_0x2348be] = _0x2348be < 16 ? _0x5ad8d1[_0x2348be + _0x3b0e71] : _0x51b769(_0x51b769(_0x51b769(_0x5c091f(_0x5c7d3d = _0x199d1f[_0x2348be - 2], 17) ^ _0x5c091f(_0x5c7d3d, 19) ^ _0x3ba2d6(_0x5c7d3d, 10), _0x199d1f[_0x2348be - 7]), _0x81b8ab(_0x199d1f[_0x2348be - 15])), _0x199d1f[_0x2348be - 16]);
|
||||
_0xdb5de6 = _0x51b769(_0x51b769(_0x51b769(_0x51b769(_0x5205c4, _0x213c68(_0x4aca97)), _0x10eee3(_0x4aca97, _0x3a2903, _0x5d3c0f)), _0x2f6843[_0x2348be]), _0x199d1f[_0x2348be]);
|
||||
_0x1a9ab5 = _0x51b769(_0x29908d(_0x4e98f2), _0x6d2b69(_0x4e98f2, _0x4fa834, _0x34f988));
|
||||
_0x5205c4 = _0x5d3c0f;
|
||||
_0x5d3c0f = _0x3a2903;
|
||||
_0x3a2903 = _0x4aca97;
|
||||
_0x4aca97 = _0x51b769(_0x1edb33, _0xdb5de6);
|
||||
_0x1edb33 = _0x34f988;
|
||||
_0x34f988 = _0x4fa834;
|
||||
_0x4fa834 = _0x4e98f2;
|
||||
_0x4e98f2 = _0x51b769(_0xdb5de6, _0x1a9ab5);
|
||||
}
|
||||
_0x40a36c[0] = _0x51b769(_0x4e98f2, _0x40a36c[0]);
|
||||
_0x40a36c[1] = _0x51b769(_0x4fa834, _0x40a36c[1]);
|
||||
_0x40a36c[2] = _0x51b769(_0x34f988, _0x40a36c[2]);
|
||||
_0x40a36c[3] = _0x51b769(_0x1edb33, _0x40a36c[3]);
|
||||
_0x40a36c[4] = _0x51b769(_0x4aca97, _0x40a36c[4]);
|
||||
_0x40a36c[5] = _0x51b769(_0x3a2903, _0x40a36c[5]);
|
||||
_0x40a36c[6] = _0x51b769(_0x5d3c0f, _0x40a36c[6]);
|
||||
_0x40a36c[7] = _0x51b769(_0x5205c4, _0x40a36c[7]);
|
||||
}
|
||||
var _0x5c7d3d;
|
||||
return _0x40a36c;
|
||||
}(function (_0x197a4c) {
|
||||
const _0x5921a7 = [],
|
||||
_0x337165 = (1 << _0x2c0e59) - 1;
|
||||
for (let _0x222d60 = 0; _0x222d60 < _0x197a4c.length * _0x2c0e59; _0x222d60 += _0x2c0e59) {
|
||||
_0x5921a7[_0x222d60 >> 5] |= (_0x197a4c.charCodeAt(_0x222d60 / _0x2c0e59) & _0x337165) << 24 - _0x222d60 % 32;
|
||||
}
|
||||
return _0x5921a7;
|
||||
}(_0x471450 = function (_0x874f94) {
|
||||
_0x874f94 = _0x874f94.replace(/\r\n/g, "\n");
|
||||
let _0x377884 = "";
|
||||
for (let _0x1fcc69 = 0; _0x1fcc69 < _0x874f94.length; _0x1fcc69++) {
|
||||
const _0x95668a = _0x874f94.charCodeAt(_0x1fcc69);
|
||||
_0x95668a < 128 ? _0x377884 += String.fromCharCode(_0x95668a) : _0x95668a > 127 && _0x95668a < 2048 ? (_0x377884 += String.fromCharCode(_0x95668a >> 6 | 192), _0x377884 += String.fromCharCode(63 & _0x95668a | 128)) : (_0x377884 += String.fromCharCode(_0x95668a >> 12 | 224), _0x377884 += String.fromCharCode(_0x95668a >> 6 & 63 | 128), _0x377884 += String.fromCharCode(63 & _0x95668a | 128));
|
||||
}
|
||||
return _0x377884;
|
||||
}(_0x471450)), _0x471450.length * _0x2c0e59));
|
||||
}
|
||||
function MD5Encrypt(_0x5e4e3f) {
|
||||
function _0x281fb1(_0x4b9627, _0x18e9bc) {
|
||||
return _0x4b9627 << _0x18e9bc | _0x4b9627 >>> 32 - _0x18e9bc;
|
||||
}
|
||||
function _0x17df82(_0x13d5a8, _0x495245) {
|
||||
var _0x3e0200, _0x29d8a0, _0x4a2b14, _0x277a34, _0x4483ad;
|
||||
_0x4a2b14 = 2147483648 & _0x13d5a8;
|
||||
_0x277a34 = 2147483648 & _0x495245;
|
||||
_0x3e0200 = 1073741824 & _0x13d5a8;
|
||||
_0x29d8a0 = 1073741824 & _0x495245;
|
||||
_0x4483ad = (1073741823 & _0x13d5a8) + (1073741823 & _0x495245);
|
||||
return _0x3e0200 & _0x29d8a0 ? 2147483648 ^ _0x4483ad ^ _0x4a2b14 ^ _0x277a34 : _0x3e0200 | _0x29d8a0 ? 1073741824 & _0x4483ad ? 3221225472 ^ _0x4483ad ^ _0x4a2b14 ^ _0x277a34 : 1073741824 ^ _0x4483ad ^ _0x4a2b14 ^ _0x277a34 : _0x4483ad ^ _0x4a2b14 ^ _0x277a34;
|
||||
}
|
||||
function _0x380f30(_0x2cdd60, _0x2097b9, _0x1c76c2, _0x56dabc, _0x11be74, _0x520964, _0x10c05c) {
|
||||
var _0x448b56, _0x3467b4;
|
||||
_0x2cdd60 = _0x17df82(_0x2cdd60, _0x17df82(_0x17df82((_0x448b56 = _0x2097b9) & (_0x3467b4 = _0x1c76c2) | ~_0x448b56 & _0x56dabc, _0x11be74), _0x10c05c));
|
||||
return _0x17df82(_0x281fb1(_0x2cdd60, _0x520964), _0x2097b9);
|
||||
}
|
||||
function _0x3a2fea(_0x3496d2, _0xa835f4, _0x4b0689, _0x28f809, _0x31d708, _0xe34261, _0x142941) {
|
||||
var _0x4fb09f, _0x5693de, _0x717cb9;
|
||||
_0x3496d2 = _0x17df82(_0x3496d2, _0x17df82(_0x17df82((_0x4fb09f = _0xa835f4, _0x5693de = _0x4b0689, _0x4fb09f & (_0x717cb9 = _0x28f809) | _0x5693de & ~_0x717cb9), _0x31d708), _0x142941));
|
||||
return _0x17df82(_0x281fb1(_0x3496d2, _0xe34261), _0xa835f4);
|
||||
}
|
||||
function _0x287e85(_0x594a65, _0x105999, _0x133c00, _0x328af0, _0x5f0740, _0x1cbe3b, _0x471a72) {
|
||||
var _0x49bf36, _0x207593;
|
||||
_0x594a65 = _0x17df82(_0x594a65, _0x17df82(_0x17df82((_0x49bf36 = _0x105999) ^ (_0x207593 = _0x133c00) ^ _0x328af0, _0x5f0740), _0x471a72));
|
||||
return _0x17df82(_0x281fb1(_0x594a65, _0x1cbe3b), _0x105999);
|
||||
}
|
||||
function _0x24aacc(_0x5c2450, _0x1e6c02, _0x14a29b, _0x1f0edb, _0x492303, _0x3a47d7, _0x483035) {
|
||||
var _0x487ba7, _0x32e18d;
|
||||
_0x5c2450 = _0x17df82(_0x5c2450, _0x17df82(_0x17df82((_0x487ba7 = _0x1e6c02, (_0x32e18d = _0x14a29b) ^ (_0x487ba7 | ~_0x1f0edb)), _0x492303), _0x483035));
|
||||
return _0x17df82(_0x281fb1(_0x5c2450, _0x3a47d7), _0x1e6c02);
|
||||
}
|
||||
function _0x5605ed(_0x3bb9c6) {
|
||||
var _0x49292b,
|
||||
_0x11a540 = "",
|
||||
_0x31492e = "";
|
||||
for (_0x49292b = 0; 3 >= _0x49292b; _0x49292b++) {
|
||||
_0x11a540 += (_0x31492e = "0" + (_0x3bb9c6 >>> 8 * _0x49292b & 255).toString(16)).substr(_0x31492e.length - 2, 2);
|
||||
}
|
||||
return _0x11a540;
|
||||
}
|
||||
var _0x5601fb,
|
||||
_0x79644f,
|
||||
_0x517003,
|
||||
_0x5c3e9a,
|
||||
_0x2a131a,
|
||||
_0xc0171d,
|
||||
_0x5b4dca,
|
||||
_0x3cc98c,
|
||||
_0x56aa41,
|
||||
_0x4a5aff = [];
|
||||
for (_0x4a5aff = function (_0x265887) {
|
||||
for (var _0x15bbd8, _0x545869 = _0x265887.length, _0x1de657 = _0x545869 + 8, _0x4cbdc8 = 16 * ((_0x1de657 - _0x1de657 % 64) / 64 + 1), _0x1cd0e5 = Array(_0x4cbdc8 - 1), _0x3843ad = 0, _0x106475 = 0; _0x545869 > _0x106475;) {
|
||||
_0x15bbd8 = (_0x106475 - _0x106475 % 4) / 4;
|
||||
_0x3843ad = _0x106475 % 4 * 8;
|
||||
_0x1cd0e5[_0x15bbd8] = _0x1cd0e5[_0x15bbd8] | _0x265887.charCodeAt(_0x106475) << _0x3843ad;
|
||||
_0x106475++;
|
||||
}
|
||||
_0x15bbd8 = (_0x106475 - _0x106475 % 4) / 4;
|
||||
_0x3843ad = _0x106475 % 4 * 8;
|
||||
_0x1cd0e5[_0x15bbd8] = _0x1cd0e5[_0x15bbd8] | 128 << _0x3843ad;
|
||||
_0x1cd0e5[_0x4cbdc8 - 2] = _0x545869 << 3;
|
||||
_0x1cd0e5[_0x4cbdc8 - 1] = _0x545869 >>> 29;
|
||||
return _0x1cd0e5;
|
||||
}(_0x5e4e3f = function (_0x3c80e0) {
|
||||
_0x3c80e0 = _0x3c80e0.replace(/\r\n/g, "\n");
|
||||
for (var _0xa11f9f = "", _0x1c591b = 0; _0x1c591b < _0x3c80e0.length; _0x1c591b++) {
|
||||
var _0x226957 = _0x3c80e0.charCodeAt(_0x1c591b);
|
||||
128 > _0x226957 ? _0xa11f9f += String.fromCharCode(_0x226957) : _0x226957 > 127 && 2048 > _0x226957 ? (_0xa11f9f += String.fromCharCode(_0x226957 >> 6 | 192), _0xa11f9f += String.fromCharCode(63 & _0x226957 | 128)) : (_0xa11f9f += String.fromCharCode(_0x226957 >> 12 | 224), _0xa11f9f += String.fromCharCode(_0x226957 >> 6 & 63 | 128), _0xa11f9f += String.fromCharCode(63 & _0x226957 | 128));
|
||||
}
|
||||
return _0xa11f9f;
|
||||
}(_0x5e4e3f)), _0xc0171d = 1732584193, _0x5b4dca = 4023233417, _0x3cc98c = 2562383102, _0x56aa41 = 271733878, _0x5601fb = 0; _0x5601fb < _0x4a5aff.length; _0x5601fb += 16) {
|
||||
_0x79644f = _0xc0171d;
|
||||
_0x517003 = _0x5b4dca;
|
||||
_0x5c3e9a = _0x3cc98c;
|
||||
_0x2a131a = _0x56aa41;
|
||||
_0xc0171d = _0x380f30(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 0], 7, 3614090360);
|
||||
_0x56aa41 = _0x380f30(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 1], 12, 3905402710);
|
||||
_0x3cc98c = _0x380f30(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 2], 17, 606105819);
|
||||
_0x5b4dca = _0x380f30(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 3], 22, 3250441966);
|
||||
_0xc0171d = _0x380f30(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 4], 7, 4118548399);
|
||||
_0x56aa41 = _0x380f30(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 5], 12, 1200080426);
|
||||
_0x3cc98c = _0x380f30(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 6], 17, 2821735955);
|
||||
_0x5b4dca = _0x380f30(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 7], 22, 4249261313);
|
||||
_0xc0171d = _0x380f30(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 8], 7, 1770035416);
|
||||
_0x56aa41 = _0x380f30(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 9], 12, 2336552879);
|
||||
_0x3cc98c = _0x380f30(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 10], 17, 4294925233);
|
||||
_0x5b4dca = _0x380f30(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 11], 22, 2304563134);
|
||||
_0xc0171d = _0x380f30(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 12], 7, 1804603682);
|
||||
_0x56aa41 = _0x380f30(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 13], 12, 4254626195);
|
||||
_0x3cc98c = _0x380f30(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 14], 17, 2792965006);
|
||||
_0x5b4dca = _0x380f30(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 15], 22, 1236535329);
|
||||
_0xc0171d = _0x3a2fea(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 1], 5, 4129170786);
|
||||
_0x56aa41 = _0x3a2fea(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 6], 9, 3225465664);
|
||||
_0x3cc98c = _0x3a2fea(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 11], 14, 643717713);
|
||||
_0x5b4dca = _0x3a2fea(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 0], 20, 3921069994);
|
||||
_0xc0171d = _0x3a2fea(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 5], 5, 3593408605);
|
||||
_0x56aa41 = _0x3a2fea(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 10], 9, 38016083);
|
||||
_0x3cc98c = _0x3a2fea(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 15], 14, 3634488961);
|
||||
_0x5b4dca = _0x3a2fea(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 4], 20, 3889429448);
|
||||
_0xc0171d = _0x3a2fea(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 9], 5, 568446438);
|
||||
_0x56aa41 = _0x3a2fea(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 14], 9, 3275163606);
|
||||
_0x3cc98c = _0x3a2fea(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 3], 14, 4107603335);
|
||||
_0x5b4dca = _0x3a2fea(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 8], 20, 1163531501);
|
||||
_0xc0171d = _0x3a2fea(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 13], 5, 2850285829);
|
||||
_0x56aa41 = _0x3a2fea(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 2], 9, 4243563512);
|
||||
_0x3cc98c = _0x3a2fea(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 7], 14, 1735328473);
|
||||
_0x5b4dca = _0x3a2fea(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 12], 20, 2368359562);
|
||||
_0xc0171d = _0x287e85(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 5], 4, 4294588738);
|
||||
_0x56aa41 = _0x287e85(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 8], 11, 2272392833);
|
||||
_0x3cc98c = _0x287e85(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 11], 16, 1839030562);
|
||||
_0x5b4dca = _0x287e85(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 14], 23, 4259657740);
|
||||
_0xc0171d = _0x287e85(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 1], 4, 2763975236);
|
||||
_0x56aa41 = _0x287e85(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 4], 11, 1272893353);
|
||||
_0x3cc98c = _0x287e85(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 7], 16, 4139469664);
|
||||
_0x5b4dca = _0x287e85(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 10], 23, 3200236656);
|
||||
_0xc0171d = _0x287e85(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 13], 4, 681279174);
|
||||
_0x56aa41 = _0x287e85(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 0], 11, 3936430074);
|
||||
_0x3cc98c = _0x287e85(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 3], 16, 3572445317);
|
||||
_0x5b4dca = _0x287e85(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 6], 23, 76029189);
|
||||
_0xc0171d = _0x287e85(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 9], 4, 3654602809);
|
||||
_0x56aa41 = _0x287e85(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 12], 11, 3873151461);
|
||||
_0x3cc98c = _0x287e85(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 15], 16, 530742520);
|
||||
_0x5b4dca = _0x287e85(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 2], 23, 3299628645);
|
||||
_0xc0171d = _0x24aacc(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 0], 6, 4096336452);
|
||||
_0x56aa41 = _0x24aacc(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 7], 10, 1126891415);
|
||||
_0x3cc98c = _0x24aacc(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 14], 15, 2878612391);
|
||||
_0x5b4dca = _0x24aacc(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 5], 21, 4237533241);
|
||||
_0xc0171d = _0x24aacc(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 12], 6, 1700485571);
|
||||
_0x56aa41 = _0x24aacc(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 3], 10, 2399980690);
|
||||
_0x3cc98c = _0x24aacc(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 10], 15, 4293915773);
|
||||
_0x5b4dca = _0x24aacc(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 1], 21, 2240044497);
|
||||
_0xc0171d = _0x24aacc(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 8], 6, 1873313359);
|
||||
_0x56aa41 = _0x24aacc(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 15], 10, 4264355552);
|
||||
_0x3cc98c = _0x24aacc(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 6], 15, 2734768916);
|
||||
_0x5b4dca = _0x24aacc(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 13], 21, 1309151649);
|
||||
_0xc0171d = _0x24aacc(_0xc0171d, _0x5b4dca, _0x3cc98c, _0x56aa41, _0x4a5aff[_0x5601fb + 4], 6, 4149444226);
|
||||
_0x56aa41 = _0x24aacc(_0x56aa41, _0xc0171d, _0x5b4dca, _0x3cc98c, _0x4a5aff[_0x5601fb + 11], 10, 3174756917);
|
||||
_0x3cc98c = _0x24aacc(_0x3cc98c, _0x56aa41, _0xc0171d, _0x5b4dca, _0x4a5aff[_0x5601fb + 2], 15, 718787259);
|
||||
_0x5b4dca = _0x24aacc(_0x5b4dca, _0x3cc98c, _0x56aa41, _0xc0171d, _0x4a5aff[_0x5601fb + 9], 21, 3951481745);
|
||||
_0xc0171d = _0x17df82(_0xc0171d, _0x79644f);
|
||||
_0x5b4dca = _0x17df82(_0x5b4dca, _0x517003);
|
||||
_0x3cc98c = _0x17df82(_0x3cc98c, _0x5c3e9a);
|
||||
_0x56aa41 = _0x17df82(_0x56aa41, _0x2a131a);
|
||||
}
|
||||
return (_0x5605ed(_0xc0171d) + _0x5605ed(_0x5b4dca) + _0x5605ed(_0x3cc98c) + _0x5605ed(_0x56aa41)).toLowerCase();
|
||||
}
|
||||
630
脚本库/web版/账密/百度收录/2025-08-25_bdsl_8027f638.js
Normal file
630
脚本库/web版/账密/百度收录/2025-08-25_bdsl_8027f638.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/百度热搜榜/2025-08-25_bdhot_7149be26.js
Normal file
630
脚本库/web版/账密/百度热搜榜/2025-08-25_bdhot_7149be26.js
Normal file
File diff suppressed because one or more lines are too long
603
脚本库/web版/账密/看雪论坛/2025-08-25_ql_kanxue_6aeb8664.js
Normal file
603
脚本库/web版/账密/看雪论坛/2025-08-25_ql_kanxue_6aeb8664.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/知乎热搜榜/2025-08-25_zhhot_4d73713f.js
Normal file
630
脚本库/web版/账密/知乎热搜榜/2025-08-25_zhhot_4d73713f.js
Normal file
File diff suppressed because one or more lines are too long
569
脚本库/web版/账密/短网址生成/2025-08-25_dwz_74555928.js
Normal file
569
脚本库/web版/账密/短网址生成/2025-08-25_dwz_74555928.js
Normal file
File diff suppressed because one or more lines are too long
540
脚本库/web版/账密/硬声/2026-05-14_yingsheng_2e324775.js
Normal file
540
脚本库/web版/账密/硬声/2026-05-14_yingsheng_2e324775.js
Normal file
@@ -0,0 +1,540 @@
|
||||
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/yingsheng.js
|
||||
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/yingsheng.js
|
||||
// # Repo: smallfawn/QLScriptPublic
|
||||
// # Path: daily/yingsheng.js
|
||||
// # UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
// # SHA256: 2e3247750a23257df4001154edfad1f6aede0cc2bd147a83b7860ee66ce6f4c5
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
------------------------------------------
|
||||
@Author:
|
||||
@Date: 2024.06.07 19:15
|
||||
@Description: 硬声APP的自动化任务程序
|
||||
cron: 12 12 * * *
|
||||
------------------------------------------
|
||||
yingsheng
|
||||
账号#密码 或者 请求头authorization#userid
|
||||
多账户&或换行
|
||||
#Notice:
|
||||
⚠️【免责声明】
|
||||
------------------------------------------
|
||||
1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。
|
||||
2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
|
||||
3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。
|
||||
4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
|
||||
5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。
|
||||
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。
|
||||
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。
|
||||
*/
|
||||
const { Env } = require("../tools/env")
|
||||
const $ = new Env("硬声");
|
||||
let ckName = `yingsheng`;
|
||||
const strSplitor = "#";
|
||||
const axios = require("axios");
|
||||
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
|
||||
const CryptoJS = require('crypto-js');
|
||||
let param_version = '2.8.0'
|
||||
let salt = 'lw0270iBJzxXdJLRtePEENsauRzkHSqm'
|
||||
|
||||
|
||||
let AES_key = 'q09cRVOPCnfJzt7p'
|
||||
let AES_IV = 'cnry8k3o4WdCGU1T'
|
||||
class Task {
|
||||
constructor(env) {
|
||||
this.index = $.userIdx++
|
||||
let user = env.split(strSplitor);
|
||||
|
||||
this.name = user[0];
|
||||
this.passwd = user[1];
|
||||
this.auth = '';
|
||||
this.device_id = '07cdc486c91ca0457e4263cfa9667aa7od'
|
||||
this.valid = false;
|
||||
this.coins = 0;
|
||||
this.user_id = null;
|
||||
this.userIdList = []; // 用于关注任务
|
||||
this.TASK_WAIT_TIME = 1000; // 请求间隔
|
||||
}
|
||||
calculateSign(params, apiType) {
|
||||
|
||||
params['Authorization'] = this.auth
|
||||
params['timestamp'] = Math.floor(new Date().getTime() / 1000)
|
||||
if (apiType == 'yingsheng') {
|
||||
params['platform'] = 'h5'
|
||||
console.log(salt + this.SHA1Encrypt($.jsonToStr(params, '&')) + this.auth)
|
||||
params['sign'] = this.SHA1Encrypt(salt + this.SHA1Encrypt($.jsonToStr(params, '&')) + this.auth)
|
||||
}
|
||||
if (apiType == 'ysapi') {
|
||||
params['platform'] = 'android'
|
||||
console.log($.jsonToStr(params, '&', true) + AES_IV + AES_key)
|
||||
console.log(AES_IV + AES_key + this.SHA1Encrypt($.jsonToStr(params, '&', true) + AES_IV + AES_key) + this.auth)
|
||||
params['sign'] = this.SHA1Encrypt(AES_IV + AES_key + this.SHA1Encrypt($.jsonToStr(params, '&', true) + AES_IV + AES_key) + this.auth)
|
||||
}
|
||||
params['version'] = param_version
|
||||
return {
|
||||
"Authorization": params['Authorization'],
|
||||
"timestamp": params['timestamp'],
|
||||
"platform": params['platform'],
|
||||
"sign": params['sign'],
|
||||
"version": params['version']
|
||||
}
|
||||
}
|
||||
SHA1Encrypt(message) {
|
||||
//实现SHA1
|
||||
return CryptoJS.SHA1(message).toString();
|
||||
}
|
||||
|
||||
EncryptCrypto(message) {
|
||||
return CryptoJS.AES.encrypt(
|
||||
CryptoJS.enc.Utf8.parse(message),
|
||||
CryptoJS.enc.Utf8.parse(AES_key),
|
||||
{ mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7, iv: CryptoJS.enc.Utf8.parse(AES_IV) }
|
||||
).ciphertext.toString(CryptoJS.enc.Base64) + '\n';
|
||||
}
|
||||
async run() {
|
||||
console.log(`\n============= 账号[${this.name}] =============`)
|
||||
//检测如果this.name 如果不是11位手机号 并且是数字
|
||||
if (this.name.length == 11 && !isNaN(this.name)) {
|
||||
await this.login();
|
||||
} else {
|
||||
this.auth = this.name
|
||||
this.valid = true
|
||||
this.user_id = this.passwd
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!this.valid) return;
|
||||
console.log(`----------- 签到 -----------`)
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.getSignStatus();
|
||||
console.log(`----------- 任务 -----------`)
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.getTaskList();
|
||||
console.log(`----------- 积分 -----------`)
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.getInfo();
|
||||
}
|
||||
|
||||
async login() {
|
||||
try {
|
||||
let pwd = this.EncryptCrypto(this.passwd)
|
||||
console.log(pwd)
|
||||
let param = { 'account': this.name, 'password': pwd, 'device_id': this.device_id }
|
||||
let url = `https://ysapi.elecfans.com/api/sso/accountLogin`
|
||||
let body = $.jsonToStr(param, '&', true)
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
this.valid = true
|
||||
this.name = result.data.mobile
|
||||
this.coins = result.data.coins
|
||||
this.auth = result.data.Authorization
|
||||
this.user_id = result.data.user_id
|
||||
console.log(`登录成功`)
|
||||
console.log(`手机:${this.name}`)
|
||||
console.log(`硬币:${this.coins}`)
|
||||
} else {
|
||||
console.log(`登录失败: ${JSON.stringify(result)}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
} finally { }
|
||||
}
|
||||
|
||||
async getInfo() {
|
||||
try {
|
||||
let param = { 'user_id': this.user_id }
|
||||
let url = `https://ysapi.elecfans.com/api/member/getInfo?${$.jsonToStr(param, '&')}`
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'get',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
this.coins = result.data.coins
|
||||
console.log(`硬币:${this.coins}`)
|
||||
} else {
|
||||
console.log(`查询账户失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async getSignStatus() {
|
||||
try {
|
||||
let param = { 'date': '' }
|
||||
let url = `https://yingsheng.elecfans.com/ysapi/wapi/activity/signin/data?${$.jsonToStr(param, '&')}`
|
||||
let headersParams = this.calculateSign(param, 'yingsheng')
|
||||
let options = {
|
||||
method: 'get',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
if (result.data.data.today_is_sign == 1) {
|
||||
console.log(`今日已签到`)
|
||||
} else {
|
||||
console.log(`今日未签到`)
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.signin();
|
||||
}
|
||||
} else {
|
||||
console.log(`查询签到状态失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async signin() {
|
||||
try {
|
||||
let param = { 'date': '' }
|
||||
let url = `https://yingsheng.elecfans.com/ysapi/wapi/activity/signin/signin`
|
||||
let body = JSON.stringify(param)
|
||||
let headersParams = this.calculateSign(param, 'yingsheng')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
console.log(`签到成功,获得${result.data.coins}硬币`)
|
||||
} else {
|
||||
console.log(`签到失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
// ---------- 任务相关方法 ----------
|
||||
async getTaskList() {
|
||||
try {
|
||||
let param = {}
|
||||
let url = `https://yingsheng.elecfans.com/ysapi/wapi/activity/task/dailyList`
|
||||
let headersParams = this.calculateSign(param, 'yingsheng')
|
||||
let options = {
|
||||
method: 'get',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.recommendList(); // 获取推荐用户列表用于关注任务
|
||||
for (let key in result.data) {
|
||||
let task = result.data[key]
|
||||
if (task.title.includes('发布作品') || task.title.includes('作品播放量')) continue;
|
||||
if (task.title.indexOf('观看作品') > -1) {
|
||||
for (let idx in task.step) {
|
||||
if (task.step[idx].com_status == 12) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.receiveCoin(task);
|
||||
break;
|
||||
} else if (task.step[idx].com_status != 13) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.viewVideoAdd(idx);
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.receiveCoin(task);
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (let idx in task.step) {
|
||||
let step = task.step[idx]
|
||||
if (step.com_status == 10) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.taskReceive(task);
|
||||
}
|
||||
if (step.com_status == 12) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.receiveCoin(task);
|
||||
} else if (step.com_status != 13) {
|
||||
let num = step.condition < 25 ? (step.condition - step.finish_progress) : 1
|
||||
let getReward = true;
|
||||
for (let i = 0; i < num; i++) {
|
||||
if (task.title.indexOf('点赞') > -1) {
|
||||
let rndIdx = Math.floor(Math.random() * 2000) + 8000
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.thumbsup(rndIdx);
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.thumbsup(rndIdx);
|
||||
} else if (task.title.indexOf('观看直播') > -1) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.finishLive();
|
||||
} else if (task.title.indexOf('关注') > -1) {
|
||||
let uid = this.userIdList[i] ? this.userIdList[i] : Math.floor(Math.random() * 100000) + 4900000
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.doFollow(uid, 1);
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.doFollow(uid, 2);
|
||||
} else {
|
||||
getReward = false;
|
||||
}
|
||||
}
|
||||
if (getReward) {
|
||||
await $.wait(this.TASK_WAIT_TIME);
|
||||
await this.receiveCoin(task);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
console.log(`查询任务列表失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async taskReceive(task) {
|
||||
try {
|
||||
let param = { 'type': task.type }
|
||||
let url = `https://yingsheng.elecfans.com/ysapi/wapi/activity/task/receive`
|
||||
let body = JSON.stringify(param)
|
||||
let headersParams = this.calculateSign(param, 'yingsheng')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
console.log(`开始任务[${task.title}]成功`)
|
||||
} else {
|
||||
console.log(`开始任务[${task.title}]失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async receiveCoin(task) {
|
||||
try {
|
||||
let param = { 'type': task.type }
|
||||
let url = `https://yingsheng.elecfans.com/ysapi/wapi/activity/task/receiveCoin`
|
||||
let body = JSON.stringify(param)
|
||||
let headersParams = this.calculateSign(param, 'yingsheng')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/json"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
console.log(`领取任务[${task.title}]奖励获得${result.data.coins}硬币`)
|
||||
} else {
|
||||
console.log(`领取任务[${task.title}]奖励失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async thumbsup(video_id) {
|
||||
try {
|
||||
let param = { 'video_id': video_id }
|
||||
let url = `https://ysapi.elecfans.com/api/video/publish/thumbsup`
|
||||
let body = $.jsonToStr(param, '&')
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
console.log(`${result.data.msg}: video_id=${video_id}`)
|
||||
} else {
|
||||
console.log(`点赞[video_id=${video_id}]失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async viewVideoAdd(step) {
|
||||
try {
|
||||
let param = { 'step': step }
|
||||
let url = `https://ysapi.elecfans.com/api/activity/task/viewVideo/add`
|
||||
let body = $.jsonToStr(param, '&')
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
console.log(`刷新看视频进度[step=${step}]成功`)
|
||||
} else {
|
||||
console.log(`刷新看视频进度[step=${step}]失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async finishLive() {
|
||||
try {
|
||||
let param = {}
|
||||
let url = `https://ysapi.elecfans.com/api/activity/task/live/finish`
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
data: ''
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
console.log(`完成观看直播任务成功`)
|
||||
} else {
|
||||
console.log(`完成观看直播任务失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async recommendList() {
|
||||
try {
|
||||
let param = { page: 1 }
|
||||
let url = `https://ysapi.elecfans.com/api/recommend/video/index?page=1`
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'get',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
if (result.code == 0) {
|
||||
for (let item of result.data.data) {
|
||||
this.userIdList.push(item.user_id)
|
||||
}
|
||||
} else {
|
||||
console.log(`获取推荐列表失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
|
||||
async doFollow(user_id, type) {
|
||||
try {
|
||||
let param = { 'user_id': user_id, 'type': type }
|
||||
let url = `https://ysapi.elecfans.com/api/member/follow`
|
||||
let body = $.jsonToStr(param, '&')
|
||||
let headersParams = this.calculateSign(param, 'ysapi')
|
||||
let options = {
|
||||
method: 'post',
|
||||
url,
|
||||
headers: {
|
||||
...headersParams,
|
||||
"User-Agent": defaultUserAgent,
|
||||
"Content-Type": "application/x-www-form-urlencoded"
|
||||
},
|
||||
data: body
|
||||
}
|
||||
let { data: result } = await axios.request(options)
|
||||
let str = type == 1 ? '关注' : '取消关注'
|
||||
if (result.code == 0) {
|
||||
console.log(`${str}用户[${user_id}]成功`)
|
||||
} else {
|
||||
console.log(`${str}用户[${user_id}]失败: ${result.message}`)
|
||||
}
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
!(async () => {
|
||||
await getNotice()
|
||||
$.checkEnv(ckName);
|
||||
|
||||
for (let user of $.userList) {
|
||||
await new Task(user).run();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done());
|
||||
|
||||
async function getNotice() {
|
||||
try {
|
||||
let options = {
|
||||
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
|
||||
headers: {
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
timeout: 3000
|
||||
}
|
||||
let {
|
||||
data: res
|
||||
} = await axios.request(options);
|
||||
$.log(res)
|
||||
return res
|
||||
} catch (e) { }
|
||||
|
||||
}
|
||||
637
脚本库/web版/账密/神回复/2025-08-25_shenhuifu_2d02f196.js
Normal file
637
脚本库/web版/账密/神回复/2025-08-25_shenhuifu_2d02f196.js
Normal file
File diff suppressed because one or more lines are too long
985
脚本库/web版/账密/福田e家/2025-06-28_福田e家_2681de89.js
Normal file
985
脚本库/web版/账密/福田e家/2025-06-28_福田e家_2681de89.js
Normal file
File diff suppressed because one or more lines are too long
627
脚本库/web版/账密/科研通/2025-08-25_ql_kyt_1d04491e.js
Normal file
627
脚本库/web版/账密/科研通/2025-08-25_ql_kyt_1d04491e.js
Normal file
File diff suppressed because one or more lines are too long
890
脚本库/web版/账密/移动云盘/2025-06-28_移动云盘_4e6ef37b.py
Normal file
890
脚本库/web版/账密/移动云盘/2025-06-28_移动云盘_4e6ef37b.py
Normal file
@@ -0,0 +1,890 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%A7%BB%E5%8A%A8%E4%BA%91%E7%9B%98.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%A7%BB%E5%8A%A8%E4%BA%91%E7%9B%98.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 移动云盘.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: 4e6ef37b7f18f2ba813cddfef30964fd1a284fca7eb0abd17c2b542b7c77a0e8
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
# 脚本名称: [中国移动云盘]
|
||||
# 功能描述: [签到 基础任务 果园 云朵大作战]
|
||||
# 使用说明:
|
||||
# - [抓包 Cookie:任意Authorization]
|
||||
# - [注意事项: 简易方法,开抓包进App,搜refresh,找到authTokenRefresh.do ,请求头中的Authorization,响应体<token> xxx</token> 中xxx值(新版加密抓这个)]
|
||||
# 环境变量设置:
|
||||
# - 名称:[ydypCK] 格式:[Authorization值#手机号#token值]
|
||||
# - 多账号处理方式:[换行或者&分割]
|
||||
# 定时设置: [0 0 8,16,20 * * *]
|
||||
# 更新日志:
|
||||
# - [1.30]: [同一环境变量获取]
|
||||
# 注: 本脚本仅用于个人学习和交流,请勿用于非法用途。作者不承担由于滥用此脚本所引起的任何责任,请在下载后24小时内删除。
|
||||
# new Env("移动云盘")
|
||||
#TL库:https://github.com/3288588344/toulu.git
|
||||
#tg频道:https://t.me/TLtoulu
|
||||
#QQ频道:https://pd.qq.com/s/672fku8ge
|
||||
#微信机器人:kckl6688
|
||||
#公众号:哆啦A梦的藏宝箱
|
||||
import os
|
||||
import random
|
||||
import re
|
||||
import time
|
||||
from os import path
|
||||
|
||||
import requests
|
||||
|
||||
ua = 'Mozilla/5.0 (Linux; Android 11; M2012K10C Build/RP1A.200720.011; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/90.0.4430.210 Mobile Safari/537.36 MCloudApp/10.0.1'
|
||||
|
||||
err_accounts = '' # 异常账号
|
||||
err_message = '' # 错误信息
|
||||
user_amount = '' # 用户云朵·数量
|
||||
GLOBAL_DEBUG = False
|
||||
|
||||
|
||||
# 发送通知
|
||||
def load_send():
|
||||
cur_path = path.abspath(path.dirname(__file__))
|
||||
notify_file = cur_path + "/notify.py"
|
||||
|
||||
if path.exists(notify_file):
|
||||
try:
|
||||
from notify import send # 导入模块的send为notify_send
|
||||
print("加载通知服务成功!")
|
||||
return send # 返回导入的函数
|
||||
except ImportError:
|
||||
print("加载通知服务失败~")
|
||||
else:
|
||||
print("加载通知服务失败~")
|
||||
|
||||
return False # 返回False表示未成功加载通知服务
|
||||
|
||||
|
||||
class YP:
|
||||
def __init__(self, cookie):
|
||||
self.notebook_id = None
|
||||
self.note_token = None
|
||||
self.note_auth = None
|
||||
self.click_num = 15 # 定义抽奖次数和摇一摇戳一戳次数
|
||||
self.draw = 1 # 抽奖次数,首次免费
|
||||
self.session = requests.Session()
|
||||
|
||||
self.timestamp = str(int(round(time.time() * 1000)))
|
||||
self.cookies = {'sensors_stay_time': self.timestamp}
|
||||
self.Authorization = cookie.split("#")[0]
|
||||
self.account = cookie.split("#")[1]
|
||||
self.auth_token = cookie.split("#")[2]
|
||||
self.encrypt_account = self.account[:3] + "*" * 4 + self.account[7:]
|
||||
self.fruit_url = 'https://happy.mail.10086.cn/jsp/cn/garden/'
|
||||
|
||||
self.jwtHeaders = {
|
||||
'User-Agent': ua,
|
||||
'Accept': '*/*',
|
||||
'Host': 'caiyun.feixin.10086.cn:7071',
|
||||
}
|
||||
self.treeHeaders = {
|
||||
'Host': 'happy.mail.10086.cn',
|
||||
'Accept': 'application/json, text/plain, */*',
|
||||
'User-Agent': ua,
|
||||
'Referer': 'https://happy.mail.10086.cn/jsp/cn/garden/wap/index.html?sourceid=1003',
|
||||
'Cookie': '',
|
||||
}
|
||||
|
||||
# 捕获异常
|
||||
|
||||
def catch_errors(func):
|
||||
def wrapper(self, *args, **kwargs):
|
||||
try:
|
||||
return func(self, *args, **kwargs)
|
||||
except Exception as e:
|
||||
global err_message
|
||||
print("错误:", str(e))
|
||||
err_message += f'用户[{self.encrypt_account}]:{e}\n' # 错误信息
|
||||
return None
|
||||
|
||||
return wrapper
|
||||
|
||||
@catch_errors
|
||||
def run(self):
|
||||
if self.jwt():
|
||||
self.signin_status()
|
||||
self.click()
|
||||
# 任务
|
||||
self.get_tasklist(url = 'sign_in_3', app_type = 'cloud_app')
|
||||
print(f'\n☁️ 云朵大作战')
|
||||
self.cloud_game()
|
||||
print(f'\n🌳 果园任务')
|
||||
self.fruitLogin()
|
||||
print(f'\n📰 公众号任务')
|
||||
self.wxsign()
|
||||
self.shake()
|
||||
self.surplus_num()
|
||||
print(f'\n🔥 热门任务')
|
||||
self.backup_cloud()
|
||||
self.open_send()
|
||||
print(f'\n📧 139邮箱任务')
|
||||
self.get_tasklist(url = 'newsign_139mail', app_type = 'email_app')
|
||||
self.receive()
|
||||
else:
|
||||
global err_accounts
|
||||
# 失效账号
|
||||
err_accounts += f'{self.encrypt_account}\n'
|
||||
|
||||
@catch_errors
|
||||
def send_request(self, url, headers=None, cookies=None, data=None, params=None, method='GET', debug=None,
|
||||
retries=5):
|
||||
|
||||
debug = debug if debug is not None else GLOBAL_DEBUG
|
||||
|
||||
self.session.headers.update(headers or {})
|
||||
if cookies:
|
||||
self.session.cookies.update(cookies)
|
||||
request_args = {'json': data} if isinstance(data, dict) else {'data': data}
|
||||
|
||||
for attempt in range(retries):
|
||||
try:
|
||||
response = self.session.request(method, url, params = params, **request_args)
|
||||
response.raise_for_status()
|
||||
if debug:
|
||||
print(f'\n【{url}】响应数据:\n{response.text}')
|
||||
return response
|
||||
except (requests.RequestException, ConnectionError, TimeoutError) as e:
|
||||
print(f"请求异常: {e}")
|
||||
if attempt >= retries - 1:
|
||||
print("达到最大重试次数。")
|
||||
return None
|
||||
time.sleep(1)
|
||||
|
||||
# 随机延迟默认1-1.5s
|
||||
def sleep(self, min_delay=1, max_delay=1.5):
|
||||
delay = random.uniform(min_delay, max_delay)
|
||||
time.sleep(delay)
|
||||
|
||||
# 日志
|
||||
def log_info(self, err_msg=None, amount=None):
|
||||
global err_message, user_amount
|
||||
if err_msg is not None:
|
||||
err_message += f'用户[{self.encrypt_account}]:{err_msg}\n' # 错误信息
|
||||
elif amount is not None:
|
||||
user_amount += f'用户[{self.encrypt_account}]:{amount}\n' # 云朵数量
|
||||
|
||||
# 刷新令牌
|
||||
def sso(self):
|
||||
sso_url = 'https://orches.yun.139.com/orchestration/auth-rebuild/token/v1.0/querySpecToken'
|
||||
sso_headers = {
|
||||
'Authorization': self.Authorization,
|
||||
'User-Agent': ua,
|
||||
'Content-Type': 'application/json',
|
||||
'Accept': '*/*',
|
||||
'Host': 'orches.yun.139.com'
|
||||
}
|
||||
sso_payload = {"account": self.account, "toSourceId": "001005"}
|
||||
sso_data = self.send_request(sso_url, headers = sso_headers, data = sso_payload, method = 'POST').json()
|
||||
|
||||
if sso_data['success']:
|
||||
refresh_token = sso_data['data']['token']
|
||||
return refresh_token
|
||||
else:
|
||||
print(sso_data['message'])
|
||||
return None
|
||||
|
||||
# jwt
|
||||
def jwt(self):
|
||||
# 获取jwttoken
|
||||
token = self.sso()
|
||||
if token is not None:
|
||||
|
||||
jwt_url = f"https://caiyun.feixin.10086.cn:7071/portal/auth/tyrzLogin.action?ssoToken={token}"
|
||||
jwt_data = self.send_request(jwt_url, headers = self.jwtHeaders, method = 'POST').json()
|
||||
if jwt_data['code'] != 0:
|
||||
print(jwt_data['msg'])
|
||||
return False
|
||||
self.jwtHeaders['jwtToken'] = jwt_data['result']['token']
|
||||
self.cookies['jwtToken'] = jwt_data['result']['token']
|
||||
return True
|
||||
else:
|
||||
print('-ck可能失效了')
|
||||
return False
|
||||
|
||||
# 签到查询
|
||||
@catch_errors
|
||||
def signin_status(self):
|
||||
self.sleep()
|
||||
check_url = 'https://caiyun.feixin.10086.cn/market/signin/page/info?client=app'
|
||||
check_data = self.send_request(check_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
if check_data['msg'] == 'success':
|
||||
today_sign_in = check_data['result'].get('todaySignIn', False)
|
||||
|
||||
if today_sign_in:
|
||||
print('✅已签到')
|
||||
else:
|
||||
print('❌ 未签到')
|
||||
signin_url = 'https://caiyun.feixin.10086.cn/market/manager/commonMarketconfig/getByMarketRuleName?marketName=sign_in_3'
|
||||
signin_data = self.send_request(signin_url, headers = self.jwtHeaders,
|
||||
cookies = self.cookies).json()
|
||||
|
||||
if signin_data['msg'] == 'success':
|
||||
print('✅签到成功')
|
||||
else:
|
||||
print(signin_data['msg'])
|
||||
self.log_info(signin_data['msg'])
|
||||
else:
|
||||
print(check_data['msg'])
|
||||
self.log_info(check_data['msg'])
|
||||
|
||||
# 戳一下
|
||||
def click(self):
|
||||
url = "https://caiyun.feixin.10086.cn/market/signin/task/click?key=task&id=319"
|
||||
successful_click = 0 # 获得次数
|
||||
|
||||
try:
|
||||
for _ in range(self.click_num):
|
||||
return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
time.sleep(0.2)
|
||||
|
||||
if 'result' in return_data:
|
||||
print(f'✅{return_data["result"]}')
|
||||
successful_click += 1
|
||||
|
||||
if successful_click == 0:
|
||||
print(f'❌未获得 x {self.click_num}')
|
||||
except Exception as e:
|
||||
print(f'错误信息:{e}')
|
||||
|
||||
# 刷新笔记token
|
||||
@catch_errors
|
||||
def refresh_notetoken(self):
|
||||
note_url = 'http://mnote.caiyun.feixin.10086.cn/noteServer/api/authTokenRefresh.do'
|
||||
note_payload = {
|
||||
"authToken": self.auth_token,
|
||||
"userPhone": self.account
|
||||
}
|
||||
note_headers = {
|
||||
'X-Tingyun-Id': 'p35OnrDoP8k;c=2;r=1122634489;u=43ee994e8c3a6057970124db00b2442c::8B3D3F05462B6E4C',
|
||||
'Charset': 'UTF-8',
|
||||
'Connection': 'Keep-Alive',
|
||||
'User-Agent': 'mobile',
|
||||
'APP_CP': 'android',
|
||||
'CP_VERSION': '3.2.0',
|
||||
'x-huawei-channelsrc': '10001400',
|
||||
'Host': 'mnote.caiyun.feixin.10086.cn',
|
||||
'Content-Type': 'application/json; charset=UTF-8',
|
||||
'Accept-Encoding': 'gzip'
|
||||
}
|
||||
|
||||
try:
|
||||
response = self.send_request(note_url, headers = note_headers, data = note_payload, method = "POST")
|
||||
response.raise_for_status()
|
||||
except requests.exceptions.RequestException as e:
|
||||
print('出错了:', e)
|
||||
return
|
||||
|
||||
self.note_token = response.headers.get('NOTE_TOKEN')
|
||||
self.note_auth = response.headers.get('APP_AUTH')
|
||||
|
||||
# 任务列表
|
||||
def get_tasklist(self, url, app_type):
|
||||
url = f'https://caiyun.feixin.10086.cn/market/signin/task/taskList?marketname={url}'
|
||||
return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
self.sleep()
|
||||
# 任务列表
|
||||
task_list = return_data.get('result', {})
|
||||
|
||||
try:
|
||||
for task_type, tasks in task_list.items():
|
||||
if task_type in ["new", "hidden", "hiddenabc"]:
|
||||
continue
|
||||
if app_type == 'cloud_app':
|
||||
if task_type == "month":
|
||||
print('\n📆 云盘每月任务')
|
||||
for month in tasks:
|
||||
task_id = month.get('id')
|
||||
if task_id in [110, 113, 417, 409]:
|
||||
continue
|
||||
task_name = month.get('name', '')
|
||||
task_status = month.get('state', '')
|
||||
|
||||
if task_status == 'FINISH':
|
||||
print(f'-已完成: {task_name}')
|
||||
continue
|
||||
print(f'-去完成: {task_name}')
|
||||
self.do_task(task_id, task_type = 'month', app_type = 'cloud_app')
|
||||
time.sleep(2)
|
||||
elif task_type == "day":
|
||||
print('\n📆 云盘每日任务')
|
||||
for day in tasks:
|
||||
task_id = day.get('id')
|
||||
if task_id == 404:
|
||||
continue
|
||||
task_name = day.get('name')
|
||||
task_status = day.get('state', '')
|
||||
|
||||
if task_status == 'FINISH':
|
||||
print(f'-已完成: {task_name}')
|
||||
continue
|
||||
print(f'-去完成: {task_name}')
|
||||
self.do_task(task_id, task_type = 'day', app_type = 'cloud_app')
|
||||
elif app_type == 'email_app':
|
||||
if task_type == "month":
|
||||
print('\n📆 139邮箱每月任务')
|
||||
for month in tasks:
|
||||
task_id = month.get('id')
|
||||
task_name = month.get('name', '')
|
||||
task_status = month.get('state', '')
|
||||
if task_id in [1004, 1005, 1015, 1020]:
|
||||
continue
|
||||
|
||||
if task_status == 'FINISH':
|
||||
print(f'-已完成: {task_name}')
|
||||
continue
|
||||
print(f'-去完成: {task_name}')
|
||||
self.do_task(task_id, task_type = 'month', app_type = 'email_app')
|
||||
time.sleep(2)
|
||||
except Exception as e:
|
||||
print(f'错误信息:{e}')
|
||||
|
||||
# 做任务
|
||||
@catch_errors
|
||||
def do_task(self, task_id, task_type, app_type):
|
||||
self.sleep()
|
||||
task_url = f'https://caiyun.feixin.10086.cn/market/signin/task/click?key=task&id={task_id}'
|
||||
self.send_request(task_url, headers = self.jwtHeaders, cookies = self.cookies)
|
||||
|
||||
if app_type == 'cloud_app':
|
||||
if task_type == 'day':
|
||||
if task_id == 106:
|
||||
print('-开始上传文件,默认0kb')
|
||||
self.updata_file()
|
||||
elif task_id == 107:
|
||||
self.refresh_notetoken()
|
||||
print('-获取默认笔记id')
|
||||
note_url = 'http://mnote.caiyun.feixin.10086.cn/noteServer/api/syncNotebookV3.do'
|
||||
headers = {
|
||||
'X-Tingyun-Id': 'p35OnrDoP8k;c=2;r=1122634489;u=43ee994e8c3a6057970124db00b2442c::8B3D3F05462B6E4C',
|
||||
'Charset': 'UTF-8',
|
||||
'Connection': 'Keep-Alive',
|
||||
'User-Agent': 'mobile',
|
||||
'APP_CP': 'android',
|
||||
'CP_VERSION': '3.2.0',
|
||||
'x-huawei-channelsrc': '10001400',
|
||||
'APP_NUMBER': self.account,
|
||||
'APP_AUTH': self.note_auth,
|
||||
'NOTE_TOKEN': self.note_token,
|
||||
'Host': 'mnote.caiyun.feixin.10086.cn',
|
||||
'Content-Type': 'application/json; charset=UTF-8',
|
||||
'Accept': '*/*'
|
||||
}
|
||||
payload = {
|
||||
"addNotebooks": [],
|
||||
"delNotebooks": [],
|
||||
"notebookRefs": [],
|
||||
"updateNotebooks": []
|
||||
}
|
||||
return_data = self.send_request(url = note_url, headers = headers, data = payload,
|
||||
method = 'POST').json()
|
||||
if return_data is None:
|
||||
return print('出错了')
|
||||
self.notebook_id = return_data['notebooks'][0]['notebookId']
|
||||
print('开始创建笔记')
|
||||
self.create_note(headers)
|
||||
elif task_type == 'month':
|
||||
pass
|
||||
elif app_type == 'email_app':
|
||||
if task_type == 'month':
|
||||
pass
|
||||
|
||||
# 上传文件
|
||||
@catch_errors
|
||||
def updata_file(self):
|
||||
url = 'http://ose.caiyun.feixin.10086.cn/richlifeApp/devapp/IUploadAndDownload'
|
||||
headers = {
|
||||
'x-huawei-uploadSrc': '1',
|
||||
'x-ClientOprType': '11',
|
||||
'Connection': 'keep-alive',
|
||||
'x-NetType': '6',
|
||||
'x-DeviceInfo': '6|127.0.0.1|1|10.0.1|Xiaomi|M2012K10C|CB63218727431865A48E691BFFDB49A1|02-00-00-00-00-00|android 11|1080X2272|zh||||032|',
|
||||
'x-huawei-channelSrc': '10000023',
|
||||
'x-MM-Source': '032',
|
||||
'x-SvcType': '1',
|
||||
'APP_NUMBER': self.account,
|
||||
'Authorization': self.Authorization,
|
||||
'X-Tingyun-Id': 'p35OnrDoP8k;c=2;r=1955442920;u=43ee994e8c3a6057970124db00b2442c::8B3D3F05462B6E4C',
|
||||
'Host': 'ose.caiyun.feixin.10086.cn',
|
||||
'User-Agent': 'okhttp/3.11.0',
|
||||
'Content-Type': 'application/xml; charset=UTF-8',
|
||||
'Accept': '*/*'
|
||||
}
|
||||
payload = '''
|
||||
<pcUploadFileRequest>
|
||||
<ownerMSISDN>{phone}</ownerMSISDN>
|
||||
<fileCount>1</fileCount>
|
||||
<totalSize>1</totalSize>
|
||||
<uploadContentList length="1">
|
||||
<uploadContentInfo>
|
||||
<comlexFlag>0</comlexFlag>
|
||||
<contentDesc><![CDATA[]]></contentDesc>
|
||||
<contentName><![CDATA[000000.txt]]></contentName>
|
||||
<contentSize>1</contentSize>
|
||||
<contentTAGList></contentTAGList>
|
||||
<digest>C4CA4238A0B923820DCC509A6F75849B</digest>
|
||||
<exif/>
|
||||
<fileEtag>0</fileEtag>
|
||||
<fileVersion>0</fileVersion>
|
||||
<updateContentID></updateContentID>
|
||||
</uploadContentInfo>
|
||||
</uploadContentList>
|
||||
<newCatalogName></newCatalogName>
|
||||
<parentCatalogID></parentCatalogID>
|
||||
<operation>0</operation>
|
||||
<path></path>
|
||||
<manualRename>2</manualRename>
|
||||
<autoCreatePath length="0"/>
|
||||
<tagID></tagID>
|
||||
<tagType></tagType>
|
||||
</pcUploadFileRequest>
|
||||
'''.format(phone = self.account)
|
||||
|
||||
response = requests.post(url = url, headers = headers, data = payload)
|
||||
if response is None:
|
||||
return
|
||||
if response.status_code != 200:
|
||||
return print('-上传失败')
|
||||
print('-上传文件成功')
|
||||
|
||||
# 创建笔记
|
||||
def create_note(self, headers):
|
||||
note_id = self.get_note_id(32) # 获取随机笔记id
|
||||
createtime = str(int(round(time.time() * 1000)))
|
||||
time.sleep(3)
|
||||
updatetime = str(int(round(time.time() * 1000)))
|
||||
note_url = 'http://mnote.caiyun.feixin.10086.cn/noteServer/api/createNote.do'
|
||||
payload = {
|
||||
"archived": 0,
|
||||
"attachmentdir": note_id,
|
||||
"attachmentdirid": "",
|
||||
"attachments": [],
|
||||
"audioInfo": {
|
||||
"audioDuration": 0,
|
||||
"audioSize": 0,
|
||||
"audioStatus": 0
|
||||
},
|
||||
"contentid": "",
|
||||
"contents": [{
|
||||
"contentid": 0,
|
||||
"data": "<font size=\"3\">000000</font>",
|
||||
"noteId": note_id,
|
||||
"sortOrder": 0,
|
||||
"type": "RICHTEXT"
|
||||
}],
|
||||
"cp": "",
|
||||
"createtime": createtime,
|
||||
"description": "android",
|
||||
"expands": {
|
||||
"noteType": 0
|
||||
},
|
||||
"latlng": "",
|
||||
"location": "",
|
||||
"noteid": note_id,
|
||||
"notestatus": 0,
|
||||
"remindtime": "",
|
||||
"remindtype": 1,
|
||||
"revision": "1",
|
||||
"sharecount": "0",
|
||||
"sharestatus": "0",
|
||||
"system": "mobile",
|
||||
"tags": [{
|
||||
"id": self.notebook_id,
|
||||
"orderIndex": "0",
|
||||
"text": "默认笔记本"
|
||||
}],
|
||||
"title": "00000",
|
||||
"topmost": "0",
|
||||
"updatetime": updatetime,
|
||||
"userphone": self.account,
|
||||
"version": "1.00",
|
||||
"visitTime": ""
|
||||
}
|
||||
create_note_data = self.send_request(note_url, headers = headers, data = payload, method = "POST")
|
||||
if create_note_data.status_code == 200:
|
||||
print('-创建笔记成功')
|
||||
else:
|
||||
print('-创建失败')
|
||||
|
||||
# 笔记id
|
||||
def get_note_id(self, length):
|
||||
characters = '19f3a063d67e4694ca63a4227ec9a94a19088404f9a28084e3e486b928039a299bf756ebc77aa4f6bfa250308ec6a8be8b63b5271a00350d136d117b8a72f39c5bd15cdfd350cba4271dc797f15412d9f269e666aea5039f5049d00739b320bb9e8585a008b52c1cbd86970cae9476446f3e41871de8d9f6112db94b05e5dc7ea0a942a9daf145ac8e487d3d5cba7cea145680efc64794d43dd15c5062b81e1cda7bf278b9bc4e1b8955846e6bc4b6a61c28f831f81b2270289e5a8a677c3141ddc9868129060c0c3b5ef507fbd46c004f6de346332ef7f05c0094215eae1217ee7c13c8dca6d174cfb49c716dd42903bb4b02d823b5f1ff93c3f88768251b56cc'
|
||||
note_id = ''.join(random.choice(characters) for _ in range(length))
|
||||
return note_id
|
||||
|
||||
# 公众号签到
|
||||
@catch_errors
|
||||
def wxsign(self):
|
||||
self.sleep()
|
||||
url = 'https://caiyun.feixin.10086.cn/market/playoffic/followSignInfo?isWx=true'
|
||||
return_data = self.send_request(url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
|
||||
if return_data['msg'] != 'success':
|
||||
return print(return_data['msg'])
|
||||
if not return_data['result'].get('todaySignIn'):
|
||||
return print('❌签到失败,可能未绑定公众号')
|
||||
return print('✅签到成功')
|
||||
|
||||
# 摇一摇
|
||||
def shake(self):
|
||||
url = "https://caiyun.feixin.10086.cn:7071/market/shake-server/shake/shakeIt?flag=1"
|
||||
successful_shakes = 0 # 记录成功摇中的次数
|
||||
|
||||
try:
|
||||
for _ in range(self.click_num):
|
||||
return_data = self.send_request(url = url, cookies = self.cookies, headers = self.jwtHeaders,
|
||||
method = 'POST').json()
|
||||
time.sleep(1)
|
||||
shake_prize_config = return_data["result"].get("shakePrizeconfig")
|
||||
|
||||
if shake_prize_config:
|
||||
print(f"🎉摇一摇获得: {shake_prize_config['name']}")
|
||||
successful_shakes += 1
|
||||
except Exception as e:
|
||||
print(f'错误信息: {e}')
|
||||
if successful_shakes == 0:
|
||||
print(f'❌未摇中 x {self.click_num}')
|
||||
|
||||
# 查询剩余抽奖次数
|
||||
@catch_errors
|
||||
def surplus_num(self):
|
||||
self.sleep()
|
||||
draw_info_url = 'https://caiyun.feixin.10086.cn/market/playoffic/drawInfo'
|
||||
draw_url = "https://caiyun.feixin.10086.cn/market/playoffic/draw"
|
||||
|
||||
draw_info_data = self.send_request(draw_info_url, headers = self.jwtHeaders).json()
|
||||
|
||||
if draw_info_data.get('msg') == 'success':
|
||||
remain_num = draw_info_data['result'].get('surplusNumber', 0)
|
||||
print(f'剩余抽奖次数{remain_num}')
|
||||
if remain_num > 50 - self.draw:
|
||||
for _ in range(self.draw):
|
||||
self.sleep()
|
||||
draw_data = self.send_request(url = draw_url, headers = self.jwtHeaders).json()
|
||||
|
||||
if draw_data.get("code") == 0:
|
||||
prize_name = draw_data["result"].get("prizeName", "")
|
||||
print("✅抽奖成功,获得:" + prize_name)
|
||||
else:
|
||||
print("❌抽奖失败")
|
||||
else:
|
||||
pass
|
||||
else:
|
||||
print(draw_info_data.get('msg'))
|
||||
self.log_info(draw_info_data.get('msg'))
|
||||
|
||||
# 果园专区
|
||||
@catch_errors
|
||||
def fruitLogin(self):
|
||||
token = self.sso()
|
||||
if token is not None:
|
||||
print("-果园专区token刷新成功")
|
||||
self.sleep()
|
||||
login_info_url = f'{self.fruit_url}login/caiyunsso.do?token={token}&account={self.account}&targetSourceId=001208&sourceid=1003&enableShare=1'
|
||||
headers = {
|
||||
'Host': 'happy.mail.10086.cn',
|
||||
'Upgrade-Insecure-Requests': '1',
|
||||
'User-Agent': ua,
|
||||
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
|
||||
'Referer': 'https://caiyun.feixin.10086.cn:7071/',
|
||||
'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7'
|
||||
}
|
||||
loginInfoData = requests.request("GET", login_info_url, headers = headers)
|
||||
treeCookie = loginInfoData.request.headers['Cookie']
|
||||
self.treeHeaders['cookie'] = treeCookie
|
||||
|
||||
do_login_url = f'{self.fruit_url}login/userinfo.do'
|
||||
doLoginData = self.send_request(do_login_url, headers = self.treeHeaders).json()
|
||||
if doLoginData.get('result', {}).get('islogin') != 1:
|
||||
return print('❌果园登录失败')
|
||||
# 去做果园任务
|
||||
self.fruitTask()
|
||||
else:
|
||||
print("果园专区token刷新失败")
|
||||
|
||||
# 任务查询
|
||||
@catch_errors
|
||||
def fruitTask(self):
|
||||
# 签到任务
|
||||
check_sign_data = self.send_request(f'{self.fruit_url}task/checkinInfo.do',
|
||||
headers = self.treeHeaders).json()
|
||||
if check_sign_data.get('success'):
|
||||
today_checkin = check_sign_data.get('result', {}).get('todayCheckin', 0)
|
||||
if today_checkin == 1:
|
||||
print('-果园今日已签到')
|
||||
else:
|
||||
checkin_data = self.send_request(f'{self.fruit_url}task/checkin.do',
|
||||
headers = self.treeHeaders).json()
|
||||
if checkin_data.get('result', {}).get('code', '') == 1:
|
||||
print('-果园签到成功')
|
||||
self.sleep()
|
||||
water_data = self.send_request(f'{self.fruit_url}user/clickCartoon.do?cartoonType=widget',
|
||||
headers = self.treeHeaders).json()
|
||||
color_data = self.send_request(f'{self.fruit_url}user/clickCartoon.do?cartoonType=color',
|
||||
headers = self.treeHeaders).json()
|
||||
given_water = water_data.get('result', {}).get('given', 0)
|
||||
print(f'-领取每日水滴: {given_water}')
|
||||
print(f'-每日雨滴:{color_data.get("result").get("msg")}')
|
||||
else:
|
||||
print('-果园签到查询失败:', check_sign_data.get('msg', ''))
|
||||
|
||||
# 获取任务列表
|
||||
task_list_data = self.send_request(f'{self.fruit_url}task/taskList.do?clientType=PE',
|
||||
headers = self.treeHeaders).json()
|
||||
task_state_data = self.send_request(f'{self.fruit_url}task/taskState.do', headers = self.treeHeaders).json()
|
||||
task_state_result = task_state_data.get('result', [])
|
||||
|
||||
task_list = task_list_data.get('result', [])
|
||||
|
||||
for task in task_list:
|
||||
task_id = task.get('taskId', '')
|
||||
task_name = task.get('taskName', '')
|
||||
water_num = task.get('waterNum', 0)
|
||||
if task_id == 2002 or task_id == 2003:
|
||||
continue
|
||||
|
||||
task_state = next(
|
||||
(state.get('taskState', 0) for state in task_state_result if state.get('taskId') == task_id), 0)
|
||||
|
||||
if task_state == 2:
|
||||
print(f'-已完成: {task_name}')
|
||||
else:
|
||||
self.do_fruit_task(task_name, task_id, water_num)
|
||||
|
||||
# 果树信息
|
||||
self.tree_info()
|
||||
|
||||
# 做任务
|
||||
@catch_errors
|
||||
def do_fruit_task(self, task_name, task_id, water_num):
|
||||
print(f'-去完成: {task_name}')
|
||||
do_task_url = f'{self.fruit_url}task/doTask.do?taskId={task_id}'
|
||||
do_task_data = self.send_request(do_task_url, headers = self.treeHeaders).json()
|
||||
|
||||
if do_task_data.get('success'):
|
||||
get_water_url = f'{self.fruit_url}task/givenWater.do?taskId={task_id}'
|
||||
get_water_data = self.send_request(get_water_url, headers = self.treeHeaders).json()
|
||||
|
||||
if get_water_data.get('success'):
|
||||
print(f'-已完成任务获得水滴: {water_num}')
|
||||
else:
|
||||
print(f'❌领取失败: {get_water_data.get("msg", "")}')
|
||||
else:
|
||||
print(f'❌参与任务失败: {do_task_data.get("msg", "")}')
|
||||
|
||||
# 果树信息
|
||||
@catch_errors
|
||||
def tree_info(self):
|
||||
treeinfo_url = f'{self.fruit_url}user/treeInfo.do'
|
||||
treeinfo_data = self.send_request(treeinfo_url, headers = self.treeHeaders).json()
|
||||
|
||||
if not treeinfo_data.get('success'):
|
||||
error_message = treeinfo_data.get('msg', '获取果园任务列表失败')
|
||||
print(error_message)
|
||||
else:
|
||||
collect_water = treeinfo_data.get('result', {}).get('collectWater', 0)
|
||||
tree_level = treeinfo_data.get('result', {}).get('treeLevel', 0)
|
||||
print(f'-当前小树等级: {tree_level} 剩余水滴: {collect_water}')
|
||||
if tree_level in (2, 4, 6, 8):
|
||||
# 开宝箱
|
||||
openbox_url = f'{self.fruit_url}prize/openBox.do'
|
||||
openbox_data = self.send_request(openbox_url, headers = self.treeHeaders).json()
|
||||
print(f'- {openbox_data.get("result").get("msg")}')
|
||||
|
||||
watering_amount = collect_water // 20 # 计算需要浇水的次数
|
||||
watering_url = f'{self.fruit_url}user/watering.do?isFast=0'
|
||||
if watering_amount > 0:
|
||||
for _ in range(watering_amount):
|
||||
watering_data = self.send_request(watering_url, headers = self.treeHeaders).json()
|
||||
if watering_data.get('success'):
|
||||
print('✔️ 浇水成功')
|
||||
time.sleep(3)
|
||||
else:
|
||||
print('-水滴不足!')
|
||||
|
||||
# 云朵大作战
|
||||
@catch_errors
|
||||
def cloud_game(self):
|
||||
game_info_url = 'https://caiyun.feixin.10086.cn/market/signin/hecheng1T/info?op=info'
|
||||
bigin_url = 'https://caiyun.feixin.10086.cn/market/signin/hecheng1T/beinvite'
|
||||
end_url = 'https://caiyun.feixin.10086.cn/market/signin/hecheng1T/finish?flag=true'
|
||||
|
||||
game_info_data = self.send_request(game_info_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
if game_info_data and game_info_data.get('code', -1) == 0:
|
||||
currnum = game_info_data.get('result', {}).get('info', {}).get('curr', 0)
|
||||
count = game_info_data.get('result', {}).get('history', {}).get('0', {}).get('count', '')
|
||||
rank = game_info_data.get('result', {}).get('history', {}).get('0', {}).get('rank', '')
|
||||
|
||||
print(f'今日剩余游戏次数: {currnum}\n本月排名: {rank} 合成次数: {count}')
|
||||
|
||||
for _ in range(currnum):
|
||||
self.send_request(bigin_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
print('-开始游戏,等待10-15秒完成游戏')
|
||||
time.sleep(random.randint(10, 15))
|
||||
end_data = self.send_request(end_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
if end_data and end_data.get('code', -1) == 0:
|
||||
print('游戏成功')
|
||||
else:
|
||||
print("-获取游戏信息失败")
|
||||
|
||||
# 领取云朵
|
||||
@catch_errors
|
||||
def receive(self):
|
||||
receive_url = "https://caiyun.feixin.10086.cn/market/signin/page/receive"
|
||||
prize_url = f"https://caiyun.feixin.10086.cn/market/prizeApi/checkPrize/getUserPrizeLogPage?currPage=1&pageSize=15&_={self.timestamp}"
|
||||
receive_data = self.send_request(receive_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
self.sleep()
|
||||
prize_data = self.send_request(prize_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
result = prize_data.get('result').get('result')
|
||||
rewards = ''
|
||||
for value in result:
|
||||
prizeName = value.get('prizeName')
|
||||
flag = value.get('flag')
|
||||
if flag == 1:
|
||||
rewards += f'-待领取奖品: {prizeName}\n'
|
||||
|
||||
receive_amount = receive_data["result"].get("receive", "")
|
||||
total_amount = receive_data["result"].get("total", "")
|
||||
print(f'\n-当前待领取:{receive_amount}云朵')
|
||||
print(f'-当前云朵数量:{total_amount}云朵')
|
||||
msg = f'云朵数量:{total_amount} \n{rewards}'
|
||||
self.log_info(amount = msg)
|
||||
|
||||
# 备份云朵
|
||||
@catch_errors
|
||||
def backup_cloud(self):
|
||||
backup_url = 'https://caiyun.feixin.10086.cn/market/backupgift/info'
|
||||
backup_data = self.send_request(backup_url, headers = self.jwtHeaders).json()
|
||||
state = backup_data.get('result', {}).get('state', '')
|
||||
if state == -1:
|
||||
print('本月未备份,暂无连续备份奖励')
|
||||
|
||||
elif state == 0:
|
||||
print('-领取本月连续备份奖励')
|
||||
cur_url = 'https://caiyun.feixin.10086.cn/market/backupgift/receive'
|
||||
cur_data = self.send_request(cur_url, headers = self.jwtHeaders).json()
|
||||
print(f'-获得云朵数量:{cur_data.get("result").get("result")}')
|
||||
|
||||
elif state == 1:
|
||||
print('-已领取本月连续备份奖励')
|
||||
self.sleep()
|
||||
expend_url = 'https://caiyun.feixin.10086.cn/market/signin/page/taskExpansion' # 每月膨胀云朵
|
||||
expend_data = self.send_request(expend_url, headers = self.jwtHeaders, cookies = self.cookies).json()
|
||||
|
||||
curMonthBackup = expend_data.get('result', {}).get('curMonthBackup', '') # 本月备份
|
||||
preMonthBackup = expend_data.get('result', {}).get('preMonthBackup', '') # 上月备份
|
||||
curMonthBackupTaskAccept = expend_data.get('result', {}).get('curMonthBackupTaskAccept', '') # 本月是否领取
|
||||
nextMonthTaskRecordCount = expend_data.get('result', {}).get('nextMonthTaskRecordCount', '') # 下月备份云朵
|
||||
acceptDate = expend_data.get('result', {}).get('acceptDate', '') # 月份
|
||||
|
||||
if curMonthBackup:
|
||||
print(f'- 本月已备份,下月可领取膨胀云朵: {nextMonthTaskRecordCount}')
|
||||
else:
|
||||
print('- 本月还未备份,下月暂无膨胀云朵')
|
||||
|
||||
if preMonthBackup:
|
||||
if curMonthBackupTaskAccept:
|
||||
print('- 上月已备份,膨胀云朵已领取')
|
||||
else:
|
||||
# 领取
|
||||
receive_url = f'https://caiyun.feixin.10086.cn/market/signin/page/receiveTaskExpansion?acceptDate={acceptDate}'
|
||||
receive_data = self.send_request(receive_url, headers = self.jwtHeaders,
|
||||
cookies = self.cookies).json()
|
||||
if receive_data.get("code") != 0:
|
||||
print(f'-领取失败:{receive_data.get("msg")}')
|
||||
else:
|
||||
cloudCount = receive_data.get('result', {}).get('cloudCount', '')
|
||||
print(f'- 膨胀云朵领取成功: {cloudCount}朵')
|
||||
else:
|
||||
print('-上月未备份,本月无膨胀云朵领取')
|
||||
|
||||
# # 开启备份
|
||||
# def open_backup(self):
|
||||
|
||||
# 通知云朵
|
||||
@catch_errors
|
||||
def open_send(self):
|
||||
send_url = 'https://caiyun.feixin.10086.cn/market/msgPushOn/task/status'
|
||||
send_data = self.send_request(send_url, headers = self.jwtHeaders).json()
|
||||
|
||||
pushOn = send_data.get('result', {}).get('pushOn', '') # 0未开启,1开启,2未领取,3已领取
|
||||
firstTaskStatus = send_data.get('result', {}).get('firstTaskStatus', '')
|
||||
secondTaskStatus = send_data.get('result', {}).get('secondTaskStatus', '')
|
||||
onDuaration = send_data.get('result', {}).get('onDuaration', '') # 开启时间
|
||||
|
||||
if pushOn == 1:
|
||||
reward_url = 'https://caiyun.feixin.10086.cn/market/msgPushOn/task/obtain'
|
||||
|
||||
if firstTaskStatus == 3:
|
||||
print('- 任务1奖励已领取')
|
||||
else:
|
||||
# 领取任务1
|
||||
print('- 领取任务1奖励')
|
||||
reward1_data = self.send_request(reward_url, headers = self.jwtHeaders, data = {"type": 1},
|
||||
method = "POST").json()
|
||||
print(reward1_data.get('result', {}).get('description', ''))
|
||||
|
||||
if secondTaskStatus == 2:
|
||||
# 领取任务2
|
||||
print('- 领取任务2奖励')
|
||||
reward2_data = self.send_request(reward_url, headers = self.jwtHeaders, data = {"type": 2},
|
||||
method = "POST").json()
|
||||
print(reward2_data.get('result', {}).get('description', ''))
|
||||
|
||||
print(f'- 通知已开启天数: {onDuaration}, 满31天可领取奖励')
|
||||
else:
|
||||
print('- 通知权限未开启')
|
||||
|
||||
def get_announcement():
|
||||
"""
|
||||
获取公告信息
|
||||
"""
|
||||
external_url = 'https://github.com/3288588344/toulu/raw/refs/heads/main/tl.txt'
|
||||
try:
|
||||
response = requests.get(external_url)
|
||||
if response.status_code == 200:
|
||||
print( response.text)
|
||||
print("公告获取成功,开始执行任务...")
|
||||
else:
|
||||
print(f"获取公告失败,状态码: {response.status_code}")
|
||||
except requests.exceptions.RequestException as e:
|
||||
print(f"获取公告时发生错误: {e}")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
get_announcement()
|
||||
env_name = 'ydypCK'
|
||||
token = os.getenv(env_name)
|
||||
if not token:
|
||||
print(f'⛔️未获取到ck变量:请检查变量 {env_name} 是否填写')
|
||||
exit(0)
|
||||
|
||||
cookies = re.split(r'[&\n]', token)
|
||||
print(f"移动硬盘共获取到{len(cookies)}个账号")
|
||||
|
||||
for i, account_info in enumerate(cookies, start = 1):
|
||||
print(f"\n======== ▷ 第 {i} 个账号 ◁ ========")
|
||||
YP(account_info).run()
|
||||
print("\n随机等待5-10s进行下一个账号")
|
||||
time.sleep(random.randint(5, 10))
|
||||
|
||||
# 输出异常账号信息
|
||||
if err_accounts != '':
|
||||
print(f"\n失效账号:\n{err_accounts}")
|
||||
else:
|
||||
print('当前所有账号ck有效')
|
||||
if err_message != '':
|
||||
print(f'-错误信息: \n{err_message}')
|
||||
print(user_amount)
|
||||
# 在load_send中获取导入的send函数
|
||||
send = load_send()
|
||||
|
||||
# 判断send是否可用再进行调用
|
||||
if send:
|
||||
msg = f"失效账号:\n{err_accounts}\n-错误信息:\n{err_message}\n-云朵数量: \n{user_amount}"
|
||||
send('中国移动云盘任务信息', msg)
|
||||
else:
|
||||
print('通知服务不可用')
|
||||
569
脚本库/web版/账密/简繁体转换/2025-08-25_fjzh_246b5fc8.js
Normal file
569
脚本库/web版/账密/简繁体转换/2025-08-25_fjzh_246b5fc8.js
Normal file
File diff suppressed because one or more lines are too long
696
脚本库/web版/账密/米游社_原神签到/2025-06-28_米哈游_44eb1b9e.js
Normal file
696
脚本库/web版/账密/米游社_原神签到/2025-06-28_米哈游_44eb1b9e.js
Normal file
File diff suppressed because one or more lines are too long
600
脚本库/web版/账密/经纬度解析/2025-08-25_lnglat_aa6d5e0b.js
Normal file
600
脚本库/web版/账密/经纬度解析/2025-08-25_lnglat_aa6d5e0b.js
Normal file
File diff suppressed because one or more lines are too long
519
脚本库/web版/账密/统一快乐星球茄皇/2026-05-14_qiehuang_678fa340.py
Normal file
519
脚本库/web版/账密/统一快乐星球茄皇/2026-05-14_qiehuang_678fa340.py
Normal file
@@ -0,0 +1,519 @@
|
||||
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/qiehuang.py
|
||||
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/qiehuang.py
|
||||
# Repo: smallfawn/QLScriptPublic
|
||||
# Path: daily/qiehuang.py
|
||||
# UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
# SHA256: 678fa3406b5408e8ba04725e090ea9f8db8951fb4406c132dd23950af0270e0a
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
# cron: 25 10 * * *
|
||||
# new Env('统一快乐星球茄皇')
|
||||
|
||||
import requests
|
||||
import json
|
||||
import os
|
||||
import time
|
||||
import re
|
||||
import random
|
||||
from collections import defaultdict
|
||||
from notify import send
|
||||
|
||||
users = os.getenv("QH", '').splitlines()
|
||||
# 清洗数据:去除每个用户字符串的首尾空格,过滤空行/全空格的无效数据
|
||||
users = [user.strip() for user in users if user.strip()]
|
||||
|
||||
# 解析为 (wid, 手机号) 列表
|
||||
parsed_users = []
|
||||
for user_str in users:
|
||||
if "#" in user_str:
|
||||
# 按#拆分(只拆1次,避免手机号含#导致拆分错误)
|
||||
wid, phone = user_str.split("#", 1)
|
||||
parsed_users.append((wid.strip(), phone.strip()))
|
||||
else:
|
||||
# 兼容旧格式:只有wid没有手机号时,手机号为空字符串
|
||||
parsed_users.append((user_str.strip(), ""))
|
||||
|
||||
# UA可自行替换为自己的
|
||||
user_agent = "Mozilla/5.0 (Linux; Android 14; 23046RP50C Build/UKQ1.230804.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/142.0.7444.172 Safari/537.36 XWEB/1420045 MMWEBSDK/20250201 MMWEBID/5714 MicroMessenger/8.0.57.2820(0x28003956) WeChat/arm64 Weixin Android Tablet NetType/WIFI Language/zh_CN ABI/arm64 miniProgram/wx532ecb3bdaaf92f9"
|
||||
STEP_ORDER = ["登录", "领取种子", "签到", "浏览任务", "收获作物", "播种", "循环浇水"]
|
||||
STEP_EMOJI = {"登录": "🔑", "领取种子": "🌱", "签到": "📅", "浏览任务": "🔍", "收获作物": "🌾", "播种": "🌱", "循环浇水": "🔄"}
|
||||
|
||||
def _short(s, n=120):
|
||||
s = s.strip()
|
||||
return s if len(s) <= n else s[:n - 1] + "…"
|
||||
|
||||
def _pick_status(line: str) -> str:
|
||||
if "✅" in line: return "✅"
|
||||
if "⚠️" in line: return "⚠️"
|
||||
if "❌" in line: return "❌"
|
||||
return "ℹ️"
|
||||
|
||||
def _step_key(line: str) -> str:
|
||||
for k in STEP_ORDER:
|
||||
if k in line:
|
||||
return k
|
||||
return "信息"
|
||||
|
||||
def _pull_resource_snapshot(lines):
|
||||
res = {}
|
||||
for line in reversed(lines):
|
||||
if "☀️" in line:
|
||||
try: res["sun"] = int(re.findall(r"☀️(\d+)", line)[0])
|
||||
except: pass
|
||||
if "💧" in line:
|
||||
try: res["water"] = int(re.findall(r"💧(\d+)", line)[0])
|
||||
except: pass
|
||||
if "🍅" in line:
|
||||
try: res["fruit"] = int(re.findall(r"🍅(\d+)", line)[0])
|
||||
except: pass
|
||||
if len(res) >= 2:
|
||||
break
|
||||
return res
|
||||
|
||||
def render_report(all_lines):
|
||||
blocks, cur = [], []
|
||||
for ln in all_lines:
|
||||
if ln.strip().startswith("👤 用户"):
|
||||
if cur: blocks.append(cur)
|
||||
cur = [ln.strip()]
|
||||
elif ln is not None:
|
||||
cur.append(ln.rstrip())
|
||||
if cur: blocks.append(cur)
|
||||
out = []
|
||||
for b in blocks:
|
||||
if not b: continue
|
||||
header = b[0].strip()
|
||||
out.append("━━━━━━━━━━━━━━━━━━━━━━")
|
||||
out.append(header)
|
||||
bucket = defaultdict(list)
|
||||
for ln in b[1:]:
|
||||
if not ln.strip(): continue
|
||||
bucket[_step_key(ln)].append(ln)
|
||||
snap = _pull_resource_snapshot(b)
|
||||
if snap:
|
||||
res_line = "📊 当前资源:"
|
||||
if "sun" in snap: res_line += f"☀️{snap['sun']} "
|
||||
if "water" in snap: res_line += f"💧{snap['water']} "
|
||||
if "fruit" in snap: res_line += f"🍅{snap['fruit']} "
|
||||
out.append(res_line.strip())
|
||||
for step in STEP_ORDER + ["信息"]:
|
||||
if step not in bucket: continue
|
||||
lines = bucket[step]
|
||||
cleaned, seen = [], set()
|
||||
for ln in lines:
|
||||
if set(ln.strip()) in (set("="),):
|
||||
continue
|
||||
# 关键修复:循环浇水日志不做去重(保留所有记录)
|
||||
if step == "循环浇水":
|
||||
cleaned.append(ln)
|
||||
else:
|
||||
norm = re.sub(r"账号\d+:", "", re.sub(r"\s+", " ", ln)).strip()
|
||||
if norm not in seen:
|
||||
seen.add(norm)
|
||||
cleaned.append(ln)
|
||||
# 循环浇水保留所有记录
|
||||
if step == "循环浇水":
|
||||
picked = cleaned
|
||||
else:
|
||||
picked = cleaned[-1:] if cleaned else []
|
||||
for pln in picked:
|
||||
status = _pick_status(pln)
|
||||
icon = STEP_EMOJI.get(step, "•")
|
||||
body = re.sub(r"^[🔑🌱📅🔍🌾🔄]+\s*" + re.escape(step) + r"[::]?\s*", "", pln)
|
||||
body = re.sub(r"^[✅❌⚠️ℹ️]+\s*", "", body)
|
||||
out.append(f"{icon} {step} {status} {_short(body)}")
|
||||
succ = sum("✅" in ln for ln in b)
|
||||
fail = sum("❌" in ln for ln in b)
|
||||
warn = sum("⚠️" in ln for ln in b)
|
||||
out.append(f"🧾 小结:成功 {succ} · 预警 {warn} · 失败 {fail}")
|
||||
out.append("━━━━━━━━━━━━━━━━━━━━━━")
|
||||
return "\n".join(out)
|
||||
|
||||
|
||||
def login(wid, phone, user_logs):
|
||||
step = "登录"
|
||||
# 校验手机号是否存在
|
||||
if not phone:
|
||||
msg = "未配置手机号,登录失败 🔒"
|
||||
print(msg)
|
||||
user_logs.append(f"🔑 {step}: {msg}")
|
||||
return None
|
||||
try:
|
||||
url = "https://api.zhumanito.cn/api/login"
|
||||
# 新增手机号参数 wm_phone
|
||||
payload = {"wid": wid, "wm_phone": phone}
|
||||
headers = {'User-Agent': user_agent, 'Content-Type': "application/json"}
|
||||
response = requests.post(url, data=json.dumps(payload), headers=headers)
|
||||
response.raise_for_status()
|
||||
dljson = response.json()
|
||||
# 响应格式新增 code 字段校验
|
||||
if dljson.get("code") == 200 and 'data' in dljson and 'token' in dljson['data'] and 'user' in dljson['data'] and 'land' in dljson['data']:
|
||||
msg = f"登录成功(手机号:{phone})✅"
|
||||
print(msg)
|
||||
user_logs.append(f"🔑 {step}: {msg}")
|
||||
time.sleep(random.uniform(4, 5))
|
||||
return {
|
||||
"token": dljson['data']['token'],
|
||||
"user_data": dljson['data']['user'],
|
||||
"land_data": dljson['data']['land']
|
||||
}
|
||||
else:
|
||||
msg = f"登录失败,返回数据: {dljson} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"🔑 {step}: {msg}")
|
||||
return None
|
||||
except Exception as e:
|
||||
msg = f"登录出错(手机号:{phone}): {str(e)} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"🔑 {step}: {msg}")
|
||||
return None
|
||||
|
||||
def get_seeds(authorization, user_logs):
|
||||
step = "领取种子"
|
||||
if not authorization:
|
||||
msg = "未获取到授权,无法领取种子 🔒"
|
||||
print(msg)
|
||||
user_logs.append(f"🌱 {step}: {msg}")
|
||||
return
|
||||
try:
|
||||
url = "https://api.zhumanito.cn/api/guide"
|
||||
headers = {'User-Agent': user_agent, 'Content-Type': "application/json", 'authorization': authorization}
|
||||
for st in (1, 2):
|
||||
payload = {"status": st}
|
||||
response = requests.post(url, data=json.dumps(payload), headers=headers)
|
||||
response.raise_for_status()
|
||||
user_logs.append(f"🌱 {step}: 领取/引导完成 ✅")
|
||||
time.sleep(random.uniform(4, 5))
|
||||
except Exception as e:
|
||||
msg = f"领取种子出错: {str(e)} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"🌱 {step}: {msg}")
|
||||
|
||||
def check_in(authorization, user_logs):
|
||||
step = "签到"
|
||||
if not authorization:
|
||||
msg = "未获取到授权,无法签到 🔒"
|
||||
print(msg)
|
||||
user_logs.append(f"📅 {step}: {msg}")
|
||||
return
|
||||
try:
|
||||
url = "https://api.zhumanito.cn/api/task/complete"
|
||||
headers = {'User-Agent': user_agent, 'Content-Type': "application/x-www-form-urlencoded", 'authorization': authorization}
|
||||
response = requests.post(url, headers=headers)
|
||||
response_data = response.json()
|
||||
if response_data.get("msg") == "成功":
|
||||
msg = "签到成功 ✅"
|
||||
print(f"签到结果: {msg}")
|
||||
user_logs.append(f"📅 {step}: {msg}")
|
||||
elif response_data.get("msg") == "不可重复完成":
|
||||
msg = "今日已签到,无需重复操作 ✅"
|
||||
print(f"签到结果: {msg}")
|
||||
user_logs.append(f"📅 {step}: {msg}")
|
||||
else:
|
||||
msg = f"失败,原因: {response_data.get('msg', '未知错误')} ❌"
|
||||
print(f"签到结果: {msg}")
|
||||
user_logs.append(f"📅 {step}: {msg}")
|
||||
time.sleep(random.uniform(4, 5))
|
||||
except Exception as e:
|
||||
msg = f"签到出错: {str(e)} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"📅 {step}: {msg}")
|
||||
|
||||
def explore(authorization, wid, user_logs):
|
||||
step = "浏览任务"
|
||||
if not authorization:
|
||||
msg = "未获取到授权,无法执行浏览任务 🔒"
|
||||
print(msg)
|
||||
user_logs.append(f"🔍 {step}: {msg}")
|
||||
return
|
||||
max_retry = 3
|
||||
retry_count = 0
|
||||
while retry_count < max_retry:
|
||||
try:
|
||||
url = f"https://api.zhumanito.cn/?wid={wid}"
|
||||
headers = {
|
||||
'Host': 'api.zhumanito.cn',
|
||||
'User-Agent': user_agent,
|
||||
'authorization': authorization,
|
||||
'sec-ch-ua': '"Chromium";v="142", "Android WebView";v="142", "Not_A Brand";v="99"',
|
||||
'sec-ch-ua-mobile': '?0',
|
||||
'sec-ch-ua-platform': '"Android"',
|
||||
'upgrade-insecure-requests': '1',
|
||||
'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/wxpic,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
|
||||
'x-requested-with': 'com.tencent.mm',
|
||||
'sec-fetch-site': 'same-site',
|
||||
'sec-fetch-mode': 'navigate',
|
||||
'sec-fetch-user': '?1',
|
||||
'sec-fetch-dest': 'document',
|
||||
'referer': 'https://h5.zhumanito.cn/',
|
||||
'accept-encoding': 'gzip, deflate, br, zstd',
|
||||
'accept-language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7',
|
||||
'priority': 'u=0, i'
|
||||
}
|
||||
response = requests.get(url, headers=headers, allow_redirects=False, timeout=10, verify=True)
|
||||
if response.status_code == 302:
|
||||
msg = "浏览任务完成✅"
|
||||
print(f"浏览任务:{msg}")
|
||||
user_logs.append(f"🔍 {step}: {msg}")
|
||||
time.sleep(random.uniform(4, 5))
|
||||
break
|
||||
elif response.status_code == 429:
|
||||
retry_after = int(response.headers.get("Retry-After", "1"))
|
||||
retry_count += 1
|
||||
if retry_count < max_retry:
|
||||
msg = f"浏览请求限速,等待{retry_after}秒后重试(第{retry_count}/{max_retry}次)"
|
||||
print(f"浏览任务:{msg}")
|
||||
time.sleep(retry_after)
|
||||
else:
|
||||
msg = f"浏览请求多次限速,放弃重试 ❌"
|
||||
print(f"浏览任务:{msg}")
|
||||
user_logs.append(f"🔍 {step}: {msg}")
|
||||
else:
|
||||
msg = f"浏览失败,状态码: {response.status_code} ❌"
|
||||
print(f"浏览任务:{msg}")
|
||||
user_logs.append(f"🔍 {step}: {msg}")
|
||||
break
|
||||
except requests.exceptions.RequestException as e:
|
||||
msg = f"浏览任务出错: {str(e)} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"🔍 {step}: {msg}")
|
||||
break
|
||||
|
||||
def harvest(authorization, user_logs, account):
|
||||
step = "收获作物"
|
||||
try:
|
||||
url = "https://api.zhumanito.cn/api/harvest"
|
||||
headers = {
|
||||
'User-Agent': user_agent,
|
||||
'Content-Type': "application/x-www-form-urlencoded;charset=utf-8",
|
||||
'authorization': authorization
|
||||
}
|
||||
before_fruit = int(account["user_data"].get("fruit_num", 0))
|
||||
response = requests.post(url, headers=headers, data=b"", timeout=15)
|
||||
response.raise_for_status()
|
||||
res_json = response.json()
|
||||
if res_json.get("code") == 200:
|
||||
account["user_data"] = res_json["data"]["user"]
|
||||
account["land_data"] = res_json["data"]["land"]
|
||||
after_fruit = int(account["user_data"].get("fruit_num", 0))
|
||||
total_after = int(account["user_data"].get("total_fruit_num", after_fruit))
|
||||
delta = max(0, after_fruit - before_fruit)
|
||||
msg = f"收获成功!🍅+{delta} → 现有 {after_fruit}(累计 {total_after})"
|
||||
print(msg)
|
||||
user_logs.append(f"🌾 {step}: {msg}")
|
||||
snap_line = f"📊 收获后资源:☀️{account['user_data'].get('sun_num',0)} 💧{account['user_data'].get('water_num',0)} 🍅{after_fruit}"
|
||||
print(snap_line)
|
||||
user_logs.append(snap_line)
|
||||
time.sleep(random.uniform(4, 5))
|
||||
return True
|
||||
else:
|
||||
msg = f"收获失败: {res_json.get('msg', '未知信息')} ⚠️"
|
||||
print(msg)
|
||||
user_logs.append(f"🌾 {step}: {msg}")
|
||||
return False
|
||||
except Exception as e:
|
||||
msg = f"收获请求出错: {str(e)} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"🌾 {step}: {msg}")
|
||||
return False
|
||||
|
||||
def plant_seed(authorization, user_logs, account):
|
||||
step = "播种"
|
||||
try:
|
||||
url = "https://api.zhumanito.cn/api/seed"
|
||||
headers = {
|
||||
'User-Agent': user_agent,
|
||||
'Content-Type': "application/x-www-form-urlencoded;charset=utf-8",
|
||||
'authorization': authorization
|
||||
}
|
||||
response = requests.post(url, headers=headers, data=b"", timeout=15)
|
||||
response.raise_for_status()
|
||||
res_json = response.json()
|
||||
if res_json.get("code") == 200:
|
||||
msg = "播种成功!✅"
|
||||
print(msg)
|
||||
user_logs.append(f"🌱 {step}: {msg}")
|
||||
account["user_data"] = res_json["data"]["user"]
|
||||
account["land_data"] = res_json["data"]["land"]
|
||||
time.sleep(random.uniform(4, 5))
|
||||
return True
|
||||
else:
|
||||
msg = f"播种失败: {res_json.get('msg', '未知信息')} ⚠️"
|
||||
print(msg)
|
||||
user_logs.append(f"🌱 {step}: {msg}")
|
||||
return False
|
||||
except Exception as e:
|
||||
msg = f"播种请求出错: {str(e)} ❌"
|
||||
print(msg)
|
||||
user_logs.append(f"🌱 {step}: {msg}")
|
||||
return False
|
||||
|
||||
def water_once(headers, account_idx):
|
||||
"""单次浇水(带限速重试)"""
|
||||
max_retry = 3
|
||||
retry_count = 0
|
||||
while retry_count < max_retry:
|
||||
try:
|
||||
response = requests.post(
|
||||
"https://api.zhumanito.cn/api/water",
|
||||
headers=headers,
|
||||
data=b"",
|
||||
allow_redirects=False,
|
||||
timeout=(25, 30)
|
||||
)
|
||||
|
||||
if response.status_code == 200:
|
||||
return response.json()
|
||||
elif response.status_code == 429:
|
||||
retry_after = int(response.headers.get("Retry-After", "1"))
|
||||
retry_count += 1
|
||||
if retry_count < max_retry:
|
||||
print(f"账号{account_idx}:浇水请求限速,等待{retry_after}秒后重试(第{retry_count}/{max_retry}次)")
|
||||
time.sleep(retry_after)
|
||||
else:
|
||||
raise Exception(f"浇水请求多次限速({max_retry}次),放弃重试")
|
||||
else:
|
||||
raise Exception(f"响应状态码异常: {response.status_code},内容: {response.text}")
|
||||
except json.JSONDecodeError:
|
||||
raise Exception(f"返回非JSON数据: {response.text}")
|
||||
except Exception as e:
|
||||
if retry_count >= max_retry - 1:
|
||||
raise e
|
||||
retry_count += 1
|
||||
time.sleep(1)
|
||||
return None
|
||||
|
||||
def loop_watering(headers, account_idx, account, user_logs):
|
||||
step = "循环浇水"
|
||||
user_logs.append(f"🔄 {step}:进入循环浇水(需💧≥20且☀️≥20)")
|
||||
print(f"\n🔄 账号{account_idx}:进入循环浇水(需💧≥20且☀️≥20)")
|
||||
|
||||
water_headers = headers.copy()
|
||||
water_headers["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"
|
||||
|
||||
while True:
|
||||
water = account["user_data"].get("water_num", 0)
|
||||
sun = account["user_data"].get("sun_num", 0)
|
||||
|
||||
if water >= 20 and sun >= 20:
|
||||
log_msg = f"🔄 {step}:📌 账号{account_idx}:资源满足(💧{water},☀️{sun}),浇水..."
|
||||
print(log_msg)
|
||||
user_logs.append(log_msg)
|
||||
|
||||
try:
|
||||
res = water_once(water_headers, account_idx)
|
||||
|
||||
if res.get("code") == 200:
|
||||
# 浇水成功,更新用户数据
|
||||
account["user_data"] = res["data"]["user"]
|
||||
land = res["data"].get("land", [])
|
||||
|
||||
success_msg = f"🔄 {step}:✅ 账号{account_idx}:浇水成功!"
|
||||
status_msg = f"🔄 {step}:📊 剩余:💧{account['user_data']['water_num']},☀️{account['user_data']['sun_num']}"
|
||||
print("="*35)
|
||||
print(success_msg)
|
||||
print(status_msg)
|
||||
# 关键修改:每条浇水成功日志都保留(不合并、不删除)
|
||||
user_logs.append(success_msg)
|
||||
user_logs.append(status_msg)
|
||||
|
||||
if land:
|
||||
land_msg = f"🔄 {step}:🌱 土地:共{len(land)}块,阶段{land[0]['seed_stage']} 🌱"
|
||||
print(land_msg)
|
||||
user_logs.append(land_msg)
|
||||
print("="*35)
|
||||
|
||||
time.sleep(random.uniform(4, 5))
|
||||
else:
|
||||
# 浇水失败(如达上限、其他错误)
|
||||
fail_msg = f"🔄 {step}:❌ 账号{account_idx}:浇水失败:{res.get('msg', '未知错误')}"
|
||||
print(fail_msg)
|
||||
user_logs.append(fail_msg)
|
||||
break
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"🔄 {step}:⚠️ 账号{account_idx}:浇水请求异常:{str(e)} ❌"
|
||||
print(error_msg)
|
||||
user_logs.append(error_msg)
|
||||
break
|
||||
else:
|
||||
end_msg = f"🔄 {step}:🔚 账号{account_idx}:资源不足(💧{water},☀️{sun}),停止浇水 ⏹️"
|
||||
print(end_msg)
|
||||
user_logs.append(end_msg)
|
||||
fruit = account['user_data'].get('fruit_num', 0)
|
||||
final_snap = f"📊 最终资源:☀️{sun} 💧{water} 🍅{fruit}"
|
||||
print(final_snap)
|
||||
user_logs.append(final_snap)
|
||||
break
|
||||
|
||||
def process_user(wid, phone, user_index):
|
||||
user_logs = [f"👤 用户{user_index}: wid={wid} | 手机号={phone}"]
|
||||
print(f"\n===== 开始处理用户 {user_index} (wid: {wid}, 手机号: {phone}) =====")
|
||||
# 登录时传入 wid 和手机号
|
||||
login_data = login(wid, phone, user_logs)
|
||||
if login_data:
|
||||
auth_token = login_data["token"]
|
||||
headers = {'User-Agent': user_agent, 'authorization': auth_token}
|
||||
account = {"user_data": login_data["user_data"], "land_data": login_data["land_data"]}
|
||||
fruit = account['user_data'].get('fruit_num', 0)
|
||||
print(f"📊 当前番茄数量:{fruit}")
|
||||
user_logs.append(f"📊 当前番茄数量:{fruit}")
|
||||
if account["user_data"].get("new_status", 2) != 2:
|
||||
get_seeds(auth_token, user_logs)
|
||||
check_in(auth_token, user_logs)
|
||||
explore(auth_token, wid, user_logs)
|
||||
current_stage = 0
|
||||
if account["land_data"] and len(account["land_data"]) > 0:
|
||||
current_stage = account["land_data"][0].get("seed_stage", 0)
|
||||
print(f"\n🧠 账号{user_index}:智能判断... 当前土地状态: {current_stage}")
|
||||
user_logs.append(f"ℹ️ 土地状态: {current_stage}")
|
||||
if current_stage == 5:
|
||||
print("判断:作物已成熟。")
|
||||
user_logs.append("🧠 判断:作物已成熟。")
|
||||
print(f">> 账号{user_index}:执行 [收获]...")
|
||||
harvest_success = harvest(auth_token, user_logs, account)
|
||||
if harvest_success:
|
||||
print(f">> 账号{user_index}:执行 [播种]...")
|
||||
plant_seed(auth_token, user_logs, account)
|
||||
elif current_stage == 0:
|
||||
print("判断:土地为空。")
|
||||
user_logs.append("🧠 判断:土地为空。")
|
||||
print(f">> 账号{user_index}:执行 [播种]...")
|
||||
plant_seed(auth_token, user_logs, account)
|
||||
else:
|
||||
print("判断:作物生长中... 无需收获或播种。")
|
||||
user_logs.append("🧠 判断:作物生长中。")
|
||||
loop_watering(headers, user_index, account, user_logs)
|
||||
else:
|
||||
msg = "获取授权失败,无法执行后续操作 🔒"
|
||||
print(msg)
|
||||
user_logs.append(f"⚠️ {msg}")
|
||||
print(f"===== 完成处理用户 {user_index} =====\n")
|
||||
time.sleep(3)
|
||||
return user_logs
|
||||
|
||||
if __name__ == "__main__":
|
||||
if not parsed_users or len(parsed_users) == 0:
|
||||
print("未从环境变量TYQH中获取到任何用户信息! 🚫")
|
||||
send("统一茄皇", "未从环境变量TYQH中获取到任何用户信息! 🚫")
|
||||
else:
|
||||
print(f"共检测到 {len(parsed_users)} 个用户,开始依次处理... 👥")
|
||||
all_logs = []
|
||||
for i, (wid, phone) in enumerate(parsed_users, 1):
|
||||
try:
|
||||
user_logs = process_user(wid, phone, i)
|
||||
all_logs.extend(user_logs)
|
||||
all_logs.append("")
|
||||
except Exception as e:
|
||||
error_msg = f"用户 {i} 处理过程中发生未捕获错误: {str(e)} ❌"
|
||||
print(error_msg)
|
||||
all_logs.append(f"❌ {error_msg}")
|
||||
all_logs.append("")
|
||||
# 推送完整报告(包含所有浇水成功记录)
|
||||
report = render_report(all_logs)
|
||||
print("\n" + "="*50)
|
||||
print("最终推送通知内容:")
|
||||
print(report)
|
||||
print("="*50)
|
||||
send("统一茄皇", report)
|
||||
585
脚本库/web版/账密/罗技粉丝俱乐部/2025-06-28_罗技粉丝俱乐部_c45cd687.js
Normal file
585
脚本库/web版/账密/罗技粉丝俱乐部/2025-06-28_罗技粉丝俱乐部_c45cd687.js
Normal file
@@ -0,0 +1,585 @@
|
||||
// # Source: https://gitee.com/jdqlscript/toulu/blob/main/%E7%BD%97%E6%8A%80%E7%B2%89%E4%B8%9D%E4%BF%B1%E4%B9%90%E9%83%A8.js
|
||||
// # Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E7%BD%97%E6%8A%80%E7%B2%89%E4%B8%9D%E4%BF%B1%E4%B9%90%E9%83%A8.js
|
||||
// # Repo: jdqlscript/toulu
|
||||
// # Path: 罗技粉丝俱乐部.js
|
||||
// # UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
// # SHA256: c45cd6870fb5b9d8c3af919d9243a322eaf57226c2cfedab3c421836778af525
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
罗技粉丝俱乐部
|
||||
多账号换行或&隔开
|
||||
TL库:https://github.com/3288588344/toulu.git
|
||||
tg频道:https://t.me/TLtoulu
|
||||
QQ频道:https://pd.qq.com/s/672fku8ge
|
||||
*/
|
||||
const $ = new Env("罗技粉丝俱乐部");
|
||||
let envSplitor = ['\n','&']
|
||||
let httpErr, httpReq, httpResp
|
||||
let userCookie = ($.isNode() ? process.env.ljfsjlbCookie : $.getdata('ljfsjlbCookie')) || '';
|
||||
let userList = []
|
||||
let userIdx = 0
|
||||
let userCount = 0
|
||||
let VIDEO_TASK_NUM = 3
|
||||
let contentType = 'application/json;charset=utf-8'
|
||||
let client_id = 'LogitechFans'
|
||||
let defaultUA = 'Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.23(0x1800172f) NetType/WIFI Language/zh_CN'
|
||||
let Referer = 'https://servicewechat.com/wx9be0a7d24db348e8/220/page-frame.html'
|
||||
///////////////////////////////////////////////////////////////////
|
||||
class UserInfo {
|
||||
constructor(str) {
|
||||
this.index = ++userIdx
|
||||
this.name = this.index
|
||||
this.valid = false
|
||||
|
||||
this.auth = str
|
||||
this.taskList = {}
|
||||
}
|
||||
|
||||
async taskApi(fn,method,url,body) {
|
||||
let result = null
|
||||
try {
|
||||
let host = url.replace('//','/').split('/')[1]
|
||||
let urlObject = {
|
||||
url: url,
|
||||
headers: {
|
||||
'Host': host,
|
||||
'Connection': 'keep-alive',
|
||||
'User-Agent': defaultUA,
|
||||
'Referer': Referer,
|
||||
'client_id': client_id,
|
||||
'Authorization': 'Bearer ' + this.auth,
|
||||
},
|
||||
timeout: 5000,
|
||||
}
|
||||
if(body) {
|
||||
urlObject.body = body
|
||||
urlObject.headers['Content-Type'] = contentType
|
||||
}
|
||||
await httpRequest(method,urlObject).then(async (ret) => {
|
||||
if(ret.resp?.statusCode == 200) {
|
||||
if(ret.resp?.body) {
|
||||
result = JSON.parse(ret.resp.body)
|
||||
} else {
|
||||
console.log(`账号[${this.index}]调用${method}[${fn}]出错,返回为空`)
|
||||
}
|
||||
} else {
|
||||
console.log(`账号[${this.index}]调用${method}[${fn}]出错,返回状态码[${ret.resp?.statusCode||''}]`)
|
||||
}
|
||||
})
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(result);
|
||||
}
|
||||
}
|
||||
|
||||
async GetIsLogin() {
|
||||
try {
|
||||
let fn = 'GetIsLogin'
|
||||
let method = 'post'
|
||||
let url = `https://api.wincheers.net/api/services/app/crmAccount/GetIsLogin`
|
||||
let body = ``
|
||||
await this.taskApi(fn,method,url,body).then(async (result) => {
|
||||
if(result.success==true) {
|
||||
this.valid = true
|
||||
this.name = result.result.name
|
||||
this.id = result.result.id
|
||||
this.integral = result.result.integral
|
||||
this.phone = result.result.telephone
|
||||
this.buyerNo = result.result.buyerNo
|
||||
console.log(`登录成功`)
|
||||
console.log(`昵称: ${this.name}`)
|
||||
console.log(`ID: ${this.id}`)
|
||||
console.log(`积分: ${this.integral}`)
|
||||
} else {
|
||||
$.logAndNotify(`账号[${this.index}]登录失败,CK失效`)
|
||||
}
|
||||
})
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
async IsSignDao() {
|
||||
try {
|
||||
let fn = 'IsSignDao'
|
||||
let method = 'post'
|
||||
let url = `https://api.wincheers.net/api/services/app/signIn/IsSignDao`
|
||||
let body = ``
|
||||
await this.taskApi(fn,method,url,body).then(async (result) => {
|
||||
if(result.success==true) {
|
||||
let taskDetail = result.result.split('|')
|
||||
|
||||
this.taskList.IsSingDao = taskDetail[0]
|
||||
this.taskList.SignDay = taskDetail[1]
|
||||
this.taskList.IsNotice = taskDetail[2]
|
||||
this.taskList.Integral = taskDetail[3]
|
||||
this.taskList.VideoNum = taskDetail[4]
|
||||
this.taskList.shareNum = taskDetail[5]
|
||||
this.taskList.Isperfect = taskDetail[6]
|
||||
this.taskList.IsRelease = taskDetail[7]
|
||||
this.taskList.IsBangDing = taskDetail[8]
|
||||
this.taskList.IsForward = taskDetail[9]
|
||||
this.taskList.Iscomment = taskDetail[10]
|
||||
this.taskList.isProbe = taskDetail[11]
|
||||
this.taskList.isInterest = taskDetail[12]
|
||||
this.taskList.InviteNum = taskDetail[13]
|
||||
|
||||
if(this.taskList.IsSingDao != 'ok') {
|
||||
await this.ContinuitySignIn();
|
||||
} else {
|
||||
console.log(`今天已签到,已签到${this.taskList.SignDay}天`)
|
||||
}
|
||||
if(this.taskList.VideoNum < VIDEO_TASK_NUM) {
|
||||
let num = VIDEO_TASK_NUM - this.taskList.VideoNum
|
||||
for(let i=0; i<num; i++) {
|
||||
let id = parseInt(Math.random()*10000) + 2000
|
||||
await this.AddLogVideo(id)
|
||||
}
|
||||
}
|
||||
//await this.GiftPoints();
|
||||
} else {
|
||||
console.log(`查询任务失败:${result?.error?.message}`)
|
||||
}
|
||||
})
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
async ContinuitySignIn() {
|
||||
try {
|
||||
let fn = 'ContinuitySignIn'
|
||||
let method = 'post'
|
||||
let url = `https://api.wincheers.net/api/services/app/signIn/ContinuitySignIn`
|
||||
let body = ``
|
||||
await this.taskApi(fn,method,url,body).then(async (result) => {
|
||||
if(result.success==true) {
|
||||
this.taskList.SignDay++
|
||||
console.log(`签到成功,获得${result.result}积分,已签到${this.taskList.SignDay}天`)
|
||||
} else {
|
||||
console.log(`签到失败:${result?.error?.message}`)
|
||||
}
|
||||
})
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
async AddLogVideo(SocialId) {
|
||||
try {
|
||||
let fn = 'AddLogVideo'
|
||||
let method = 'post'
|
||||
let url = `https://api.wincheers.net/api/services/app/socialVideoOverLog/AddLog?SocialId=${SocialId}`
|
||||
let body = ``
|
||||
await this.taskApi(fn,method,url,body).then(async (result) => {
|
||||
if(result.success==true) {
|
||||
console.log(`观看视频成功`)
|
||||
if(result.result > 0) console.log(`完成观看视频任务成功,获得${result.result}积分`)
|
||||
} else {
|
||||
console.log(`观看视频失败:${result?.error?.message}`)
|
||||
}
|
||||
})
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
async GiftPoints() {
|
||||
try {
|
||||
let fn = 'GiftPoints'
|
||||
let method = 'post'
|
||||
let url = `https://api.wincheers.net/api/services/app/crmAccount/GiftPoints`
|
||||
let body = ``
|
||||
await this.taskApi(fn,method,url,body).then(async (result) => {
|
||||
if(result.success==true) {
|
||||
console.log(`分享成功,每天首次分享可得50积分`)
|
||||
} else {
|
||||
console.log(`分享失败:${result?.error?.message}`)
|
||||
}
|
||||
})
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
async userTask() {
|
||||
try {
|
||||
console.log(`\n============= 账号[${this.index}] =============`)
|
||||
await this.getScoreAccount();
|
||||
} catch(e) {
|
||||
console.log(e)
|
||||
} finally {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
!(async () => {
|
||||
if (typeof $request !== "undefined") {
|
||||
await GetRewrite()
|
||||
}else {
|
||||
if(!(await checkEnv())) return;
|
||||
|
||||
console.log('\n================ 登录 ================')
|
||||
for(let user of userList) {
|
||||
console.log(`----------- 账号[${user.index}] -----------`)
|
||||
await user.GetIsLogin();
|
||||
}
|
||||
|
||||
let validUserList = userList.filter(x => x.valid)
|
||||
|
||||
if(validUserList.length > 0) {
|
||||
console.log('\n================ 任务 ================')
|
||||
for(let user of validUserList) {
|
||||
console.log(`----------- 账号[${user.index}] -----------`)
|
||||
await user.IsSignDao();
|
||||
}
|
||||
}
|
||||
|
||||
await $.showmsg();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done())
|
||||
///////////////////////////////////////////////////////////////////
|
||||
async function GetRewrite() {
|
||||
}
|
||||
async function checkEnv() {
|
||||
if(userCookie) {
|
||||
let splitor = envSplitor[0];
|
||||
for(let sp of envSplitor) {
|
||||
if(userCookie.indexOf(sp) > -1) {
|
||||
splitor = sp;
|
||||
break;
|
||||
}
|
||||
}
|
||||
for(let userCookies of userCookie.split(splitor)) {
|
||||
if(userCookies) userList.push(new UserInfo(userCookies))
|
||||
}
|
||||
userCount = userList.length
|
||||
} else {
|
||||
console.log('未找到CK')
|
||||
return;
|
||||
}
|
||||
|
||||
console.log(`共找到${userCount}个账号`)
|
||||
return true
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////
|
||||
async function httpRequest(method,url) {
|
||||
httpErr=null, httpReq=null, httpResp=null;
|
||||
return new Promise((resolve) => {
|
||||
$.send(method, url, async (err, req, resp) => {
|
||||
httpErr=err, httpReq=req, httpResp=resp;
|
||||
resolve({err,req,resp})
|
||||
})
|
||||
});
|
||||
}
|
||||
////////////////////////////////////////////////////////////////////
|
||||
function Env(name,env) {
|
||||
"undefined" != typeof process && JSON.stringify(process.env).indexOf("xxxxx") > -1 && process.exit(0);
|
||||
return new class {
|
||||
constructor(name,env) {
|
||||
this.name = name
|
||||
this.notifyStr = ''
|
||||
this.startTime = (new Date).getTime()
|
||||
Object.assign(this,env)
|
||||
console.log(`${this.name} 开始运行:\n`)
|
||||
}
|
||||
isNode() {
|
||||
return "undefined" != typeof module && !!module.exports
|
||||
}
|
||||
isQuanX() {
|
||||
return "undefined" != typeof $task
|
||||
}
|
||||
isSurge() {
|
||||
return "undefined" != typeof $httpClient && "undefined" == typeof $loon
|
||||
}
|
||||
isLoon() {
|
||||
return "undefined" != typeof $loon
|
||||
}
|
||||
getdata(t) {
|
||||
let e = this.getval(t);
|
||||
if (/^@/.test(t)) {
|
||||
const[, s, i] = /^@(.*?)\.(.*?)$/.exec(t),
|
||||
r = s ? this.getval(s) : "";
|
||||
if (r)
|
||||
try {
|
||||
const t = JSON.parse(r);
|
||||
e = t ? this.lodash_get(t, i, "") : e
|
||||
} catch (t) {
|
||||
e = ""
|
||||
}
|
||||
}
|
||||
return e
|
||||
}
|
||||
setdata(t, e) {
|
||||
let s = !1;
|
||||
if (/^@/.test(e)) {
|
||||
const[, i, r] = /^@(.*?)\.(.*?)$/.exec(e),
|
||||
o = this.getval(i),
|
||||
h = i ? "null" === o ? null : o || "{}" : "{}";
|
||||
try {
|
||||
const e = JSON.parse(h);
|
||||
this.lodash_set(e, r, t),
|
||||
s = this.setval(JSON.stringify(e), i)
|
||||
} catch (e) {
|
||||
const o = {};
|
||||
this.lodash_set(o, r, t),
|
||||
s = this.setval(JSON.stringify(o), i)
|
||||
}
|
||||
}
|
||||
else {
|
||||
s = this.setval(t, e);
|
||||
}
|
||||
return s
|
||||
}
|
||||
getval(t) {
|
||||
return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null
|
||||
}
|
||||
setval(t, e) {
|
||||
return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null
|
||||
}
|
||||
send(m, t, e = (() => {})) {
|
||||
if(m != 'get' && m != 'post' && m != 'put' && m != 'delete') {
|
||||
console.log(`无效的http方法:${m}`);
|
||||
return;
|
||||
}
|
||||
if(m == 'get' && t.headers) {
|
||||
delete t.headers["Content-Type"];
|
||||
delete t.headers["Content-Length"];
|
||||
} else if(t.body && t.headers) {
|
||||
if(!t.headers["Content-Type"]) t.headers["Content-Type"] = "application/x-www-form-urlencoded";
|
||||
}
|
||||
if(this.isSurge() || this.isLoon()) {
|
||||
if(this.isSurge() && this.isNeedRewrite) {
|
||||
t.headers = t.headers || {};
|
||||
Object.assign(t.headers, {"X-Surge-Skip-Scripting": !1});
|
||||
}
|
||||
let conf = {
|
||||
method: m,
|
||||
url: t.url,
|
||||
headers: t.headers,
|
||||
timeout: t.timeout,
|
||||
data: t.body
|
||||
};
|
||||
if(m == 'get') delete conf.data
|
||||
$axios(conf).then(t => {
|
||||
const {
|
||||
status: i,
|
||||
request: q,
|
||||
headers: r,
|
||||
data: o
|
||||
} = t;
|
||||
e(null, q, {
|
||||
statusCode: i,
|
||||
headers: r,
|
||||
body: o
|
||||
});
|
||||
}).catch(err => console.log(err))
|
||||
} else if (this.isQuanX()) {
|
||||
t.method = m.toUpperCase(), this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
|
||||
hints: !1
|
||||
})),
|
||||
$task.fetch(t).then(t => {
|
||||
const {
|
||||
statusCode: i,
|
||||
request: q,
|
||||
headers: r,
|
||||
body: o
|
||||
} = t;
|
||||
e(null, q, {
|
||||
statusCode: i,
|
||||
headers: r,
|
||||
body: o
|
||||
})
|
||||
}, t => e(t))
|
||||
} else if (this.isNode()) {
|
||||
this.got = this.got ? this.got : require("got");
|
||||
const {
|
||||
url: s,
|
||||
...i
|
||||
} = t;
|
||||
this.instance = this.got.extend({
|
||||
followRedirect: false
|
||||
});
|
||||
this.instance[m](s, i).then(t => {
|
||||
const {
|
||||
statusCode: i,
|
||||
request: q,
|
||||
headers: r,
|
||||
body: o
|
||||
} = t;
|
||||
e(null, q, {
|
||||
statusCode: i,
|
||||
headers: r,
|
||||
body: o
|
||||
})
|
||||
}, t => {
|
||||
const {
|
||||
message: s,
|
||||
request: q,
|
||||
response: i
|
||||
} = t;
|
||||
e(s, q, i)
|
||||
})
|
||||
}
|
||||
}
|
||||
time(t,x=null) {
|
||||
let xt = x ? new Date(x) : new Date
|
||||
let e = {
|
||||
"M+": xt.getMonth() + 1,
|
||||
"d+": xt.getDate(),
|
||||
"h+": xt.getHours(),
|
||||
"m+": xt.getMinutes(),
|
||||
"s+": xt.getSeconds(),
|
||||
"q+": Math.floor((xt.getMonth() + 3) / 3),
|
||||
S: xt.getMilliseconds()
|
||||
};
|
||||
/(y+)/.test(t) && (t = t.replace(RegExp.$1, (xt.getFullYear() + "").substr(4 - RegExp.$1.length)));
|
||||
for (let s in e)
|
||||
new RegExp("(" + s + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? e[s] : ("00" + e[s]).substr(("" + e[s]).length)));
|
||||
return t
|
||||
}
|
||||
async showmsg() {
|
||||
if(!this.notifyStr) return;
|
||||
let notifyBody = this.name + " 运行通知\n\n" + this.notifyStr
|
||||
if($.isNode()){
|
||||
var notify = require('./sendNotify');
|
||||
console.log('\n============== 推送 ==============')
|
||||
await notify.sendNotify(this.name, notifyBody);
|
||||
} else {
|
||||
this.msg(notifyBody);
|
||||
}
|
||||
}
|
||||
logAndNotify(str) {
|
||||
console.log(str)
|
||||
this.notifyStr += str
|
||||
this.notifyStr += '\n'
|
||||
}
|
||||
logAndNotifyWithTime(str) {
|
||||
let t = '['+this.time('hh:mm:ss.S')+']'+str
|
||||
console.log(t)
|
||||
this.notifyStr += t
|
||||
this.notifyStr += '\n'
|
||||
}
|
||||
logWithTime(str) {
|
||||
console.log('['+this.time('hh:mm:ss.S')+']'+str)
|
||||
}
|
||||
msg(e = t, s = "", i = "", r) {
|
||||
const o = t => {
|
||||
if (!t)
|
||||
return t;
|
||||
if ("string" == typeof t)
|
||||
return this.isLoon() ? t : this.isQuanX() ? {
|
||||
"open-url": t
|
||||
}
|
||||
: this.isSurge() ? {
|
||||
url: t
|
||||
}
|
||||
: void 0;
|
||||
if ("object" == typeof t) {
|
||||
if (this.isLoon()) {
|
||||
let e = t.openUrl || t.url || t["open-url"],
|
||||
s = t.mediaUrl || t["media-url"];
|
||||
return {
|
||||
openUrl: e,
|
||||
mediaUrl: s
|
||||
}
|
||||
}
|
||||
if (this.isQuanX()) {
|
||||
let e = t["open-url"] || t.url || t.openUrl,
|
||||
s = t["media-url"] || t.mediaUrl;
|
||||
return {
|
||||
"open-url": e,
|
||||
"media-url": s
|
||||
}
|
||||
}
|
||||
if (this.isSurge()) {
|
||||
let e = t.url || t.openUrl || t["open-url"];
|
||||
return {
|
||||
url: e
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r)));
|
||||
let h = ["", "============== 系统通知 =============="];
|
||||
h.push(e),
|
||||
s && h.push(s),
|
||||
i && h.push(i),
|
||||
console.log(h.join("\n"))
|
||||
}
|
||||
getMin(a,b){
|
||||
return ((a<b) ? a : b)
|
||||
}
|
||||
getMax(a,b){
|
||||
return ((a<b) ? b : a)
|
||||
}
|
||||
padStr(num,length,padding='0') {
|
||||
let numStr = String(num)
|
||||
let numPad = (length>numStr.length) ? (length-numStr.length) : 0
|
||||
let retStr = ''
|
||||
for(let i=0; i<numPad; i++) {
|
||||
retStr += padding
|
||||
}
|
||||
retStr += numStr
|
||||
return retStr;
|
||||
}
|
||||
json2str(obj,c,encodeUrl=false) {
|
||||
let ret = []
|
||||
for(let keys of Object.keys(obj).sort()) {
|
||||
let v = obj[keys]
|
||||
if(v && encodeUrl) v = encodeURIComponent(v)
|
||||
ret.push(keys+'='+v)
|
||||
}
|
||||
return ret.join(c);
|
||||
}
|
||||
str2json(str,decodeUrl=false) {
|
||||
let ret = {}
|
||||
for(let item of str.split('&')) {
|
||||
if(!item) continue;
|
||||
let idx = item.indexOf('=')
|
||||
if(idx == -1) continue;
|
||||
let k = item.substr(0,idx)
|
||||
let v = item.substr(idx+1)
|
||||
if(decodeUrl) v = decodeURIComponent(v)
|
||||
ret[k] = v
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
randomString(len,charset='abcdef0123456789') {
|
||||
let str = '';
|
||||
for (let i = 0; i < len; i++) {
|
||||
str += charset.charAt(Math.floor(Math.random()*charset.length));
|
||||
}
|
||||
return str;
|
||||
}
|
||||
randomList(a) {
|
||||
let idx = Math.floor(Math.random()*a.length)
|
||||
return a[idx]
|
||||
}
|
||||
wait(t) {
|
||||
return new Promise(e => setTimeout(e, t))
|
||||
}
|
||||
done(t = {}) {
|
||||
const e = (new Date).getTime(),
|
||||
s = (e - this.startTime) / 1e3;
|
||||
console.log(`\n${this.name} 运行结束,共运行了 ${s} 秒!`)
|
||||
if(this.isSurge() || this.isQuanX() || this.isLoon()) $done(t)
|
||||
}
|
||||
}(name,env)
|
||||
}
|
||||
258
脚本库/web版/账密/联想延保签到/2025-06-28_联想延保签到_f8c349cc.py
Normal file
258
脚本库/web版/账密/联想延保签到/2025-06-28_联想延保签到_f8c349cc.py
Normal file
@@ -0,0 +1,258 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%81%94%E6%83%B3%E5%BB%B6%E4%BF%9D%E7%AD%BE%E5%88%B0.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%81%94%E6%83%B3%E5%BB%B6%E4%BF%9D%E7%AD%BE%E5%88%B0.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 联想延保签到.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: f8c349ccab0323222234630bfe4b5c0f1f6fc22d876be5a01880f989a73214c1
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
'''QQ频道:98do10s246
|
||||
|
||||
联系:3288588344(看心情回,巨婴别来问)
|
||||
下载config.toml文件,上传到同目录,在config.toml文件中填联想APP的手机号和密码
|
||||
通知可填可不填
|
||||
config.toml文件下载链接:https://raw.githubusercontent.com/3288588344/toulu/main/config.toml
|
||||
'''
|
||||
import base64
|
||||
import json
|
||||
import logging
|
||||
import random
|
||||
import re
|
||||
from sys import exit
|
||||
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
from smtplib import SMTP_SSL
|
||||
from email.header import Header
|
||||
|
||||
import requests
|
||||
import toml
|
||||
from requests.utils import cookiejar_from_dict, dict_from_cookiejar
|
||||
|
||||
|
||||
USER_AGENT = [
|
||||
"Mozilla/5.0 (Linux; U; Android 11; zh-cn; PDYM20 Build/RP1A.200720.011) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/70.0.3538.80 Mobile Safari/537.36 HeyTapBrowser/40.7.24.9",
|
||||
"Mozilla/5.0 (Linux; Android 12; Redmi K30 Pro) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Mobile Safari/537.36"
|
||||
]
|
||||
|
||||
|
||||
class Push_messages:
|
||||
class Server_chan:
|
||||
def __init__(self, send_key: str) -> None:
|
||||
self.send_key = send_key
|
||||
|
||||
def send_message(self, content: str) -> bool:
|
||||
data = {"title": "联想签到", "desp": content}
|
||||
response = requests.post(
|
||||
f"https://sctapi.ftqq.com/{self.send_key}.send", data=data
|
||||
)
|
||||
res_data = response.json().get("data")
|
||||
pushid = res_data.get("pushid")
|
||||
readkey = res_data.get("readkey")
|
||||
result = requests.get(
|
||||
f"https://sctapi.ftqq.com/push?id={pushid}&readkey={readkey}"
|
||||
)
|
||||
return True if result.json().get("code") == 0 else False
|
||||
|
||||
class Wechat_message:
|
||||
def __init__(self, corpid: str, corpsecret: str, agentid: str) -> None:
|
||||
self.corpid = corpid
|
||||
self.corpsecret = corpsecret
|
||||
self.agentid = agentid
|
||||
self.token = (
|
||||
requests.get(
|
||||
f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={self.corpid}&corpsecret={self.corpsecret}"
|
||||
)
|
||||
.json()
|
||||
.get("access_token")
|
||||
)
|
||||
|
||||
def send_message(self, content: str) -> bool:
|
||||
data = {
|
||||
"touser": "@all",
|
||||
"msgtype": "text",
|
||||
"agentid": self.agentid,
|
||||
"text": {"content": content},
|
||||
"safe": 0,
|
||||
}
|
||||
response = requests.post(
|
||||
f"https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token={self.token}",
|
||||
data=json.dumps(data),
|
||||
)
|
||||
return True if response.json().get("errcode") == 0 else False
|
||||
|
||||
class Dingtalk_message:
|
||||
def __init__(self, ding_accesstoken: str) -> None:
|
||||
self.ding_accesstoken = ding_accesstoken
|
||||
|
||||
def send_message(self, content: str) -> bool:
|
||||
data = {
|
||||
"msgtype": "text",
|
||||
"text": {"content": content},
|
||||
"at": {"isAtAll": True},
|
||||
}
|
||||
response = requests.post(
|
||||
f"https://oapi.dingtalk.com/robot/send?access_token={self.ding_accesstoken}",
|
||||
data=json.dumps(data),
|
||||
)
|
||||
return True if response.json().get("errcode") == 0 else False
|
||||
|
||||
class Email_message:
|
||||
def __init__(self, sender_email: str, sender_password: str, receiver_email: str, smtp_server: str,
|
||||
smtp_port: int) -> None:
|
||||
self.sender_email = sender_email
|
||||
self.sender_password = sender_password
|
||||
self.receiver_email = receiver_email
|
||||
self.smtp_server = smtp_server
|
||||
self.smtp_port = smtp_port
|
||||
|
||||
def send_message(self, content: str) -> bool:
|
||||
receiver_email = [self.receiver_email]
|
||||
|
||||
message = MIMEText(content, 'plain', 'utf-8')
|
||||
message['Subject'] = Header("联想智选定时签到结果", "utf-8")
|
||||
message['From'] = Header("联想智选定时签到程序", "utf-8")
|
||||
message['To'] = receiver_email[0]
|
||||
|
||||
try:
|
||||
smtp = SMTP_SSL(self.smtp_server, self.smtp_port)
|
||||
smtp.login(self.sender_email, self.sender_password)
|
||||
smtp.sendmail(
|
||||
self.sender_email, receiver_email, message.as_string())
|
||||
smtp.quit()
|
||||
return True
|
||||
except smtplib.SMTPException as e:
|
||||
print('send email error', e)
|
||||
return False
|
||||
|
||||
|
||||
def set_push_type():
|
||||
for type, key in config.get("message_push").items():
|
||||
key_list = key.values()
|
||||
if "".join(key_list):
|
||||
return getattr(Push_messages(), type)(*key_list).send_message
|
||||
else:
|
||||
return logger
|
||||
|
||||
|
||||
def login(username, password):
|
||||
def get_cookie():
|
||||
session.headers = {
|
||||
"user-agent": ua,
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
}
|
||||
session.get(url="https://reg.lenovo.com.cn/auth/rebuildleid")
|
||||
session.get(
|
||||
url="https://reg.lenovo.com.cn/auth/v1/login?ticket=5e9b6d3d-4500-47fc-b32b-f2b4a1230fd3&ru=https%3A%2F%2Fmclub.lenovo.com.cn%2F"
|
||||
)
|
||||
data = f"account={username}&password={base64.b64encode(str(password).encode()).decode()}\
|
||||
&ps=1&ticket=5e9b6d3d-4500-47fc-b32b-f2b4a1230fd3&codeid=&code=&slide=v2&applicationPlatform=2&shopId=\
|
||||
1&os=web&deviceId=BIT%2F8ZTwWmvKpMsz3bQspIZRY9o9hK1Ce3zKIt5js7WSUgGQNnwvYmjcRjVHvJbQ00fe3T2wxgjZAVSd\
|
||||
OYl8rrQ%3D%3D&t=1655187183738&websiteCode=10000001&websiteName=%25E5%2595%2586%25E5%259F%258E%25E\
|
||||
7%25AB%2599&forwardPageUrl=https%253A%252F%252Fmclub.lenovo.com.cn%252F"
|
||||
login_response = session.post(
|
||||
url="https://reg.lenovo.com.cn/auth/v2/doLogin", data=data
|
||||
)
|
||||
if login_response.json().get("ret") == "1":
|
||||
logger(f"{username}账号或密码错误")
|
||||
return None
|
||||
ck_dict = dict_from_cookiejar(session.cookies)
|
||||
config["cookies"][username] = f"{ck_dict}"
|
||||
toml.dump(config, open(config_file, "w"))
|
||||
session.cookies = cookiejar_from_dict(ck_dict)
|
||||
return session
|
||||
|
||||
session = requests.Session()
|
||||
session.headers = {
|
||||
"user-agent": ua,
|
||||
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
}
|
||||
if cookie_dict := config.get("cookies").get(username):
|
||||
session.cookies = cookiejar_from_dict(eval(cookie_dict))
|
||||
ledou = session.post(
|
||||
"https://i.lenovo.com.cn/info/uledou.jhtml",
|
||||
data={"sts": "b044d754-bda2-4f56-9fea-dcf3aecfe782"},
|
||||
)
|
||||
try:
|
||||
int(ledou.text)
|
||||
except ValueError:
|
||||
logger(f"{username} ck有错,重新获取ck并保存")
|
||||
session = get_cookie()
|
||||
return session
|
||||
logger(f"{username} ck没有错")
|
||||
return session
|
||||
else:
|
||||
logger(f"{username} ck为空,重新获取ck并保存")
|
||||
session = get_cookie()
|
||||
return session
|
||||
|
||||
|
||||
def sign(session):
|
||||
res = session.get(url="https://mclub.lenovo.com.cn/signlist/")
|
||||
token = re.findall('token\s=\s"(.*?)"', res.text)[0]
|
||||
data = f"_token={token}&memberSource=1"
|
||||
headers = {
|
||||
"Host": "mclub.lenovo.com.cn",
|
||||
"pragma": "no-cache",
|
||||
"cache-control": "no-cache",
|
||||
"accept": "application/json, text/javascript, */*; q=0.01",
|
||||
"origin": "https://mclub.lenovo.com.cn",
|
||||
"x-requested-with": "XMLHttpRequest",
|
||||
"user-agent": ua
|
||||
+ "/lenovoofficialapp/16554342219868859_10128085590/newversion/versioncode-1000080/",
|
||||
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
|
||||
"referer": "https://mclub.lenovo.com.cn/signlist?pmf_group=in-push&pmf_medium=app&pmf_source=Z00025783T000",
|
||||
"accept-language": "zh-CN,en-US;q=0.8",
|
||||
}
|
||||
sign_response = session.post(
|
||||
"https://mclub.lenovo.com.cn/signadd", data=data, headers=headers
|
||||
)
|
||||
sign_days = (
|
||||
session.get(url="https://mclub.lenovo.com.cn/getsignincal")
|
||||
.json()
|
||||
.get("signinCal")
|
||||
.get("continueCount")
|
||||
)
|
||||
sign_user_info = session.get("https://mclub.lenovo.com.cn/signuserinfo")
|
||||
try:
|
||||
serviceAmount = sign_user_info.json().get("serviceAmount")
|
||||
ledou = sign_user_info.json().get("ledou")
|
||||
except Exception as e:
|
||||
logger(sign_user_info.headers["content-type"])
|
||||
logger(sign_user_info.status_code)
|
||||
logger(e)
|
||||
serviceAmount, ledou = None, None
|
||||
session.close()
|
||||
if sign_response.json().get("success"):
|
||||
return f"\U00002705账号{username}签到成功, \U0001F4C6连续签到{sign_days}天, \U0001F954共有乐豆{ledou}个, \U0001F4C5共有延保{serviceAmount}天\n"
|
||||
else:
|
||||
return f"\U0001F6AB账号{username}今天已经签到, \U0001F4C6连续签到{sign_days}天, \U0001F954共有乐豆{ledou}个, \U0001F4C5共有延保{serviceAmount}天\n"
|
||||
|
||||
|
||||
def main():
|
||||
global logger, config_file, config, ua, username
|
||||
logging.basicConfig(
|
||||
level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s"
|
||||
)
|
||||
logger = logging.getLogger(__name__).info
|
||||
config_file = r"config.toml"
|
||||
config = toml.load(config_file)
|
||||
account = config.get("account")
|
||||
if not account:
|
||||
exit(1)
|
||||
if not (ua := config.get("browser").get("ua")):
|
||||
ua = random.choice(USER_AGENT)
|
||||
config["browser"]["ua"] = ua
|
||||
push = set_push_type()
|
||||
message = "联想签到: \n"
|
||||
for username, password in account.items():
|
||||
session = login(username, password)
|
||||
if not session:
|
||||
continue
|
||||
message += sign(session)
|
||||
push(message)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
1083
脚本库/web版/账密/胖乖生活/2025-06-28_胖乖生活_104430b9.py
Normal file
1083
脚本库/web版/账密/胖乖生活/2025-06-28_胖乖生活_104430b9.py
Normal file
File diff suppressed because it is too large
Load Diff
679
脚本库/web版/账密/腾讯视频/2025-06-28_腾讯视频_d184953f.js
Normal file
679
脚本库/web版/账密/腾讯视频/2025-06-28_腾讯视频_d184953f.js
Normal file
File diff suppressed because one or more lines are too long
585
脚本库/web版/账密/葫芦侠3楼/2025-08-25_huluxia_6233f109.js
Normal file
585
脚本库/web版/账密/葫芦侠3楼/2025-08-25_huluxia_6233f109.js
Normal file
@@ -0,0 +1,585 @@
|
||||
// # Source: https://github.com/imoki/sign_script/blob/main/polymerization/huluxia.js
|
||||
// # Raw: https://raw.githubusercontent.com/imoki/sign_script/main/polymerization/huluxia.js
|
||||
// # Repo: imoki/sign_script
|
||||
// # Path: polymerization/huluxia.js
|
||||
// # UploadedAt: 2025-08-25T21:29:14+08:00
|
||||
// # SHA256: 6233f109c9d3883bbb174dbdb20376c2462cb2aa72e8fba21e67863ce31bc48e
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
name: "葫芦侠3楼"
|
||||
cron: 45 0 9 * * *
|
||||
脚本兼容: 金山文档(1.0)
|
||||
更新时间:20241226
|
||||
环境变量名:无
|
||||
环境变量值:无
|
||||
备注:需要_key。用抓包工具抓取所需的值
|
||||
如何快速抓取到_key:
|
||||
1.开启抓包
|
||||
2.葫芦侠APP退出,然后重新登录
|
||||
3.此时任意找到一个url中含有“user/info”的请求
|
||||
4.然后点击“查看表单”,复制其中的_key值
|
||||
*/
|
||||
|
||||
var sheetNameSubConfig = "huluxia"; // 分配置表名称
|
||||
var pushHeader = "【葫芦侠】";
|
||||
var sheetNameConfig = "CONFIG"; // 总配置表
|
||||
var sheetNamePush = "PUSH"; // 推送表名称
|
||||
var sheetNameEmail = "EMAIL"; // 邮箱表
|
||||
var flagSubConfig = 0; // 激活分配置工作表标志
|
||||
var flagConfig = 0; // 激活主配置工作表标志
|
||||
var flagPush = 0; // 激活推送工作表标志
|
||||
var line = 21; // 指定读取从第2行到第line行的内容
|
||||
var message = ""; // 待发送的消息
|
||||
var messageArray = []; // 待发送的消息数据,每个元素都是某个账号的消息。目的是将不同用户消息分离,方便个性化消息配置
|
||||
var messageOnlyError = 0; // 0为只推送失败消息,1则为推送成功消息。
|
||||
var messageNickname = 0; // 1为推送位置标识(昵称/单元格Ax(昵称为空时)),0为不推送位置标识
|
||||
var messageHeader = []; // 存放每个消息的头部,如:单元格A3。目的是分离附加消息和执行结果消息
|
||||
var messagePushHeader = pushHeader; // 存放在总消息的头部,默认是pushHeader,如:【xxxx】
|
||||
var version = 1 // 版本类型,自动识别并适配。默认为airscript 1.0,否则为2.0(Beta)
|
||||
var separator = "##########MOKU##########" // 分割符,分割消息。可用于PUSH.js灵活推送
|
||||
var maxMessageLength = 400; // 设置最大长度,超过这个长度则分片发送
|
||||
var messageDistance = 100; // 消息距离,用于匹配100字符内最近的行
|
||||
|
||||
var jsonPush = [
|
||||
{ name: "bark", key: "xxxxxx", flag: "0" },
|
||||
{ name: "pushplus", key: "xxxxxx", flag: "0" },
|
||||
{ name: "ServerChan", key: "xxxxxx", flag: "0" },
|
||||
{ name: "email", key: "xxxxxx", flag: "0" },
|
||||
{ name: "dingtalk", key: "xxxxxx", flag: "0" },
|
||||
{ name: "discord", key: "xxxxxx", flag: "0" },
|
||||
]; // 推送数据,flag=1则推送
|
||||
var jsonEmail = {
|
||||
server: "",
|
||||
port: "",
|
||||
sender: "",
|
||||
authorizationCode: "",
|
||||
}; // 有效邮箱配置
|
||||
|
||||
// =================青龙适配开始===================
|
||||
|
||||
qlSwitch = 0
|
||||
|
||||
// =================青龙适配结束===================
|
||||
|
||||
// =================金山适配开始===================
|
||||
// airscript检测版本
|
||||
function checkVesion(){
|
||||
try{
|
||||
let temp = Application.Range("A1").Text;
|
||||
Application.Range("A1").Value = temp
|
||||
console.log("😶🌫️ 检测到当前airscript版本为1.0,进行1.0适配")
|
||||
}catch{
|
||||
console.log("😶🌫️ 检测到当前airscript版本为2.0,进行2.0适配")
|
||||
version = 2
|
||||
}
|
||||
}
|
||||
|
||||
// 推送相关
|
||||
// 获取时间
|
||||
function getDate(){
|
||||
let currentDate = new Date();
|
||||
currentDate = currentDate.getFullYear() + '/' + (currentDate.getMonth() + 1).toString() + '/' + currentDate.getDate().toString();
|
||||
return currentDate
|
||||
}
|
||||
|
||||
// 将消息写入CONFIG表中作为消息队列,之后统一发送
|
||||
function writeMessageQueue(message){
|
||||
// 当天时间
|
||||
let todayDate = getDate()
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活主配置表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("✨ 开始将结果写入主配置表");
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
if(version == 1){
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}else{
|
||||
// 找到指定的表行
|
||||
if(Application.Range("A" + (i + 2)).Value2 == sheetNameSubConfig){
|
||||
// 写入更新的时间
|
||||
Application.Range("F" + (i + 2)).Value2 = todayDate
|
||||
// 写入消息
|
||||
Application.Range("G" + (i + 2)).Value2 = message
|
||||
console.log("✨ 写入结果完成");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 总推送
|
||||
function push(message) {
|
||||
writeMessageQueue(message) // 将消息写入CONFIG表中
|
||||
// if (message != "") {
|
||||
// // message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
// let length = jsonPush.length;
|
||||
// let name;
|
||||
// let key;
|
||||
// for (let i = 0; i < length; i++) {
|
||||
// if (jsonPush[i].flag == 1) {
|
||||
// name = jsonPush[i].name;
|
||||
// key = jsonPush[i].key;
|
||||
// if (name == "bark") {
|
||||
// bark(message, key);
|
||||
// } else if (name == "pushplus") {
|
||||
// pushplus(message, key);
|
||||
// } else if (name == "ServerChan") {
|
||||
// serverchan(message, key);
|
||||
// } else if (name == "email") {
|
||||
// email(message);
|
||||
// } else if (name == "dingtalk") {
|
||||
// dingtalk(message, key);
|
||||
// } else if (name == "discord") {
|
||||
// discord(message, key);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// console.log("🍳 消息为空不推送");
|
||||
// }
|
||||
}
|
||||
|
||||
// 推送bark消息
|
||||
function bark(message, key) {
|
||||
if (key != "") {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
message = encodeURIComponent(message)
|
||||
BARK_ICON = "https://s21.ax1x.com/2024/06/23/pkrUkfe.png"
|
||||
let url = "https://api.day.app/" + key + "/" + message + "/" + "?icon=" + BARK_ICON;
|
||||
// 若需要修改推送的分组,则将上面一行改为如下的形式
|
||||
// let url = 'https://api.day.app/' + bark_id + "/" + message + "?group=分组名";
|
||||
let resp = HTTP.get(url, {
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送pushplus消息
|
||||
function pushplus(message, key) {
|
||||
if (key != "") {
|
||||
message = encodeURIComponent(message)
|
||||
// url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message;
|
||||
url = "http://www.pushplus.plus/send?token=" + key + "&content=" + message + "&title=" + pushHeader; // 增加标题
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// 推送serverchan消息
|
||||
function serverchan(message, key) {
|
||||
if (key != "") {
|
||||
url =
|
||||
"https://sctapi.ftqq.com/" +
|
||||
key +
|
||||
".send" +
|
||||
"?title=" + messagePushHeader +
|
||||
"&desp=" +
|
||||
message;
|
||||
let resp = HTTP.fetch(url, {
|
||||
method: "get",
|
||||
});
|
||||
sleep(5000);
|
||||
}
|
||||
}
|
||||
|
||||
// email邮箱推送
|
||||
function email(message) {
|
||||
var myDate = new Date(); // 创建一个表示当前时间的 Date 对象
|
||||
var data_time = myDate.toLocaleDateString(); // 获取当前日期的字符串表示
|
||||
let server = jsonEmail.server;
|
||||
let port = parseInt(jsonEmail.port); // 转成整形
|
||||
let sender = jsonEmail.sender;
|
||||
let authorizationCode = jsonEmail.authorizationCode;
|
||||
|
||||
let mailer;
|
||||
mailer = SMTP.login({
|
||||
host: server,
|
||||
port: port,
|
||||
username: sender,
|
||||
password: authorizationCode,
|
||||
secure: true,
|
||||
});
|
||||
mailer.send({
|
||||
from: pushHeader + "<" + sender + ">",
|
||||
to: sender,
|
||||
subject: pushHeader + " - " + data_time,
|
||||
text: message,
|
||||
});
|
||||
// console.log("🍳 已发送邮件至:" + sender);
|
||||
console.log("🍳 已发送邮件");
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 邮箱配置
|
||||
function emailConfig() {
|
||||
console.log("🍳 开始读取邮箱配置");
|
||||
let length = jsonPush.length; // 因为此json数据可无序,因此需要遍历
|
||||
let name;
|
||||
for (let i = 0; i < length; i++) {
|
||||
name = jsonPush[i].name;
|
||||
if (name == "email") {
|
||||
if (jsonPush[i].flag == 1) {
|
||||
let flag = ActivateSheet(sheetNameEmail); // 激活邮箱表
|
||||
// 邮箱表存在
|
||||
// var email = {
|
||||
// 'email':'', 'port':'', 'sender':'', 'authorizationCode':''
|
||||
// } // 有效配置
|
||||
if (flag == 1) {
|
||||
console.log("🍳 开始读取邮箱表");
|
||||
for (let i = 2; i <= 2; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
jsonEmail.server = Application.Range("A" + i).Text;
|
||||
jsonEmail.port = Application.Range("B" + i).Text;
|
||||
jsonEmail.sender = Application.Range("C" + i).Text;
|
||||
jsonEmail.authorizationCode = Application.Range("D" + i).Text;
|
||||
if (Application.Range("A" + i).Text == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
}
|
||||
// console.log(jsonEmail)
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 推送钉钉机器人
|
||||
function dingtalk(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = "https://oapi.dingtalk.com/robot/send?access_token=" + key;
|
||||
let resp = HTTP.post(url, { msgtype: "text", text: { content: message } });
|
||||
// console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// 推送Discord机器人
|
||||
function discord(message, key) {
|
||||
message = messagePushHeader + message // 消息头最前方默认存放:【xxxx】
|
||||
let url = key;
|
||||
let resp = HTTP.post(url, { content: message });
|
||||
//console.log(resp.text())
|
||||
sleep(5000);
|
||||
}
|
||||
|
||||
// =================金山适配结束===================
|
||||
// =================共用开始===================
|
||||
// main() // 入口
|
||||
|
||||
// function main(){
|
||||
checkVesion() // 版本检测,以进行不同版本的适配
|
||||
|
||||
flagConfig = ActivateSheet(sheetNameConfig); // 激活推送表
|
||||
// 主配置工作表存在
|
||||
if (flagConfig == 1) {
|
||||
console.log("🍳 开始读取主配置表");
|
||||
let name; // 名称
|
||||
let onlyError;
|
||||
let nickname;
|
||||
for (let i = 2; i <= 100; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
name = Application.Range("A" + i).Text;
|
||||
onlyError = Application.Range("C" + i).Text;
|
||||
nickname = Application.Range("D" + i).Text;
|
||||
if (name == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
if (name == sheetNameSubConfig) {
|
||||
if (onlyError == "是") {
|
||||
messageOnlyError = 1;
|
||||
console.log("🍳 只推送错误消息");
|
||||
}
|
||||
|
||||
if (nickname == "是") {
|
||||
messageNickname = 1;
|
||||
console.log("🍳 单元格用昵称替代");
|
||||
}
|
||||
|
||||
break; // 提前退出,提高效率
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flagPush = ActivateSheet(sheetNamePush); // 激活推送表
|
||||
// 推送工作表存在
|
||||
if (flagPush == 1) {
|
||||
console.log("🍳 开始读取推送工作表");
|
||||
let pushName; // 推送类型
|
||||
let pushKey;
|
||||
let pushFlag; // 是否推送标志
|
||||
for (let i = 2; i <= line; i++) {
|
||||
// 从工作表中读取推送数据
|
||||
pushName = Application.Range("A" + i).Text;
|
||||
pushKey = Application.Range("B" + i).Text;
|
||||
pushFlag = Application.Range("C" + i).Text;
|
||||
if (pushName == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
jsonPushHandle(pushName, pushFlag, pushKey);
|
||||
}
|
||||
// console.log(jsonPush)
|
||||
}
|
||||
|
||||
// 邮箱配置函数
|
||||
emailConfig();
|
||||
|
||||
flagSubConfig = ActivateSheet(sheetNameSubConfig); // 激活分配置表
|
||||
if (flagSubConfig == 1) {
|
||||
console.log("🍳 开始读取分配置表");
|
||||
|
||||
if(qlSwitch != 1){ // 金山文档
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
execHandle(cookie, i);
|
||||
}
|
||||
}
|
||||
message = messageMerge()// 将消息数组融合为一条总消息
|
||||
push(message); // 推送消息
|
||||
}else{
|
||||
for (let i = 2; i <= line; i++) {
|
||||
var cookie = Application.Range("A" + i).Text;
|
||||
var exec = Application.Range("B" + i).Text;
|
||||
if (cookie == "") {
|
||||
// 如果为空行,则提前结束读取
|
||||
break;
|
||||
}
|
||||
if (exec == "是") {
|
||||
console.log("🧑 开始执行用户:" + "1" )
|
||||
execHandle(cookie, i);
|
||||
break; // 只取一个
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// }
|
||||
|
||||
// 激活工作表函数
|
||||
function ActivateSheet(sheetName) {
|
||||
let flag = 0;
|
||||
try {
|
||||
// 激活工作表
|
||||
let sheet = Application.Sheets.Item(sheetName);
|
||||
sheet.Activate();
|
||||
console.log("🥚 激活工作表:" + sheet.Name);
|
||||
flag = 1;
|
||||
} catch {
|
||||
flag = 0;
|
||||
console.log("🍳 无法激活工作表,工作表可能不存在");
|
||||
}
|
||||
return flag;
|
||||
}
|
||||
|
||||
// 对推送数据进行处理
|
||||
function jsonPushHandle(pushName, pushFlag, pushKey) {
|
||||
let length = jsonPush.length;
|
||||
for (let i = 0; i < length; i++) {
|
||||
if (jsonPush[i].name == pushName) {
|
||||
if (pushFlag == "是") {
|
||||
jsonPush[i].flag = 1;
|
||||
jsonPush[i].key = pushKey;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 将消息数组融合为一条总消息
|
||||
function messageMerge(){
|
||||
// console.log(messageArray)
|
||||
let message = ""
|
||||
for(i=0; i<messageArray.length; i++){
|
||||
if(messageArray[i] != "" && messageArray[i] != null)
|
||||
{
|
||||
message += "\n" + messageHeader[i] + messageArray[i] + ""; // 加上推送头
|
||||
}
|
||||
}
|
||||
if(message != "")
|
||||
{
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
console.log(message + "\n") // 打印总消息
|
||||
console.log("✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨")
|
||||
}
|
||||
return message
|
||||
}
|
||||
|
||||
function sleep(d) {
|
||||
for (var t = Date.now(); Date.now() - t <= d; );
|
||||
}
|
||||
|
||||
// // 获取sign,返回小写
|
||||
// function getsign(data) {
|
||||
// var sign = Crypto.createHash("md5")
|
||||
// .update(data, "utf8")
|
||||
// .digest("hex")
|
||||
// // .toUpperCase() // 大写
|
||||
// .toString();
|
||||
// return sign;
|
||||
// }
|
||||
|
||||
// =================共用结束===================
|
||||
|
||||
|
||||
// 获取sign
|
||||
function getsign(cat_id, time_s) {
|
||||
// 'cat_id' + cat_id + 'time' + time_s + 'fa1c28a5b62e79c3e63d9030b6142e4b'
|
||||
var key =
|
||||
"cat_id" +
|
||||
cat_id +
|
||||
"time" +
|
||||
time_s +
|
||||
"fa1c28a5b62e79c3e63d9030b6142e4b";
|
||||
// console.log(key)
|
||||
var sign = Crypto.createHash("md5")
|
||||
.update(key, "utf8")
|
||||
.digest("hex")
|
||||
.toUpperCase()
|
||||
.toString();
|
||||
return sign;
|
||||
}
|
||||
|
||||
// 获取10 位时间戳
|
||||
function getts10() {
|
||||
var ts = Math.round(new Date().getTime() / 1000).toString();
|
||||
return ts;
|
||||
}
|
||||
|
||||
// 获取13位时间戳
|
||||
function getts13(){
|
||||
// var ts = Math.round(new Date().getTime()/1000).toString() // 获取10 位时间戳
|
||||
let ts = new Date().getTime()
|
||||
return ts
|
||||
}
|
||||
|
||||
// 具体的执行函数
|
||||
function execHandle(cookie, pos) {
|
||||
let messageSuccess = "";
|
||||
let messageFail = "";
|
||||
let messageName = "";
|
||||
// 推送昵称或单元格,还是不推送位置标识
|
||||
if (messageNickname == 1) {
|
||||
// 推送昵称或单元格
|
||||
messageName = Application.Range("C" + pos).Text;
|
||||
if(messageName == "")
|
||||
{
|
||||
messageName = "单元格A" + pos + "";
|
||||
}
|
||||
}
|
||||
|
||||
posLabel = pos-2 ; // 存放下标,从0开始
|
||||
messageHeader[posLabel] = "👨🚀 " + messageName
|
||||
try {
|
||||
// catid = [1, 2, 3, 4, 6, 15, 16, 21, 22, 23, 29, 34, 43, 44, 45, 56, 57, 58, 60, 63, 67, 68, 69, 70, 71, 76, 77, 81, 82, 84, 90, 92, 94, 96, 98, 102, 105, 107, 108, 110, 111, 115, 119, 120, 121]
|
||||
catid = [1, 2, 3, 4, 6, 15, 16, 21, 22, 29, 43, 44, 45, 57, 58, 60, 63, 67, 68, 69, 70, 71, 76, 77, 81, 82, 84, 90, 92, 94, 96, 98, 102, 107, 108, 110, 111, 115, 119, 120, 121]
|
||||
// catid = [1,56]
|
||||
for (let i = 0; i < catid.length; i++) {
|
||||
cat_id = String(catid[i])
|
||||
time_s = String(getts13())
|
||||
|
||||
// 无需device_code版本
|
||||
var url1 = "http://floor.huluxia.com/user/signin/ANDROID/4.1.8?platform=2&gkey=000000&app_version=4.2.0.5&versioncode=20141475&market_id=floor_web&_key=" + cookie + "&phone_brand_type=OP&cat_id=" + cat_id+ "&time=" + time_s
|
||||
|
||||
// console.log(url1)
|
||||
// 将cat_id和time和不变的voice_code组合成一个字符串
|
||||
sign = getsign(cat_id, time_s)
|
||||
// console.log(sign)
|
||||
|
||||
// data = {
|
||||
// "sign": sign // 动态sign
|
||||
// }
|
||||
headers = {
|
||||
"Accept-Encoding": "identity",
|
||||
"Host": "floor.huluxia.com",
|
||||
'User-Agent': 'okhttp/3.8.1',
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
}
|
||||
|
||||
resp = HTTP.fetch(url1 + "&sign=" + sign, {
|
||||
method: "post",
|
||||
headers: headers,
|
||||
// data: data
|
||||
});
|
||||
// sign错误时:
|
||||
// {"arg":"sign","code":101,"msg":"参数不能为空","title":{},"status":0}
|
||||
// sign正确时:
|
||||
// {"msg":"","continueDays":1,"experienceVal":5,"remainDaysToGetMoreExperiences":10,"nextExperience":10,"signin":1,"isFirstSignToday":1,"medal":{},"medalUrl":{},"ranking":0,"contrast":0,"status":1}
|
||||
|
||||
resp = resp.json();
|
||||
console.log(resp)
|
||||
// 状态:0为失败,1为成功。
|
||||
status = resp['status']
|
||||
if(status == 1)
|
||||
{
|
||||
continueDays = resp['continueDays'] // 连续签到天数
|
||||
experienceVal = resp['experienceVal'] // 本次签到经验
|
||||
// messageSuccess += '版块' + cat_id + '签到成功,获' + experienceVal + '经验,已签' + continueDays + '天'
|
||||
content = "🎉 " + '版块' + cat_id + '签到成功,获' + experienceVal + '经验,已签' + continueDays + '天\n'
|
||||
messageSuccess += content // ' 版块' + cat_id + '签到成功'
|
||||
console.log(content)
|
||||
}else
|
||||
{
|
||||
// {"title":{},"code":103,"msg":"未登录","status":0}
|
||||
respmsg = resp['msg']
|
||||
code = resp['code']
|
||||
if(code == 103){
|
||||
content = "❌ " + respmsg + "\n"
|
||||
messageFail += content // " 板块" + cat_id + "签到失败," + msg + " ";
|
||||
console.log(content);
|
||||
break; // 不再执行
|
||||
}else{
|
||||
// {"msg":"当前板块不存在","code":104,"title":{},"status":0}
|
||||
msg = resp['msg']
|
||||
content = "📢 " + "板块" + cat_id + "签到失败," + respmsg + "\n"
|
||||
messageFail += content // " 板块" + cat_id + "签到失败," + msg + " ";
|
||||
console.log(content);
|
||||
}
|
||||
}
|
||||
|
||||
sleep(2000); // 降低请求频率
|
||||
}
|
||||
|
||||
} catch {
|
||||
messageFail += "❌ " + "失败\n";
|
||||
}
|
||||
|
||||
sleep(2000);
|
||||
if (messageOnlyError == 1) {
|
||||
messageArray[posLabel] = messageFail;
|
||||
} else {
|
||||
if(messageFail != ""){
|
||||
messageArray[posLabel] = messageFail + " " + messageSuccess;
|
||||
}else{
|
||||
messageArray[posLabel] = messageSuccess;
|
||||
}
|
||||
}
|
||||
|
||||
if(messageArray[posLabel] != "")
|
||||
{
|
||||
console.log(messageArray[posLabel]);
|
||||
}
|
||||
}
|
||||
117
脚本库/web版/账密/葫芦侠签到/2025-06-28_葫芦侠签到_e6c5a800.py
Normal file
117
脚本库/web版/账密/葫芦侠签到/2025-06-28_葫芦侠签到_e6c5a800.py
Normal file
@@ -0,0 +1,117 @@
|
||||
# Source: https://gitee.com/jdqlscript/toulu/blob/main/%E8%91%AB%E8%8A%A6%E4%BE%A0%E7%AD%BE%E5%88%B0.py
|
||||
# Raw: https://gitee.com/jdqlscript/toulu/raw/main/%E8%91%AB%E8%8A%A6%E4%BE%A0%E7%AD%BE%E5%88%B0.py
|
||||
# Repo: jdqlscript/toulu
|
||||
# Path: 葫芦侠签到.py
|
||||
# UploadedAt: 2025-06-28T11:18:42+08:00
|
||||
# SHA256: e6c5a800f14ae992bbef0055b24554457ac3ba98d665bfc433d0c7fbf454db54
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
"""
|
||||
Description:葫芦侠签到板块自动化脚本
|
||||
* cron "30 6 * * *"
|
||||
账号密码填在最下方,不需要变量
|
||||
TL库:https://pd.qq.com/s/btv4bw7av
|
||||
TG频道:https://t.me/TLtoulu
|
||||
长期套餐大额流量电话卡办理地址:https://hk.yunhaoka.cn/#/pages/micro_store/index?agent_id=669709
|
||||
微信机器人:kckl6688
|
||||
公众号:哆啦A梦的藏宝箱
|
||||
|
||||
|
||||
"""
|
||||
import requests
|
||||
import json
|
||||
import hashlib
|
||||
import time
|
||||
import re
|
||||
|
||||
def get_categoryid_list(url):
|
||||
headers = {
|
||||
"Host": "floor.huluxia.com",
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
|
||||
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
|
||||
"Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2",
|
||||
}
|
||||
response = requests.get(url, headers=headers)
|
||||
if response.status_code == 200:
|
||||
return response.text
|
||||
else:
|
||||
return False
|
||||
|
||||
def send_sign_post(url, post_data):
|
||||
headers = {
|
||||
"Connection": "close",
|
||||
"Content-Length": "37",
|
||||
"Accept-Encoding": "gzip",
|
||||
"Host": "floor.huluxia.com",
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"User-Agent": "okhttp/3.8.1"
|
||||
}
|
||||
response = requests.post(url, headers=headers, data=post_data.encode('utf-8'))
|
||||
if response.status_code == 200:
|
||||
return response.text
|
||||
else:
|
||||
return False
|
||||
|
||||
def get_login_sign():
|
||||
password_encode = hashlib.md5(password.encode()).hexdigest()
|
||||
encode_text = f"account{account}device_code[d]7f659db3-9ffb-41ec-80c3-fbf0db5691a9password{password_encode}voice_codefa1c28a5b62e79c3e63d9030b6142e4b"
|
||||
account_sign = hashlib.md5(encode_text.encode()).hexdigest()
|
||||
account_upper = account_sign.upper()
|
||||
url= "http://floor.huluxia.com/account/login/ANDROID/4.1.8?platform=2&gkey=000000&app_version=4.2.1.7&versioncode=371&market_id=tool_huluxia&_key=&device_code=%5Bd%5D7f659db3-9ffb-41ec-80c3-fbf0db5691a9&phone_brand_type=UN"
|
||||
data = {
|
||||
"account" : str(account),
|
||||
"login_type" : "2",
|
||||
"password" : str(password_encode),
|
||||
"sign" : str(account_upper)
|
||||
}
|
||||
headers = {
|
||||
"Host": "floor.huluxia.com",
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"User-Agent": "okhttp/3.8.1"
|
||||
}
|
||||
response_login = requests.post(url,headers=headers,data=data)
|
||||
if response_login.status_code == 200:
|
||||
login_json = response_login.json()
|
||||
login_status = login_json['status']
|
||||
if login_status == 1:
|
||||
login_username = login_json['user']['nick']
|
||||
login_uid = login_json['user']['userID']
|
||||
login_key = login_json['_key']
|
||||
print("——"*20+f"\n当前状态:登陆成功\n用户ID:{login_uid}\n用户名:{login_username}\n"+"——"*20)
|
||||
return login_key
|
||||
else:
|
||||
return False
|
||||
else:
|
||||
return False
|
||||
|
||||
def process_run(loginkey):
|
||||
url = "http://floor.huluxia.com/category/list/ANDROID/2.0"
|
||||
getiddata = get_categoryid_list(url)
|
||||
categoryids = re.findall('"categoryID":(.*?),',getiddata)
|
||||
titles = re.findall('"title":"(.*?)",',getiddata)
|
||||
print(f"板块数量:{len(categoryids)}")
|
||||
sign_counts = 0
|
||||
success_category_ids = []
|
||||
for title, categoryid in zip(titles,categoryids):
|
||||
timestamp = str(int(time.time() * 1000))
|
||||
encode_text = f"cat_id{categoryid}time{timestamp}fa1c28a5b62e79c3e63d9030b6142e4b"
|
||||
md5_encode = hashlib.md5(encode_text.encode()).hexdigest()
|
||||
post_data = f"sign={md5_encode.upper()}"
|
||||
sign_url = f"http://floor.huluxia.com/user/signin/ANDROID/4.1.8?platform=2&gkey=000000&app_version=4.2.1.7&versioncode=371&market_id=tool_huluxia&_key={loginkey}&phone_brand_type=UN&cat_id={categoryid}&time={timestamp}"
|
||||
signdata = send_sign_post(sign_url, post_data)
|
||||
signjson = json.loads(signdata)
|
||||
signstatus = signjson['status']
|
||||
if signstatus == 1:
|
||||
print(f"板块:{title}\t状态:签到成功!")
|
||||
sign_counts += 1
|
||||
success_category_ids.append(categoryid)
|
||||
errorsign = len(categoryids) - sign_counts
|
||||
text = f"签到成功:{sign_counts}个板块"
|
||||
print("——"*20+f"\n{text}\n"+"——"*20)
|
||||
|
||||
if __name__ == "__main__":
|
||||
account = "" # 这里填葫芦侠绑定手机号
|
||||
password = "" # 这里填葫芦侠的密码
|
||||
loginkey = get_login_sign()
|
||||
process_run(loginkey)
|
||||
122
脚本库/web版/账密/蔚来签到/2026-05-14_weilai_c95486e9.js
Normal file
122
脚本库/web版/账密/蔚来签到/2026-05-14_weilai_c95486e9.js
Normal file
@@ -0,0 +1,122 @@
|
||||
// # Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/weilai.js
|
||||
// # Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/weilai.js
|
||||
// # Repo: smallfawn/QLScriptPublic
|
||||
// # Path: daily/weilai.js
|
||||
// # UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
// # SHA256: c95486e99c3ccf5f4c9515ef0f21ce8032913dddbc664f9c2e609072a662bea3
|
||||
// # Category: web版/账密
|
||||
// # Evidence: web/H5关键词 + username/password/login
|
||||
//
|
||||
|
||||
/*
|
||||
------------------------------------------
|
||||
@Author: sm
|
||||
@Date: 2024.06.07 19:15
|
||||
@Description: 蔚来APP签到
|
||||
cron: 30 8 * * *
|
||||
------------------------------------------
|
||||
#Notice:
|
||||
变量名 weilai
|
||||
APP抓请求头app.nio.com 请求头里面的authorization 去掉Bearer后面部分就是变量值,
|
||||
或者抓网页版https://www.nio.cn/ 右上角登录后请求头里面的authorization 去掉Bearer后面部分就是变量值,
|
||||
多个账号换行或者&分隔
|
||||
⚠️【免责声明】
|
||||
------------------------------------------
|
||||
1、此脚本仅用于学习研究,不保证其合法性、准确性、有效性,请根据情况自行判断,本人对此不承担任何保证责任。
|
||||
2、由于此脚本仅用于学习研究,您必须在下载后 24 小时内将所有内容从您的计算机或手机或任何存储设备中完全删除,若违反规定引起任何事件本人对此均不负责。
|
||||
3、请勿将此脚本用于任何商业或非法目的,若违反规定请自行对此负责。
|
||||
4、此脚本涉及应用与本人无关,本人对因此引起的任何隐私泄漏或其他后果不承担任何责任。
|
||||
5、本人对任何脚本引发的问题概不负责,包括但不限于由脚本错误引起的任何损失和损害。
|
||||
6、如果任何单位或个人认为此脚本可能涉嫌侵犯其权利,应及时通知并提供身份证明,所有权证明,我们将在收到认证文件确认后删除此脚本。
|
||||
7、所有直接或间接使用、查看此脚本的人均应该仔细阅读此声明。本人保留随时更改或补充此声明的权利。一旦您使用或复制了此脚本,即视为您已接受此免责声明。
|
||||
*/
|
||||
|
||||
const { Env } = require("../tools/env")
|
||||
const $ = new Env("蔚来签到");
|
||||
let ckName = `weilai`;
|
||||
const strSplitor = "#";
|
||||
const axios = require("axios");
|
||||
const defaultUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 MicroMessenger/8.0.31(0x18001e31) NetType/WIFI Language/zh_CN miniProgram"
|
||||
|
||||
|
||||
class Task {
|
||||
constructor(env) {
|
||||
this.index = $.userIdx++
|
||||
this.user = env.split(strSplitor);
|
||||
this.token = this.user[0];
|
||||
|
||||
}
|
||||
|
||||
async run() {
|
||||
await this.signIn()
|
||||
}
|
||||
|
||||
async signIn() {
|
||||
let options = {
|
||||
method: 'POST',
|
||||
url: `https://gateway-front-external.nio.com/moat/10086/c/award_cn/checkin?app_id=10086×tamp=${Date.now()}`,
|
||||
headers: {
|
||||
"authority": "gateway-front-external.nio.com",
|
||||
"content-type": "application/x-www-form-urlencoded",
|
||||
"accept": "application/json, text/plain, */*",
|
||||
"authorization": 'Bearer ' + this.token,
|
||||
"sec-fetch-site": "cross-site",
|
||||
"priority": "u=3, i",
|
||||
"accept-language": "zh-CN,zh-Hans;q=0.9",
|
||||
"accept-encoding": "gzip, deflate, br",
|
||||
"sec-fetch-mode": "cors",
|
||||
"origin": "null",
|
||||
"user-agent": defaultUserAgent,
|
||||
"sec-fetch-dest": "empty"
|
||||
},
|
||||
data: "event=checkin"
|
||||
};
|
||||
let { data: result } = await axios.request(options);
|
||||
if (result?.result_code == 'success') {
|
||||
$.log(`🌸账号[${this.index}]` + `${result.data.tip}🎉`);
|
||||
} else {
|
||||
$.log(`🌸账号[${this.index}] 签到-失败:${JSON.stringify(result)}❌`)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
!(async () => {
|
||||
await getNotice()
|
||||
$.checkEnv(ckName);
|
||||
|
||||
for (let user of $.userList) {
|
||||
await new Task(user).run();
|
||||
}
|
||||
})()
|
||||
.catch((e) => console.log(e))
|
||||
.finally(() => $.done());
|
||||
|
||||
async function getNotice() {
|
||||
try {
|
||||
let options = {
|
||||
url: `https://ghproxy.net/https://raw.githubusercontent.com/smallfawn/Note/refs/heads/main/Notice.json`,
|
||||
headers: {
|
||||
"User-Agent": defaultUserAgent,
|
||||
},
|
||||
timeout:3000
|
||||
}
|
||||
let {
|
||||
data: res
|
||||
} = await axios.request(options);
|
||||
$.log(res)
|
||||
return res
|
||||
} catch (e) {}
|
||||
|
||||
}
|
||||
619
脚本库/web版/账密/词霸每日一句/2025-08-25_ciba_43494f7f.js
Normal file
619
脚本库/web版/账密/词霸每日一句/2025-08-25_ciba_43494f7f.js
Normal file
File diff suppressed because one or more lines are too long
638
脚本库/web版/账密/谜语/2025-08-25_miyu_1cb49542.js
Normal file
638
脚本库/web版/账密/谜语/2025-08-25_miyu_1cb49542.js
Normal file
File diff suppressed because one or more lines are too long
630
脚本库/web版/账密/趣味笑话/2025-08-25_qwxh_f35da7e8.js
Normal file
630
脚本库/web版/账密/趣味笑话/2025-08-25_qwxh_f35da7e8.js
Normal file
File diff suppressed because one or more lines are too long
161
脚本库/web版/账密/阿里云盘签到/2026-05-14_aliyunpan_1c3e68b4.py
Normal file
161
脚本库/web版/账密/阿里云盘签到/2026-05-14_aliyunpan_1c3e68b4.py
Normal file
@@ -0,0 +1,161 @@
|
||||
# Source: https://github.com/smallfawn/QLScriptPublic/blob/main/daily/aliyunpan.py
|
||||
# Raw: https://raw.githubusercontent.com/smallfawn/QLScriptPublic/main/daily/aliyunpan.py
|
||||
# Repo: smallfawn/QLScriptPublic
|
||||
# Path: daily/aliyunpan.py
|
||||
# UploadedAt: 2026-05-14T17:47:57+08:00
|
||||
# SHA256: 1c3e68b4482e3fec462964a3f1f5984496ca84ac208570d26b82b9a3415fef6a
|
||||
# Category: web版/账密
|
||||
# Evidence: web/H5关键词 + username/password/login
|
||||
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
new Env('阿里云盘签到');
|
||||
cron: 10 6,18 * * *
|
||||
|
||||
环境变量说明:
|
||||
变量名: ALIYUN_ACCOUNTS
|
||||
格式: refresh_token#备注名 & refresh_token2#备注名2
|
||||
提示: 多个账号用 & 或 换行 分隔;内部参数用 # 分隔。
|
||||
进入网页端阿里云盘,按 F12 打开开发者工具,打开控制台输入JSON.parse(localStorage.getItem("token")).refresh_token 然后拼接#备注名即可,例如:
|
||||
"""
|
||||
|
||||
import os
|
||||
import re
|
||||
import time
|
||||
import logging
|
||||
import requests
|
||||
import random
|
||||
from typing import Dict
|
||||
|
||||
# ==================== 日志配置 ====================
|
||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||
logger = logging.getLogger("AliYun")
|
||||
|
||||
# ==================== 核心逻辑 ====================
|
||||
class ALiYun:
|
||||
def __init__(self, name: str, refresh_token: str):
|
||||
self.session = requests.Session()
|
||||
self.name = name
|
||||
self.refresh_token = refresh_token
|
||||
self.access_token = ""
|
||||
self.headers = {
|
||||
"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 15_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148 AlphaDrive/3.0.0",
|
||||
"Content-Type": "application/json; charset=utf-8"
|
||||
}
|
||||
|
||||
def _refresh_access_token(self) -> bool:
|
||||
"""刷新 access_token"""
|
||||
url = 'https://auth.aliyundrive.com/v2/account/token'
|
||||
payload = {'grant_type': 'refresh_token', 'refresh_token': self.refresh_token}
|
||||
try:
|
||||
res = self.session.post(url, json=payload, timeout=10).json()
|
||||
if 'access_token' in res:
|
||||
self.access_token = res['access_token']
|
||||
self.refresh_token = res['refresh_token'] # 更新持久化的token
|
||||
return True
|
||||
logger.error(f"[{self.name}] 刷新 Token 失败: {res.get('message', '未知错误')}")
|
||||
return False
|
||||
except Exception as e:
|
||||
logger.error(f"[{self.name}] 刷新请求异常: {e}")
|
||||
return False
|
||||
|
||||
def check_in(self) -> Dict:
|
||||
"""执行签到"""
|
||||
url = 'https://member.aliyundrive.com/v1/activity/sign_in_list'
|
||||
headers = {**self.headers, "Authorization": f"Bearer {self.access_token}"}
|
||||
try:
|
||||
res = self.session.post(url, params={'_rx-s': 'mobile'}, json={'isReward': False}, headers=headers, timeout=10).json()
|
||||
return res
|
||||
except Exception as e:
|
||||
return {"success": False, "message": str(e)}
|
||||
|
||||
def get_reward(self, day: int) -> str:
|
||||
"""领取奖励"""
|
||||
url = 'https://member.aliyundrive.com/v1/activity/sign_in_reward'
|
||||
headers = {**self.headers, "Authorization": f"Bearer {self.access_token}"}
|
||||
try:
|
||||
res = self.session.post(url, params={'_rx-s': 'mobile'}, json={'signInDay': day}, headers=headers, timeout=10).json()
|
||||
return res.get('result', {}).get('notice', res.get('message', '未获取到奖励明细'))
|
||||
except Exception:
|
||||
return "奖励领取请求异常"
|
||||
|
||||
def get_capacity(self) -> str:
|
||||
"""查询容量"""
|
||||
def fmt(s): return f"{s/1024/1024/1024:.2f} GB" if s > 0 else "0 GB"
|
||||
url = 'https://api.aliyundrive.com/adrive/v1/user/driveCapacityDetails'
|
||||
headers = {**self.headers, "Authorization": f"Bearer {self.access_token}"}
|
||||
try:
|
||||
res = self.session.post(url, json={}, headers=headers, timeout=10).json()
|
||||
return (f"总空间: {fmt(res.get('drive_total_size', 0))}\n"
|
||||
f"已用空间: {fmt(res.get('drive_used_size', 0))}")
|
||||
except: return "容量查询失败"
|
||||
|
||||
def run(self):
|
||||
logger.info(f"--- 账号 [{self.name}] 开始签到 ---")
|
||||
if not self._refresh_access_token():
|
||||
return f"[{self.name}] ❌ 登录失效"
|
||||
|
||||
res = self.check_in()
|
||||
if not res.get('success'):
|
||||
return f"[{self.name}] ❌ 签到失败: {res.get('message')}"
|
||||
|
||||
count = res.get('result', {}).get('signInCount', 0)
|
||||
reward_info = self.get_reward(count)
|
||||
cap_info = self.get_capacity()
|
||||
|
||||
msg = (f"【{self.name}】签到成功!\n"
|
||||
f"本月累计签到: {count} 天\n"
|
||||
f"本次奖励: {reward_info}\n"
|
||||
f"{cap_info}")
|
||||
return msg
|
||||
|
||||
# ==================== 通知逻辑 ====================
|
||||
def send_notify(title, content):
|
||||
"""简易通知,如果有 notify.py 则尝试调用"""
|
||||
try:
|
||||
from notify import send
|
||||
print(title, content)
|
||||
except ImportError:
|
||||
logger.info("\n--- 通知预览 ---\n" + title + "\n" + content)
|
||||
|
||||
# ==================== 主入口 ====================
|
||||
def main():
|
||||
raw_conf = os.getenv("ALIYUN_ACCOUNTS", "")
|
||||
if not raw_conf:
|
||||
logger.error("未找到环境变量 ALIYUN_ACCOUNTS")
|
||||
return
|
||||
|
||||
# 按 & 或 换行 分隔账号
|
||||
account_list = re.split(r'[&\n]+', raw_conf.strip())
|
||||
final_reports = []
|
||||
|
||||
for idx, acc_str in enumerate(account_list):
|
||||
if not acc_str.strip(): continue
|
||||
|
||||
# 按 # 分隔 token 和 备注
|
||||
parts = acc_str.split('#')
|
||||
token = parts[0].strip()
|
||||
name = parts[1].strip() if len(parts) > 1 else f"账号{idx+1}"
|
||||
|
||||
if not token:
|
||||
logger.warning(f"账号 {name} 缺少 refresh_token,跳过")
|
||||
continue
|
||||
|
||||
client = ALiYun(name, token)
|
||||
try:
|
||||
report = client.run()
|
||||
final_reports.append(report)
|
||||
except Exception as e:
|
||||
logger.error(f"运行异常: {e}")
|
||||
final_reports.append(f"[{name}] 运行发生异常")
|
||||
|
||||
# 账号间随机延迟
|
||||
if idx < len(account_list) - 1:
|
||||
time.sleep(random.randint(3, 8))
|
||||
|
||||
if final_reports:
|
||||
print("阿里云盘签到报告", "\n" + "="*20 + "\n" + "\n\n".join(final_reports))
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
630
脚本库/web版/账密/随机一句一言/2025-08-25_oneyan_7ff4ea80.js
Normal file
630
脚本库/web版/账密/随机一句一言/2025-08-25_oneyan_7ff4ea80.js
Normal file
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user