Collect seeded Qinglong script repositories

This commit is contained in:
Hermes Agent
2026-05-24 04:36:41 +00:00
parent 28d62fef03
commit ca1a4275e4
282 changed files with 143071 additions and 5 deletions

View 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("登录失败")

View 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)

View File

@@ -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)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -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.0Beta
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);
}

View File

@@ -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.0Beta
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":"",
}
// (修改这里,以下请求方式三选一即可)
// 请求方式1POST请求抓包的data数据格式是 {"aaa":"xxx","bbb":"xxx"} 。则用这个
resp = HTTP.post(
url1,
JSON.stringify(data),
{ headers: headers }
);
// // 请求方式2POST请求抓包的data数据格式是 aaa=xxx&bbb=xxx 。则用这个
// resp = HTTP.post(
// url1,
// data,
// { headers: headers }
// );
// // 请求方式3GET请求无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]);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View 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.0Beta
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]);}}

File diff suppressed because one or more lines are too long

View 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("所有账号处理完毕")

View 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.0Beta
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]);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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) {}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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.0Beta
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]);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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))

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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) {}
}

View 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()

View 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.0Beta
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]);
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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 + "&timestamp=" + _0x54564a + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
_0x19106b = "mobile=" + this.o + "&password=" + _0x36c9ca + "&saltpasword=" + _0x4f3bf6 + "&devicetoken=" + _0x75ef22 + "&appversion=6.2.4&devicetype=02&nonce=" + _0x290169 + "&timestamp=" + _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 + "&timestamp=" + _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 + "&timestamp=" + _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 + "&timestamp=" + _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 + "&timestamp=" + _0x5dc372 + "&userId=" + this.uid + "&key=109CC0E44DF82F7EC613D35A51AD10A8").toUpperCase(),
_0x26277d = "userId=" + this.uid + "&nonce=" + _0x53969e + "&timestamp=" + _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();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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;
}
}();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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}&timestamp={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("所有账号处理完毕")

View 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)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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或共享WIFI2GB可兑换此奖品",
"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()

File diff suppressed because one or more lines are too long

View 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();
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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) { }
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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('通知服务不可用')

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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)

View 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)
}

View 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()

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View 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.0Beta
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]);
}
}

View 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)

View 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&timestamp=${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) {}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View 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()

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