领微(无限积分)好像已经修复了

以下是青龙代码 有使用方法自己查看

/**
 * 芒果盒登录+看广告回调脚本(青龙面板专用)
 * 环境变量配置:
 *   变量名:lw
 *   变量值格式:单账号→131448213387&qwerasd123;多账号→131448213387&qwerasd123#13800138000&12345678
 * 核心逻辑:登录获取userId → 循环调用看广告回调接口(随机transid、动态sig)
 */
const axios = require('axios');
const crypto = require('crypto'); // 内置MD5加密,无需额外安装
const https = require('https');

// -------------------------- 配置项 --------------------------
// 登录接口
const LOGIN_URL = 'https://m.mangguohe.cn/apichat-v2-test/auth/login';
// 看广告回调接口
const CALLBACK_URL = 'https://api.adarea.net/api/adver/callback/txCallBackSupplement';
// 固定PID/APPID(和原Python脚本一致)
const PID = "7227762734453008";
const APPID = "1206508148";
// 循环间隔(秒):避免高频请求被封
const LOOP_INTERVAL = 5;
// 随机transid明文长度
const RANDOM_PLAIN_LENGTH = 12;

// -------------------------- 工具函数 --------------------------
/**
 * MD5加密(32位小写)
 * @param {string} plainText 明文
 * @returns {string} MD5加密结果
 */
function md5Encrypt(plainText) {
    return crypto.createHash('md5').update(plainText, 'utf8').digest('hex');
}

/**
 * 生成随机字符串(字母+数字)
 * @param {number} length 长度
 * @returns {string} 随机字符串
 */
function generateRandomStr(length = 12) {
    const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    let result = '';
    for (let i = 0; i < length; i++) {
        result += chars.charAt(Math.floor(Math.random() * chars.length));
    }
    return result;
}

/**
 * 格式化当前日期为 YYYY-MM-DD HH:mm:ss
 * @returns {string} 格式化后的日期
 */
function formatCurrentDate() {
    const date = new Date();
    const year = date.getFullYear();
    const month = String(date.getMonth() + 1).padStart(2, '0');
    const day = String(date.getDate()).padStart(2, '0');
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    const seconds = String(date.getSeconds()).padStart(2, '0');
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}

// -------------------------- 登录函数 --------------------------
/**
 * 单个账号登录
 * @param {string} phone 手机号
 * @param {string} password 密码
 * @returns {Promise<Object>} 登录结果(含userId/accessToken)
 */
async function login(phone, password) {
    const headers = {
        'Accept-Encoding': 'gzip',
        'Connection': 'Keep-Alive',
        'Content-Type': 'application/json; charset=utf-8',
        'Host': 'm.mangguohe.cn',
        'User-Agent': 'okhttp/4.12.0'
    };

    const requestBody = {
        phone: phone,
        password: password,
        deviceInfo: null
    };

    try {
        console.log(`\n【${phone}】开始登录...`);
        const response = await axios({
            method: 'post',
            url: LOGIN_URL,
            headers: headers,
            data: requestBody,
            timeout: 10000,
            httpsAgent: new https.Agent({ rejectUnauthorized: false })
        });

        const resData = response.data;
        if (resData.code === 200 && resData.data) {
            const { userId, accessToken, nickname } = resData.data;
            console.log(`【${phone}】登录成功!昵称:${nickname} | userId:${userId}`);
            return {
                success: true,
                phone: phone,
                userId: userId,
                accessToken: accessToken
            };
        } else {
            console.log(`【${phone}】登录失败:${resData.message || '接口返回异常'}`);
            return { success: false, phone: phone, error: resData.message };
        }
    } catch (error) {
        const errorMsg = error.code === 'ECONNABORTED' ? '请求超时' :
                         error.response ? `HTTP${error.response.status}:${JSON.stringify(error.response.data)}` :
                         error.message || '网络异常';
        console.log(`【${phone}】登录异常:${errorMsg}`);
        return { success: false, phone: phone, error: errorMsg };
    }
}

// -------------------------- 看广告回调函数 --------------------------
/**
 * 循环调用看广告回调接口
 * @param {string} phone 手机号(日志用)
 * @param {string} userId 登录获取的userId
 */
async function runAdCallback(phone, userId) {
    console.log(`\n【${phone}】开始循环调用看广告回调接口(间隔${LOOP_INTERVAL}秒)`);
    console.log(`【${phone}】按 Ctrl+C 可终止,青龙面板可手动停止脚本`);

    // 无限循环执行
    while (true) {
        try {
            // 1. 生成随机transid
            const randomPlain = generateRandomStr(RANDOM_PLAIN_LENGTH);
            const transid = md5Encrypt(randomPlain);
            
            // 2. 动态日期 + 生成sig
            const date = formatCurrentDate();
            const sigPlain = `${transid}:${PID}:${date}`;
            const sig = md5Encrypt(sigPlain);

            // 3. 构造回调请求体/请求头
            const callbackHeaders = {
                'Accept-Encoding': 'gzip',
                'Connection': 'Keep-Alive',
                'Content-Type': 'application/json; charset=utf-8',
                'Host': 'api.adarea.net',
                'User-Agent': 'okhttp/4.12.0',
                'source': 'android'
            };

            const callbackBody = {
                date: date,
                sig: sig,
                transid: transid,
                appid: APPID,
                pid: PID,
                userid: userId, // 登录获取的userId
                extrainfo: JSON.stringify({
                    yf_appid: APPID,
                    userId: userId,
                    yf_pid: PID
                })
            };

            // 4. 发送回调请求
            console.log(`\n【${phone}】${date} 执行回调请求`);
            console.log(`【${phone}】transid:${transid} | sig:${sig}`);
            
            const response = await axios({
                method: 'post',
                url: CALLBACK_URL,
                headers: callbackHeaders,
                data: callbackBody,
                timeout: 10000,
                httpsAgent: new https.Agent({ rejectUnauthorized: false })
            });

            console.log(`【${phone}】回调响应:状态码${response.status} | 内容${JSON.stringify(response.data)}`);

        } catch (error) {
            // 单次回调失败,不终止循环
            const errorMsg = error.code === 'ECONNABORTED' ? '请求超时' :
                             error.response ? `HTTP${error.response.status}:${JSON.stringify(error.response.data)}` :
                             error.message || '回调接口异常';
            console.log(`\n【${phone}】回调请求失败:${errorMsg}`);
        }

        // 间隔指定秒数后继续
        await new Promise(resolve => setTimeout(resolve, LOOP_INTERVAL * 1000));
    }
}

// -------------------------- 主函数 --------------------------
async function main() {
    console.log('========== 芒果盒登录+看广告回调脚本开始 ==========');
    
    // 读取青龙环境变量
    const lwEnv = process.env.lw;
    if (!lwEnv) {
        console.error('❌ 未配置环境变量 lw!格式:手机号&密码#手机号&密码');
        return;
    }

    // 解析多账号
    const accountList = lwEnv.split('#');
    console.log(`📌 共读取${accountList.length}个账号,开始处理...`);

    // 遍历每个账号
    for (const account of accountList) {
        const [phone, password] = account.split('&');
        if (!phone || !password) {
            console.log(`\n❌ 账号格式错误:${account}(需为 手机号&密码)`);
            continue;
        }

        // 先登录
        const loginResult = await login(phone, password);
        if (!loginResult.success) {
            console.log(`【${phone}】跳过回调执行`);
            continue;
        }

        // 登录成功后,执行回调循环(独立执行,不阻塞其他账号)
        runAdCallback(phone, loginResult.userId).catch(err => {
            console.log(`【${phone}】回调循环异常终止:${err.message}`);
        });

        // 账号间延迟,避免登录请求高频
        await new Promise(resolve => setTimeout(resolve, 2000));
    }

    // 防止脚本退出(因为回调是无限循环)
    await new Promise(() => {});
}

// 执行主函数
main().catch(err => {
    console.error('❌ 脚本全局异常:', err.message);
});
图片[1]-领微(无限积分)好像已经修复了-暴富社区
© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容