見出し画像

Chatworkの添付ファイルをAPIで取得する

いまやってる、ChatworkでGPT4を使う中で、VectorStoreに格納するファイルも、どうせならChatworkでアップロードしたいなって思い始めました。

大まかな手順

1)添付付きでメッセージを投げます。
2)メッセージからファイルIDを取得します。
3)ファイルをダウンロードするURLを取得します。
4)URLを使用してファイルをダウンロードします。
  このURLは30秒間のみ有効です。

メッセージからファイルIDを取得します。

メッセージを受診すと、Webhookで以下のように受信されます。

本文です
[info][title][dtext:file_uploaded][/title][download:1466244790]ファイルです.pdf (54.06 KB)[/download][/info]

このなかで、"1466244790"の部分がファイルIDとなります。
ここでひとハマりしましたorz

[info]がきた時、概要文の表示もこの内容でくるので、読み飛ばすようにしてたんですよね。いくら待ってもメッセージが来ない!!
で、表示して見たらあ〜あ。。。
"file_uploaded"が来たら対応するようにしました(^^;

ファイルをダウンロードするURLを取得します。

次に、ファイルIDを使ってファイルの情報を取得します。
エンドコード:/rooms/{room_id}/files/{file_id}?create_download_url=1

const cnsUrl   = `https://api.chatwork.com/v2/rooms/${_room_id}/files/${_file_id}?create_download_url=1`;
const cnsToken = process.env.CHATWORK_TOKEN;
const response  = await axios ({        // To Chatwork
    method : 'get',
    url    : cnsUrl,
    headers : {
        'X-ChatWorkToken': cnsToken
    }
});

create_download_url=1を指定するとダウンロードのURLが返却されます。

{
"file_id": 1465351041,
"message_id": "1841209019335725056",
"filesize": 7120,
"filename": "chatwork01.pdf",
"upload_time": 1715452037,
"account": {
 "account_id": 001000,
 "name": "上辻 敏之"
},
"download_url":"https://appdata.chatwork.com/xxxxxx"
}

URLを使用してファイルをダウンロードします。

try {
    const response = await axios({
        method: 'GET',
        url: _download_url,
        responseType: 'arraybuffer' // バイナリデータとしてレスポンスを扱う
    });

    // ファイルにデータを書き込む
    const cnsOutPath = process.cwd() + '/data/' + _file_name;
    fs.writeFileSync( cnsOutPath, response.data );

    console.log(`File has been downloaded and saved to ${cnsOutPath}`);
} catch (error) {
    console.error('Error downloading the file:', error);
}

おまけ。。

ダウンロードされていないファイルの情報を一括して取得する方法もあります。
エンコード:/rooms/{room_id}/messages
だた、一度取得すると消えてしまうので、注意が必要です。

終わりに。。。。

最初、ファイルIDってどこにあるんだろとかモヤモヤしてましたが、やってみてわかったってやつでした(^^)
私は普段からaxiosを使ってるんですが、サンプルはfetchを使うものでした。
この辺は、好みというかってやつですね(^^;
しかし。。。。
複数ファイルをアップロードする時、まとめてアップロードして欲しいなぁ。。
ひとつずつ送信を押す必要があるんですが、本文のないメッセージになっちゃうし、Toとかも落ちちゃうし。。ちょっとなぁ。。。

この記事が気に入ったらサポートをしてみませんか?