58 lines
2.1 KiB
JavaScript
58 lines
2.1 KiB
JavaScript
const db = require('./db');
|
|
const AESCipher = require('./crypto');
|
|
const Attendance = require('./attendance');
|
|
const ua = require('fake-useragent');
|
|
|
|
async function runBot() {
|
|
console.log(`[${new Date().toISOString()}] 자동 출석 체크를 시작합니다...`);
|
|
|
|
try {
|
|
const limit = process.env.GET_DOMAIN_COUNT || 5;
|
|
|
|
const accountsToProcess = await db.query(`
|
|
SELECT
|
|
dl.DOMAIN_ADDRS,
|
|
dal.*
|
|
FROM DOMAIN_ACCNT_LIST dal
|
|
JOIN DOMAIN_LIST dl ON dal.DOMAIN_SEQ_ID = dl.DOMAIN_SEQ_ID
|
|
WHERE dal.USE_YN = 'Y'
|
|
AND dl.USE_YN = 'Y'
|
|
AND dal.ATNDNC_STRT_DTTM < datetime('now', 'localtime')
|
|
AND dal.ATNDNC_STTS_CD = '1'
|
|
LIMIT ?
|
|
`, [limit]);
|
|
|
|
if (accountsToProcess.length === 0) {
|
|
console.log("처리할 계정이 없습니다.");
|
|
return;
|
|
}
|
|
|
|
console.log(`총 ${accountsToProcess.length}개의 계정을 처리합니다. (최대 ${limit}개)`);
|
|
|
|
for (const account of accountsToProcess) {
|
|
// 상태를 '진행중(2)'으로 먼저 업데이트하여 다른 프로세스가 중복 실행하지 않도록 잠금
|
|
await db.run(
|
|
"UPDATE DOMAIN_ACCNT_LIST SET ATNDNC_STTS_CD = '2' WHERE DOMAIN_SEQ_ID = ? AND DOMAIN_ACCNT_ID = ?",
|
|
[account.DOMAIN_SEQ_ID, account.DOMAIN_ACCNT_ID]
|
|
);
|
|
|
|
account.DOMAIN_ACCNT_PSWRD = AESCipher.decrypt(account.DOMAIN_ACCNT_PSWRD);
|
|
|
|
// DB에 저장된 값이 없으면, 여기서 새로운 User-Agent를 생성하여 account 객체에 주입
|
|
if (!account.USER_AGENT) {
|
|
account.USER_AGENT = ua();
|
|
}
|
|
|
|
// 모든 준비가 끝난 account 데이터를 전달하여 Attendance 작업 실행
|
|
const attendanceTask = new Attendance(account);
|
|
await attendanceTask.run();
|
|
}
|
|
|
|
console.log("모든 계정 처리가 완료되었습니다.");
|
|
|
|
} catch (error) {
|
|
console.error("봇 실행 중 오류 발생:", error);
|
|
}
|
|
}
|
|
|
|
module.exports = { runBot }; |