LoginSignup
2
3

More than 1 year has passed since last update.

GASで特定のTwitterアカウントの監視ツールを作る その1

Last updated at Posted at 2022-04-08

はじめに

概要

気になるあの人がツイートしたらそれを自動でスプレッドシートに記録しよう。
何かあったときのために自動でスクリーンショットも撮って保存しちゃおう。

使うもの

全体の仕組み

  1. ZapierがTwitterアカウントを監視する(たぶん15分おきに見に行ってる)
  2. Zapierが最新ツイートを取得したらスプレッドシートに記録する
  3. スプレッドシートに変更があったら(2で記録されたら)GASのトリガー発火
  4. GASでAPI FLASHにリクエストを投げてTwitterスクショ生成
  5. 生成したスクショをGoogleドライブに保存する

完成イメージ

sheetsample.jpg

つくりかた

1. Googleスプレッドシートで下準備

新しいスプレッドシートを用意して1行目にヘッダーだけ作っておく。

ここでの例:

  • created at ... ツイート日時
  • user name ... Twitterアカウント名
  • text ... ツイート内容
  • url ... ツイートURL
  • screenshot ... スクショURL

2. ZapierでZapを作成する

Trigger (User Tweet in Twitter)

  • Choose app & event ... Twitter / User Tweet
  • Choose Account ... 自分のTwitterアカウント
  • Setup Trigger ... 監視したいTwitterアカウント

Action (Create Spreadsheet Row in Google Sheets)

  • Choose app & event ... Google Sheets / Create Spreadsheet Row
  • Choose account ... 自分のGoogleアカウント
  • Set up action ...
    • Drive ... My Google Drive
    • Spreadsheet ... 1で用意したスプレッドシート
    • Worksheet ... 任意
    • 以下、スプレッドシートで作成したヘッダーの項目と取り込む項目を一致させる

3. GASでコード記述&トリガー作成

コード記述

コード.gs
function takeScreenshots() {
  let sheet = SpreadsheetApp.openById('スプレッドシートID').getSheetByName('シート名');
  let sheetLastRow = sheet.getLastRow();
  let ssLastRow = sheet.getRange(sheet.getMaxRows(), 5).getNextDataCell(SpreadsheetApp.Direction.UP).getRow();
  let tweetUrl = null;

  if(sheetLastRow !== ssLastRow) {
    for(i = ssLastRow + 1; i <= sheetLastRow; i++) {
      url = sheet.getRange(i, 4).getValue();
      let fileUrl = takeAScreenshot(tweetUrl);
      sheet.getRange(i, 5).setValue(fileUrl);
    }
  }
}

function takeAScreenshot(tweetUrl) {
  let folderId = 'GoogleドライブのフォルダID';
  let now = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'YYYYMMdd-HHmmss');
  let access_key = 'API FLASHのアクセスキー';
  let requestUrl = 'https://api.apiflash.com/v1/urltoimage?access_key=' + access_key + '&url=' + tweetUrl;

  try {
    UrlFetchApp.fetch(requestUrl);
    Utilities.sleep(1000 * 10);
    let image = UrlFetchApp.fetch(requestUrl).getBlob();
    fileUrl = folder.createFile(image).setName('任意の名前' + now).getUrl();
  } catch(error) { //API FLASH月上限の100Screenshotsを超えてしまった場合など
    fileUrl = 'none';
  }
  return fileUrl;
}

トリガー作成

  • 実行する関数 ... takeScreenshots
  • 実行するデプロイを選択 ... Head
  • イベントのソースを選択 ... スプレッドシートから
  • イベントの種類を選択 ... 変更時
  • エラー通知設定 ... お好みで

結果

自動でツイートが記録されて、Googleドライブにスクショが保存されるようになったよ。

sheetsample.jpg

drivesample.PNG

追記(2022/5/2)

API FLASHの無料プランは月100枚までしかスクショが撮れないので、リクエストのエラーが返ってきたときの例外処理をコードに追加。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3