이 글은 탈중앙형 SNS, **미스키Misskey** 와 구글 시트(+ GAS)를 이용해 쉽게 캐릭터 대사 자동봇을 만드는 법에 대한 설명입니다

<aside> ❗ 코딩 몰라도 됩니다 간단하고 쉽습니다

대사 DB가 있다면 5분 정도 걸립니다

</aside>

글을 읽기 전에…

Misskey를 포함한 탈중앙형 SNS (ActivePub를 사용하는 마스토돈 등의 SNS)는 대부분 개인이 사비로 서버(인스턴스)를 유지하고, 운영합니다. 악의로 관리자에게 피해가 갈 만한 행동은 하지 말아 주세요.

개별 인스턴스마다 조금 다르지만, 기본적으로 자동화 계정(봇)은 전체 공개(로컬 타임라인과 연합 타임라인에 보임) 설정으로 노트 작성을 하지 말 것을 권장합니다. 아래 코드로 자동 작성되는 노트의 공개 설정은 (로컬/연합타임라인에 올라가지 않음)입니다.

Misskey 에서의 설정

  1. 인스턴스 목록에서 적당한 인스턴스를 선택해 가입합니다.

  2. 인증 등의 절차를 마치고 가입이 완료되면

    설정-API 주소: {미스키 주소}/settings/api 에서

  3. 액세스 토큰의 이름과 권한을 설정해 액세스 토큰을 생성합니다.

    노트 작성/삭제 권한은 반드시 포함되어 있어야 합니다.

    토큰은 영문+숫자로 이루어져 있습니다. (예시: VXDV7I2JkgTMkJhhiTTYWEf0QPu8Iu0Y)

    생성된 토큰을 복사해 둡니다. 이를 분실하면 액세스 토큰을 삭제 후 다시 만들어야 합니다. (키를 다시 볼 수 없습니다.)

    언제든지 토큰을 삭제할 수 있습니다. 키가 유출된 것 같다면 반드시 삭제합시다.

Google Sheet 에서의 설정

  1. 구글 시트에 출력할 대사를 작성합니다.

  2. 이후의 코드는 아래와 같이,

    해당 문서의 시트명이 ‘data’인 시트, A1부터 대사를 입력했을 때를 기준으로 작성되어 있습니다.

    코드에 손대고 싶지 않다면, 이 점을 반드시 지켜주세요!

  3. 확장 프로그램-Apps Script 에서,

    입력되어 있는 코드를 모두 지우고 다음을 붙여넣습니다.

    {엑세스 토큰} 에는 위에서 복사해둔 엑세스 토큰을,

    {Misskey 인스턴스 기본 주소} 에는 만든 계정의 인스턴스 기본 주소를 입력합니다. 예시: Misskey.io 인스턴스의 경우, <https://misskey.io> 를 입력

    const accessToken = "{엑세스 토큰}";
    
    function postToMisskey() {
      const apiUrl = "{Misskey 인스턴스 기본 주소}/api/notes/create";
      const options = {
        'method': 'post',
        'contentType': 'application/json',
        'headers': {
          'Authorization': 'Bearer ' + accessToken,
        },
        'payload': JSON.stringify({
          'i' : accessToken,
          'visibility' : 'home',
          'text': noteContent()
          })
      };
    
      const response = UrlFetchApp.fetch(apiUrl, options);
    
      // Check the response status code
      if (response.getResponseCode() == 200) {
        console.log("성공! : 응답" + response);
      } else {
        console.error("Failed to create note. Error code: " + response.getResponseCode());
      }
    }
    
    function noteContent(){
      const sheets = SpreadsheetApp.getActiveSpreadsheet().getSheets();
      const dataSheet = sheets.find((sheet)=>sheet.getName() == 'data');
      const startRowNumber = 1;
      const endRowNumber = dataSheet.getLastRow();
      const rowNum = Math.ceil(Math.random()*endRowNumber)+startRowNumber;
      var contentText = dataSheet.getRange(rowNum,1).getValue().toString();
      console.log(contentText);
    
      return contentText;
    }
    

  4. 왼쪽 메뉴 중 트리거 ⏰ 메뉴에서 트리거를 추가하고 다음과 같이 설정합니다.

    실행할 함수 선택 postToMisskey
    실행할 배포 선택 Head(기본값)
    이벤트 소스 선택 시간 기반
    트리거 기반 시간 유형 선택 시간 단위 타이머
    시간 간격 선택 (원하는 간격으로 설정)

끝입니다

설정 후 한 시간 안에 랜덤하게 미스키 노트가 작성될 거예요.

문의는 @[email protected] 혹은 디스코드 headdrop 낙차#4187

NC:arkn_pot_5: (@SAN_c)