Bot

Bot Runtime API 2.0 attachments で「Request body cannot be parsed」になる

ぼまぼま

2026.02.10既読 31

LINE WORKS Bot Runtime API 2.0 を使用して、Bot から PDF ファイルを送信しようとしています。

メッセージ送信 API は正常に動作していますが、
attachments(ファイルアップロード)API のみ、何度試しても下記エラーになります。

upload status: 400 upload body: {"code":"INVALID_PARAMETER","description":"Request body cannot be parsed."}

現在呼び出しているエンドポイントは公式ドキュメント通りです。

POST https://www.worksapis.com/v1.0/bots/{botId}/attachments

試したこと:

・multipart/form-data で file を送信
・application/json で fileName / fileSize / contentType を送信
・requests の files パラメータ使用
・requests の json パラメータ使用
・Content-Type の有無、指定方法の変更
・Bot Token は正常取得(メッセージ送信は成功するため認証は問題なし)

いずれの場合も同じエラーになります。

そのため fileId が取得できず、メッセージにファイルを添付できません。

質問したいことは下記です。

Bot Runtime API 2.0 の attachments に対する「正しいリクエストボディの形式」を教えていただきたいです。

公式ドキュメントやサンプルコードと同じ形式で送ってもパースエラーになるため、
実際に動作しているリクエスト例(Python / curl / Postman など)を知りたいです。

特に知りたい点:

・attachments API は multipart か JSON のどちらが正しいのか
・必須パラメータの正式なキー名
・成功時に fileId が返る正しいリクエスト例

同様の実装をされた方がいらっしゃいましたら、ご教示いただけると助かります。

コメント1

  • 업데이트 된 답글입니다.

    ぼまぼま 投稿者

    【自己解決】BotでPDF送信時、アップロードURLで401になる件の原因

    同様の現象で詰まる方が出ると思われるため、解決内容を共有します。

    ■ 症状

    Bot から PDF ファイルを送信する処理で、以下の手順を実装。

    POST /bots/{botId}/attachments で uploadUrl と fileId を取得 → 成功 (200)

    取得した uploadUrl に対してファイルをアップロード → 401 Unauthorized

    fileId を使ってメッセージ送信 → content.fileId is invalid

    トークン取得、Scope(bot / bot.message / file)も正常で、fileId も正しく返ってきているのに、ストレージへのアップロードだけが 必ず401 になる状態でした。

    ■ 原因

    ストレージサーバー(apis-storage.worksmobile.com)へのアップロード時のリクエスト形式が仕様通りになっていなかったことが原因でした。

    重要ポイントは以下の2つです。

    Authorization: Bearer {token} を付ける

    multipart/form-data 形式(requests の files=)でアップロードする

    PUT や binary 送信、Content-Type: application/pdf では 401になります。

    ■ 正しいアップロード方法(Python例)
    def upload_binary(token, upload_url):
       headers = {"Authorization": f"Bearer {token}"}

       with open(PDF_PATH, "rb") as f:
           files = {
               'file': (os.path.basename(PDF_PATH), f, 'application/pdf')
           }
           res = requests.post(upload_url, headers=headers, files=files)

       print(res.status_code, res.text)


    この形式にしたところ、

    step2 upload: 200
    step3 send: 201


    となり、正常にファイル送信できました。

    ■ 結論(重要)

    uploadUrl へのアップロードは

    Authorizationヘッダー付き + multipart/form-data

    でなければならない。

    ここがドキュメントから非常に読み取りにくく、多くの方がハマるポイントだと思われます。

    同様の症状の方の参考になれば幸いです。

    2026.02.10

    0
次の投稿Bot 利用ユーザーの登録APIの不具合について
リスト

まだ、解決できませんか?
今すぐ実際に使用しているLINE WORKSユーザーに質問してみましょう。