Edited at

Node-RED で Twitter ダイレクト・メッセージ を送る場合の備忘録

More than 1 year has passed since last update.


0. はじめに

ちょっとした落とし穴にハマった後、「こんなところにハマるのは自分だけだし、一度経験した自分も二度ハマるわけが無い」と思っていたところ、解決した記憶があるエラーを見続ける事になったので、記事にしておきます。


1. Twitter の出力ノードの使い方

Twitter.png

通常のツイート:

ドラッグ・ドロップ後に認証情報をセットアップすれば、msg.payload で渡した内容をツイートします。

ダイレクト・メッセージ:

ドキュメントに「記載の通り」、 msg.payload 内へ文字列で送信先を指定します。

間違えようの無い簡単さです。

msg.payload = "D 相手のユーザー名 ダイレクトメッセージで送る内容";

ドキュメントの記載:

To send a Direct Message (DM) - use a payload like "D {username} {message}"


(本文より長い)補足

1) Node-RED で何かする前に、通常の Twitter クライアントから、ダイレクトメッセージが意図した ID 間で送受信可能なことを事前確認します。

(言うまでも無いことですね。はい、やってませんでした。いや、以前は送受信できていたんですよ、その後 Twitter のアカウント設定を変更しましたが:sweat_smile:

2) JSON 風に記述するのは誤りです。

msg.payload = {

D : {
"username": "相手のユーザー名",
"message": "ダイレクトメッセージで送る内容"
}
};

他の理由でも発生し得る、つまりトラブルシューティングを難しくする以下のエラーとなります。

017/5/26 16:22:36node: Tweetmsg : error

"Error: HTTP Error 401: Unauthorized, API message: {"errors":[{"code":32,"message":"Could not authenticate you."}]}"

3) {} 自体を含めて文字列として記述するのも誤りです。

msg.payload = "D {相手のユーザー名} {ダイレクトメッセージで送る内容}";

当然、{} をエスケープしても誤りです。

msg.payload = "D \{"+ 相手のユーザー名 +"\} \{"+ ダイレクトメッセージで送る内容+"\}";

上記 2) と同様にエラーとなります。

このエラーの場合、「ユーザー名が認識できていない」という意味は伝わってきます。

2017/5/26 16:28:04node: Tweetmsg : error

"Error: HTTP Error 404: Not Found, API message: {"errors":[{"code":50,"message":"User not found."}]}"

ただし、ユーザー名 を @ユーザー名 と記載しても、問題なくダイレクトメッセージを送ることは確認しています。

もちろん、年寄りになったとか、みっちり開発作業を続ける機会を確保しきれていないとか、思うところは色々ありますが、割愛致します:sob: