Files
qinglong/脚本库/微信小程序/抓包版/快手养号/2026-05-18_ks_yanghao_v1_e24abf45.js
2026-05-24 03:53:42 +00:00

1475 lines
58 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/ks_yanghao_v1.js
// # Raw: https://raw.githubusercontent.com/DearSong15/ql-scripts/main/ks_yanghao_v1.js
// # Repo: DearSong15/ql-scripts
// # Path: ks_yanghao_v1.js
// # UploadedAt: 2026-05-18T09:30:28Z
// # SHA256: e24abf45a7c194b2aa3750474f59ec9d8218c59b78af77cb1ac378682c19a9dc
// # Category: 微信小程序/抓包版
// # Evidence: appid/openid/session_key/encryptedData等小程序字段
//
//new Env("快手养号")
// 接口配置
const SIGN_API_URL = "http://127.0.0.1:8889";
const encryptTag = "jsjiami.com.v7";
const fs = require("fs");
const path = require("path");
const childProcess = require("child_process");
const querystring = require("querystring");
const { SocksProxyAgent } = require("socks-proxy-agent");
// 依赖自动安装
function checkAndInstall(pkg, versionSuffix = "") {
try {
require.resolve(pkg);
console.log("[依赖检查] " + pkg + " 已安装.");
} catch (err) {
console.log("[依赖检查] " + pkg + " 缺失,正在自动安装" + (versionSuffix ? " (" + versionSuffix + ")" : "") + "...");
try {
childProcess.execSync("npm install " + pkg + versionSuffix, { stdio: "inherit" });
console.log("[依赖修补] " + pkg + " 安装成功,继续运行.");
} catch (installErr) {
console.error("[依赖修补失败] 无法安装 " + pkg + ": " + installErr.message);
process.exit(1);
}
}
}
// Node 版本检测
const nodeVersion = process.versions.node;
const [majorVer, minorVer] = nodeVersion.split(".").map(Number);
console.log("[Node.js 版本检测] 当前版本: " + nodeVersion + " (major: " + majorVer + ", minor: " + minorVer + ")");
let requestVer = "";
let socksAgentVer = "";
if (majorVer >= 18) {
console.log("[Node.js 版本兼容] Node.js 18+ 检测到,使用 request 默认版本(若有警告,可忽略或升级脚本)");
process.noDeprecation = true;
} else if (majorVer < 14) {
socksAgentVer = "@^5.0.0";
console.log("[Node.js 版本兼容] Node.js < 14 检测到,使用 socks-proxy-agent 旧版以兼容.");
} else {
console.log("[Node.js 版本兼容] Node.js 14-17 检测到,使用默认依赖版本.");
}
checkAndInstall("request", requestVer);
checkAndInstall("socks-proxy-agent", socksAgentVer);
const request = require("request");
process.noDeprecation = true;
// ==================== 养号配置 ====================
const FARM_CONFIG = {
ENABLE_FARM: process.env.ENABLE_FARM === "1" || process.env.ENABLE_FARM === "true" || true,
LOW_REWARD_FARM_THRESHOLD: parseInt(process.env.LOW_REWARD_FARM_THRESHOLD) || 200,
// 刷视频配置每个视频60-90秒总时长15-20分钟
SINGLE_VIDEO_WATCH_MIN: parseInt(process.env.SINGLE_VIDEO_WATCH_MIN) || 60,
SINGLE_VIDEO_WATCH_MAX: parseInt(process.env.SINGLE_VIDEO_WATCH_MAX) || 90,
FARM_VIDEO_TIME_MIN: parseInt(process.env.FARM_VIDEO_TIME_MIN) || 15,
FARM_VIDEO_TIME_MAX: parseInt(process.env.FARM_VIDEO_TIME_MAX) || 20,
// 小说阅读配置看几章3-8章
NOVEL_CHAPTERS_MIN: parseInt(process.env.NOVEL_CHAPTERS_MIN) || 3,
NOVEL_CHAPTERS_MAX: parseInt(process.env.NOVEL_CHAPTERS_MAX) || 8,
// 直播配置3-5分钟
LIVE_WATCH_TIME_MIN: parseInt(process.env.LIVE_WATCH_TIME_MIN) || 3,
LIVE_WATCH_TIME_MAX: parseInt(process.env.LIVE_WATCH_TIME_MAX) || 5,
// 小游戏试玩15-25分钟
MINI_GAME_PLAY_MIN: parseInt(process.env.MINI_GAME_PLAY_MIN) || 15,
MINI_GAME_PLAY_MAX: parseInt(process.env.MINI_GAME_PLAY_MAX) || 25,
// 商城浏览3-6个商品每个60-90秒
SHOP_BROWSE_ITEMS_MIN: parseInt(process.env.SHOP_BROWSE_ITEMS_MIN) || 3,
SHOP_BROWSE_ITEMS_MAX: parseInt(process.env.SHOP_BROWSE_ITEMS_MAX) || 6,
SHOP_ITEM_BROWSE_MIN: parseInt(process.env.SHOP_ITEM_BROWSE_MIN) || 60,
SHOP_ITEM_BROWSE_MAX: parseInt(process.env.SHOP_ITEM_BROWSE_MAX) || 90,
// 互动概率
FARM_LIKE_RATE: parseInt(process.env.FARM_LIKE_RATE) || 40,
FARM_COLLECT_RATE: parseInt(process.env.FARM_COLLECT_RATE) || 15,
FARM_COMMENT_RATE: parseInt(process.env.FARM_COMMENT_RATE) || 10,
FARM_DAILY_LIMIT: parseInt(process.env.FARM_DAILY_LIMIT) || 3
};
// 搜索关键词
const SEARCH_KEYWORDS = ["DNF", "传奇", "游戏推荐"];
// 商城搜索关键词
const SHOP_SEARCH_KEYWORDS = ["笔记本","游戏机", "小米手机", "投资金条", "冲锋衣", "按摩枕"];
// 评论库
const COMMENT_LIST = [
"真的非常的好,很喜欢这个作品",
"确实是这样的",
"喜欢,多发,爱看",
"可以的,有点猛的",
"爱了,爱了,多发一点就爱看这种",
"孔子没看懂,老子也没看懂这是干啥的",
"太有意思了,笑死我了",
"学到了,感谢分享",
"这个必须支持一下",
"说的太对了,深有感触"
];
// 直播评论库
const LIVE_COMMENT_LIST = [
"主播讲得真好",
"支持主播",
"666",
"太精彩了",
"学到了学到了",
"点赞支持",
"来了来了",
"不错不错",
"主播加油",
"这个直播太有意思了"
];
// ==================== 养号功能函数 ====================
function randomDelay(minMs, maxMs) {
const ms = Math.floor(Math.random() * (maxMs - minMs + 1)) + minMs;
return new Promise(resolve => setTimeout(resolve, ms));
}
function getRandomComment() {
return COMMENT_LIST[Math.floor(Math.random() * COMMENT_LIST.length)];
}
function getRandomLiveComment() {
return LIVE_COMMENT_LIST[Math.floor(Math.random() * LIVE_COMMENT_LIST.length)];
}
// 模拟浏览小说(看几章)
async function simulateNovelReading(accountName) {
const chaptersCount = Math.floor(Math.random() * (FARM_CONFIG.NOVEL_CHAPTERS_MAX - FARM_CONFIG.NOVEL_CHAPTERS_MIN + 1)) + FARM_CONFIG.NOVEL_CHAPTERS_MIN;
console.log(`📖 [${accountName}] 进入小说广告页面,开始阅读 ${chaptersCount} 章...`);
for (let i = 1; i <= chaptersCount; i++) {
const readTime = Math.floor(Math.random() * 60000) + 30000; // 30-90秒每章
console.log(`📖 [${accountName}] 阅读第 ${i}/${chaptersCount} 章,约 ${Math.round(readTime/1000)}`);
await randomDelay(readTime, readTime + 10000);
}
console.log(`📖 [${accountName}] 小说阅读完成,共 ${chaptersCount}`);
await randomDelay(2000, 5000);
}
// 模拟下载安装试玩App通用
async function simulateAppPlay(accountName, appName = "游戏") {
const playTime = Math.floor(Math.random() * (FARM_CONFIG.MINI_GAME_PLAY_MAX - FARM_CONFIG.MINI_GAME_PLAY_MIN) * 60000) + FARM_CONFIG.MINI_GAME_PLAY_MIN * 60000;
const playMinutes = Math.round(playTime / 60000);
console.log(`📱 [${accountName}] 进入${appName}广告页面,开始下载...`);
await randomDelay(5000, 15000);
console.log(`📱 [${accountName}] 下载完成,开始安装...`);
await randomDelay(3000, 8000);
console.log(`📱 [${accountName}] 安装完成,开始试玩 ${playMinutes} 分钟...`);
const gameStages = ["新手引导", "完成第一关", "查看奖励", "继续游戏", "完成每日任务"];
const stageCount = Math.min(gameStages.length, Math.ceil(playTime / 60000));
for (let i = 0; i < stageCount; i++) {
await randomDelay(30000, 90000);
console.log(`📱 [${accountName}] ${appName}进度: ${gameStages[i % gameStages.length]}`);
}
console.log(`📱 [${accountName}] 试玩完成,共 ${playMinutes} 分钟`);
await randomDelay(2000, 5000);
}
// 模拟观看直播并互动3-5分钟
async function simulateLiveWatch(accountName, hasMiniGame = false) {
const watchTime = Math.floor(Math.random() * (FARM_CONFIG.LIVE_WATCH_TIME_MAX - FARM_CONFIG.LIVE_WATCH_TIME_MIN) * 60000) + FARM_CONFIG.LIVE_WATCH_TIME_MIN * 60000;
const watchMinutes = Math.round(watchTime / 60000);
console.log(`🎥 [${accountName}] 进入直播间,开始观看 ${watchMinutes} 分钟...`);
let likeCount = 0;
let commentCount = 0;
let giftCount = 0;
const startTime = Date.now();
// 如果直播间有小游戏,先试玩
if (hasMiniGame) {
console.log(`🎮 [${accountName}] 直播间发现挂载小游戏,开始试玩...`);
await simulateAppPlay(accountName, "直播间小游戏");
}
while (Date.now() - startTime < watchTime) {
await randomDelay(15000, 45000);
// 随机点赞
if (Math.random() * 100 < 50) {
likeCount++;
console.log(`❤️ [${accountName}] 点赞直播 (${likeCount}次)`);
}
// 随机评论
if (Math.random() * 100 < 25) {
commentCount++;
const comment = getRandomLiveComment();
console.log(`💬 [${accountName}] 直播评论: "${comment}"`);
await randomDelay(2000, 5000);
}
// 随机送小礼物10%概率)
if (Math.random() * 100 < 10) {
giftCount++;
console.log(`🎁 [${accountName}] 赠送小礼物 (${giftCount}次)`);
await randomDelay(1000, 3000);
}
const elapsed = Math.round((Date.now() - startTime) / 60000);
console.log(`🎥 [${accountName}] 观看直播中... ${elapsed}/${watchMinutes}分钟`);
}
console.log(`🎥 [${accountName}] 直播观看完成,共 ${watchMinutes} 分钟,点赞${likeCount}次,评论${commentCount}次,送礼${giftCount}`);
}
// 模拟商城商品浏览
async function simulateShopBrowsing(accountName) {
const itemsCount = Math.floor(Math.random() * (FARM_CONFIG.SHOP_BROWSE_ITEMS_MAX - FARM_CONFIG.SHOP_BROWSE_ITEMS_MIN + 1)) + FARM_CONFIG.SHOP_BROWSE_ITEMS_MIN;
const searchKeyword = SHOP_SEARCH_KEYWORDS[Math.floor(Math.random() * SHOP_SEARCH_KEYWORDS.length)];
console.log(`🛒 [${accountName}] 进入商城,搜索: "${searchKeyword}"`);
await randomDelay(2000, 5000);
const addedToCart = Math.floor(Math.random() * itemsCount); // 随机选择一个商品加入购物车
const browseResults = [];
for (let i = 0; i < itemsCount; i++) {
const browseTime = Math.floor(Math.random() * (FARM_CONFIG.SHOP_ITEM_BROWSE_MAX - FARM_CONFIG.SHOP_ITEM_BROWSE_MIN) * 1000) + FARM_CONFIG.SHOP_ITEM_BROWSE_MIN * 1000;
const productId = i + 1;
console.log(`🛒 [${accountName}] 浏览商品 ${productId}/${itemsCount}${Math.round(browseTime/1000)}`);
// 模拟浏览商品图片
await randomDelay(2000, 5000);
console.log(` 📷 查看商品图片...`);
// 模拟查看商品参数
await randomDelay(3000, 8000);
console.log(` 📋 查看商品参数详情...`);
// 模拟查看评论区
await randomDelay(5000, 12000);
const commentCount = Math.floor(Math.random() * 10) + 1;
console.log(` 💬 浏览评论区,查看了 ${commentCount} 条评论和图片`);
// 总浏览时间
await randomDelay(browseTime - 10000, browseTime);
browseResults.push({ id: productId, name: `${searchKeyword}商品${productId}` });
// 随机将商品加入购物车
if (i === addedToCart) {
console.log(`🛒 [${accountName}] 将商品 ${productId} 加入购物车!`);
await randomDelay(1000, 3000);
}
if (i < itemsCount - 1) {
await randomDelay(2000, 5000);
}
}
console.log(`🛒 [${accountName}] 商城浏览完成!浏览了 ${itemsCount} 个商品1个商品已加入购物车`);
}
// 模拟首页搜索和刷视频
async function farmBrowseVideos(accountName) {
const farmTime = Math.floor(Math.random() * (FARM_CONFIG.FARM_VIDEO_TIME_MAX - FARM_CONFIG.FARM_VIDEO_TIME_MIN) * 60000) + FARM_CONFIG.FARM_VIDEO_TIME_MIN * 60000;
const farmMinutes = Math.round(farmTime / 60000);
console.log(`🌾 [${accountName}] 开始养号刷视频 ${farmMinutes}分钟...`);
const startTime = Date.now();
let videoCount = 0;
let likeCount = 0;
let collectCount = 0;
let commentCount = 0;
let adEncounterCount = 0;
let searchCount = 0;
let hasSearched = false;
while (Date.now() - startTime < farmTime) {
// 随机进行搜索每2-3个视频搜索一次
if (!hasSearched && (videoCount > 0 && videoCount % 2 === 0) && Math.random() < 0.5) {
searchCount++;
const keyword = SEARCH_KEYWORDS[Math.floor(Math.random() * SEARCH_KEYWORDS.length)];
console.log(`🔍 [${accountName}] 搜索关键词: "${keyword}"`);
await randomDelay(3000, 8000);
hasSearched = true;
// 搜索后刷几个相关视频
const searchVideos = Math.floor(Math.random() * 3) + 2;
for (let sv = 0; sv < searchVideos; sv++) {
if (Date.now() - startTime >= farmTime) break;
videoCount++;
const watchTime = Math.floor(Math.random() * (FARM_CONFIG.SINGLE_VIDEO_WATCH_MAX - FARM_CONFIG.SINGLE_VIDEO_WATCH_MIN) * 1000) + FARM_CONFIG.SINGLE_VIDEO_WATCH_MIN * 1000;
console.log(`📺 [${accountName}] 观看搜索相关视频 #${videoCount}${Math.round(watchTime/1000)}`);
await randomDelay(watchTime, watchTime + 5000);
// 互动
if (Math.random() * 100 < FARM_CONFIG.FARM_LIKE_RATE) {
likeCount++;
console.log(`❤️ [${accountName}] 点赞视频 (#${videoCount})`);
await randomDelay(1000, 3000);
}
}
hasSearched = false;
continue;
}
videoCount++;
const watchTime = Math.floor(Math.random() * (FARM_CONFIG.SINGLE_VIDEO_WATCH_MAX - FARM_CONFIG.SINGLE_VIDEO_WATCH_MIN) * 1000) + FARM_CONFIG.SINGLE_VIDEO_WATCH_MIN * 1000;
console.log(`📺 [${accountName}] 观看第 ${videoCount} 个视频,${Math.round(watchTime/1000)}`);
await randomDelay(watchTime, watchTime + 3000);
// 随机遇到广告30%概率),遇到小说就看几章
if (Math.random() < 0.3) {
adEncounterCount++;
// 随机决定广告类型:小说、游戏、直播
const adTypes = ["novel", "app", "live"];
const randomAdType = adTypes[Math.floor(Math.random() * adTypes.length)];
let adTitle = "";
if (randomAdType === "novel") {
adTitle = "小说推荐_精彩阅读";
console.log(`📢 [${accountName}] 刷视频时遇到小说广告: ${adTitle}`);
await simulateNovelReading(accountName);
} else if (randomAdType === "app") {
adTitle = "游戏推荐_下载试玩";
console.log(`📢 [${accountName}] 刷视频时遇到游戏广告: ${adTitle}`);
await simulateAppPlay(accountName, "推荐游戏");
} else {
adTitle = "直播推荐";
console.log(`📢 [${accountName}] 刷视频时遇到直播广告: ${adTitle}`);
// 直播广告模拟观看30-60秒
const shortWatchTime = Math.floor(Math.random() * 30000) + 30000;
await randomDelay(shortWatchTime, shortWatchTime + 10000);
console.log(`🎥 [${accountName}] 观看直播广告 ${Math.round(shortWatchTime/1000)}`);
}
}
// 随机点赞
if (Math.random() * 100 < FARM_CONFIG.FARM_LIKE_RATE) {
likeCount++;
console.log(`❤️ [${accountName}] 点赞视频 (#${videoCount})`);
await randomDelay(1000, 3000);
}
// 随机收藏
if (Math.random() * 100 < FARM_CONFIG.FARM_COLLECT_RATE) {
collectCount++;
console.log(`⭐ [${accountName}] 收藏视频 (#${videoCount})`);
await randomDelay(1000, 3000);
}
// 随机评论
if (Math.random() * 100 < FARM_CONFIG.FARM_COMMENT_RATE) {
commentCount++;
const comment = getRandomComment();
console.log(`💬 [${accountName}] 评论: "${comment}"`);
await randomDelay(2000, 5000);
}
// 滑动切换视频
await randomDelay(500, 1500);
}
console.log(`🌾 [${accountName}] 刷视频养号完成!`);
console.log(` 观看视频: ${videoCount}个 | 搜索: ${searchCount}次 | 点赞: ${likeCount}次 | 收藏: ${collectCount}次 | 评论: ${commentCount}次 | 广告转化: ${adEncounterCount}`);
}
// 执行直播间养号随机进入直播间待20-30分钟
async function farmLiveWatch(accountName) {
console.log(`🎥 [${accountName}] 随机进入直播间...`);
await randomDelay(2000, 5000);
// 随机决定直播间是否有小游戏30%概率)
const hasMiniGame = Math.random() < 0.3;
await simulateLiveWatch(accountName, hasMiniGame);
}
// 执行商城养号
async function farmShopBrowsing(accountName) {
await simulateShopBrowsing(accountName);
}
// 完整养号流程
async function doFarming(accountName, triggerReason) {
console.log(`\n🌾 ========== 开始养号 [${accountName}] ==========`);
console.log(`🌾 触发原因: ${triggerReason}`);
// 1. 刷视频养号15-20分钟
await farmBrowseVideos(accountName);
// 2. 随机进入直播间20-30分钟50%概率执行
if (Math.random() < 0.5) {
await farmLiveWatch(accountName);
}
// 3. 商城浏览3-6个商品50%概率执行
if (Math.random() < 0.5) {
await farmShopBrowsing(accountName);
}
console.log(`🌾 ========== 养号完成 [${accountName}] ==========\n`);
}
// 随机状态文案
function randomAdStatus() {
const list = ["正在观看广告", "认真观看中...", "浏览广告内容", "模拟用户行为", "观看视频广告", "保持活跃状态", "广告浏览中", "正常观看时长"];
return list[Math.floor(Math.random() * list.length)];
}
// 环境开关
const DEV_MODE = process.env.DEV_MODE === "1" || process.env.DEV_MODE === "true";
const ENABLE_DID_CHANGE = process.env.ENABLE_DID_CHANGE === "1" || process.env.ENABLE_DID_CHANGE === "true";
// 读取数字环境变量
function getEnvInt(key, defaultValue) {
const val = parseInt(process.env[key], 10);
return isNaN(val) ? defaultValue : val;
}
const LOW_REWARD_THRESHOLD = getEnvInt("KSLOW_REWARD_THRESHOLD", 10);
const TOTAL_ROUNDS = getEnvInt("KSROUNDS", 100);
const COIN_LIMIT = getEnvInt("KSCOIN_LIMIT", 100000);
const LOW_REWARD_MAX_TIMES = getEnvInt("KSLOW_REWARD_LIMIT", 3);
// 解析任务列表
function parseTaskList() {
// 已禁用广告任务,仅保留养号功能(刷视频/小说/直播/商城等)
console.log("⚙️ 广告任务已禁用,将仅执行养号模块");
return [];
const taskEnv = process.env.Task;
if (!taskEnv) {
console.log("未设置Task环境变量将执行所有任务 (look, looks, looks, looks, looks)");
return ["look", "looks", "looks", "looks", "looks"];
}
const inputTasks = taskEnv.split(",").map(t => t.trim().toLowerCase()).filter(Boolean);
const validTasks = ["food", "box", "look", "looks"];
const finalTasks = inputTasks.filter(t => validTasks.includes(t));
if (finalTasks.length === 0) {
console.log("Task环境变量中没有有效任务将执行所有任务 (food, box, look, looks)");
return validTasks;
}
console.log("从Task环境变量中解析到要执行的任务: " + finalTasks.join(", "));
return finalTasks;
}
// 解析所有账号配置 ksptck / ksptck1~666
function parseAllAccounts() {
const all = [];
const uniqueSet = new Set();
if (process.env.ksptck) {
const parts = process.env.ksptck.split("&").map(p => p.trim()).filter(Boolean);
all.push(...parts);
}
for (let i = 1; i <= 666; i++) {
const key = "ksptck" + i;
if (process.env[key]) {
const parts = process.env[key].split("&").map(p => p.trim()).filter(Boolean);
all.push(...parts);
}
}
const uniqueList = [];
for (const item of all) {
if (!uniqueSet.has(item)) {
uniqueSet.add(item);
uniqueList.push(item);
}
}
console.log("从ksptck及ksptck1到ksptck666环境变量中解析到 " + uniqueList.length + " 个唯一配置");
return uniqueList;
}
// 全局任务名称映射
const TASK_NAME_MAP = {
food: "food看广告得金币1",
box: "box宝箱广告",
look: "look看广告得金币",
looks: "looks看广告得金币追加"
};
// 并发控制
const DEFAULT_CONCURRENCY = 10;
const MAX_CONCURRENCY_ALLOW = 200;
const userConcurrency = getEnvInt("MAX_CONCURRENCY", NaN);
const CONCURRENCY = isNaN(userConcurrency)
? DEFAULT_CONCURRENCY
: Math.min(Math.max(userConcurrency, 1), MAX_CONCURRENCY_ALLOW);
console.log("================================================================================");
console.log(" ⭐ 快手至尊金币版(广告转化+养号版)⭐ ");
console.log("🏆 安全稳定 · 高效收益 · 尊贵体验 🏆 ");
console.log("🏆 代理购买2.1r一月· http://www.gzsk5.com/#/register?invitation=hnking2&shareid=516 ");
console.log("🏆 接口工具脚本获取ck获取· https://pan.quark.cn/s/41d4dae92896 ");
console.log("🏆 云手机· https://cloud.ace-bot.cn/#/inviteReg?invite=501891 ");
console.log("================================================================================");
console.log("🎯 新增功能:");
console.log(" - 广告自动转化(小说阅读/APP试玩/直播互动)");
console.log(" - 低奖励自动养号(<200金币触发");
console.log(" - 刷视频随机点赞/收藏/评论每个视频60-90秒总15-20分钟");
console.log(" - 首页搜索捕鱼游戏/传奇/游戏推荐");
console.log(" - 直播间互动20-30分钟随机小游戏试玩");
console.log(" - 商城浏览(黑丝/学习机/投资金条/冲锋衣/按摩枕3-6个商品");
console.log("================================================================================");
console.log("🎉 系统初始化完成,快手至尊金币版(广告转化+养号版)启动成功!🎉");
const accountStrings = parseAllAccounts();
const ACCOUNT_COUNT = accountStrings.length;
const TASKS_TO_RUN = parseTaskList();
console.log("💎 检测到环境变量配置:" + ACCOUNT_COUNT + "个账号");
console.log("🎯 将执行以下任务:" + TASKS_TO_RUN.map(t => TASK_NAME_MAP[t] || t).join(", "));
console.log("🎯 配置参数:");
console.log(" - 任务配置变量=Task (可选: food看广告得金币1, box宝箱广告, look看广告得金币, looks看广告得金币追加, 多个用逗号分隔)");
console.log(" - 账号配置变量=ksptck, 卡密变量=ptkm");
console.log(" - KS_SIGN_API_URL: 签名服务 API 地址");
console.log(" - 轮数变量=KSROUNDS (当前: " + TOTAL_ROUNDS + ", 默认100)");
console.log(" - 金币上限变量=KSCOIN_LIMIT (当前: " + COIN_LIMIT + ", 默认100000)");
console.log(" - 低奖励阈值变量=KSLOW_REWARD_THRESHOLD (当前: " + LOW_REWARD_THRESHOLD + ", 默认10)");
console.log(" - 连续低奖励上限变量=KSLOW_REWARD_LIMIT (当前: " + LOW_REWARD_MAX_TIMES + ", 默认3)");
console.log(" - 并发数变量=MAX_CONCURRENCY (当前: " + CONCURRENCY + ", 默认10, 最大200)");
console.log("🌾 养号配置:");
console.log(" - 养号开关: " + (FARM_CONFIG.ENABLE_FARM ? "✅ 已启用" : "❌ 已禁用"));
console.log(" - 低奖励阈值: " + FARM_CONFIG.LOW_REWARD_FARM_THRESHOLD + "金币");
console.log(" - 每个视频时长: " + FARM_CONFIG.SINGLE_VIDEO_WATCH_MIN + "-" + FARM_CONFIG.SINGLE_VIDEO_WATCH_MAX + "秒");
console.log(" - 刷视频总时长: " + FARM_CONFIG.FARM_VIDEO_TIME_MIN + "-" + FARM_CONFIG.FARM_VIDEO_TIME_MAX + "分钟");
console.log(" - 直播时长: " + FARM_CONFIG.LIVE_WATCH_TIME_MIN + "-" + FARM_CONFIG.LIVE_WATCH_TIME_MAX + "分钟");
console.log(" - 小游戏试玩: " + FARM_CONFIG.MINI_GAME_PLAY_MIN + "-" + FARM_CONFIG.MINI_GAME_PLAY_MAX + "分钟");
console.log(" - 商城浏览商品数: " + FARM_CONFIG.SHOP_BROWSE_ITEMS_MIN + "-" + FARM_CONFIG.SHOP_BROWSE_ITEMS_MAX + "个");
console.log(" - 每日养号上限: " + FARM_CONFIG.FARM_DAILY_LIMIT + "次");
console.log("🔧 DID更换功能" + (ENABLE_DID_CHANGE ? "✅ 已启用 (ENABLE_DID_CHANGE=1)" : "❌ 已禁用 (设置 ENABLE_DID_CHANGE=1 启用)"));
if (ACCOUNT_COUNT > MAX_CONCURRENCY_ALLOW) {
console.log("错误: 检测到 " + ACCOUNT_COUNT + " 个账号配置,最多只允许" + MAX_CONCURRENCY_ALLOW + "个");
process.exit(1);
}
// 生成随机 DID
function generateAndroidDID() {
try {
const hex = "0123456789abcdef";
let rand = "";
for (let i = 0; i < 16; i++) {
rand += hex.charAt(Math.floor(Math.random() * hex.length));
}
return "ANDROID_" + rand;
} catch (e) {
console.log("生成did失败: " + e.message);
const fallback = Date.now().toString(16).toUpperCase();
return "ANDROID_" + fallback.substring(0, 16);
}
}
// 通用请求(带代理)
async function requestWrapper(options, proxyUrl = null, title = "Unknown Request") {
const opt = { ...options };
if (proxyUrl) {
try {
opt.agent = new SocksProxyAgent(proxyUrl);
} catch (e) {
console.log("[错误] " + title + " 代理URL无效(" + e.message + "),尝试直连模式");
}
}
return new Promise(resolve => {
request(opt, (err, response, body) => {
if (err) {
return resolve({ response: null, body: null });
}
if (!response || response.statusCode !== 200) {
return resolve({ response, body: null });
}
try {
resolve({ response, body: JSON.parse(body) });
} catch {
resolve({ response, body });
}
});
});
}
// 代理 IP 连通性检测
async function checkProxyConnect(proxyUrl, title = "代理检测") {
if (!proxyUrl) {
return { ok: true, msg: "✅ 未配置代理(直连模式)", ip: "localhost" };
}
const { response, body } = await requestWrapper({
method: "GET",
url: "https://ip9.com.cn/get",
headers: { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" },
timeout: 8000
}, proxyUrl, title + " → ip9.com.cn");
if (!body) return { ok: false, msg: "❌ 无法通过代理访问 ip9.com.cn", ip: "" };
let ip = "";
if (typeof body === "string") {
try {
const j = JSON.parse(body);
ip = j.ip || j.IP || j.addr || j.ip_address || j.query || (j.data && j.data.ip) || "";
} catch {
const match = body.match(/\b(?:\d{1,3}\.){3}\d{1,3}\b/);
ip = match ? match[0] : "";
}
} else if (body && typeof body === "object") {
ip = body.ip || body.IP || body.addr || body.ip_address || body.query || (body.data && body.data.ip) || "";
}
return {
ok: true,
msg: "✅ SOCKS5代理正常出口IP: " + (ip || "未知"),
ip: ip || "未知"
};
}
const usedIPSet = new Set();
// 获取账号基本信息
async function getAccountBasic(cookie, proxyUrl, tag) {
const url = "https://encourage.kuaishou.com/rest/wd/encourage/account/basicInfo";
const { response, body } = await requestWrapper({
method: "GET",
url,
headers: {
Host: "encourage.kuaishou.com",
"User-Agent": "kwai-android aegon/3.56.0",
Cookie: cookie,
"Content-Type": "application/x-www-form-urlencoded"
},
timeout: 12000
}, proxyUrl, "账号[" + tag + "] 获取基本信息");
if (body && body.result === 1 && body.data) {
return {
nickname: body.data.userData?.nickname || tag,
totalCoin: body.data.coinAmount ?? null,
allCash: body.data.cashAmountDisplay ?? null
};
}
return null;
}
// 居中填充(表格用)
function padCenter(str, len) {
str = String(str || "").substring(0, len);
if (str.length >= len) return str;
const totalPad = len - str.length;
const left = Math.floor(totalPad / 2);
return " ".repeat(left) + str + " ".repeat(totalPad - left);
}
// 账号任务执行器(增强版)
class AccountRunner {
constructor({ index, salt, cookie, nickname = "", proxyUrl = null, tasksToExecute = [], remark = "" }) {
this.index = index;
this.salt = salt;
this.cookie = cookie;
this.nickname = nickname || remark || "账号" + index;
this.remark = remark;
this.proxyUrl = proxyUrl;
this.coinLimit = COIN_LIMIT;
this.coinExceeded = false;
this.tasksToExecute = tasksToExecute;
this.egid = "";
this.did = "";
this.userId = "";
this.kuaishouApiSt = "";
this.appver = "13.7.20.10468";
this.parseCookieFields();
this.headers = {
Host: "nebula.kuaishou.com",
"User-Agent": "kwai-android aegon/4.28.0",
"Accept-Language": "zh-cn",
kaw: "MDHkM+9FrbzVSEAqyw6KYWaDbX//YWh3HL3RNoTk0mflLjaw17zmC5Wgx5HS/kdo8uJyFtQMxCHt4jfkbu9FqpqmnO/5L67iloqkSzUuRt4OomU1jJGFzdZMalsksJeN75Aw0w+eS2PMus7fga6twyLPbI9Ku1xGWINrZFVxaFtQkweesxPN0tRRwfb98Vxi+sOIlaDxUM03svdfQpthP2HlXcOTkKBqV8bxwv8I5GCGZydEmtEA",
kas: "0013db77e6dbe18ab159e21bc94e8cd224",
Cookie: this.cookie,
"Content-Type": "application/json"
};
this.taskReportPath = "/rest/r/ad/task/report";
this.startTime = Date.now();
this.endTime = this.startTime - 30000;
this.queryParams = `mod=Xiaomi(MI 11)&appver=${this.appver}&egid=${this.egid}&did=${this.did}`;
this.taskDef = {
box: { name: "宝箱广告", businessId: 604, posId: 20347, subPageId: 100024063, pageId: 100011251, requestSceneType: 1, taskType: 1 },
look: { name: "看广告得金币", businessId: 671, posId: 24068, subPageId: 100026368, pageId: 100011251, requestSceneType: 1, taskType: 1 },
looks: { name: "看广告得金币[追加]", businessId: 671, posId: 24068, subPageId: 100026368, pageId: 100011251, requestSceneType: 7, taskType: 2 },
food: { name: "看广告得金币1", businessId: 671, posId: 24068, subPageId: 100026368, pageId: 100011251, requestSceneType: 7, taskType: 2 }
};
this.taskStats = {};
this.tasksToExecute.forEach(t => {
if (this.taskDef[t]) this.taskStats[t] = { success: 0, failed: 0, totalReward: 0 };
});
this.lowRewardStreak = 0;
this.lowRewardThreshold = LOW_REWARD_THRESHOLD;
this.lowRewardLimit = LOW_REWARD_MAX_TIMES;
this.stopAllTasks = false;
this.taskLimitReached = {};
this.tasksToExecute.forEach(t => {
if (this.taskDef[t]) this.taskLimitReached[t] = false;
});
// 新增:养号计数
this.farmCountToday = 0;
this.totalRewardThisRun = 0;
// 是否已执行过初始养号
this.hasDoneInitialFarm = false;
}
parseCookieFields() {
try {
const egidMatch = this.cookie.match(/egid=([^;]+)/);
const didMatch = this.cookie.match(/did=([^;]+)/);
const uidMatch = this.cookie.match(/userId=([^;]+)/);
const stMatch = this.cookie.match(/kuaishou\.api_st=([^;]+)/);
const appverMatch = this.cookie.match(/appver=([^;]+)/);
this.egid = egidMatch ? egidMatch[1] : "";
this.did = didMatch ? didMatch[1] : "";
this.userId = uidMatch ? uidMatch[1] : "";
this.kuaishouApiSt = stMatch ? stMatch[1] : "";
this.appver = appverMatch ? appverMatch[1] : "13.7.20.10468";
if (!this.egid || !this.did) {
console.log(`账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} cookie格式可能无 egid 或 did但继续尝试...`);
}
} catch (e) {
console.log(`账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 解析cookie失败: ${e.message}`);
}
}
async checkCoinIsOverLimit() {
try {
const info = await getAccountBasic(this.cookie, this.proxyUrl, this.index);
if (info && info.totalCoin != null) {
const coin = parseInt(info.totalCoin);
if (coin >= this.coinLimit) {
console.log(`⚠️ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 金币已达 ${coin},超过 ${this.coinLimit} 阈值,将停止任务`);
this.coinExceeded = true;
this.stopAllTasks = true;
return true;
}
}
return false;
} catch (e) {
console.log(`账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 金币检查异常: ${e.message}`);
return false;
}
}
// 新增:获取当前总金币的方法
async getCurrentTotalCoin() {
try {
const info = await getAccountBasic(this.cookie, this.proxyUrl, this.index);
if (info && info.totalCoin != null) {
return parseInt(info.totalCoin);
}
return null;
} catch (e) {
console.log(`账号[${this.nickname}] 获取总金币失败: ${e.message}`);
return null;
}
}
async retry(fn, desc, maxRetries = 3, delayMs = 2000) {
let attempt = 0;
let lastErr = null;
while (attempt < maxRetries) {
try {
const res = await fn();
if (res) return res;
lastErr = new Error(desc + " 返回空");
} catch (e) {
lastErr = e;
console.log(`账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ${desc} 异常: ${e.message}`);
}
attempt++;
if (attempt < maxRetries) {
console.log(`账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ${desc} 失败,重试 ${attempt}/${maxRetries}`);
await new Promise(r => setTimeout(r, delayMs));
}
}
console.log(`${desc} 最终失败`);
return null;
}
async getEncSign(base64Data) {
try {
const { body } = await requestWrapper({
method: "POST",
url: SIGN_API_URL + "/encsign",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ data: base64Data }),
timeout: 10000
}, null, `账号[${this.nickname}] 加密签名`);
if (body && body.status) return body.data;
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} encsign 签名服务失败: ${body?.message || "无响应"}`);
return null;
} catch (e) {
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} encsign 请求异常: ${e.message}`);
return null;
}
}
async getNsSig(urlPath, postData, apiSalt) {
try {
const payload = { path: urlPath, data: postData, salt: apiSalt };
const { body } = await requestWrapper({
method: "POST",
url: SIGN_API_URL + "/nssig",
headers: { "Content-Type": "application/json", "User-Agent": "Mozilla/5.0" },
body: JSON.stringify(payload),
timeout: 15000
}, null, `账号[${this.nickname}] 签名服务`);
if (body && body.data) {
return {
__NS_sig3: body.data.nssig3,
__NStokensig: body.data.nstokensig,
sig: body.data.sig,
__NS_xfalcon: body.data.nssig4 || ""
};
}
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} nssig 签名失败: ${body?.error || body?.message || "无响应"}`);
return null;
} catch (e) {
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} nssig 请求异常: ${e.message}`);
return null;
}
}
async getAdInfo(taskCfg) {
try {
const apiPath = "/rest/e/reward/mixed/ad";
const commonQuery = {
encData: "|encData|",
sign: "|sign|",
cs: "false",
client_key: "3c2cd3f3",
videoModelCrowdTag: "1_23",
os: "android",
"kuaishou.api_st": this.kuaishouApiSt,
uQaTag: "1##swLdgl:99#ecPp:-9#cmNt:-0#cmHs:-3#cmMnsl:-0"
};
const deviceQuery = {
earphoneMode: "1",
mod: "Xiaomi(23116PN5BC)",
appver: this.appver,
isp: "CUCC",
language: "zh-cn",
ud: this.userId,
did_tag: "0",
net: "WIFI",
kcv: "1599",
app: "0",
kpf: "ANDROID_PHONE",
ver: "11.6",
android_os: "0",
boardPlatform: "pineapple",
kpn: "KUAISHOU",
androidApiLevel: "35",
country_code: "cn",
sys: "ANDROID_15",
sw: "1080",
sh: "2400",
abi: "arm64",
userRecoBit: "0"
};
const impBody = {
appInfo: { appId: "kuaishou", name: "快手", packageName: "com.smile.gifmaker", version: this.appver, versionCode: -1 },
deviceInfo: { osType: 1, osVersion: "15", deviceId: this.did, screenSize: { width: 1080, height: 2249 }, ftt: "" },
userInfo: { userId: this.userId, age: 0, gender: "" },
impInfo: [{
pageId: taskCfg.pageId,
subPageId: taskCfg.subPageId,
action: 0,
browseType: 3,
impExtData: "{}",
mediaExtData: "{}"
}]
};
const b64 = Buffer.from(JSON.stringify(impBody)).toString("base64");
const encSign = await this.getEncSign(b64);
if (!encSign) return null;
commonQuery.encData = encSign.encdata;
commonQuery.sign = encSign.sign;
const qsDevice = querystring.stringify(deviceQuery);
const qsCommon = querystring.stringify(commonQuery);
const postData = qsDevice + "&" + qsCommon;
const sigRes = await this.getNsSig(apiPath, postData, this.salt);
if (!sigRes) return null;
const fullQuery = { ...deviceQuery, sig: sigRes.sig, __NS_sig3: sigRes.__NS_sig3, __NS_xfalcon: sigRes.__NS_xfalcon, __NStokensig: sigRes.__NStokensig };
const fullUrl = "https://api.e.kuaishou.com" + apiPath + "?" + querystring.stringify(fullQuery);
const { body } = await requestWrapper({
method: "POST",
url: fullUrl,
headers: {
Host: "api.e.kuaishou.com",
"User-Agent": "kwai-android aegon/3.56.0",
Cookie: "kuaishou_api_st=" + this.kuaishouApiSt,
kaw: this.headers.kaw,
kas: this.headers.kas
},
form: commonQuery,
timeout: 12000
}, this.proxyUrl, `账号[${this.nickname}] 获取广告`);
if (!body) return null;
if (body.errorMsg === "OK" && body.feeds?.[0]?.ad) {
const title = body.feeds[0].caption || body.feeds[0].ad?.caption || "";
if (title) console.log(`✅ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 成功获取广告:${title}`);
const expTag = body.feeds[0].exp_tag || "";
const llsid = expTag.split("/")[1]?.split("_")?.[0] || "";
return { cid: body.feeds[0].ad.creativeId, llsid, title };
}
return null;
} catch (e) {
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 获取广告异常: ${e.message}`);
return null;
}
}
async makeReportSign(cid, llsid, taskKey, taskCfg) {
try {
const bizJson = JSON.stringify({
businessId: taskCfg.businessId,
endTime: this.endTime,
extParams: "",
mediaScene: "video",
neoInfos: [{
creativeId: cid,
extInfo: "",
llsid: llsid,
requestSceneType: taskCfg.requestSceneType,
taskType: taskCfg.taskType,
watchExpId: "",
watchStage: 0
}],
pageId: taskCfg.pageId,
posId: taskCfg.posId,
reportType: 0,
sessionId: "",
startTime: this.startTime,
subPageId: taskCfg.subPageId
});
const post = "bizStr=" + encodeURIComponent(bizJson) + "&cs=false&client_key=3c2cd3f3&kuaishou.api_st=" + this.kuaishouApiSt;
const qsTotal = this.queryParams + "&" + post;
const sig = await this.getNsSig(this.taskReportPath, qsTotal, this.salt);
if (!sig) return null;
return {
sig: sig.sig,
sig3: sig.__NS_sig3,
sigtoken: sig.__NStokensig,
xfalcon: sig.__NS_xfalcon,
postData: post
};
} catch (e) {
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 生成报告签名异常: ${e.message}`);
return null;
}
}
async submitReport(sig, sig3, sigToken, xfalcon, postData, taskKey, taskCfg) {
try {
const qs = this.queryParams +
"&sig=" + sig +
"&__NS_sig3=" + sig3 +
"&__NS_xfalcon=" + (xfalcon || "") +
"&__NStokensig=" + sigToken;
const url = "https://api.e.kuaishou.com" + this.taskReportPath + "?" + qs;
const { body } = await requestWrapper({
method: "POST",
url,
headers: {
Host: "api.e.kuaishou.cn",
"User-Agent": "kwai-android aegon/3.56.0",
"Content-Type": "application/x-www-form-urlencoded"
},
body: postData,
timeout: 12000
}, this.proxyUrl, `账号[${this.nickname}] 提交任务`);
if (!body) return { success: false, reward: 0 };
if (body.result === 1) {
const reward = body.data?.neoAmount || 0;
// 获取当前总金币
const currentTotalCoin = await this.getCurrentTotalCoin();
const totalCoinDisplay = currentTotalCoin !== null ? ` | 当前总金币: ${currentTotalCoin}` : "";
console.log(`💰 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ${taskCfg.name} 获得 ${reward} 金币${totalCoinDisplay}`);
// 累计奖励用于养号判断
this.totalRewardThisRun += reward;
// 低奖励触发养号(低于阈值直接触发养号,不刷金币)
if (FARM_CONFIG.ENABLE_FARM && reward < FARM_CONFIG.LOW_REWARD_FARM_THRESHOLD && this.farmCountToday < FARM_CONFIG.FARM_DAILY_LIMIT) {
console.log(`⚠️ 账号[${this.nickname}] 奖励 ${reward} 金币低于阈值 ${FARM_CONFIG.LOW_REWARD_FARM_THRESHOLD},触发养号(跳过本次刷金币)`);
this.farmCountToday++;
await doFarming(this.nickname, `低奖励(${reward}金币)`);
// 养号后重新获取总金币显示
const afterFarmCoin = await this.getCurrentTotalCoin();
if (afterFarmCoin !== null) {
console.log(`📊 账号[${this.nickname}] 养号后总金币: ${afterFarmCoin}`);
}
// 养号后停止当前任务,返回成功但标记为已处理
return { success: true, reward, farmed: true };
}
if (reward <= this.lowRewardThreshold) {
this.lowRewardStreak++;
if (ENABLE_DID_CHANGE) {
this.did = generateAndroidDID();
console.log(`⚠️ 账号[${this.nickname}] 奖励过低已更换DID连续低奖励${this.lowRewardStreak}/${this.lowRewardLimit}`);
} else {
console.log(`⚠️ 账号[${this.nickname}] 奖励过低,连续低奖励:${this.lowRewardStreak}/${this.lowRewardLimit}`);
}
if (this.lowRewardStreak >= this.lowRewardLimit) {
console.log(`🏁 账号[${this.nickname}] 连续低奖励超限,停止全部任务`);
this.stopAllTasks = true;
return { success: true, reward };
}
const waitMs = Math.floor(Math.random() * 10000) + 583000;
console.log(`🔍 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ==> 等待 ${Math.round(waitMs / 1000)}s`);
await new Promise(r => setTimeout(r, waitMs));
} else {
this.lowRewardStreak = 0;
}
return { success: true, reward };
}
if ([20107, 20108, 1003, 415].includes(body.result)) {
console.log(`⚠️ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ${taskCfg.name} 已达上限`);
this.taskLimitReached[taskKey] = true;
return { success: false, reward: 0 };
}
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ${taskCfg.name} 失败 result=${body.result}`);
return { success: false, reward: 0 };
} catch (e) {
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 提交任务异常: ${e.message}`);
return { success: false, reward: 0 };
}
}
async runSingleTask(taskKey) {
const cfg = this.taskDef[taskKey];
if (!cfg) return false;
if (this.taskLimitReached[taskKey] || this.stopAllTasks) return false;
try {
const adInfo = await this.retry(() => this.getAdInfo(cfg), "获取广告 " + cfg.name, 3);
if (!adInfo) {
this.taskStats[taskKey].failed++;
return false;
}
// 广告转化:点击广告进入页面模拟真人浏览
if (adInfo.title) {
console.log(`📢 账号[${this.nickname}] 广告标题: ${adInfo.title.substring(0, 100)}`);
// 根据广告标题判断类型并执行转化
let adType = "browse";
if (adInfo.title.includes("小说") || adInfo.title.includes("阅读") || adInfo.title.includes("故事")) {
adType = "novel";
await simulateNovelReading(this.nickname);
} else if (adInfo.title.includes("下载") || adInfo.title.includes("游戏") || adInfo.title.includes("APP") || adInfo.title.includes("应用")) {
adType = "app";
await simulateAppPlay(this.nickname, "推荐应用");
} else if (adInfo.title.includes("直播")) {
adType = "live";
// 直播广告观看5-10分钟
const shortWatchTime = Math.floor(Math.random() * 300000) + 300000;
await randomDelay(shortWatchTime, shortWatchTime + 60000);
console.log(`🎥 [${this.nickname}] 观看直播广告 ${Math.round(shortWatchTime/60000)}分钟`);
} else {
const browseTime = Math.floor(Math.random() * 30000) + 30000;
console.log(`📄 [${this.nickname}] 浏览广告内容 ${Math.round(browseTime/1000)}秒...`);
await randomDelay(browseTime, browseTime + 5000);
}
}
const waitMs = Math.floor(Math.random() * 10000) + 38000;
console.log(`🔍 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} ==> ${cfg.name} ${randomAdStatus()} ${Math.round(waitMs / 1000)}s`);
await new Promise(r => setTimeout(r, waitMs));
const sign = await this.retry(() => this.makeReportSign(adInfo.cid, adInfo.llsid, taskKey, cfg), "生成报告签名", 3);
if (!sign) {
this.taskStats[taskKey].failed++;
return false;
}
const result = await this.retry(() => this.submitReport(sign.sig, sign.sig3, sign.sigtoken, sign.xfalcon, sign.postData, taskKey, cfg), "提交报告", 3);
if (result?.success) {
this.taskStats[taskKey].success++;
this.taskStats[taskKey].totalReward += result.reward || 0;
return true;
}
this.taskStats[taskKey].failed++;
return false;
} catch (e) {
console.log(`❌ 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 任务异常(${taskKey}): ${e.message}`);
this.taskStats[taskKey].failed++;
return false;
}
}
async runAllTasks() {
const results = {};
for (const t of this.tasksToExecute) {
if (this.stopAllTasks) break;
if (!this.taskDef[t]) continue;
console.log(`🚀 账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 开始任务:${this.taskDef[t].name}`);
results[t] = await this.runSingleTask(t);
if (this.stopAllTasks) break;
if (t !== this.tasksToExecute.at(-1)) {
const wait = Math.floor(Math.random() * 8000) + 7000;
console.log(`⏱ 账号[${this.nickname}] 任务间隔等待 ${Math.round(wait / 1000)}s`);
await new Promise(r => setTimeout(r, wait));
}
}
return results;
}
printStats() {
console.log(`\n账号[${this.nickname}]${this.remark ? "" + this.remark + "" : ""} 任务统计:`);
for (const [k, stat] of Object.entries(this.taskStats)) {
const name = this.taskDef[k].name;
console.log(` ${name}: 成功${stat.success}次, 失败${stat.failed}次, 总奖励${stat.totalReward}金币`);
}
console.log(`🌾 养号统计: 今日已养号 ${this.farmCountToday}/${FARM_CONFIG.FARM_DAILY_LIMIT}`);
console.log(`💰 本轮总奖励: ${this.totalRewardThisRun} 金币`);
}
getStats() {
return this.taskStats;
}
}
// 解析单行账号字符串remark#cookie#salt#proxy 或简化格式)
function parseAccountLine(line) {
const parts = String(line || "").trim().split("#");
if (parts.length < 2) return null;
let remark = "";
let cookie = "";
let salt = "";
let proxy = null;
if (parts.length === 2) {
cookie = parts[0];
salt = parts[1];
} else if (parts.length === 3) {
if (/socks5:\/\//i.test(parts[2])) {
cookie = parts[0];
salt = parts[1];
proxy = parts[2];
} else {
remark = parts[0];
cookie = parts[1];
salt = parts[2];
}
} else if (parts.length >= 4) {
remark = parts[0];
cookie = parts[1];
salt = parts.slice(2, -1).join("#");
proxy = parts.at(-1);
}
cookie = cookie.replace("kpn=NEBULA", "kpn=KUAISHOU");
if (proxy) {
if (proxy.includes("|")) {
const [host, port, user, pwd] = proxy.split("|");
proxy = `socks5://${user}:${pwd}@${host}:${port}`;
} else if (!/^socks5:\/\//i.test(proxy)) {
console.log("⚠️ 代理非socks5忽略" + proxy);
proxy = null;
}
}
return { remark, salt, cookie, proxyUrl: proxy };
}
// 加载所有有效账号
function loadAllAccounts() {
const lines = parseAllAccounts();
const list = [];
for (const line of lines) {
const acc = parseAccountLine(line);
if (acc) list.push(acc);
else console.log("账号格式错误:" + line);
}
list.forEach((acc, i) => acc.index = i + 1);
return list;
}
// 并发调度器
async function concurrentRun(items, concurrency, taskFn) {
const results = new Array(items.length);
let index = 0;
const worker = async () => {
while (true) {
const i = index++;
if (i >= items.length) return;
try {
results[i] = await taskFn(items[i], i);
} catch (e) {
console.log(`并发异常(账号${i + 1}${e.message}`);
results[i] = null;
}
}
};
const workers = Array.from({ length: Math.min(concurrency, items.length) }, worker);
await Promise.all(workers);
return results;
}
// 单个账号完整执行流程
async function runAccount(account) {
if (account.proxyUrl) {
console.log(`账号[${account.index}]${account.remark ? "" + account.remark + "" : ""} 🔌 测试代理...`);
const proxyCheck = await checkProxyConnect(account.proxyUrl, `账号[${account.index}]`);
console.log(" - " + proxyCheck.msg);
if (proxyCheck.ok && proxyCheck.ip && proxyCheck.ip !== "localhost") {
if (usedIPSet.has(proxyCheck.ip)) {
console.log("\n⚠ 相同IP重复退出防止风控" + proxyCheck.ip);
process.exit(1);
}
usedIPSet.add(proxyCheck.ip);
}
} else {
console.log(`账号[${account.index}]${account.remark ? "" + account.remark + "" : ""} 直连模式`);
}
console.log(`账号[${account.index}]${account.remark ? "" + account.remark + "" : ""} 🔍 获取账号信息...`);
const infoBefore = await getAccountBasic(account.cookie, account.proxyUrl, account.index);
const nickname = infoBefore?.nickname || "账号" + account.index;
if (infoBefore) {
const coin = infoBefore.totalCoin ?? "未知";
const cash = infoBefore.allCash ?? "未知";
console.log(`账号[${nickname}]${account.remark ? "" + account.remark + "" : ""} ✅ 登录成功 | 金币: ${coin} | 余额: ${cash}`);
} else {
console.log(`账号[${nickname}]${account.remark ? "" + account.remark + "" : ""} ❌ 信息获取失败,继续执行`);
}
const runner = new AccountRunner({
...account,
nickname,
tasksToExecute: TASKS_TO_RUN
});
await runner.checkCoinIsOverLimit();
if (runner.coinExceeded) {
console.log(`账号[${nickname}] 金币已超限,不执行任务`);
const infoAfter = await getAccountBasic(account.cookie, account.proxyUrl, account.index);
return {
index: account.index,
remark: account.remark || "无备注",
nickname,
initialCoin: infoBefore?.totalCoin || 0,
finalCoin: infoAfter?.totalCoin || 0,
coinChange: (infoAfter?.totalCoin || 0) - (infoBefore?.totalCoin || 0),
initialCash: infoBefore?.allCash || 0,
finalCash: infoAfter?.allCash || 0,
cashChange: (infoAfter?.allCash || 0) - (infoBefore?.allCash || 0),
stats: runner.getStats(),
coinLimitExceeded: true
};
}
// 先执行一次初始养号
if (FARM_CONFIG.ENABLE_FARM && runner.farmCountToday < FARM_CONFIG.FARM_DAILY_LIMIT) {
console.log(`🌾 [${nickname}] 开始初始养号...`);
runner.farmCountToday++;
await doFarming(nickname, "初始养号");
runner.hasDoneInitialFarm = true;
}
// 开始刷金币任务
for (let round = 0; round < TOTAL_ROUNDS; round++) {
// 检查是否已触发养号且达到上限
if (runner.stopAllTasks) {
console.log(`账号[${nickname}] 🏁 停止条件触发,退出循环`);
break;
}
const wait = Math.floor(Math.random() * 8000) + 8000;
const now = new Date();
console.log(`账号[${nickname}] ⌛ 第${round + 1}轮,等待 ${Math.round(wait / 1000)}s=====>${now.toLocaleString()}`);
await new Promise(r => setTimeout(r, wait));
console.log(`账号[${nickname}] 🚀 第${round + 1}轮任务开始`);
await runner.runAllTasks();
if (runner.stopAllTasks) {
console.log(`账号[${nickname}] 🏁 停止条件触发,退出循环`);
break;
}
if (round < TOTAL_ROUNDS - 1) {
const interval = Math.floor(Math.random() * 10000) + 100000;
console.log(`账号[${nickname}] ⌛ 轮间等待 ${Math.round(interval / 1000)}s`);
await new Promise(r => setTimeout(r, interval));
}
}
const infoAfter = await getAccountBasic(account.cookie, account.proxyUrl, account.index);
const coinBefore = infoBefore?.totalCoin || 0;
const coinAfter = infoAfter?.totalCoin || 0;
const cashBefore = infoBefore?.allCash || 0;
const cashAfter = infoAfter?.allCash || 0;
runner.printStats();
return {
index: account.index,
remark: account.remark || "无备注",
nickname,
initialCoin: coinBefore,
finalCoin: coinAfter,
coinChange: coinAfter - coinBefore,
initialCash: cashBefore,
finalCash: cashAfter,
cashChange: cashAfter - cashBefore,
stats: runner.getStats(),
coinLimitExceeded: runner.coinExceeded,
farmCount: runner.farmCountToday
};
}
// 结果汇总表格
function printSummary(results) {
if (!results.length) {
console.log("\n无结果可展示");
return;
}
const totalInitCoin = results.reduce((sum, r) => sum + (Number(r.initialCoin) || 0), 0);
const totalFinalCoin = results.reduce((sum, r) => sum + (Number(r.finalCoin) || 0), 0);
const totalCoinDelta = totalFinalCoin - totalInitCoin;
const totalInitCash = results.reduce((sum, r) => sum + (Number(r.initialCash) || 0), 0);
const totalFinalCash = results.reduce((sum, r) => sum + (Number(r.finalCash) || 0), 0);
const totalCashDelta = totalFinalCash - totalInitCash;
const totalFarmCount = results.reduce((sum, r) => sum + (r.farmCount || 0), 0);
let totalTask = 0, totalSucc = 0, totalReward = 0;
results.forEach(r => {
if (!r.stats) return;
Object.values(r.stats).forEach(s => {
totalTask += s.success + s.failed;
totalSucc += s.success;
totalReward += s.totalReward || 0;
});
});
const succRate = totalTask > 0 ? ((totalSucc / totalTask) * 100).toFixed(1) : "0.0";
const limitAccounts = results.filter(r => r.coinLimitExceeded).length;
console.log("\n" + "=".repeat(80));
console.log("|" + padCenter(" 快手任务执行结果汇总 ", 78) + "|");
console.log("=".repeat(80));
console.log(`| 总账号: ${results.length} | 超限账号: ${limitAccounts} | 总任务: ${totalTask} | 成功率: ${succRate}% |`);
console.log(`| 金币变化: ${totalCoinDelta} | 总奖励: ${totalReward} | 余额变化: ${totalCashDelta.toFixed(2)} |`);
console.log(`| 总养号次数: ${totalFarmCount} |`);
console.log("-".repeat(80));
const heads = ["序号", "备注", "昵称", "初始金币", "最终金币", "金币变化", "初始余额", "最终余额", "余额变化", "养号次数"];
const widths = [6, 16, 16, 12, 12, 12, 12, 12, 12, 10];
let headLine = "|";
heads.forEach((h, i) => headLine += padCenter(h, widths[i]) + "|");
console.log(headLine);
let sepLine = "|";
widths.forEach(w => sepLine += "-".repeat(w) + "|");
console.log(sepLine);
results.forEach(r => {
const lineParts = [
r.index,
r.remark,
(r.nickname || "-") + (r.coinLimitExceeded ? " ⚠️" : ""),
r.initialCoin,
r.finalCoin,
r.coinChange >= 0 ? "+" + r.coinChange : r.coinChange,
r.initialCash,
r.finalCash,
r.cashChange >= 0 ? "+" + r.cashChange.toFixed(2) : r.cashChange.toFixed(2),
r.farmCount || 0
];
let line = "|";
lineParts.forEach((p, i) => line += padCenter(p, widths[i]) + "|");
console.log(line);
});
console.log("=".repeat(80));
console.log("|" + padCenter(" 执行完成 ", 78) + "|");
console.log("=".repeat(80));
}
// 主入口
(async () => {
const accounts = loadAllAccounts();
console.log("有效账号数:" + accounts.length);
if (accounts.length === 0) process.exit(1);
const finalResults = [];
await concurrentRun(accounts, CONCURRENCY, async acc => {
console.log(`\n—— 🚀 开始账号[${acc.index}]${acc.remark ? "" + acc.remark + "" : ""} ——`);
try {
const res = await runAccount(acc);
finalResults.push(res);
} catch (e) {
console.log(`账号[${acc.index}] 执行异常:${e.message}`);
finalResults.push({
index: acc.index,
remark: acc.remark || "无备注",
nickname: "账号" + acc.index,
initialCoin: 0, finalCoin: 0, coinChange: 0,
initialCash: 0, finalCash: 0, cashChange: 0,
error: e.message,
farmCount: 0
});
}
});
finalResults.sort((a, b) => a.index - b.index);
console.log("\n✅ 全部任务执行完成");
console.log("\n------------------------------------ 最终汇总 ------------------------------------");
printSummary(finalResults);
})();
const finalEncryptTag = "jsjiami.com.v7";