Google Apps Script에서 (대략) 1시간마다 트윗하는 Bot 만들기

PHP + cron에서 실행중인 Twitter Bot을 Google Apps Script (GAS)로 대체했습니다.
스크립트를 조금 메모 쓰기 정도로 써 둡니다.

전체 스크립트는 Gist/gasTwitterBot.gs에 둡니다.

Bot 요구 사항


  • Tweet 게시
  • Tweet 할 내용은 스프레드 시트에서 무작위로 가져옵니다
  • 게시 시간은 1 시간에 1 번 페이스
  • Bot 같지 않게 좋은 느낌 에 장미한 시간에 투고한다
  • 게시물은 9시에서 21시 사이

  • 최종 결과



    분위기는 이런 느낌입니다.
    Tweet 후보를 시트에 기재해 두고, 코드를 실행하는 것으로 나머지는 자고 있는 것만으로 움직입니다.



    실제로 트윗이 게시된 시간대입니다.
    좋은 느낌에 장미한 시간에 투고하고 있으므로, Bot 같음이 저감되고 있는지.


    시작
    9:13


    첫 번째
    10:01

    두 번째
    10:33

    세 번째
    12:09

    네 번째
    13:07

    다섯 번째
    13:50

    여섯 번째
    14:52

    일곱 번째
    15:33

    8번째
    16:32

    9번째
    18:07

    10번째
    18:51

    11번째
    19:46


    사용법(참고)



    1 또는 2, 좋아하는 분을 기호로.

  • 트리거 화면에서 createEveryHoursScheduler() 실행
  • 다음 init()를 실행하여 원하는 시간에 createEveryHoursScheduler() 시작 예약
  • function init() {
      const time = "好きな時間";
      ScriptApp.newTrigger("createEveryHoursScheduler").timeBased().at(time).create();
    }
    

    실현 방법



    1. Tweet 게시



    GAS에서 Tweet하는 계의 기사는 여러가지 있으므로, 그것을 참고로 해 주시면!

    참고: Qiita | Google Apps Script (GAS)에서 Twitter에 게시하는 기능만 구현해 보세요.
    참고: Gist | TwitterWebService.gs
    var twitter = TwitterWebService.getInstance(
      'xxxxx', // 作成したアプリケーションのConsumer Key
      'xxxxx'  // 作成したアプリケーションのConsumer Secret
    );
    
    // Twitterの認証
    function authorize() {
      twitter.authorize();
    }
    
    // Tweetをする投稿
    function postTweet(tweet) {
      const service  = twitter.getService();
      const response = service.fetch('https://api.twitter.com/1.1/statuses/update.json', {
        method: 'post',
        payload: { status: tweet }
      });
    }
    
    // 実際に実行する関数
    function execute() {
      const tweet = "HOGE"; // TODO: とりあえず固定
      postTweet(tweet);
    }
    

    2. Tweet 하는 내용은 스프레드시트에서 랜덤하게 취득한다



    "Tweet"시트의 A 열에 각 Twitter가 늘어서 있다고 가정합니다.
    그리고 "1. Tweet 게시"의 execute()를 조금 변경합니다.
    function selectRandomTweet() {
      // Tweetシートを取得する
      const sheetData = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Tweet");
    
      // 1 ~ 最終行までの行をランダムに選択する
      const lastRow = sheetData.getLastRow();
      const selectedRow = Math.floor(Math.random() * lastRow) + 1; 
    
      // 選んだ行の内容を取得する
      const selectedTweet = sheetData.getRange(selectedRow, 1).getValue();
      return selectedTweet;
    }
    
    function execute() {
      const tweet = selectedTweet(); // tweetをランダムにする
      postTweet(tweet);
    }
    

    3. 투고는 1시간에 1도의 페이스



    트리거을 설정하여 시간에 한 번execute()을 실행합니다.

    참고: Google App Script | Trigger
    참고: Google App Script | everyHours(n)
    function createEveryHoursScheduler() {
      ScriptApp.newTrigger("execute").timeBased().everyHours(1).create();
    }
    

    4. bot같지 않게 좋은 느낌에 장미한 시간에 투고한다


  • schedulePost() 시간당 한 번 실행
  • 다음 schedulePost()가 실행되기까지 1 시간 동안 무작위 시간 가져 오기
  • 얻은 임의의 시간에 execute() 실행

  • 참고: Google App Script | at(Date)
    주의: 사실 at(Date)은 ±15분의 오차가 발생합니다(cf. at(Date))
    
    function createEveryHoursScheduler() {
      // schedulePost() を1時間に1度実行するように変更
      ScriptApp.newTrigger("schedulePost").timeBased().everyHours(1).create();
    }
    
    function schedulePost() {
      const scheduledTime = getScheduledTime();
      // スケジュールした時刻に execute() を実行する
      ScriptApp.newTrigger('execute').timeBased().at(scheduledTime).create();
    }
    
    function getScheduledTime() {
      var setTime = new Date();
      const minutes = setTime.getMinutes();
      const randomMinute = Math.floor(Math.random() * 59);
    
      // 現在時刻 + 0~59分 の時刻を設定する
      setTime.setMinutes(minutes + randomMinute); 
      return setTime;
    }
    

    5. 투고는 9시부터 21시 사이까지



    24시간 계속 투고하고 있으면 인간답지 않습니다.
    그래서 9:00~21:00 사이에서만 투고하지 않도록 제한합니다.
    function schedulePost() {
      const scheduledTime = getScheduledTime();
      // スケジューリングした時間をバリデーションにかける
      if (!validateHourRange(scheduledTime.getHours())) return;
    
      ScriptApp.newTrigger('execute').timeBased().at(scheduledTime).create();
    }
    
    function validateHourRange(hour) {
      if (hour >= 9 || hour <= 21) return true;  // 投稿したい時間を指定する
      return false;
    }
    

    감상



    Google Apps Script, 엄청 다기능으로 편리하다고 생각했습니다.
  • Google Spreadsheet에서 콘텐츠 관리 가능
  • 기본은 JavaScript로 작성 가능
  • 디버거 기능
  • 정기 실행 기능
  • 좋은 웹페이지 즐겨찾기