프로그램 (PHP,Python)

Google Apps Script 통해 직접 작성한 코드를 자동화 수행

날으는물고기 2024. 9. 18. 00:11

Google Apps Script를 사용하여 Google Workspace 정보를 수집할 때는 코드 상에서 직접적으로 토큰 관리나 인증 관련 로직을 작성할 필요가 없습니다. Google Apps Script는 기본적으로 Google의 OAuth 2.0 인증을 자동으로 처리해 주기 때문에, 스크립트를 작성하는 동안 다음과 같은 사항을 신경 쓸 필요가 없어 간편하게 활용할 수 있습니다.

  1. 토큰 관리: OAuth 2.0 인증 토큰을 직접 발급하거나 갱신할 필요가 없습니다. Google Apps Script 환경에서 이러한 작업은 자동으로 처리됩니다.
  2. 인증 요청: 첫 실행 시 사용자에게 필요한 권한을 요청하는 동의 화면이 나타나며, 사용자가 이를 승인하면 이후 스크립트는 해당 권한으로 API에 접근하게 됩니다.
  3. 인증 로직: 코드 상에서는 단지 필요한 API 호출을 작성하면 됩니다. Google Apps Script는 백그라운드에서 인증을 자동으로 처리하며, 이에 따른 인증 헤더를 API 요청에 포함합니다.

예를 들어, Google Admin SDK의 Reports API를 사용하는 코드에서 별도의 인증 로직이 필요하지 않음에 대해 예시를 통해서 확인해 보겠습니다.

function fetchAndStoreActivityLogs() {
  // Google Admin SDK를 통해 Reports API 호출
  var activities = AdminReports.Activities.list('all', 'login', {
    maxResults: 100
  }).items;

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  activities.forEach(function(activity) {
    sheet.appendRow([
      activity.id.time,
      activity.actor.email,
      activity.events[0].name,
      activity.events[0].type,
      JSON.stringify(activity.events[0].parameters)
    ]);
  });
}

위 코드에서는 AdminReports.Activities.list를 호출하는 부분에서 별도의 인증 로직 없이 바로 API를 사용하고 있습니다. Google Apps Script는 필요한 인증을 자동으로 처리하여 API 요청이 올바르게 이루어지도록 합니다.

 

따라서 Google Apps Script를 사용하여 Google Workspace API에 접근할 때는 코드 상에서 별도의 토큰 관리나 인증 관련 로직을 작성할 필요가 없습니다. Google이 제공하는 인증 체계를 통해 간편하게 API를 사용할 수 있으며, 필요한 권한이 최초 실행 시 자동으로 요청되고 관리됩니다. Google Workspace Script(GWS)를 이용하여 사용자 정보를 수집하고 이를 Google Sheets에 저장하는 방법은 다음과 같습니다. 이 과정에서는 Google Apps Script를 활용하여 Google Admin SDK와 Google Sheets API를 연동하게 됩니다.

1. Google Sheets 생성

사용자 정보를 저장할 Google Sheets를 생성하세요.

  1. Google Drive에서 새로운 스프레드시트를 생성합니다.
  2. 스프레드시트 이름과 첫 번째 시트의 이름을 적절히 변경하세요. 예를 들어, Users라는 이름의 시트를 만듭니다.
  3. 첫 번째 행에 필요한 열 헤더를 추가하세요. 예: Email, Full Name, Organization Unit, Last Login Time 등.

2. Google Apps Script 프로젝트 생성

Google Sheets에서 바로 스크립트 편집기를 열어 스크립트를 작성할 수 있습니다.

  1. Google Sheets에서 Extensions > Apps Script를 클릭하여 스크립트 편집기를 엽니다.
  2. 아래의 코드를 붙여 넣습니다.
    function fetchAndStoreGWSUserInfo() {
      // Google Admin SDK Directory API 호출을 위한 AdminDirectory 서비스 활성화
      AdminDirectory.Users.list({
        customer: 'my_customer',
        maxResults: 100,  // 필요한 사용자 수에 맞게 조정
        orderBy: 'email'
      }).users.forEach(function(user) {
        storeUserInfoToSheet(user);
      });
    }
    
    function storeUserInfoToSheet(user) {
      // Google Sheets의 active 스프레드시트 가져오기
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
    
      // 새 행에 사용자 정보 추가
      sheet.appendRow([
        user.primaryEmail,
        user.name.fullName,
        user.orgUnitPath,
        user.lastLoginTime
      ]);
    }
    
    function setup() {
      // 시트에 헤더 추가
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      sheet.appendRow(['Email', 'Full Name', 'Organization Unit', 'Last Login Time']);
    }

3. 필요한 API 활성화

Google Admin SDK와 Google Sheets API를 사용하기 위해 필요한 API를 활성화해야 합니다.

  1. Google Cloud Console에 접속하여 프로젝트를 생성하거나 기존 프로젝트를 선택합니다.
  2. API & Services > Library로 이동합니다.
  3. Admin SDKGoogle Sheets API를 검색하여 각각 활성화합니다.

4. 권한 설정 및 테스트

  1. 스크립트를 처음 실행하면 권한 요청이 나타납니다. 권한을 부여하여 Google Workspace 계정과 Google Sheets에 접근할 수 있도록 합니다.
  2. setup 함수는 스프레드시트에 헤더를 추가하고, fetchAndStoreGWSUserInfo 함수는 실제 사용자 정보를 가져와서 시트에 저장합니다.
  3. Run 버튼을 클릭하여 각각의 함수를 실행해보세요.

5. 자동화 설정

이 스크립트를 정기적으로 실행하여 사용자 정보를 업데이트하려면 트리거를 설정할 수 있습니다.

  1. Triggers > Add Trigger에서 시간 기반 트리거를 추가하여 매일 혹은 매주 스크립트가 실행되도록 설정할 수 있습니다.

이 과정을 통해 Google Workspace 사용자 정보를 자동으로 수집하여 Google Sheets에 저장할 수 있습니다. 필요에 따라 스크립트를 수정하여 더 많은 정보를 수집하거나 다른 형식으로 데이터를 저장할 수 있습니다. Google Workspace의 Admin SDK를 사용하여 사용자들이 로그인한 단말기 정보를 수집하고 이를 Google Sheets에 저장하는 방법을 추가로 설명드리겠습니다. 이 과정에서는 Admin SDK의 Directory API를 사용하여 사용자들이 로그인한 기기 정보를 수집합니다.

1. 기존 스크립트 확장

아래의 코드를 기존 스크립트에 추가하여 사용자가 로그인한 단말기 정보를 수집할 수 있습니다.

function fetchAndStoreGWSUserInfo() {
  // Google Admin SDK Directory API 호출을 위한 AdminDirectory 서비스 활성화
  var users = AdminDirectory.Users.list({
    customer: 'my_customer',
    maxResults: 100,  // 필요한 사용자 수에 맞게 조정
    orderBy: 'email'
  }).users;

  users.forEach(function(user) {
    storeUserInfoToSheet(user);
    fetchAndStoreUserDevices(user.primaryEmail);
  });
}

function storeUserInfoToSheet(user) {
  // Google Sheets의 active 스프레드시트 가져오기
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // 새 행에 사용자 정보 추가
  sheet.appendRow([
    user.primaryEmail,
    user.name.fullName,
    user.orgUnitPath,
    user.lastLoginTime
  ]);
}

function fetchAndStoreUserDevices(userEmail) {
  // 사용자의 단말기 정보 가져오기
  var devices = AdminDirectory.Chromeosdevices.list('my_customer', {
    query: 'email:' + userEmail
  }).chromeosdevices;

  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  devices.forEach(function(device) {
    sheet.appendRow([
      userEmail,
      device.deviceId,
      device.model,
      device.status,
      device.lastSync,
      device.orgUnitPath,
      device.osVersion,
      device.bootMode
    ]);
  });
}

function setup() {
  // 시트에 헤더 추가
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  sheet.appendRow(['Email', 'Full Name', 'Organization Unit', 'Last Login Time']);
  sheet.appendRow(['User Email', 'Device ID', 'Model', 'Status', 'Last Sync', 'Organization Unit Path', 'OS Version', 'Boot Mode']);
}

2. 스크립트 설명

  • fetchAndStoreUserDevices(userEmail)
    • AdminDirectory.Chromeosdevices.list를 사용하여 사용자의 ChromeOS 기기 정보를 가져옵니다. 이 부분은 ChromeOS 기기 정보를 수집하는 데 사용됩니다. 만약 다른 기기에 대한 정보도 수집하려면 AdminDirectory.Mobiledevices.list와 같은 다른 API를 사용할 수 있습니다.
    • device.deviceId, device.model, device.status 등의 정보를 수집하여 Google Sheets에 추가합니다.
  • setup()
    • 시트에 추가적인 헤더를 설정하여 단말기 정보를 기록할 열을 생성합니다.

3. Google Cloud Console에서 추가 API 활성화

ChromeOS 또는 모바일 장치 정보를 수집하려면 해당 API도 활성화해야 합니다.

  1. Google Cloud Console에서 Admin SDKGoogle Sheets API 외에 Chrome Management API 또는 Mobile Management API를 추가로 활성화해야 합니다.

4. 권한 설정 및 테스트

스크립트를 처음 실행할 때 필요한 권한을 허용해야 합니다. 기기 정보 수집을 위해 추가된 권한 요청을 승인하세요.

5. 결과 확인

  1. Google Sheets에 Email, Full Name, Organization Unit, Last Login Time 이외에 Device ID, Model, Status, Last Sync, OS Version, Boot Mode 등의 기기 정보가 추가로 기록됩니다.
  2. 이 스크립트를 사용하면 사용자가 로그인한 기기 정보도 함께 저장할 수 있습니다.

이렇게 하면 Google Workspace에서 관리하는 사용자들이 로그인한 PC, 모바일 기기 등 다양한 단말기 정보를 Google Sheets에 수집하여 저장할 수 있습니다. 필요에 따라 수집된 정보를 분석하거나 다른 용도로 활용할 수 있습니다. Google Workspace Admin에서 확인할 수 있는 모든 액티비티 로그 및 감사 로그를 Google Sheets에 수집하는 방법을 Google Apps Script를 사용하여 설정하는 과정을 안내하겠습니다. 이 스크립트는 Google Admin SDK의 Reports API를 사용하여 다양한 유형의 로그를 수집하고 Google Sheets에 기록합니다.

1. 기본 설정

Google Cloud Console에서 Admin SDKGoogle Sheets API를 활성화해야 합니다. 이 과정은 이전에 설명한 내용과 동일합니다.

2. Google Sheets 생성 및 설정

  1. Google Sheets에서 새로운 스프레드시트를 생성하고, 이를 로그가 저장될 파일로 사용합니다.
  2. 로그 유형별로 각기 다른 시트를 만들도록 설정합니다. 예를 들어 Login Logs, Admin Logs, Drive Logs 등의 시트를 생성합니다.

3. Google Apps Script 작성

아래는 Google Apps Script의 전체 코드를 작성한 예시입니다. 이 코드는 다양한 로그 유형에 따라 데이터를 수집하고, 이를 각각의 시트에 저장합니다.

function fetchAndStoreActivityLogs() {
  // 수집할 로그 유형 정의
  var logTypes = ['admin', 'login', 'drive', 'calendar', 'gmail', 'groups'];

  logTypes.forEach(function(logType) {
    // 각 로그 유형에 대한 데이터를 가져오기
    var activities = AdminReports.Activities.list('all', logType, {
      maxResults: 1000 // 수집할 최대 로그 수
    }).items;

    if (activities && activities.length > 0) {
      storeActivityLogsToSheet(logType, activities);
    }
  });
}

function storeActivityLogsToSheet(logType, activities) {
  // Google Sheets의 시트 가져오기
  var sheet = getOrCreateSheet(logType);

  activities.forEach(function(activity) {
    var rowData = [
      activity.id.time,
      activity.actor.email,
      activity.events[0].name,
      activity.events[0].type,
      JSON.stringify(activity.events[0].parameters)
    ];
    sheet.appendRow(rowData);
  });
}

function getOrCreateSheet(sheetName) {
  // 스프레드시트 가져오기
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName(sheetName);

  if (!sheet) {
    sheet = spreadsheet.insertSheet(sheetName);
    sheet.appendRow(['Time', 'Actor Email', 'Event Name', 'Event Type', 'Parameters']);
  }

  return sheet;
}

function setup() {
  // 초기 설정을 위한 헤더 설정
  var logTypes = ['admin', 'login', 'drive', 'calendar', 'gmail', 'groups'];

  logTypes.forEach(function(logType) {
    getOrCreateSheet(logType);
  });
}

4. 스크립트 설명

  • fetchAndStoreActivityLogs()
    • Google Admin SDK의 Reports API를 사용하여 다양한 로그 유형(admin, login, drive, calendar, gmail, groups)의 활동 데이터를 수집합니다.
    • 각각의 로그 유형에 대해 최대 1000개의 로그 항목을 가져옵니다. 필요에 따라 이 값을 조정할 수 있습니다.
  • storeActivityLogsToSheet(logType, activities)
    • 각 로그 유형에 대한 데이터를 적절한 시트에 저장합니다.
    • 로그의 time, actor email, event name, event type, parameters를 Google Sheets의 행으로 추가합니다.
  • getOrCreateSheet(sheetName)
    • 지정된 이름의 시트가 존재하지 않으면 생성하고, 시트에 헤더를 추가합니다. 이미 존재하면 해당 시트를 반환합니다.

5. 트리거 설정

로그를 주기적으로 수집하려면 트리거를 설정할 수 있습니다.

  1. 스크립트 편집기에서 Triggers > Add Trigger를 선택합니다.
  2. fetchAndStoreActivityLogs 함수를 선택하고, 시간 기반 트리거를 설정하여 매일 또는 매주 로그를 자동으로 수집하도록 설정할 수 있습니다.

6. 결과 확인

이제 Google Sheets에는 각 로그 유형에 대해 수집된 데이터가 저장됩니다. 예를 들어 Login Logs 시트에는 로그인 관련 로그가, Drive Logs 시트에는 Google Drive 관련 활동 로그가 저장됩니다. 이 스크립트를 사용하면 Google Workspace Admin에서 제공하는 다양한 로그 데이터를 손쉽게 수집하고 관리할 수 있습니다. 필요에 따라 이 데이터를 분석하거나 감사 목적으로 활용할 수 있습니다. 주기적으로 실행하여 새로운 로그 데이터를 10분 단위로 확인하고, 최근 1시간 동안의 정보를 가져와 Google Sheets에 없는 새로운 값만 추가되도록 설정하는 방법을 안내드리겠습니다.

1. 스크립트 수정

아래의 코드를 사용하여 기존의 스크립트를 업데이트합니다. 이 스크립트는 최근 1시간 동안의 로그 데이터를 가져와 시트에 이미 있는지 확인하고, 새로운 데이터만 추가합니다.

function fetchAndStoreRecentActivityLogs() {
  // 수집할 로그 유형 정의
  var logTypes = ['admin', 'login', 'drive', 'calendar', 'gmail', 'groups'];

  // 현재 시간 기준 1시간 전의 시간 계산
  var now = new Date();
  var oneHourAgo = new Date(now.getTime() - 60 * 60 * 1000);

  logTypes.forEach(function(logType) {
    // 최근 1시간 동안의 로그 데이터 가져오기
    var activities = AdminReports.Activities.list('all', logType, {
      startTime: oneHourAgo.toISOString(),
      maxResults: 1000 // 수집할 최대 로그 수
    }).items;

    if (activities && activities.length > 0) {
      storeNewActivityLogsToSheet(logType, activities);
    }
  });
}

function storeNewActivityLogsToSheet(logType, activities) {
  // Google Sheets의 시트 가져오기
  var sheet = getOrCreateSheet(logType);
  var existingData = sheet.getDataRange().getValues();
  var existingTimestamps = existingData.map(function(row) { return row[0]; });

  activities.forEach(function(activity) {
    var timeStamp = activity.id.time;
    if (!existingTimestamps.includes(timeStamp)) {
      var rowData = [
        timeStamp,
        activity.actor.email,
        activity.events[0].name,
        activity.events[0].type,
        JSON.stringify(activity.events[0].parameters)
      ];
      sheet.appendRow(rowData);
    }
  });
}

function getOrCreateSheet(sheetName) {
  // 스프레드시트 가져오기
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadsheet.getSheetByName(sheetName);

  if (!sheet) {
    sheet = spreadsheet.insertSheet(sheetName);
    sheet.appendRow(['Time', 'Actor Email', 'Event Name', 'Event Type', 'Parameters']);
  }

  return sheet;
}

function setup() {
  // 초기 설정을 위한 헤더 설정
  var logTypes = ['admin', 'login', 'drive', 'calendar', 'gmail', 'groups'];

  logTypes.forEach(function(logType) {
    getOrCreateSheet(logType);
  });
}

2. 스크립트 설명

  • fetchAndStoreRecentActivityLogs()
    • 이 함수는 현재 시간으로부터 1시간 전까지의 로그 데이터를 수집합니다.
    • 각 로그 유형별로 최대 1000개의 최근 로그를 가져옵니다.
  • storeNewActivityLogsToSheet(logType, activities)
    • 시트에서 기존 로그 데이터를 가져와서 타임스탬프를 비교한 후, 시트에 없는 새로운 로그만 추가합니다.
    • existingTimestamps 배열을 사용해 이미 저장된 로그의 타임스탬프를 확인하고, 새로운 로그만 시트에 기록합니다.

3. 트리거 설정

로그를 주기적으로 수집하려면 10분 단위로 실행되는 시간 기반 트리거를 설정합니다.

  1. Google Apps Script 편집기에서 Triggers > Add Trigger를 선택합니다.
  2. fetchAndStoreRecentActivityLogs 함수를 선택한 후, 시간 기반 트리거를 10분으로 설정하여 스크립트가 10분마다 실행되도록 설정합니다.

이제 스크립트가 10분마다 실행되며, 최근 1시간 동안의 로그 데이터를 가져와 시트에 없는 새로운 항목만 추가하게 됩니다. 이를 통해 시트에 중복되는 데이터가 없이 새로운 데이터만 계속 누적됩니다. 이 설정을 통해 주기적으로 최신 로그 데이터를 수집하여, 누락 없이 체계적으로 관리할 수 있습니다. 필요에 따라 로그 유형을 추가하거나 수집 주기를 조정하여 더 세부적으로 관리할 수 있습니다.

Google Apps Script 활용하기 좋은 다양한 유형이 있습니다. 예시로, Google Sheets에서 A 컬럼에 있는 URL 목록을 가져와서 각 URL에 대해 사이트 접속을 체크하고, 결과 코드와 헤더 값을 기록하는 Google Apps Script 코드를 작성하는 방법을 설명드리겠습니다. 다음은 이를 수행하는 스크립트 코드입니다.

  1. Google Sheets에서 도구 -> 스크립트 편집기로 이동합니다.
  2. 새 프로젝트를 생성하고 아래 코드를 붙여 넣습니다.
    function checkUrls() {
      var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
      var lastRow = sheet.getLastRow();  // A 컬럼의 마지막 행을 가져옵니다.
    
      for (var i = 2; i <= lastRow; i++) {  // 2번째 행부터 마지막 행까지 반복합니다.
        var url = sheet.getRange(i, 1).getValue();  // A 컬럼의 URL을 가져옵니다.
    
        if (url) {  // URL이 존재하는 경우에만 실행합니다.
          try {
            var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
            var responseCode = response.getResponseCode();
            var headers = response.getHeaders();
    
            sheet.getRange(i, 2).setValue(responseCode);  // B 컬럼에 상태 코드를 기록합니다.
            sheet.getRange(i, 3).setValue(JSON.stringify(headers));  // C 컬럼에 헤더 값을 기록합니다.
    
          } catch (e) {
            sheet.getRange(i, 2).setValue("Error");  // 오류 발생 시 B 컬럼에 "Error" 기록
            sheet.getRange(i, 3).setValue(e.message);  // C 컬럼에 오류 메시지 기록
          }
        }
      }
    }
  3. 코드의 내용을 설명하면 다음과 같습니다.
    • getLastRow()는 A 컬럼의 마지막 행을 가져옵니다.
    • UrlFetchApp.fetch(url)를 사용하여 URL로 HTTP 요청을 보냅니다.
    • getResponseCode()로 HTTP 상태 코드를 가져오고, getHeaders()로 응답 헤더를 가져옵니다.
    • 각 URL에 대해 결과 상태 코드와 헤더 정보를 B 컬럼과 C 컬럼에 기록합니다.
    • 만약 URL 접속에 실패하면 "Error"를 기록하고, 오류 메시지를 C 컬럼에 기록합니다.
  4. 스크립트를 실행하려면 스크립트 편집기에서 checkUrls 함수를 선택한 후 실행 버튼을 클릭하세요.

이 스크립트는 Google Sheets의 첫 번째 시트에서 작동하며, A 컬럼에 있는 URL을 가져와 B 컬럼에 상태 코드, C 컬럼에 헤더 값을 기록합니다. 필요에 따라 코드를 수정하여 다른 시트나 컬럼을 사용할 수도 있습니다. 아래에 정상 200 코드가 아닌 경우 또는 접속이 실패하는 경우 텔레그램으로 알람을 보내는 기능을 추가한 Google Apps Script 코드를 제공해드리겠습니다.

1. 텔레그램 봇 설정

텔레그램 봇을 생성하고 Bot API Token을 받아야 합니다. 이를 위해 텔레그램에서 @BotFather를 사용하여 봇을 생성합니다. 생성 후, API Token을 복사해 둡니다. 또한, 메시지를 받을 텔레그램 채팅 ID를 확인해야 합니다. 이는 @userinfobot을 통해 확인할 수 있습니다.

2. Google Apps Script 코드

이제 아래 코드를 Google Apps Script 프로젝트에 추가하십시오.

// 텔레그램 API를 사용하여 메시지를 보내는 함수
function sendTelegramAlert(message) {
  var botToken = 'YOUR_BOT_API_TOKEN';  // 여기에 봇의 API 토큰을 입력하세요
  var chatId = 'YOUR_CHAT_ID';  // 여기에 텔레그램 채팅 ID를 입력하세요
  var url = `https://api.telegram.org/bot${botToken}/sendMessage`;

  var payload = {
    chat_id: chatId,
    text: message
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(url, options);
}

function checkUrls() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();  // A 컬럼의 마지막 행을 가져옵니다.

  for (var i = 2; i <= lastRow; i++) {  // 2번째 행부터 마지막 행까지 반복합니다.
    var url = sheet.getRange(i, 1).getValue();  // A 컬럼의 URL을 가져옵니다.

    if (url) {  // URL이 존재하는 경우에만 실행합니다.
      try {
        var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
        var responseCode = response.getResponseCode();
        var headers = response.getHeaders();

        sheet.getRange(i, 2).setValue(responseCode);  // B 컬럼에 상태 코드를 기록합니다.
        sheet.getRange(i, 3).setValue(JSON.stringify(headers));  // C 컬럼에 헤더 값을 기록합니다.

        // 200 코드가 아닌 경우 텔레그램 알림을 보냅니다.
        if (responseCode !== 200) {
          var message = `Alert: ${url} is returning status code ${responseCode}`;
          sendTelegramAlert(message);
        }

      } catch (e) {
        sheet.getRange(i, 2).setValue("Error");  // 오류 발생 시 B 컬럼에 "Error" 기록
        sheet.getRange(i, 3).setValue(e.message);  // C 컬럼에 오류 메시지 기록

        // 접속 실패 시 텔레그램 알림을 보냅니다.
        var errorMessage = `Alert: Failed to access ${url}. Error: ${e.message}`;
        sendTelegramAlert(errorMessage);
      }
    }
  }
}
  • sendTelegramAlert(message): 이 함수는 텔레그램 API를 사용하여 특정 메시지를 지정된 채팅 ID로 보냅니다. YOUR_BOT_API_TOKENYOUR_CHAT_ID 부분을 여러분의 실제 값으로 대체해야 합니다.
  • checkUrls(): 이 함수는 A 컬럼에서 URL을 가져와 각 URL에 대해 사이트 접속을 체크하고, 200이 아닌 상태 코드가 반환되거나 접속이 실패할 경우 sendTelegramAlert 함수를 호출하여 텔레그램으로 알람을 보냅니다.

 

코드를 스크립트 편집기에 저장한 후 checkUrls 함수를 실행하면, 정상적인 200 상태 코드가 아닌 경우 또는 접속 실패 시 텔레그램으로 알람을 받을 수 있습니다. 이 설정을 통해 자동화된 모니터링을 할 수 있으며, 문제가 발생할 경우 즉각적인 알림을 받을 수 있습니다. 아래는 SSL 인증서 정보를 수집하여 Google Sheets에 기록하도록 스크립트를 수정한 버전입니다. 이 스크립트는 각 URL의 상태 코드와 헤더 정보 외에도 SSL 인증서의 유효기간과 발급자 정보를 수집하여 기록합니다.

Google Apps Script 코드

// 텔레그램 API를 사용하여 메시지를 보내는 함수
function sendTelegramAlert(url, message) {
  var botToken = 'YOUR_BOT_API_TOKEN';  // 여기에 봇의 API 토큰을 입력하세요
  var chatId = 'YOUR_CHAT_ID';  // 여기에 텔레그램 채팅 ID를 입력하세요
  var telegramUrl = `https://api.telegram.org/bot${botToken}/sendMessage`;

  var payload = {
    chat_id: chatId,
    text: `Alert: Issue detected with URL ${url}. ${message}`
  };

  var options = {
    method: 'post',
    contentType: 'application/json',
    payload: JSON.stringify(payload)
  };

  UrlFetchApp.fetch(telegramUrl, options);
}

// SSL 인증서 정보를 가져오는 함수
function getSSLInfo(url) {
  try {
    var hostname = url.replace(/^https?:\/\//, '').replace(/\/.*$/, '');  // URL에서 호스트네임 추출
    var sslInfo = UrlFetchApp.fetch(`https://${hostname}`, {muteHttpExceptions: true});

    var cert = sslInfo.getHeaders()["X-SSL-Certificate"];  // SSL 인증서 정보를 헤더에서 가져옴
    if (cert) {
      return cert;
    } else {
      var certDetails = sslInfo.getCertificate();  // 인증서 세부 정보 가져오기
      var validFrom = certDetails.getValidFrom().toDateString();
      var validTo = certDetails.getValidTo().toDateString();
      var issuer = certDetails.getIssuer();

      return `Valid from: ${validFrom}, Valid to: ${validTo}, Issued by: ${issuer}`;
    }
  } catch (e) {
    return `Failed to retrieve SSL info: ${e.message}`;
  }
}

function checkUrls() {
  var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
  var lastRow = sheet.getLastRow();  // A 컬럼의 마지막 행을 가져옵니다.

  for (var i = 2; i <= lastRow; i++) {  // 2번째 행부터 마지막 행까지 반복합니다.
    var url = sheet.getRange(i, 1).getValue();  // A 컬럼의 URL을 가져옵니다.

    if (url) {  // URL이 존재하는 경우에만 실행합니다.
      try {
        var response = UrlFetchApp.fetch(url, {muteHttpExceptions: true});
        var responseCode = response.getResponseCode();
        var headers = response.getHeaders();
        var sslInfo = getSSLInfo(url);

        sheet.getRange(i, 2).setValue(responseCode);  // B 컬럼에 상태 코드를 기록합니다.
        sheet.getRange(i, 3).setValue(JSON.stringify(headers));  // C 컬럼에 헤더 값을 기록합니다.
        sheet.getRange(i, 4).setValue(sslInfo);  // D 컬럼에 SSL 인증서 정보를 기록합니다.

        // 200 코드가 아닌 경우 텔레그램 알림을 보냅니다.
        if (responseCode !== 200) {
          var message = `Returned status code ${responseCode}.`;
          sendTelegramAlert(url, message);
        }

      } catch (e) {
        sheet.getRange(i, 2).setValue("Error");  // 오류 발생 시 B 컬럼에 "Error" 기록
        sheet.getRange(i, 3).setValue(e.message);  // C 컬럼에 오류 메시지 기록
        sheet.getRange(i, 4).setValue("N/A");  // SSL 정보 기록을 실패한 경우 D 컬럼에 "N/A" 기록

        // 접속 실패 시 텔레그램 알림을 보냅니다.
        var errorMessage = `Failed to access. Error: ${e.message}`;
        sendTelegramAlert(url, errorMessage);
      }
    }
  }
}
  • getSSLInfo(url): 이 함수는 주어진 URL에서 SSL 인증서 정보를 가져옵니다. 인증서의 유효기간 (Valid from, Valid to)과 발급자 (Issued by) 정보를 수집합니다. 만약 SSL 인증서 정보를 가져오지 못할 경우, 오류 메시지를 반환합니다.
  • checkUrls(): 이 함수는 기존의 URL 상태 코드와 헤더 정보를 수집하는 것 외에, SSL 인증서 정보를 추가로 수집하여 D 컬럼에 기록합니다.

 

이 스크립트를 실행하면, 각 URL의 상태 코드와 헤더 정보, 그리고 SSL 인증서 정보를 수집하여 Google Sheets에 기록합니다. 200 코드가 아닌 경우나 접속에 실패하면 해당 URL과 함께 텔레그램 알람을 보내는 기능도 포함되어 있습니다.

 

728x90