吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1472|回复: 13
上一主题 下一主题
收起左侧

[Java 原创] DSU自动签到(支持多账号+Server酱推送)

  [复制链接]
跳转到指定楼层
楼主
MRBANK 发表于 2025-4-23 11:23 回帖奖励
本帖最后由 MRBANK 于 2025-5-22 10:55 编辑

青龙配置教程:
1.添加环境变量
名称:COOKIES_自定义的环境变量名(代码中有两处改为自己设置的名称)
值:登录对应论坛,填入cookies

2.  修改代码中需要签到的网站地址
SIGN_URL: "https://www.XXXXX.com/plugin.php?id=dsu_paulsign:sign",// 需要签到的网站

3.新建js脚本 填入修改后的代码


4.设置定时任务自动签到


配置消息推送:
push推送用的方糖,公众号服务号推送消息
申请SendKey绑定微信
https://sct.ftqq.com/sendkey
新增环境变量PUSH_KEY
值:申请的SendKey


[JavaScript] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
const axios = require("axios");
const cheerio = require("cheerio");
const iconv = require('iconv-lite');
 
// 日志函数,取消时间显示
function log(message) {
    console.log(message);
}
 
// 检查环境变量
function checkEnvVars() {
    const requiredVars = ['COOKIES_自定义的环境变量名'];
    for (const varName of requiredVars) {
        if (!process.env[varName]) {
            log(`请设置环境变量 ${varName}`);
            return false;
        }
    }
    return true;
}
 
// PUSH_KEY相关配置
const PUSH_KEY = process.env.PUSH_KEY || '';
 
function post_msg(url, data) {
    return axios.post(url, data)
      .then(response => response.status === 200)
      .catch(error => {
            log(`消息推送失败: ${error.message}`);
            return false;
        });
}
 
function ServerChan_send(sendkey, title, desp = '') {
    const url = `[url=https://sctapi.ftqq.com/]https://sctapi.ftqq.com/[/url]${sendkey}.send`;
    const data = {
        title,
        desp
    };
    return post_msg(url, data);
}
 
function xxts(title, content) {
    const msg = `${title}\n\n${content}`;
    if (PUSH_KEY) {
        ServerChan_send(PUSH_KEY, title, msg)
          .then(success => {
                if (success) {
                    log("PUSH_KEY推送成功");
                } else {
                    log("PUSH_KEY推送失败");
                }
            });
    }
}
 
// ===================== 配置 =====================
const CONFIG = {
    COOKIE_NAME: "COOKIES_自定义的环境变量名", // 增加环境变量存放网站cookies,多账号用#分隔
    SIGN_URL: "https://www.XXXXX.com/plugin.php?id=dsu_paulsign:sign",// 需要签到的网站
    USER_AGENT: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36",
    TIMEOUT: 15000,
    RETRY: 3,
    DELAY: 2000,
    DEBUG_MODE: false // 生产环境建议关闭
};
// ===================== 配置结束 =====================
 
// 带重试的请求函数
async function fetchWithRetry(url, config) {
    let attempts = 0;
    while (attempts < CONFIG.RETRY) {
        try {
            const response = await axios({
                url,
                timeout: CONFIG.TIMEOUT,
                responseType: 'arraybuffer',
                ...config,
                headers: {
                    'User-Agent': CONFIG.USER_AGENT,
                    ...config.headers
                }
            });
 
            if (CONFIG.DEBUG_MODE) {
                log(`请求成功:${url}`);
                log(`响应头:${JSON.stringify(response.headers)}`);
            }
            return response;
        } catch (error) {
            if (++attempts === CONFIG.RETRY) {
                log(`请求失败,已达到最大重试次数: ${error.message}`);
                throw error;
            }
            log(`请求失败,正在重试 (${attempts + 1}/${CONFIG.RETRY}): ${error.message}`);
            await new Promise(r => setTimeout(r, CONFIG.DELAY));
        }
    }
}
 
// 签到核心逻辑
async function cnnvnSign(cookie) {
    try {
        // 阶段1:获取formhash
        const pageRes = await fetchWithRetry(CONFIG.SIGN_URL, {
            headers: { 'Cookie': cookie }
        });
        const decodedPage = iconv.decode(pageRes.data, 'gbk');
        const $page = cheerio.load(decodedPage);
 
        // 增强登录状态检测
        if (!decodedPage.includes('每日签到')) {
            throw new Error('Cookie失效或页面结构变更');
        }
 
        // 更稳健的formhash提取
        const formhash = $page('input[name="formhash"]').val() || decodedPage.match(/formhash=([a-z0-9]+)/)?.[1];
        if (!formhash) throw new Error('formhash提取失败');
 
        // 阶段2:提交签到
        const postData = new URLSearchParams({
            formhash: formhash,
            submit: '1',
            qdxq: 'kx',
            todaysay: ''
        });
 
        const signRes = await fetchWithRetry(`${CONFIG.SIGN_URL}&operation=qiandao`, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/x-www-form-urlencoded',
                'Cookie': cookie,
                'Referer': CONFIG.SIGN_URL
            },
            data: postData.toString()
        });
 
        // 增强结果解析
        const decodedSign = iconv.decode(signRes.data, 'gbk');
        const $sign = cheerio.load(decodedSign);
        const resultText = $sign('#ct').text().trim().replace(/\s+/g, ' ');
 
        // 关键修复:优化成功判断逻辑
        const isSuccess = /签到成功|您今日已经签到|已签到/.test(resultText);
 
        if (CONFIG.DEBUG_MODE) {
            log(`签到结果文本: ${resultText}`);
        }
 
        return {
            success: isSuccess,
            message: resultText
        };
 
    } catch (error) {
        return {
            success: false,
            message: error.message,
            debug: CONFIG.DEBUG_MODE ? error.stack : undefined
        };
    }
}
 
// 多账户处理器
async function processAccounts() {
    if (!checkEnvVars()) {
        return;
    }
    const cookies = process.env[CONFIG.COOKIE_NAME]?.split('#').filter(c => c.trim()) || [];
    if (cookies.length === 0) {
        log(`请设置环境变量 ${CONFIG.COOKIE_NAME}`);
        return;
    }
 
    for (const [index, cookie] of cookies.entries()) {
        log(`处理账号 ${index + 1}/${cookies.length}`);
        const result = await cnnvnSign(cookie);
 
        if (result.success) {
            const logMsg = `状态: ${result.message.includes('已经') ? '重复签到' : '成功'} | 详情: ${result.message.substring(0, 20)}`;
            log(logMsg);
            xxts('自动签到(成功)', logMsg);
        } else {
            const logMsg = `失败详情: ${result.message}`;
            log(logMsg);
            xxts('自动签到(失败)', logMsg);
        }
        await new Promise(r => setTimeout(r, CONFIG.DELAY));
    }
}
 
// 执行入口
if (require.main === module) {
    processAccounts().catch(err => {
        log(`全局错误: ${err.message}`);
        xxts('自动签到(全局错误)', err.message);
    });
}

免费评分

参与人数 4吾爱币 +9 热心值 +4 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
gzdiky + 1 + 1 对我很有用,正愁不会写
52pj5551 + 1 + 1 谢谢@Thanks!
Lidaoyao + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| MRBANK 发表于 2025-4-23 15:12 |楼主
bucaiGitHub 发表于 2025-4-23 15:11
dsu是Discuz的缩写吗

discuz的dsu_paulsign签到插件

免费评分

参与人数 1吾爱币 +1 收起 理由
bucaiGitHub + 1 谢谢@Thanks!

查看全部评分

推荐
 楼主| MRBANK 发表于 2025-5-7 14:14 |楼主
赵爽小可爱 发表于 2025-5-7 10:59
wx.xxxxx.com的网页可以签到吗?cookie每天都变 第二天就失效了

cookies每天变没办法了~不管什么网址,discuz论坛dsu的插件地址不会变....加上后面的插件地址就行了
沙发
onetwo888 发表于 2025-4-23 11:51
3#
24999 发表于 2025-4-23 12:18
感谢分享这么牛的代码。
4#
gzdiky 发表于 2025-4-23 12:38
就这么简单没介绍 看得云里雾里,.看看AI能不能搞懂什么 回事
5#
cjf11 发表于 2025-4-23 13:08
这怎么用
6#
 楼主| MRBANK 发表于 2025-4-23 14:12 |楼主

教程完善了
7#
 楼主| MRBANK 发表于 2025-4-23 14:12 |楼主
gzdiky 发表于 2025-4-23 12:38
就这么简单没介绍 看得云里雾里,.看看AI能不能搞懂什么 回事

教程完善了~
8#
bucaiGitHub 发表于 2025-4-23 15:11
dsu是Discuz的缩写吗
10#
netpeng 发表于 2025-4-23 16:54
用青龙面板管理,不用自己登录签到频繁操作,挺省心。感谢分享。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-5-30 00:47

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表