Google App Script Twitter 自動化

【Twitter】自動ツイート(5) ランダムツイート

はじめに

今回は自動ツイートについての第5回目です。

今回は、スプレッドシートに記載した内容をランダムにツイートできるようにします。

これまでのおさらいはこちらにまとめました。初めての方は一度目を通すことをお勧めします。

課題はこちらです。

今回の課題

  • ツイートするリストを作り、定期的にランダムにツイートさせたい。

では、見ていきましょう。

定期的にランダムツイート

乱数の生成

スプレッドシートに登録されているツイートをランダムに選択するために、総行数を取得し、ツイート対象行数をランダムに選択することを考えます。

乱数の発生は以下のようにMath.random()関数を使用します。

Math.random()関数は、0以上1未満の任意の数字をランダムに返します。

function test(){
  for(i=0; i < 5; i++)
    Logger.log(Math.random());
}

実行すると、以下のような結果が得られます。

C言語の乱数発生関数rand()と異なり、シードを時間に設定しなくても実行するたびに異なる数字が生成されます。

例えば、0から100までの乱数を発生させたい場合は、以下のようなコードで実現できます。

function test(){
  for(i=0; i < 5; i++)
    Logger.log(Math.random()*100);
}

このままだと出力結果に少数が含まれており、整数ではないので配列の添え字には使えません。

整数として取り出したいので、小数点以下を切り捨てて整数に整えます。

function test(){
  for(i=0; i < 5; i++)
    Logger.log(Math.floor(Math.random()*100));
}

実行すると、以下のように小数点以下が切り捨てられます。

このように発生させた乱数を使い、スプレッドシートの行数をランダムに選択します。

ランダムにツイート内容を取得

スプレッドシートに登録されているツイートの総数を取得し、乱数によりランダムにツイートする行数を取得します。

コードは以下の通り。

/*-------------------------------------------------
  スプレッドシートからランダムにデータを取得する

  ※idで指定するスプレッドシートはあらかじめ作成すること。
  ※先頭のA1セルは順にツイートする際のデータ取得位置として使う

  2022/02/11 created by N.Sekiya
---------------------------------------------------*/
function getMsgRandomly() {
  var spreadsheet = SpreadsheetApp.openById(SPREAD_SHEET);
  var sheet = spreadsheet.getSheets()[0];
  var tweet_cnt = spreadsheet.getLastRow()-1 ;     // 最終行-1が登録ツイート数
  Logger.log(tweet_cnt);

  var row = Math.floor(Math.random()*tweet_cnt)+2; // ランダムにツイート対象の行数取得
  return sheet.getRange(row, 1).getValue();
}

スプレッドシートの先頭行は、順番にツイートする際の次のツイート位置で使っていました。

そのため、2行目からspreadsheet.getLastRow()で取得する最終行までが登録されているツイート数となります。

取得するツイートのスプレッドシート上の行番号は2行目からなので、乱数で得られた値に+2してツイート内容を取得する行番号rowとします。

最後に、sheet.getRange(row, 1).getValue()にてツイート内容を取得します。

ここで作成した関数getMsgRandomly()をautoTweet()関数内のgetMsg()と置き換えればランダムにツイートできるようになります。

/*-------------------------------------------------
  自動ツイート関数(ランダムツイート版)

  getMsgRandomly()でスプレッドシートからランダムに
 ツイート内容を取得し、tweet()で取得した内容をツイートする。

  2022/02/11 created by N.Sekiya
---------------------------------------------------*/
function autoTweet(){

 // msg = getMsg();
  msg = getMsgRandomly();
  if(msg != ''){
    tweet(msg);
  }
}

全てのコード

autoTweet()関数では、getMsg()関数の代わりにgetMsgRandmly()関数を使用します。

コード中の下記4点は環境に合わせて修正してください。

  • <ここにツイートリストのスプレッドシートのIDを指定します>
  • <ログ出力用のスプレッドシートIDを指定します>
  • <Event nameを指定>
  • <KEYを指定>

それ以外は、コピペでいけます。

const PRJ_NAME = 'AutoTweet'; // logOut用
const SPREAD_SHEET = '<ここにツイートリストのスプレッドシートのIDを指定します>';
const LOG_SHEET = '<ログ出力用のスプレッドシートIDを指定します>';

/*-------------------------------------------------
  自動ツイート関数(ランダムツイート版)

  getMsgRandomly()でスプレッドシートからランダムに
 ツイート内容を取得し、tweet()で取得した内容をツイートする。

  2022/02/11 created by N.Sekiya
---------------------------------------------------*/
function autoTweet(){

  msg = getMsgRandomly();
  if(msg != ''){
    tweet(msg);
  }
}

/*-------------------------------------------------
  ツイート関数

  引数msgの内容をツイートする。
  UrlFetchApp.App()に与えるURLはIFTTTのトリガーに設定した
  WebhookのURLを指定する。

  2022/02/06 created by N.Sekiya
---------------------------------------------------*/
function tweet(msg) {

  // body作成
  let body = {
        'value1': msg,
        // value2: '',
        // value3: ''
  };

  // option作成
  let opt = {
        'method': 'POST',
        'contentType': 'application/json',
        'payload': JSON.stringify(body)
  };
  logOut(PRJ_NAME, opt);

  let res = UrlFetchApp.fetch(`https://maker.ifttt.com/trigger/<Event nameを指定>/with/key/<KEYを指定>`, opt);
  logOut(PRJ_NAME, 'code:' + res.getResponseCode());
  logOut(PRJ_NAME, 'content:' + res.getContentText());  
}

/*-------------------------------------------------
  スプレッドシートからランダムにデータを取得する

  ※SPREAD_SHEETで指定するスプレッドシートはあらかじめ作成すること。
  ※先頭のA1セルは順にツイートする際のデータ取得位置として使う

  2022/02/11 created by N.Sekiya
---------------------------------------------------*/
function getMsgRandomly() {
  var spreadsheet = SpreadsheetApp.openById(SPREAD_SHEET);
  var sheet = spreadsheet.getSheets()[0];
  var tweet_cnt = spreadsheet.getLastRow()-1 ;     // 最終行-1が登録ツイート数
  Logger.log(tweet_cnt);

  var row = Math.floor(Math.random()*tweet_cnt)+2; // ランダムにツイート対象の行数取得
  return sheet.getRange(row, 1).getValue();
}

/*-------------------------------------------------
  スプレッドシートにログを出力する関数

  WebアプリとしてデプロイするとLogger.log()ではログが残らない。
  デバックに困るので、スプレッドシートに出力できるようにした。
  ※LOG_SHEETで指定するスプレッドシートはあらかじめ作成すること。

  2021/12/01 created by N.Sekiya
---------------------------------------------------*/
function logOut(prjName, msg) {
  var id = LOG_SHEET;
  var spreadsheet = SpreadsheetApp.openById(LOG_SHEET);
  var sheet = spreadsheet.getSheets()[0];
  sheet.appendRow([new Date(), prjName, msg]);
}

定期実行

今更説目するまでもないと思いますが、

トリガー設定を行うことで定期的にautoTweet()関数を呼び出し、自動的にツイートできるようになります。

あとは、時間が来たらちゃんとツイートしてくれるのかしら、などと、わくわくしながら待つのみです。

これまでのおさらい

IFTTTのWebhook準備から、ツイートの基本コードまでを説明します。

IFTTTとTwitterを連携し、IFTTTのWebhookにPOSTしたらツイートさせる

ここで紹介する自動ツイートは、IFTTTのWebhookとTwitterを連携させることで実現します。

ここがTwitterのAPIを使わずに簡単に自動ツイートさせるためのコツよ。キモなのよ。

最初にIFTTTにログインしてWebhookとTwitterの設定を完了してください。

GASからIFTTTのWebhookにPOSTさせたらツイートする

IFTTTのWebhookで指定されるURLにPOSTすることでツイートできるようにGoogle Apps Scriptのコードを書きます。

とても簡単に実現できます。

リスト順にツイート

スプレッドシートにツイートしたい内容を列挙し、上から順番にツイートするところまで作ります。

前回まででツイートできるようになっているので、あとはスプレッドシートのデータを上から順番に取得してWebhookにPOSTするだけです。

仕上げ

スプレッドシートの最終行までツイートしたら、先頭に戻ってツイートを再開できるようにします。

まとめ

いかがでしたでしょうか。

スプレッドシートに登録した内容をランダムにツイートできるようになったかと思います。

有効に活用いただけると喜びます。

また、これで自動ツイートシリーズは完了となります。

ここまで読んでいただきありがとうございました。

では、今日も良い一日を。

-Google App Script, Twitter, 自動化
-, , , ,