개인프로젝트/자동화

게더타운 출석체크 자동화-Node.js WebSocket

해아's 2024. 4. 24. 12:00

실시간 학생 상태 관리를 위한 Node.js WebSocket과 Flask 서버 프로그램

오늘은 Node.js와 Flask를 이용하여 학생의 접속정보와 상태정보를 실시간으로 관리하는 프로그램을 소개합니다. 이 프로그램을 통해 학생들의 상태를 감시하고, 필요한 조치를 취할 수 있습니다.

 

1. Flask 서버에 전달할 학생명단 텍스트 파일 생성

먼저, Flask 서버에 필요한 학생명단 텍스트 파일을 생성합니다. 이 파일은 WebSocket을 통해 학생 명단을 받아와 저장하는 역할을 합니다.

let now_userlist_filename = {};
now_userlist_filename = env_DEF_SRC+`/player_names_${getCurrentDate()}.txt`;
createIfNotExists(now_userlist_filename);
// 파일이 존재하는지 확인하고 존재하지 않으면 생성하는 함수
function createIfNotExists(filePath) {
  if (!fs.existsSync(filePath)) {
      fs.writeFileSync(filePath, ''); // 빈 파일 생성
  }
}

 

2. WebSocket을 통한 학생 명단 수집

WebSocket을 활용하여 5초마다 게더타운에 접속하여 학생 명단을 가져옵니다. 이렇게 함으로써 실시간으로 학생의 접속정보를 감지할 수 있습니다.

setInterval(function () {  
  savePlayerInfoToFile(game,now_userlist_filename,now_useridlist_filename);
},5000);

 

3. 학생명단 텍스트 파일 갱신

가져온 학생 명단을 텍스트 파일에 갱신합니다. 이를 통해 학생 명단은 실시간으로 업데이트되어 Flask 서버에서 사용할 수 있습니다.

function savePlayerInfoToFile(game_id,now_userlist_filename_id,now_useridlist_filename_id) {
  const availablePlayers = Object.keys(game_id.players).reduce((acc, playerId) => {
      const player = game_id.players[playerId];
      if (player.status === 'Available') {
          acc[playerId] = player;
      }
      return acc;
  }, {});

 

4. MongoDB에 사용자 명단 저장

추가로, 5분마다 가져온 사용자 명단을 MongoDB에 별도로 저장합니다. 이를 통해 사용자 정보를 보다 안정적으로 관리할 수 있습니다.

setInterval(function () {
  connectAndInsertData(env_SK_ID1,game.players,1);
},300000);
async function connectAndInsertData(sk_id,data, type) {
    let collection;
    let localClient; // 새로운 MongoClient 객체를 저장할 변수 추가

    try {
        localClient = new MongoClient(mongoUrl); // 새로운 MongoClient 객체 생성
        await localClient.connect();
        const database = localClient.db(databaseName);

        if (type === 1) {
            collection = database.collection(collectionName1);
        } else if (type === 2) {
            collection = database.collection(collectionName2);
        } else {
            throw new Error('Invalid type value');
        }

        const timestamp = new Date();
        await collection.insertOne({ sk_id,data, timestamp });
    } catch (error) {
        console.error('Error during database operation:', error);
    } finally {
        if (localClient) {
            await localClient.close();
        }
    }
}

이렇게 구현된 프로그램을 통해 Flask 서버는 WebSocket을 통해 학생의 상태를 실시간으로 감시하고, 필요한 처리를 수행할 수 있습니다.

728x90
반응형