구글 스프레드시트와 YouTube API를 활용한 유튜브 답글 자동화

구글 스프레드시트와 YouTube Data API를 활용해 유튜브 댓글 답글 자동화를 설정하는 방법을 단계별로 알려드립니다.
구글 스프레드시트와 YouTube API를 활용한 유튜브 답글 자동화

유튜브 댓글 자동화

유튜브 댓글 자동화,구글 스프레드시트,API 설정,Youtube Data API,GPT 활용

안녕하세요. 기묘한 자동화 CTO Readygo입니다. 오늘은 구글 스프레드시트에서 사용가능한 팁을 소개하려고 해요. 저희가 오늘 다룰 내용은 바로 '유튜브 답글 자동화'입니다. 이 기능은 구글 스프레드시트와 YouTube Data API v3, GPT를 활용하여 구현됩니다.

1. GPT 설정

- GPTs API SECRET KEY발급

1. https://platform.openai.com/ 접속하기

2. 회원가입 및 로그인

3. 왼쪽 바에 API keys 클릭

4. +Create new secret key 클릭

  1. 이름 입력 후 생성 및 생성된 SECRET KEY 복사 후 메모장에 저장

2. Youtube Data api v3 설정

  1. https://console.cloud.google.com/apis/library/youtube.googleapis.com?hl=ko 접속

  2. 프로젝트 생성

  3. Youtube Data API V3 사용 선택

  4. 왼쪽 사용자 인증 정보 선택

  1. 사용자 인증 정보 만들기 선택 후 API 키 선택

  1. API 키 복사 후 메모장 저장

  1. https://console.cloud.google.com/home/dashboard 접속

해당 본인 프로젝트 번호 메모장 저장

3. 구글 스프레드시트 설정

  1. 구글 스프레드시트 접속

  2. 확장 프로그램 설치

  1. GPT검색 후 GPT for Sheets 설치

  1. GPT for Sheets Open

※ GPT 수식 사용하기 위해서는 오픈을 해놓아야 사용이 가능

  1. GPT for Sheets 내 왼쪽 상단 메뉴 바 선택

  2. API keys 선택 후 위에서 생성한 본인의 OpenAI API key 입력

※ GPT 수식 사용위해서는 위 툴과 OpenAI 내 비용 지출 필요(API 생성 없이 위 툴에서만 지출이 가능하나 API생성하여 키 입력 후 사용하는 것이 비용이 절감됨)

※ API key 입력 후 상단 모델 변경 가능 → Use your API key 부분으로 변경

  1. Apps Script 접속

  1. 프로젝트 설정(왼쪽 사이드바 톱니바퀴 모양) 클릭

  2. 프로젝트 변경 클릭후 이전에 저장해둔 프로젝트 번호 입력

  1. 구글 클라우드 콘솔의 API 및 서비스로 돌아가기

  2. OAuth 동의 하기 후 입력 절차 진행

  3. 입력 후 왼쪽 사이드바 OAuth 동의화면 앱 게시 클릭

위처럼 진행하면 설정은 마무리 됐습니다.

4. Apps Script 소스 수정

  1. 왼쪽 사이드바 프로젝트 설정 클릭 후 ‘appscript.json’ 매니페스트 파일 표시 클릭

  1. 왼쪽 사이드바 편집기 클릭 후 돌아오면 appscript.json 표시돼 있음

{
  "timeZone": "Asia/Seoul",
  "dependencies": {
  },
  "exceptionLogging": "STACKDRIVER",
  "oauthScopes": ["https://www.googleapis.com/auth/youtube.force-ssl", "https://www.googleapis.com/auth/script.external_request", "https://www.googleapis.com/auth/spreadsheets", "https://www.googleapis.com/auth/script.scriptapp"],
  "runtimeVersion": "V8"
}

appscript.json에 위 내용 입력

  1. Code.gs 소스 코드 (소스 설명은 소스코드 내 주석으로 설명)

function fetchCommentsByTime() {
  var videoId = ''; //댓글 추출하고 싶은 유튜브 영상 ID
  var apiKey = ''; //이전에 메모장에 저장해둔 유튜브 data api key
  var spreadsheetId = ''; //스프레드시트 ID
  var nextPageToken = '';
  var comments = [];
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheets()[0];
  var controlSheet = SpreadsheetApp.openById(spreadsheetId).getSheets()[1]; // 제어용 시트 추가
  lastPublishedAtCell = controlSheet.getRange('A1').getValue(); // A1 셀에서 lastPublishedAt 읽기
  try {
  var testDate = new Date(lastPublishedAtCell);
  if (isNaN(testDate.getTime())) {
    throw new Error('Invalid date'); // 날짜가 유효하지 않으면 예외 발생
  }
  lastPublishedAt = testDate.toISOString();
  } catch (e) {
    lastPublishedAt = new Date(0).toISOString(); // 예외 발생 시 기본 날짜로 설정
  }

  do {
    var apiURL = 'https://www.googleapis.com/youtube/v3/commentThreads?part=snippet&videoId='
                 + videoId + '&key=' + apiKey + '&maxResults=100' + (nextPageToken ? '&pageToken=' + nextPageToken : '');
    
    var response = UrlFetchApp.fetch(apiURL);
    var json = JSON.parse(response.getContentText());
    
    json.items.forEach(function(item) {
      var comment = item.snippet.topLevelComment.snippet;
      var commentId = item.snippet.topLevelComment.id;
      var publishedAt = comment.publishedAt;
      if (new Date(publishedAt) > new Date(lastPublishedAt)) { // Compare the dates
        comments.push([comment.authorDisplayName, comment.textDisplay, commentId, publishedAt]);
      }
    });
    
    nextPageToken = json.nextPageToken;
  } while (nextPageToken);
  sheet.clear(); // Optionally clear previous data
  sheet.appendRow(['Author', 'Comment', 'Comment ID', 'Published At', 'Response']); // Header row
  if (comments.length > 0) {
    
    comments.forEach(function(comment,index) {
      var row = index + 2
      sheet.appendRow(comment); // Append new comments
      var formulaCell = 'E' + row;
      var formula = '=GPT("댓글에 대한 답변을 30자 이내로 적어줘",  B' + row + ' ,0.5)';
      sheet.getRange(formulaCell).setFormula(formula);
      
    }); //해당 댓글에 대한 답변을 =GPT수식으로 작성
    // Update the last published at date
    controlSheet.getRange('A1').setValue(new Date(comments[0][3]).toISOString());//제어용 시트에 이전 마지막 댓글의 발생 시간 저장
    SpreadsheetApp.flush(); // 스프레드시트의 변경사항을 즉시 적용
    Utilities.sleep(10000); // GPT수식 계산에 시간을 주기 위해 10초 대기
    postYouTubeCommentReplies();
  }
  
}

function postYouTubeCommentReplies() {
  var spreadsheetId = ''; //스프레드시트 ID
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheets()[0];
  var lastRow = sheet.getLastRow();
  var data = sheet.getRange('A2:E' + lastRow).getValues();

  data.forEach(function(row) {
    var commentId = row[2]; // 각 댓글의 고유 ID
    var responseText = row[4]; // 해당 댓글에 대한 답변
    if (responseText && responseText !== "") {
      var payload = JSON.stringify({
        snippet: {
          parentId: commentId, // 답글을 다는 대상 댓글의 ID
          textOriginal: responseText
        }
      });

      var options = {
        method: 'post',
        contentType: 'application/json',
        payload: payload,
        headers: {
          'Authorization': 'Bearer ' + ScriptApp.getOAuthToken()
        },
        muteHttpExceptions: true
      };
      Logger.log(options);
      var url = 'https://www.googleapis.com/youtube/v3/comments?part=snippet';
      var response = UrlFetchApp.fetch(url, options);
      Logger.log('Posted comment response: ' + response.getContentText());
    }
  });
}


function setTrigger() {
  ScriptApp.newTrigger('fetchCommentsByTime')
    .timeBased()
    .everyMinutes(5) // 5분마다 fetchCommentsByTime함수 실행
    .create();
}

function stopAllTriggers() {
  var triggers = ScriptApp.getProjectTriggers();
  for (var i = 0; i < triggers.length; i++) {
    ScriptApp.deleteTrigger(triggers[i]);
  }
}// 트리거를 멈추기 위한 함수(트리거를 실행시키고 stop시키지않고 다시 트리거 실행시 트리거 중복실행됨)
  1. - videoId : 댓글을 추출하고 싶은 영상의 주소의 “v=” 뒷부분이 videoId입니다.

    ex) www.youtube.com/watch?v=N9Z6A~~ → videoId = N9Z6A~~

    - apiKey : 위에서 생성한 youtube api 사용자 인증정보 내 API 키입니다.

    - spreadsheetId : 본인 스프레드시트의 ID이며 “/d/ 뒷부분 부터 /edit 앞부분까지”
    ex)https://docs.google.com/spreadsheets/d/1HNy2BSVrN60MqERPyZpIIdscY/edit#gid=0 → Id : 1HNy2BSVrN60MqERPyZpIIdscY

  2. 스프레드시트로 돌아가 왼쪽아래에 시트추가 “+” 버튼을 누른다(필수)

시트를 추가하는 이유는 5분마다 함수가 작동되게 트리거를 실행시키면서 이전실행에서 추출했던 마지막 댓글의 시간을 저장하는 공간이다. 시간을 저장하여 이 이후에 생성된 댓글에 대해서만 답글을 달도록 만들어 놓았습니다.

  1. Apps Script돌아가서 setTrigger 함수 실행

※ 트리거를 실행시키고 소스를 수정 후 stop시키지않고 다시 트리거 실행시 트리거 중복실행됩니다. 그러기에 소스를 수정 후 다시 실행 시키려면 stopAllTriggers 함수를 싱행한 후 다시 setTrigger함수를 실행시켜야 합니다.

  1. 구글 스프레드시트에 정상적으로 댓글 및 응답내용 추출

위처럼 수식으로 들어가 있으나 Response부분에 GPT가 응답한 내용이 나옵니다.

  1. 답글 자동으로 작성 완료!

마무리

이렇게 설정을 마치고 나면, 유튜브 댓글에 대한 답글을 자동으로 작성할 수 있게 됩니다. 이 과정을 통해 시간을 절약하고 더 많은 소통을 할 수 있게 되길 바랍니다.

기묘한 자동화 Newsletter도 준비중에 있습니다. 구독해주신다면 앞으로 최신 AI 소식을 뉴스레터로 받아보실 수 있습니다!

감사합니다 ~🍪

Share article
구독을 통해 AI 입문 키트 자료를 무료로 받아보세요 :)

- AI툴 TOP 100
- 실무 활용 노코드/SaaS 툴 목록
- 업무자동화 핵심 GPTs 모음
Privacy Policy

기묘한자동화 블로그