🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

Q&A

解決済

2回答

1946閲覧

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

qopllqopllqop

総合スコア36

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

ChatWork

業務の効率化を目的としたコミュニケーションツール。 グループチャット、ビデオ・音声通話、ファイル共有、タスク管理などの機能を備えています。マルチデバイス対応で、ブラウザだけでなくタブレットやスマートフォンでも利用可能です。

0グッド

0クリップ

投稿2019/11/06 03:07

前提・実現したいこと

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

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

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

該当のソースコード

Functionノード

javascript

1var post_request = { 2 headers:{'X-ChatWorkToken':'************************'}, 3 form:{body:'あいうえお'}, 4 json: true 5 }; 6 7return 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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

JavaScript

1/* functionノード */ 2msg = { 3 'headers':{ 4 'X-ChatWorkToken': '<APIトークン>', 5 'Content-Type': 'application/x-www-form-urlencoded' 6 }, 7 'payload': { 8 'body':'01234567ABCDEFGあいうえおかきくけこ', 9 } 10}; 11 12return msg;

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

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

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

bash

1$ nc -l 8000 2POST /v2/rooms/roomid/messages HTTP/1.1 3X-ChatWorkToken: ChatWorkAPIToken 4Content-Length: 110 5Content-Type: application/x-www-form-urlencoded 6host: localhost:8000 7Connection: close 8 9body=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 クックブック に従って、以下のような指定方法でもできました。

JavaScript

1/* functionノード */ 2msg.headers = {} 3msg.headers['X-ChatWorkToken'] = '<APIトークン>'; 4msg.headers['Content-Type'] = 'application/x-www-form-urlencoded'; 5 6msg.payload = { 7 'body':'01234567ABCDEFGあいうえおかきくけこ', 8} 9return msg;

投稿2019/11/06 11:57

編集2019/11/06 20:34
dodox86

総合スコア9254

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

qopllqopllqop

2019/11/06 21:15

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

2019/11/12 19: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様ありがとうございました!
dodox86

2019/11/12 23:11

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

0

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

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

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

投稿2019/11/06 18:59

qopllqopllqop

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2019/11/06 20:02

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問