Files
qinglong/脚本库/web版/账密/url.hostname,/2026-05-11_zsp_video_960b2e28.js
2026-05-23 18:48:48 +00:00

585 lines
16 KiB
JavaScript
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// # Source: https://github.com/DearSong15/ql-scripts/blob/main/zsp_video.js
// # Raw: https://raw.githubusercontent.com/DearSong15/ql-scripts/main/zsp_video.js
// # Repo: DearSong15/ql-scripts
// # Path: zsp_video.js
// # UploadedAt: 2026-05-11T15:03:30Z
// # SHA256: 960b2e28799c40a00eb4bd75dcda1e61b3ab747374716073995c75053c3083ee
// # Category: web版/账密
// # Evidence: web/H5关键词 + username/password/login
//
//走个码吧,谢谢兄弟们了
//后台注册地址https://zsp.99panel.top/#/register?inviteCode=lzwbaleD
//前台https://a.zsp55.app/
//变量格式:备注#SecretId#SecretKey#deviceld
const ENV_NAME = "中视频";
const USER_AGENT = "Mozilla/5.0 (Linux; Android 15; 23013RK75C Build/AQ3A.250226.002; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/131.0.6778.260 Mobile Safari/537.36 (Immersed/39.42857) Html5Plus/1.0";
const BASE_URL = "https://x1.zsptv.online";
// 工具函数
function wait(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
// HTTP请求函数
async function httpRequest(options) {
return new Promise((resolve, reject) => {
const url = new URL(options.url);
const https = url.protocol === 'https:' ? require('https') : require('http');
const req = https.request({
hostname: url.hostname,
port: url.port || (url.protocol === 'https:' ? 443 : 80),
path: url.pathname + url.search,
method: options.method || 'GET',
headers: options.headers || {}
}, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
// 调试:记录响应
if (res.statusCode === 403) {
console.log(`🔍 响应体: ${data.substring(0, 200)}...`);
}
resolve({
statusCode: res.statusCode,
headers: res.headers,
body: data
});
});
});
req.on('error', (err) => {
reject(err);
});
if (options.body) {
req.write(options.body);
}
req.end();
});
}
// Unicode解码函数
function decodeUnicode(str) {
if (!str) return '';
return str.replace(/\\u[\dA-F]{4}/gi,
match => String.fromCharCode(parseInt(match.replace(/\\u/g, ''), 16)));
}
// 主函数
async function main() {
console.log(`🔔 脚本开始运行,时间: ${new Date().toLocaleString()}\n`);
// 读取环境变量
const accounts = loadAccounts();
if (accounts.length === 0) {
console.log("❌ 未找到有效的账号配置,请检查环境变量格式!");
return;
}
console.log(`✅ 找到 ${accounts.length} 个账号\n`);
// 遍历所有账号
for (let i = 0; i < accounts.length; i++) {
const account = accounts[i];
console.log(`\n📱 开始处理账号 ${i+1}: ${account.remark}`);
console.log("=".repeat(30));
try {
await processAccount(account);
} catch (error) {
console.log(`❌ 处理账号 ${account.remark} 时出错: ${error.message}`);
}
// 账号间延迟
if (i < accounts.length - 1) {
console.log("\n⏳ 等待5秒后处理下一个账号...");
await wait(5000);
}
}
console.log(`\n🎉 所有账号处理完成!`);
}
// 加载账号信息
function loadAccounts() {
const accounts = [];
// 尝试从不同环境变量名称读取
const envNames = ['ZSP', 'AD_WATCH_ACCOUNTS'];
let envValue = '';
for (const envName of envNames) {
if (process.env[envName]) {
envValue = process.env[envName];
console.log(`📋 从环境变量 ${envName} 读取配置`);
break;
}
}
if (!envValue) {
console.log("⚠️ 请设置环境变量 ZSP 或 AD_WATCH_ACCOUNTS");
return accounts;
}
const accountStrs = envValue.split("\n").filter(str => str.trim());
for (const str of accountStrs) {
const parts = str.split("#");
if (parts.length >= 4) {
accounts.push({
remark: parts[0] || "未命名账号",
secretId: parts[1],
secretKey: parts[2],
deviceId: parts[3]
});
console.log(`✅ 加载账号: ${parts[0] || "未命名账号"}`);
} else {
console.log(`⚠️ 忽略格式错误的环境变量: ${str}`);
}
}
return accounts;
}
// 处理单个账号
async function processAccount(account) {
// 1. 登录获取token
const token = await login(account);
if (!token) {
console.log("❌ 登录失败,跳过此账号");
return;
}
console.log(`✅ 登录成功token获取完成`);
// 2. 检测并执行签到
const signed = await checkAndSign(token, account);
if (!signed) {
console.log("❌ 签到失败,跳过广告任务");
return;
}
console.log(`\n📺 开始执行广告观看任务`);
console.log("-".repeat(30));
let successCount = 0;
let failCount = 0;
let totalReward = 0;
let consecutiveErrors = 0;
const maxAds = 50; // 最多执行50次广告任务
for (let adCount = 0; adCount < maxAds; adCount++) {
console.log(`\n🔄 第 ${adCount + 1}/${maxAds} 次广告任务`);
// 如果连续出现3次错误重新登录获取新token
if (consecutiveErrors >= 3) {
console.log("⚠️ 连续3次错误尝试重新登录...");
const newToken = await login(account);
if (newToken) {
token = newToken;
console.log("✅ 重新登录成功,继续任务");
consecutiveErrors = 0;
} else {
console.log("❌ 重新登录失败,跳过此账号");
break;
}
}
try {
// 获取广告信息
const adInfo = await getNextAd(token, account);
if (!adInfo) {
console.log(` ⚠️ 获取广告失败`);
failCount++;
consecutiveErrors++;
await wait(3000);
continue;
}
console.log(` 📱 广告标题: ${adInfo.title}`);
console.log(` ⏱️ 需要观看: ${adInfo.duration}`);
console.log(` 🪙 预期奖励: ${adInfo.reward || 0}`);
// 开始播放广告
console.log(` ▶️ 开始播放广告...`);
const playResult = await claimReward(token, account, adInfo.id, adInfo.duration);
if (playResult && playResult.success) {
console.log(` ✅ 广告观看成功!`);
console.log(` 💰 获得奖励: ${playResult.reward || 0}`);
successCount++;
totalReward += parseInt(playResult.reward) || 0;
consecutiveErrors = 0; // 重置错误计数
// 任务间延迟 (避免请求过快)
if (adCount < maxAds - 1) {
const randomDelay = Math.floor(Math.random() * 3000) + 3000; // 3-6秒随机延迟
console.log(` ⏳ 等待${Math.round(randomDelay/1000)}秒后处理下一个广告...`);
await wait(randomDelay);
}
} else {
console.log(` ❌ 广告观看失败`);
failCount++;
consecutiveErrors++;
await wait(3000);
}
} catch (error) {
console.log(` ❌ 广告任务出错: ${error.message}`);
failCount++;
consecutiveErrors++;
await wait(3000);
}
}
console.log("\n" + "=".repeat(30));
console.log(`📊 任务完成统计:`);
console.log(` ✅ 成功: ${successCount}`);
console.log(` ❌ 失败: ${failCount}`);
console.log(` 💰 总计奖励: ${totalReward}`);
console.log(` 📈 成功率: ${((successCount/maxAds)*100).toFixed(1)}%`);
}
// 登录接口
async function login(account) {
const url = `${BASE_URL}/api/app/v1/auth/secretKeyLogin`;
const body = {
secretId: account.secretId,
secretKey: account.secretKey
};
const headers = {
"Accept": "*/*",
"User-Agent": USER_AGENT,
"app-device": JSON.stringify({
"id": account.deviceId,
"brand": "xiaomi",
"model": "23013RK75C",
"platform": "android",
"system": "Android 15"
}),
"Content-Type": "application/json",
"Host": "x1.zsptv.online"
};
try {
const response = await httpRequest({
url: url,
method: "POST",
headers: headers,
body: JSON.stringify(body)
});
if (response.statusCode !== 200) {
console.log(`❌ 登录请求失败,状态码: ${response.statusCode}`);
return null;
}
const data = JSON.parse(response.body);
if (data.code === 0 && data.data && data.data.token) {
return data.data.token;
} else {
console.log(`❌ 登录失败: ${data.message || "未知错误"}`);
return null;
}
} catch (error) {
console.log(`❌ 登录请求失败: ${error.message}`);
return null;
}
}
// 检测并执行签到
async function checkAndSign(token, account) {
const url = `${BASE_URL}/api/app/v1/device/userSign`;
const headers = {
"Accept": "*/*",
"User-Agent": USER_AGENT,
"Authorization": `Bearer ${token}`,
"app-device": JSON.stringify({
"id": account.deviceId,
"brand": "xiaomi",
"model": "23013RK75C",
"platform": "android",
"system": "Android 15"
}),
"Content-Type": "application/json",
"Host": "x1.zsptv.online"
};
try {
const response = await httpRequest({
url: url,
method: "POST",
headers: headers,
body: "{}"
});
if (response.statusCode !== 200) {
console.log(`❌ 签到请求失败,状态码: ${response.statusCode}`);
return false;
}
const data = JSON.parse(response.body);
if (data.code === 0) {
const message = decodeUnicode(data.message);
console.log(`✅ 签到结果: ${message}`);
if (data.data) {
console.log(` 🪙 获得签到金币: ${data.data.qiandao_money || 0}`);
console.log(` 📅 连续签到天数: ${data.data.continuousDays || 1}`);
}
return true;
} else {
const errorMsg = decodeUnicode(data.message || "未知错误");
console.log(`❌ 签到失败: ${errorMsg}`);
// 如果已签到也返回true继续执行广告任务
if (errorMsg && errorMsg.includes("已签到")) {
console.log(` 今日已签到,继续执行广告任务`);
return true;
}
return false;
}
} catch (error) {
console.log(`❌ 签到请求失败: ${error.message}`);
return false;
}
}
// 获取下一个广告
async function getNextAd(token, account) {
const url = `${BASE_URL}/api/app/v1/ad/next`;
const headers = {
"Accept": "*/*",
"User-Agent": USER_AGENT,
"Authorization": `Bearer ${token}`,
"app-device": JSON.stringify({
"id": account.deviceId,
"brand": "xiaomi",
"model": "23013RK75C",
"platform": "android",
"system": "Android 15"
}),
"Content-Type": "application/json",
"Host": "x1.zsptv.online"
};
try {
const response = await httpRequest({
url: url,
method: "GET",
headers: headers
});
if (response.statusCode !== 200) {
console.log(` ❌ 获取广告失败,状态码: ${response.statusCode}`);
if (response.body) {
const errorData = JSON.parse(response.body);
console.log(` 🔍 错误信息: ${errorData.message || "未知错误"}`);
}
return null;
}
const data = JSON.parse(response.body);
if (data.code === 0 && data.data && data.data.result) {
const ad = data.data.result;
return {
id: ad.id,
title: decodeUnicode(ad.title),
description: decodeUnicode(ad.description),
duration: parseInt(ad.video?.duration || 30), // 默认30秒
videoUrl: ad.video?.url || "",
playUrl: ad.video?.play_url || "",
reward: ad.reward
};
} else {
const errorMsg = decodeUnicode(data.message || "未知错误");
console.log(` ❌ 获取广告失败: ${errorMsg}`);
return null;
}
} catch (error) {
console.log(` ❌ 获取广告请求失败: ${error.message}`);
return null;
}
}
// 观看广告并获取奖励(整合播放和结束确认)
async function claimReward(token, account, adId, duration) {
const startTime = new Date().toISOString();
// 1. 开始播放广告
console.log(` 📅 播放开始时间: ${startTime}`);
const playResult = await startVideoPlay(token, account, adId, startTime);
if (!playResult || !playResult.playRecordId) {
console.log(` ❌ 广告播放开始失败`);
return { success: false };
}
console.log(` ✅ 播放开始成功! 记录ID: ${playResult.playRecordId}`);
console.log(` 💰 初始奖励: ${playResult.initialReward || 0}`);
// 2. 等待广告播放时间
const waitTime = duration * 1000;
console.log(` ⌛ 广告播放中,等待 ${duration} 秒...`);
await wait(waitTime);
// 3. 广告播放结束确认
console.log(` ⏹️ 广告播放完成,确认结束...`);
const endResult = await endVideoPlay(token, account, playResult.playRecordId);
if (endResult.success) {
console.log(` 🎉 广告观看完整流程完成!`);
return {
success: true,
reward: playResult.reward || 0,
playRecordId: playResult.playRecordId
};
} else {
console.log(` ⚠️ 广告观看完成,但结束确认失败`);
// 即使结束确认失败,也视为成功(因为已经播放完成)
return {
success: true,
reward: playResult.reward || 0,
playRecordId: playResult.playRecordId
};
}
}
// 开始播放广告
async function startVideoPlay(token, account, adId, playTime) {
const url = `${BASE_URL}/api/app/v1/ad/video/play`;
const body = {
clientIp: "",
deviceInfo: {
deviceId: account.deviceId,
platform: "android"
},
id: adId.toString(),
playTime: playTime
};
const headers = {
"Accept": "*/*",
"User-Agent": USER_AGENT,
"Authorization": `Bearer ${token}`,
"app-device": JSON.stringify({
"id": account.deviceId,
"brand": "xiaomi",
"model": "23013RK75C",
"platform": "android",
"system": "Android 15"
}),
"Content-Type": "application/json",
"Host": "x1.zsptv.online"
};
try {
const response = await httpRequest({
url: url,
method: "POST",
headers: headers,
body: JSON.stringify(body)
});
if (response.statusCode !== 200) {
console.log(` ❌ 开始播放广告失败,状态码: ${response.statusCode}`);
return null;
}
const data = JSON.parse(response.body);
if (data.code === 0 && data.data) {
return {
playRecordId: data.data.id,
initialReward: data.data.reward || 0,
reward: data.data.reward || 0
};
} else {
console.log(` ❌ 开始播放广告失败: ${data.message || "未知错误"}`);
return null;
}
} catch (error) {
console.log(` ❌ 开始播放广告请求失败: ${error.message}`);
return null;
}
}
// 结束广告播放
async function endVideoPlay(token, account, playRecordId) {
const url = `${BASE_URL}/api/app/v1/ad/video/ended`;
const endTime = new Date().toISOString();
const body = {
clientIp: "",
deviceInfo: {
deviceId: account.deviceId,
platform: "android"
},
id: playRecordId.toString(),
playTime: endTime
};
const headers = {
"Accept": "*/*",
"User-Agent": USER_AGENT,
"Authorization": `Bearer ${token}`,
"app-device": JSON.stringify({
"id": account.deviceId,
"brand": "xiaomi",
"model": "23013RK75C",
"platform": "android",
"system": "Android 15"
}),
"Content-Type": "application/json",
"Host": "x1.zsptv.online"
};
try {
const response = await httpRequest({
url: url,
method: "POST",
headers: headers,
body: JSON.stringify(body)
});
if (response.statusCode !== 200) {
console.log(` ⚠️ 广告结束确认失败,状态码: ${response.statusCode}`);
// 即使结束确认失败也返回成功避免403错误导致任务中断
return { success: true };
}
const data = JSON.parse(response.body);
if (data.code === 0) {
return { success: true };
} else {
console.log(` ⚠️ 广告结束确认返回异常: ${data.message || "未知错误"}`);
return { success: false };
}
} catch (error) {
console.log(` ⚠️ 广告结束确认请求失败: ${error.message}`);
return { success: false };
}
}
// 执行主函数
if (require.main === module) {
main().catch(console.error);
}