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 };