🐭

パラメータストアを活用してChatWorkにメッセージを投稿してみた

2024/11/11に公開

こんな方向けの記事です。

・とりあえずChatWorkにメッセージを飛ばす仕組みを作りたい。
・コードの中にChatWorkのトークンコードとルームIDは入れたくない。

https://zenn.dev/mokomap_cloud/articles/dedfd802ea033d

前提

ChatWorkでメッセージを投稿したいルームが存在している事。
nodejsで記載していますのでnode、npmコマンドが入っている事。
今回はAWS CloudShellを使います。
(EC2でも可能ですが、アウトバウンドルール443が開いている必要あり)

さっそく実装(ChatWorkの各種IDの確認)

ルームIDはChatWorkのURLに載っている、ridから始まる数字です。
こちらを控えておきましょう。※下記の画像は数字を切り取りしてます。

 
 

トークンコードは利用者名を押下して「サービス連携」に移ります。

 
 

APIトークンからトークンコードをコピーして控えておきましょう。
※下記の画像はIDを切り取りしてますので空白ですが皆さんには表示されていると思います。

さっそく実装(SSMパラメータに登録)

CloudShellから下記コマンドでパラメータストアに登録しましょう。
今回は東京リージョンを使います。

aws ssm put-parameter --region ap-northeast-1 \
--name "/chatwork/roomId" \
--value "<ルームID>" \
--type "String" \
aws ssm put-parameter --region ap-northeast-1 \
--name "/chatwork/token" \
--value "<トークンコード>" \
--type "SecureString"

 
 

それぞれ下記が返ってきたら成功です。

{
    "Version": 1,
    "Tier": "Standard"
}

さっそく実装(jsファイル作成)

「@aws-sdk/client-ssm」をインストールしましょう。

npm install @aws-sdk/client-ssm

 
 

jsファイルを作成しましょう。

vi mokomap_chatwork.js

 
 

下記を貼り付けましょう。

const https = require('https');
const querystring = require('querystring');
const { SSMClient, GetParameterCommand } = require('@aws-sdk/client-ssm');

// SSM クライアントの設定
const ssmClient = new SSMClient({ region: 'ap-northeast-1' });

// コマンドライン引数からメッセージを取得
const message = process.argv.slice(2).join(' ');

if (!message) {
  console.error('エラーメッセージ: メッセージを入力してください。');
  process.exit(1);
}

// SSM パラメータから値を取得する関数
async function getParameter(name, withDecryption = false) {
  const command = new GetParameterCommand({
    Name: name,
    WithDecryption: withDecryption,
  });
  const response = await ssmClient.send(command);
  return response.Parameter.Value;
}

// メッセージ送信関数
async function sendChatWorkMessage() {
  const roomId = await getParameter('/chatwork/roomId');
  const token = await getParameter('/chatwork/token', true);

  // Chatwork API の URL とメッセージ設定
  const chatworkURL = `https://api.chatwork.com/v2/rooms/${roomId}/messages`;
  const postData = querystring.stringify({ body: message });

  const options = {
    hostname: 'api.chatwork.com',
    path: `/v2/rooms/${roomId}/messages`,
    method: 'POST',
    headers: {
      'X-ChatWorkToken': token,
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': Buffer.byteLength(postData),
    },
  };

  // HTTPS リクエストの送信
  const req = https.request(options, (res) => {
    let data = '';

    res.on('data', (chunk) => {
      data += chunk;
    });

    res.on('end', () => {
      if (res.statusCode === 200) {
        console.log('メッセージが正常に送信されました:', message);
      } else {
        console.error(`エラー: ステータスコード ${res.statusCode}`, data);
      }
    });
  });

  req.on('error', (error) => {
    console.error('リクエストエラー:', error);
  });

  req.write(postData);
  req.end();
}

// メッセージを送信
sendChatWorkMessage();

ここまで出来たら完成です!

検証

好きなメッセージを入れてコマンドを実行しましょう。

node mokomap_chatwork.js "<メッセージ>"

 
 

ちゃんと送られてきてますね!成功です!

あとがき

今回は標準ライブラリの「https」を使用しましたので少し長めの構文になりましたが
「axios」や「node-fetch」を使用すればもう少し構文を短くできそうです。
普段はPythonばかりでNodejsを使うことが無いので今回は勉強がてら作ってみました。
ChatWorkも地味に初めてでした笑
EC2サーバ内でCronとかを使ったりすれば毎日の定型作業を自動化出来たり
スクリプトに混ぜ込めば、特定のメッセージを送ることも可能なので
広く活躍してくれそうです。

この記事は下記ドキュメントを参考にしています。

https://help.chatwork.com/hc/ja/articles/115000172402-APIトークンを発行する

https://docs.aws.amazon.com/ja_jp/cloudshell/latest/userguide/welcome.html

Discussion