Node.js
Twitter
TwitterAPI
Express.js

【Node.js】Twitter APIからDMが飛ばせなくてハマった件


はじめに

勉強目的でNode.js+Express.jsでTwitterAPIを叩くだけの簡単なAPIを作成したのだがDM送信時に認証エラーが出てハマったので備忘として。


twitterSecret.json

{

"consumer_key": "xxxxxxxxxxxxxxxxxxxxxx",
"consumer_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"access_token_key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"access_token_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}


sendDM.js

const twitter = require('twitter');

const fs = require('fs');

/* 略 */

const secret = JSON.parse(fs.readFileSync("twitterSecret.json","utf-8"));
const client = new twitter(secret);

const params = {
event: {
type: "message_create"
, message_create: {
target: {
recipient_id: "xxxxxxxxxxxx"
}
, message_data: {
text: "test"
}
}
}
};

client.post("direct_messages/events/new", params, function(error, data, response){
if(!error){
console.log("成功!");
}
else {
console.log("失敗");
console.log(error);
}
});


あれこれ文献を読み進めながら書いたけど、これで概ねOKなはず...だったのだが下記のエラーに遭遇

{code:32 message: 'Could not authenticate you.'}

どう見ても認証エラー。

てっきりトークンのパーミッションが足りてないのかと思ったけど、他のエンドポイント("direct_messages/events/list"とか "statuses/update")は成功してるから、そういうわけでもなさそう。

というか、DMの送信だけできない


原因・解決方法

あれやこれやと頭を悩ませていると、公式のドキュメントにこんな記述が


Summary

- Message is defined in JSON POST body

- Content-type header must be set to application/json

- JSON body is not included in the generation of the OAuth signature.


ここら辺の仕様にライブラリが対応してないと先のエラーが出るらしい。

というわけで試しにライブラリを変えてみる。

npm install twit

※twitインスタンス作成時のトークンのプロパティは"access_token_key"ではなく"access_token"なことに注意


twitterSecret.json

{

"consumer_key": "xxxxxxxxxxxxxxxxxxxxxx",
"consumer_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"access_token": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"access_token_secret": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}


sendDM.js

//const twitter = require('twitter');    // del

const twitter = require('twit'); // add
const fs = require('fs');

/* 略 */

const secret = JSON.parse(fs.readFileSync("twitterSecret.json","utf-8"));
const client = new twitter(secret);

const params = {
event: {
type: "message_create"
, message_create: {
target: {
recipient_id: "xxxxxxxxxxxx"
}
, message_data: {
text: "test"
}
}
}
};

client.post("direct_messages/events/new", params, function(error, data, response){
if(!error){
console.log("成功!");
}
else {
console.log("失敗");
console.log(error);
}
});


これで問題なく動作した。

てっきり何か認証系の記述を書き洩らしているんだと思ってたから長いことハマってしまった。。。