LoginSignup
0
0

More than 1 year has passed since last update.

S3の画像が更新された際に、CHATWORKに画像をPOSTする

Posted at

Google Newsshowcaseの外形監視のため、AWSのSynthetics Canariesを使用しています。
(Google NewsshowcaseをSynthetics Canariesを監視する説明は、別投稿で。)

Synthetics Canariesはキャプチャをs3に置きますが、すぐに確認したく、CHATWORKに画像をPOSTすることに。
Synthetics Canariesのスクリプトを修正しても良かったのですが、機能をファットにせずに役割分担をしようと。

  • Synthetics Canariesは、外形監視のデータを集めるだけ
  • Cloudwatch Logsで、データをチェックするだけ
  • 本スクリプトは、キャプチャを送るだけ

axiosをつかって、CHATWORKに画像をPOSTするのに少しハマりました。

https://developer.chatwork.com/reference/post-rooms-room_id-files
公式だとよくわかりませんでした。

https://www.npmjs.com/package/chatwork-api-client/v/0.3.3?activeTab=readme
npmがあったので参考に。それを使えば良いのでは……、と思いつつ、作者がCHATWORKを使用しなくなったためdeprecatedです。

  1. form-dataを作成する。fileやmessageをappendする。
  2. fileはobjectにして、メタデータが必要。
import axios from 'axios'
import FormData from 'form-data'

export const postChatworkfiles = async (cwRoomId, cwTokenKey, file, fileName, message = '') => {
    const form = new FormData();

    form.append('file', file, {
        contentType: 'image/png',
        filename: fileName,
        knownLength: file.length,
    });
    form.append('message', message)

    let config = {
        headers: {
            'X-ChatWorkToken': cwTokenKey,
            'Content-Type': 'multipart/form-data',
            'Accept': 'application/json'
            ,
            ...form.getHeaders()
        }
    };

    try {
        let response = await axios.post('https://api.chatwork.com/v2/rooms/' + cwRoomId + '/files', form, config);
        console.log((JSON.stringify(response.data)));
        return response.data;
    } catch (error) {
        console.log(JSON.stringify(error));
    }
}

s3からファイルを呼ぶ側。v3からstream形式での取得になったので、取得したBufferを結合して、上記のCHATWORK post関数に。

export const lambdaHandler = async (event, context) => {
    const s3Client = new S3Client({
        region: "ap-northeast-1"
    });
    try {
        const streamToString = (stream) =>
            new Promise((resolve, reject) => {
                const chunks = [];
                stream.on("data", (chunk) => chunks.push(chunk));
                stream.on("error", reject);
                stream.on("end", () => resolve(Buffer.concat(chunks)));
            });

        const data = await s3Client.send(new GetObjectCommand({ Bucket:  event.Records[0].s3.bucket.name , Key: event.Records[0].s3.object.key }));
        const bodyContents = await streamToString(data.Body);
     const r = await postChatworkfiles('{roomid}','{token}',bodyContents, event.Records[0].s3.object.key,'今日のgoogleーshowcaseです')
    

S3のイベント設定。他の画像に反応しないように、prefixと、suffixをつけて、画像更新時にイベント発火する形
image.png

成功。

image.png

0
0
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
0
0