2019-10-06

スーパーロボット大戦

やってらんねーよ。何がって?
まずはこちらをご覧ください。

😖 最近スゲェ嫌だったこと 😣

  • Struts1


はい。これは2019年10月の日記で間違いありません。
2019年に、新規のWebアプリを、Struts1 で、書きました!

なんで?ねえなんで?

しかも燃え上がってお盆休みも取れない始末。やってらんねーよ。
そいでもって、何故かこういう時には無性に下らないおもちゃを作りたくなってしまう。

ので、作りました。


思えばこんな単純な bot をこしらえるまで長い道のりだった。
あれはもう4年前のこと、ある Twitter アカウントのこんなツイートがきっかけだった。

  • ドラゴンポーカーってゲームのCM、「超合体(ドッキング!)」ってなんすか?なんか気になる…やってみよw⇒招待ID「foobar」でお互い特典!


こんなの流れてきたら嫌がらせに「オエー」とか返したくならない?なるよねぇ!!
というわけで、ソシャゲのツイートが流れてきたら「オエー」と返す bot、

「日本オエー鳥の会」

の開発に着手した。

頓挫しました。
いえね、例によってサーバーの面倒とか看たくないし、お手軽に作ってしまおうと 考えたところまではよかったのだけれど、よりにもよって Android アプリにして しまおうと考えたのが良くなかった。

予想していた通り、ツイートを監視させ続けるために常駐させても、画面を消して しばらくするとアプリが勝手に殺されてしまう。 今思えば、諦めるのが早すぎたような気もするのだけれど、当時は他にしなければ ならないこともあったし、結局そのままうやむやになってしまったのだった。

今回もお手軽に作ってしまいたかったし、なおかつ時間をかけずにすぐに実装して しまいたかった。(絶賛炎上中でおもちゃを作る時間どころか、休みを取れるかどうか すら怪しいし)
というわけで、そういや IFTTT とかあったなとか思いつつ適当にググったら、

ツイッターbotをIFTTTとGASでサーバーレスに作ってみた | 東京ドワーフ

を見つけて、これなら数時間で実装できるんじゃないかと思い、試してみることにした。
用意するものは以下の通り。

  • Twitter アカウント(旧「日本オエー鳥の会」用アカウント)
  • 「銘菓リスト」保存用スプレッドシート
  • ツイート文面作成用スクリプト
  • ツイート実行用 IFTTT アプレット


オリジナルと違って、スプレッドシートの内容を繰り返しツイートするだけだし、 ツイートする時間もだいたいでいいから、GAS のタイマーをそのまま使うことにした。 詳しい仕組みはオリジナルの方で詳しく説明されているので、ここではスプレッドシートの内容と スクリプトの内容だけ載せておしまいにする。

まず、スプレッドシートに「銘菓リストシート」としてこんな感じで話数・掲載号とお菓子の名前をまとめておく。

銘菓リストシートの内容


あとは、次につぶやく銘菓リストの行番号を保存するために「行番号シート」を用意する。内容は1つのセルに 行番号が書いてあるだけ。

行番号シートの内容


スクリプトの方は行番号シートを読んでから、銘菓リストの該当する行を読んでツイートする文面を 組み立てて、最後に行番号シート上の番号をインクリメントするというだけ。Webhooks で IFTTT スクリプトを呼び出す関数は丸パクリなので、詳しくは東京ドワーフさんを参照してほしい。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
/**
 * @fileoverview スプレッドシートからツイート文を作成し、IFTTT経由でツイートを行う。
 */

var slowMeika = {};

/**
 * 銘菓リスト用スプレッドシートID
 * @private
 * @type {string}
 */
slowMeika.MEIKA_LIST_ID_ = 'スプレッドシート名';

/**
 * 銘菓リスト用シート名
 * @private
 * @type {string}
 */
slowMeika.MEIKA_SHEET_NAME_ = 'シート名';

/**
 * 行番号シート名
 * @private
 * @type {string}
 */
slowMeika.ROW_NUMBER_SHEET_ = 'シート名';

/**
 * Webhooks トリガーURL
 * @private
 * @type {string}
 */
slowMeika.TRIGGER_URL_ = 'https://maker.ifttt.com/trigger/イベント名/with/key/キー';

/**
 * ツイート実行
 * 文面を取得して、IFTTT経由でツイートする。
 */
function executeTweet() {
    // 文面取得
    var tweetText = createTweet_();
    // IFTTT経由でツイート
    callIFTTT_(tweetText);
}

/**
 * ツイート作成
 * スプレッドシートから値を取得して、ツイート文を作成する。
 *
 * @private
 * @return {string} ツイート文
 */
function createTweet_() {

    // スプレッドシートを開く。
    var meikaListFile = SpreadsheetApp.openById(slowMeika.MEIKA_LIST_ID_);

    // 今回のツイート行番号を取得する。
    var rowNumSheet = meikaListFile.getSheetByName(slowMeika.ROW_NUMBER_SHEET_);
    var rowNumCell = rowNumSheet.getRange(1, 1);
    var currentRow = rowNumCell.getValue();

    // 銘菓リストを開く。
    var meikaListSheet = meikaListFile.getSheetByName(slowMeika.MEIKA_SHEET_NAME_);
    // リスト長を取得する。
    var listLength = meikaListSheet.getLastRow();

    /* ツイート作成 */
    // 対象行取得
    var tweetValues = meikaListSheet.getRange(currentRow, 1, 1, 2).getValues();
    // 話数・掲載号取得
    var step = tweetValues[0][0];
    // 銘菓取得
    var meika = tweetValues[0][1];
    // 文面作成
    var tweetText = '[' + step + ']' + ' ' + meika;

    // 次回ツイート行設定
    if (listLength === currentRow) {
        // 末尾の場合は、1行目に戻る。
        rowNumCell.setValue(1);
    } else {
        // 末尾でない場合は次行とする。
        rowNumCell.setValue(++currentRow);
    }
  
    return tweetText;
}

/**
 * IFTTT呼び出し
 * IFTTT の Webhooks を呼び出してツイートする。
 * http://tokyodwarf.blog.jp/archives/79124346.html の丸パクリ。
 *
 * @private
 * @param {string} tweetText ツイート文
 */
function callIFTTT_(tweetText) {

  // ヘッダー設定
  var headers = {
    'Content-Type': 'application/json'
  };

  // post内容
  var data = {
    'value1': tweetText
  };
  
  // postの設定
  var options = {
    'method' : 'post',
    'headers': headers,
    // JavaScriptオブジェクトをJSON文字列に変換
    'payload' : JSON.stringify(data)
  };
  
  // 呼び出し
  UrlFetchApp.fetch(slowMeika.TRIGGER_URL_, options);
}


これで一通り揃ったので、タイマーを「午後3時〜4時」に設定して実際に動かしてみたら、 なぜか午後4時を過ぎてもツイートされない。ログを見たら「実行する権限がありません」とか出ている。

調べてみたところ、どうやら読み書きするシートを明示してるのが良くないらしい。

さらに調べたら、

[GAS] 実行する権限がありません。についての対策まとめ | Qiita

に「編集 > 現在のプロジェクトのトリガー」からトリガーを設定すれば動くと書いてあったので、 試しに設定してみたら動くようになった。ちょっともやもやするけど、今は深追いしないでおく。

それにしても、適当にアカウント作って100行ちょっとのスクリプトを書くだけで bot が作れるとは。
ただ、今のままだと少しつまらないので、もうちょっと機能を追加したい。
今は特にネタ無いけど。

ホームへ戻る