【同人サークル向けtips】discordにBOOTH商品販売通知botを設置する

 いかがでしたか?(先制攻撃)

 前回に引き続き、今回は、以下の画像で「売れている!」とか叫んでいるBOOTHで商品が購入されたときに通知してくれるbotについて解説していきます。

 上記のツイートに書いているとおりで、これは複数名が参加しているサークルにとってはモチベーション的に非常に嬉しいものです。一人サークルの場合は全く不要です。メールを見れば良いから。

 そう、メールです。BOOTHで商品が売れたときというのは、それを知らせるメールが届きます。このbotはメールをトリガーにして動いています。具体的に言うと、

  • BOOTHからの通知メールをgmailで受信する
  • gmailで、BOOTHからの通知メールに特定のラベルを付けるフィルタルールを設定する
  • Google Apps Scriptで、gmailの受信ボックスで特定のラベルが付いた未読メールを検索し、ヒットしたらdiscordのWebhookにpostして、当該メールを既読にする処理を定期実行する

 以上です。IFTTTよりちょっと難しいですね。IFTTTはgmailの受信ボックスと連携できないからです。許せねえな。でもgmailのフィルタルールとGASを活用することで、案外簡単なんですよね。BOOTH以外のサービスでも、売れたことをメールで通知してくれるようなサービスになら応用も利くと思います。

 ここまで説明したら分かる人には分かったと思うし以下は雑に説明していきます。

gmailのフィルタ設定

 説明は以上です。

Google Apps Script

 Google Apps Script、通称GAS。これってG suite scriptとかに改称されたりしてないんだなと思っていま調べたらもうG suiteとも言わないのか。さてこれは何かというと、まあざっくり言えば……エクセルのマクロあるじゃないですか、あれのGoogle版です。

 これはGoogleのサービスを良い感じに操作できて……

var checkLabel = "booth";
var threads = GmailApp.search('is:unread label:' + checkLabel);

 これでboothラベルが付いた未読メールを検索できます。うわあ、良い感じじゃないな。スレッド単位。BOOTHの販売通知メールは基本的にスレッドに固まってしまうのでそれを踏まえた処理が必要になります。

 さて、以下はそれを踏まえていない処理です。

var count = threads.length;
for(var i = 0; i < count; i++) {    
    var messages = threads[i].getMessages();
    if(messages.length > 0){
        var postMessage = "BOOTHから通知:`" +
            threads[i].getFirstMessageSubject() +
            "`\n『紙魚はまだ死なない』 が売れている!";
        discord(postMessage);
        for(var j = 0; j < messages.length; j++){
            messages[j].markRead(); //これthreadに対してmarkReadでよかったな
        }
    }
}

 何で踏まえていないかというと、適当に検索して出てきたコードを加工してスレッド内を順番に通知するように書いたら既読分まで通知してしまうバグが出て、そこでちゃんと未読だけ通知するように改修すりゃいいのにめんどくさくなって1回だけ通知にしていることにより、謎の構成になっててなんかこう、尾てい骨みたいな、盲腸みたいな感じになってますが、まあこういう割り切りが、デジタルトランスフォーメーションです。こうやって検索して拾ったコードを切り貼りして作ったやつを溜めておいて設計図共有サイトで共有すると転職サイトで適正年収が診断できます。まあ10分ごとに実行とかにしておけば、その時間内に一気に何部も売れるってことあんまりないだろうし……目的はみんなのドライヴ感だから……。

 discordを呼ぶところは普通にこうです。これはこの記事の方のを利用。

function discord(message) {
    const url        = 'https://discordapp.com/api/webhooks/xxxxxxxxxxxxxxxxxxxx'; //discordのwebhooksのurl
    const token      = 'xxxxxxxxxxxxxxxxxxxxxx';//discordのwebhooksのトークン
    const channel    = '#egosearch';//送信したいチャンネル
    const text       = message;
    const username   = 'ささのはストア';
    const parse      = 'full';
    const method     = 'post';

    const payload = {
        'token'      : token,
        'channel'    : channel,
        "content"    : text,
        'username'   : username,
        'parse'      : parse,
    };

    const params = {
        'method' : method,
        'payload' : payload,
        'muteHttpExceptions': true
    };

    response = UrlFetchApp.fetch(url, params);
 }

 これ動いてたけど、なんかいま公式の見たら所々不自然な気もしますが、動きゃ良いんだよ。適正年収三兆円になりたい。関係ないけどこのWordpressテーマでコードブロック始めて使ったけど(笹帽子の樹はテックブログです)、神武以来のクソダサでしょこれ。なにこれ?

 これを10分とかのトリガーで実行してください。まともな解説が読みたい人はGAS gmail 検索 webhookとかで検索して調べてみてください。いかがでしたか?(リフレイン)