質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.96%

Node-REDからチャットワークAPIを利用したメッセージ投稿で400エラー

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 172

qopllqopllqop

score 32

前提・実現したいこと

Node-REDを使用して、チャットワークと連携し、チャットボットの制作を行っています。
Node-REDからチャットワークにメッセージをPOSTするところで以下のエラーメッセージが発生しました。
Node-REDからチャットワークにメッセージをPOSTしたいと考えています。
知識も浅く、初めてNode-REDを使用しております。
大変恐れ入りますが、解決に向けましてアドバイスをいただけますと幸いです。
よろしくお願いいたします!

発生している問題・エラーメッセージ

errors: "Parameter 'body' is required"
statusCode: 400

該当のソースコード

Functionノード

var post_request = {
    headers:{'X-ChatWorkToken':'************************'},
    form:{body:'あいうえお'},
    json: true
    };

return post_request;


httpリクエストノード

メソッド:POST
https://api.chatwork.com/v2/rooms/{roomID}/messages

試したこと

過去記事
https://teratail.com/questions/180524
を確認しました。

送信時のコンテントタイプを「application/x-www-form-urlencoded」にする必要があるとのことで
let params = "body=\(msg)"
とすると良いとありますが、jsonの中で、どのように記述すれば良いのかわかりませんでした。

headers に Content-Type: "application/x-www-form-urlencoded"
入れてみましたが、エラーは解消しませんでした。

補足情報(FW/ツールのバージョンなど)

Node-RED Ver 1.0.2

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

Node-REDの場合、以下のように指定することでChatworkの指定のルームIDのグループチャットにメッセージを投稿できましたので、ご紹介します。

1. functionノードの指定
msg.headersにHTTPリクエストのヘッダーフィールド、msg.payloadにHTTPリクエストのコンテントボディ部をセットします。

/* functionノード */
msg = {
  'headers':{
    'X-ChatWorkToken': '<APIトークン>',
    'Content-Type': 'application/x-www-form-urlencoded'
  },
  'payload': {
    'body':'01234567ABCDEFGあいうえおかきくけこ',
  }
};

return msg;


2. http requestノードの指定
イメージ説明

ちなみに上記のHTTPリクエストをlocahost:8000宛(※)に送ると、以下のような内容となります。'body':'01234567ABCDEFGあいうえおかきくけこ'部分が自動的にURLエンコーディングされていることが分かります。

ncコマンドを利用し、TCPポート8000番でローカルサーバーとして簡易的に立ち上げています)

$ nc -l 8000
POST /v2/rooms/roomid/messages HTTP/1.1
X-ChatWorkToken: ChatWorkAPIToken
Content-Length: 110
Content-Type: application/x-www-form-urlencoded
host: localhost:8000
Connection: close

body=01234567ABCDEFG%E3%81%82%E3%81%84%E3%81%86%E3%81%88%E3%81%8A%E3%81%8B%E3%81%8D%E3%81%8F%E3%81%91%E3%81%93


Node-RED version: v1.0.2, Node.js v12.13.0, Windows 7 64ビット版で確認しました。


追記しました: 2019-11-07 04:57

HTTPリクエストのヘッダーフィールド部の設定ですが、リクエストヘッダをセット - Node-RED クックブック に従って、以下のような指定方法でもできました。

/* functionノード */
msg.headers = {}
msg.headers['X-ChatWorkToken'] = '<APIトークン>';
msg.headers['Content-Type'] = 'application/x-www-form-urlencoded';

msg.payload = {
  'body':'01234567ABCDEFGあいうえおかきくけこ',
}
return msg;

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/07 06:15

    再度ありがとうございます!
    Node-REDを使うにあたり、こちらの方が美しいですね!
    こちらも試させていただきます!

    キャンセル

  • 2019/11/13 04:31

    その後、教えていただいた通りクックブックに沿った設定にしていたにも関わらず、401エラー'Invalid API token'が出るようになり、送信できなくなってしまいました。 その対処方法もわかりましたので共有させていただきます。

    http requestにURLを入れた状態でフローを作成すると、「401エラー」が頻発します。
    送信できていても、http requestを開き、上書き保存すると401エラーになります。
    詳しい原因は解明できていませんが、http requestにURLを記述せず、手前にchangeノードを設置し、msg.payloadにURLをset(代入)することで、安定してPOSTできるようになりました。

    そのことから、token自体には問題がないと思います。
    functionノードからhttp requestノード間でのtokenの受け渡し(headersの受け渡し)に何か問題があるのではないかと思います。

    URLを変数で動的に設定したい場合は、functionノードでflow.set()関数などを使って、URLをfolwにセットし、changeノードでmsg.urlにsetすれば、動的なURLも設定可能です。

    dodox86様ありがとうございました!

    キャンセル

  • 2019/11/13 08:11

    Node-REDの情報はまだまだ少ないと思える中、私以外の方にもノウハウのひとつとなると思います。情報提供、どうもありがとうございます。

    キャンセル

0

ありがとうございます!無事解決いたしました!

やはりheadersに'Content-Type': 'application/x-www-form-urlencoded'が必要だったのですね。
また、body部分ははpayloadで括らなければならないこともわかり、とても勉強になりました!

初歩的な質問にも関わらず、とてもわかりやすい例を作成していただいまして本当にありがとうございます!
丸2日ほどハマっていたので助かりました。心より感謝いたします!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/11/07 05:02

    お役に立てて良かったです。HTTPヘッダー部の設定方法について、もうひとつの方法を試しましたので、追記しました。(と言いますか、こちらの方が公式のクックブックで紹介しているものなので分かりやすいかも、です)

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる