Google Formの回答を投稿するDiscord botを作ってみた

タイトルのまんまです。

創作用のサーバーで軽率に意見とか質問とか上げてほしいなー…でもなんとなく躊躇するよな〜…を解決するために匿名で意見を投げられるbotを作ってみました

使ったもの

・Glitch

・Google Form

・Google Apps Script

・Discord

流れとしては、

Discordのbotを作成する→Glitchで動かす(5分ごとに休止状態になるのでGoogle Apps Scriptで5分ごとに叩き起こす👊😡)
匿名で投稿する内容を記述するためのGoogle Form作成→Google Formで提出されるとGlitchにjsonを送るGoogle Apps Script作成→GlitchからDiscordに投稿できるようにする

になっています


Discord Botを作って導入するまではこちらのサイトを参考に作りました。

Glitchのバージョンアップにより、以下の部分がこちらのサイトと内容が変わっていました


・hello-expressがない

代わりにGlitch Hello Nodeになっています。説明文がほぼ一緒です。

・Make This Project Privateにできない

有料版のみになったそうです。つまりGlitchで作ると金を払わない限り誰にでも書いたコードが見られるそうな。間違ってもトークンとかをコード内に貼り付けないようにしましょう…

・.envがデフォルトでない

.envファイルが最初からは存在しません。Add This Fileから「.env」を作る必要があります。 ここで環境変数として設定することでpublicなプロジェクトでも変数の中身がばれなくなるのでここでトークンを設定してやりましょう

結構こういうのってバージョンアップの煽りを受けるから記事通りにやってみるだけ!が意外とできないこと、多い…


2.Google Formを作成する

記事通りにbotを作成したら、次はGoogle Formを作成します。

今回は意見を記述する欄、Discordに投稿するかのラジオボタン、投稿する場合は投下するチャンネルを選ぶラジオボタンを作成しました。


3.Google Apps Scriptを作成する

作成したgoogle formの・・・のところからスクリプトエディタを選んでGoogle Formに連携したGoogle App Scriptを作成します。


で、こんな感じで書きました

var GLITCH_URL = "https://Glitchのプロジェクト名.glitch.me";

var IDs = new Array('チャンネルのID1', 
                    'チャンネルのID2',
                    'チャンネルのID3',
                    'チャンネルのID4',
                    );


function onSubmit(e) {
    var form = FormApp.getActiveForm();
    var allResponses = form.getResponses();
    var latestResponse = allResponses[allResponses.length - 1];
    var response = latestResponse.getItemResponses();

    //回答をログ出力
    for (var i = 0; i < response.length; i++) {
      console.log(response[i].getResponse().toString());
    }

    var shareAns = response[1].getResponse().toString();
    if(shareAns != "共有しない"){
      var text = response[0].getResponse().toString();
      var channelID ;
      switch(response[2].getResponse()){
        case "回答の選択肢1の文字列":
          channelID = IDs[0];
        break;
        case "回答の選択肢2の文字列":
          channelID = IDs[1];
        break;
        case "回答の選択肢3の文字列":
          channelID = IDs[2];
        break;
        case "回答の選択肢4の文字列":
          channelID = IDs[3];
        break;           
      }

      var json =  {
          //それっぽく決める
          };

      sendGlitch(GLITCH_URL, json);
    }else{
      console.log("共有なし");
    }
};

function sendGlitch(url, json){
 var params = {
   'contentType' : 'application/json; charset=utf-8',
   'method' : 'post',
   'payload' : json,
   'muteHttpExceptions': true
 };
 response = UrlFetchApp.fetch(url, params);
}

うーんハードコーディングみ

内容としては、提出された解答から意見の内容とチャンネルのIDを含むJsonを作成して、Glitchの方に送ってる感じです。
共有なしが選ばれた場合は送らないようにしています。

左にある時計マークのとこからトリガーを設定し、提出が行われたらスクリプトが動くようにします。


4.Glitchのコードを修正する

server.jsに追記してGoogle Apps Scriptから送られてくるjsonファイルをどうにかしてDiscordの方に上げるようにします。
server.jsのcreateServerを以下のように書き換えます

http.createServer(function (req, res) {
  if (req.method == 'POST') {
    var data = "";
    req.on('data', function (chunk) {
      data += chunk;
    });

    req.on('end', function () {
      if (!data) {
        res.end("No post data");
        return;
      }

      var dataObject = querystring.parse(data);
      if (keyとvalueをそれぞれ確認する) {
        console.log("Woke up in post");
        res.end();
        return;
      }

      if (keyとvalueをそれぞれ確認する) {
        let msgChannelId = process.env.TEST_CHANNEL_ID;
        var a = "新しい意見が入ったよ";
        if (keyとvalueをそれぞれ確認する) {
          a = postに含まれる回答を入れる;
        }
        if (デバッグモードかどうか) {
          if (keyとvalueをそれぞれ確認する) {
            msgChannelId = postに含まれるチャンネルID;
          }
        }
        sendMsg(msgChannelId, a);
      }
      res.end();
    });
  }
  else if (req.method == 'GET') {
    res.writeHead(200, { 'Content-Type': 'text/plain' });
    res.end('Discord Bot is active now\n');
  }
}).listen(3000);

jsonのtypeがGoogle Apps Scriptと同じものなら、ぢすこに上げるようにしました。

これでGoogle Formに回答されたものがDiscordに送られてくるようになりました


ちなみに…

 単純にGoogle Formに投稿されたものをDiscordに上げるだけならチャンネルごとにWebhookを作成してGoogle Apps Scriptで投げるだけで良さそうです。(多分Glitchいらない)

 まあせっかく常駐できるものを作ったんだしもう少し機能増やして遊んでみたいな…

プログラミング

guest
0 Comments
Inline Feedbacks
全てのコメントを見る