🐰

【5分でできるWebhook】obnizからDiscordに通知を送ろう

2021/05/11に公開

よく忘れるやつなのに記事にしてなかったから書いておきます。

Discord側でWebhook URLを用意する(2分)

デスクトップアプリから。

Bot(Webhookの先となる仮想ユーザー)を作りたいサーバーを開き、サーバー名の右側のプルダウンメニューからServer Settingsを開きます。

IntegrationsからWebhooksを選択。

New Webhookボタンをクリックし、上図に従ってください。
Webhook URLをコピーして控えておきましょう。

Postmanでテスト(ここやらなくてもよい)

DiscordのWebhookに関する決まりは基本的に3つだけです。

  • POSTで送信すること
  • contentキーに被送信データを入れること
  • Content-Typeはapplication/x-www-form-urlencoded or multipart/form-data or application/json のいずれかにすること

application/x-www-form-urlencoded のとき

multipart/form-data のとき

application/json のとき

ちゃんと送れてるかな?

上記3つの各Content-Typeのいずれの方法でも送れていることが確認できました。

obniz側でコード書く(コピペ3分)

セットアップ等は省略です。
プッシュボタンスイッチを押すとDiscordに「ランダムなおみくじの結果文字列」が送られるスクリプトをサンプルとして以下に示します。
axiosがPOSTするときのContent-Typeはデフォルトでapplication/jsonなので、第2パラメータにそのままオブジェクト({ content: omikuji })を置けばよいです。

omikuji.js
const axios = require('axios');
const Obniz = require('obniz');
const obniz = new Obniz('Obniz_ID'); // 自分のObniz IDを入れる
const DISCORD_WEBHOOK_URL = 'ここに取得したWebhook URLを入れる';

obniz.onconnect = async function () {
  obniz.display.clear();
  obniz.display.print('Hello obniz!');

  // スイッチの反応を常時監視し変化があれば実行します
  obniz.switch.onchange = async function (state) {
    if (state === 'push') {
      // プッシュスイッチが押されたとき以下を実行

      // ランダム値から「おみくじ結果」を作成します
      const v = Math.random();
      const omikuji = (v > 0.8) ? '大吉' : (v > 0.6) ? '中吉' : (v > 0.4) ? '吉' : '凶';

      console.log('おみくじ結果:' + omikuji);
      obniz.display.clear(); // 画面を消去
      obniz.display.print('pushed'); // pushed と画面に表示

      // axiosで送る
      try {
        // POSTリクエストでDiscordにおみくじ結果を送信
        const response = await axios.post(
          DISCORD_WEBHOOK_URL,
          { content: omikuji } // このオブジェクトがJSONとして送信される
        );
        // データ送信が成功するとレスポンスが来る
        console.log('レスポンスを受信しました:' + response.data);
        console.log('POSTに成功しました!');
      } catch (error) {
        // ネットワークに接続できてない・サーバーが落ちてる・URLが違うなど
        console.log('POSTに失敗しました……');
        console.error(error);
      }
    } else {
      // プッシュスイッチ戻された・左右などの場合
      obniz.display.clear(); // 画面を消去
    }
  }
}

Node.jsで実行し、プッシュスイッチを押してみましょう。

$ node omikuji.js

うまく動いていればDiscordにこのように投稿されます。
おつかれさまでした。

Discussion