1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

チャットワークのbotを作る

Last updated at Posted at 2024-08-10

特定のメッセージに応答するbotの作り方

環境

・Chatworkの利用環境
・Google Apps Script を使うためのGoogleアカウント

構築手順

チャットワークAPIトークンの取得

  1. bot用アカウントを作成(任意)

  2. 右上にある自分のアカウントをタップ
    Untitled design.jpeg

  3. 表示されたメニューの「サービス連携」を選択

  4. APIトークンを選択
    Untitled design.png

APIトークンの取得完了です
コピぺなどしてAPIトークンを覚えておきましょう。(第3者には絶対に見せないで下さい)

GASでのプロジェクト作成とデプロイ

まずGoogle Apps Script で新しいプロジェクトを作りましょう。
https://script.google.com/

この画面が出てきた人はここからログインしましょう
IMG_0631.jpeg
新しいプロジェクトを選択
D7AA7458-02C2-466B-A205-B7C72AAD1B8F.png

そして、プロジェクト名を設定し、以下のスクリプトを貼り付けて保存します。

IMG_0591.jpeg

以下のコードは、特定のメッセージに対する応答をChatWork APIを介して送信します。

function doPost(e) {
  try {
    // アプリケーション設定を取得
    const appSettings = PropertiesService.getScriptProperties();
    const API_KEY = appSettings.getProperty('CHATWORK_API_KEY');
    const ROOM_ID = appSettings.getProperty('CHATWORK_ROOM_ID');
    const MY_ACCOUNT_ID = appSettings.getProperty('MY_ACCOUNT_ID'); 

    const contents = JSON.parse(e.postData.contents);
    Logger.log('Webhook payload: ' + JSON.stringify(contents));

    // Webhook イベントから必要な情報を取得
    var message = contents.webhook_event.body;
    var roomId = contents.webhook_event.room_id;
    var messageId = contents.webhook_event.message_id;
    var fromAccountId = contents.webhook_event.account_id;
    
    // 自分自身のメッセージには反応しない
    if (fromAccountId == MY_ACCOUNT_ID) {
      Logger.log('自分自身のメッセージです。スキップします。');
      return ContentService.createTextOutput('OK').setMimeType(ContentService.MimeType.TEXT);
    }
    
    // メッセージの重複処理を防止
    const processedMessagesJSON = PropertiesService.getUserProperties().getProperty('processedMessages') || '{}';
    const processedMessages = JSON.parse(processedMessagesJSON);

    if (processedMessages[messageId]) {
      Logger.log('メッセージは既に処理されています。スキップします。');
      return ContentService.createTextOutput('OK').setMimeType(ContentService.MimeType.TEXT);
    }

    // メッセージを処理
    if (message.includes('ここに反応する文字を入れる')) {
      Logger.log("メッセージが検出されました!");
      sendReply(API_KEY, ROOM_ID, messageId, fromAccountId, roomId, "検出した時に送る文字を入れる");
    } else {
      Logger.log('指定されたメッセージは検出されませんでした');
    }

    // メッセージが処理済みであることをマーク
    processedMessages[messageId] = true;
    PropertiesService.getUserProperties().setProperty('processedMessages', JSON.stringify(processedMessages));

    return ContentService.createTextOutput('OK').setMimeType(ContentService.MimeType.TEXT);
  } catch (error) {
    Logger.log('Error in doPost: ' + error.toString());
    return ContentService.createTextOutput('Error').setMimeType(ContentService.MimeType.TEXT);
  }
}

function sendReply(API_KEY, ROOM_ID, messageId, accountId, roomId, replyMessage) {
  const replyText = `[rp aid=${accountId} to=${roomId}-${messageId}] ${replyMessage}`;
  const url = `https://api.chatwork.com/v2/rooms/${ROOM_ID}/messages`;

  const options = {
    method: 'POST',
    headers: {
      'X-ChatWorkToken': API_KEY,
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    payload: `body=${encodeURIComponent(replyText)}`
  };

  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

function sendMessageWithoutReply(API_KEY, ROOM_ID, message) {
  const url = `https://api.chatwork.com/v2/rooms/${ROOM_ID}/messages`;

  const options = {
    method: 'POST',
    headers: {
      'X-ChatWorkToken': API_KEY,
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    payload: `body=${encodeURIComponent(message)}`
  };

  const response = UrlFetchApp.fetch(url, options);
  Logger.log(response.getContentText());
}

コード内の
ここに反応する文字を入れる
検出した時に送る文字を入れる
にお好きな文字を入れて下さい。

複数個追加したい場合

if 文の使い方について解説します。以下に、具体的な例とともに説明します。

基本的な if 文の構造

if 文は特定の条件を満たす場合に、指定されたコードブロックを実行します。基本的な構造は以下の通りです。

if (条件) {
  // 条件が真の場合に実行されるコード
}

message === 'test' の場合

message という変数が test という文字列と完全に一致するかどうかをチェックしています。この場合、条件が真であれば以下のコードブロックが実行されます。

if (message === 'test') {
  Logger.log("testが検出されました!");
  sendReply(API_KEY, ROOM_ID, messageId, fromAccountId, roomId, "テスト検出!");
}

message.includes('aaa') の場合

message という変数が aaa という文字列を含むかどうかをチェックしています。この場合、条件が真であれば以下のコードブロックが実行されます。

if (message.includes('aaa')) {
  Logger.log("aaaが検出されました!");
  sendReply(API_KEY, ROOM_ID, messageId, fromAccountId, roomId, "iii");
}

他の if 文の追加方法

新しい条件をチェックするための if 文を追加するには、次のように記述します。例えば、「おはよう」というメッセージが含まれている場合に特定の返信をする else if 文を追加します。

else if (message.includes('おはよう')) {
  Logger.log("おはようメッセージが検出されました!");
  sendReply(API_KEY, ROOM_ID, messageId, fromAccountId, roomId, "いい夢見れた?");
}

if 文の使い方のポイント

  • 完全一致チェック: === を使って変数が特定の値と完全に一致するかをチェックします。
    if (message === 'test') {
      // message が 'test' と完全一致する場合の処理
    }
    
  • 部分一致チェック: .includes メソッドを使って変数に特定の文字列が含まれているかをチェックします。
    if (message.includes('おはよう')) {
      // message に 'おはよう' が含まれている場合の処理
    }
    

if 文を使うことで、特定の条件に応じて異なる処理を実行することができます。message の内容に応じた処理を追加したい場合は、条件に応じて適切な if 文を追加していきます。


JavaScriptで追加のif文を追加するには、else if文を使用します。else if文はいくつでも追加することができます


ログの部分は自分が見やすい様に変えてください。

Logger.log("ログ");

#追加した例

// メッセージを処理
    if (message.includes('ここに反応する文字を入れる')) {
      Logger.log("参加メッセージが検出されました!");
      sendReply(API_KEY, ROOM_ID, messageId, fromAccountId, roomId, "検出した時に送る文字を入れる");
    } else if (message.includes('反応する文字2')) {
      Logger.log("反応する文字2が検出されました!");
      sendReply(API_KEY, ROOM_ID, messageId, fromAccountId, roomId, "反応!");
    } else {
      Logger.log('指定されたメッセージは検出されませんでした');
    }

反応するメッセージ

もし自分の送ったメッセージにも反応させたい場合には以下のコードを消して下さい

    // 自分自身のメッセージには反応しない
    if (fromAccountId == MY_ACCOUNT_ID) {
      Logger.log('自分自身のメッセージです。スキップします。');
      return ContentService.createTextOutput('OK').setMimeType(ContentService.MimeType.TEXT);
    }

スクリプトプロパティの設定

IMG_0596.png
スクリプトプロパティにそせぞせの値を入れます

プロパティ
CHATWORK_API_KEY 初めに取得したAPIトークンを入れる
CHATWORK_ROOM_ID ここにはルームIDを入れます。
ルームIDはグループチャットURL末尾の数字と同様の番号です。
例・以下の「*********」の箇所 https://www.chatwork.com/#!rid*********
MY_ACCOUNT_ID ここにはアカウントIDを入れて下さい
このリンクは、アカウントIDの確認の仕方です。

入力したらスクリプトプロパティを保存を押して完了します。

このプロジェクトをウェブアプリとしてデプロイ

1
デプロイから新しいデプロイを選択
IMG_0613.png
2
ウェブアプリを選択
名称未設定のデザイン.png
3
アクセス出来るユーザーを全員に変更し、デプロイを選択
0F04CE53-66DF-4214-A195-F0764F9D4797.png
4
アクセスを承認を選択
名称未設定のデザイン.png
5
警告が出てきますが、Advancedを選択
IMG_0623.jpeg
6
(unsafe)を選択
IMG_0624.jpeg
7
Googleアカウントを選択

8
allowを選択
名称未設定のデザイン.jpeg
9
WebアプリのURLをコピー
名称未設定のデザイン.png

チャットワーク側の設定

初めに 構築手順で、チャットワークAPIトークンの取得した時の画面で
IMG_9152.png
Webhookを選択




1
新規作成を選択
8CC69A5B-862A-4E8B-9F34-81AC9F76E972.png
2214290B-42DF-4698-B4EC-530C83BD6CCF.png

・ルームイベントを選択
・メッセージ作成にチェックを入れる
・ルームIDにbotを使用するルームのIDを入れる

名前 入れるもの
Webhook名 お好きな名前を入れる
Webhook URL 先程コピーしたWebアプリのURL

作成を選択して完了する

確認

IMG_0629.jpeg
きちんと反応しました!
これで完了ですお疲れ様でした。

実際に使っているコードです。 

1
2
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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?