n8nでTwitterの新着をDiscordに投稿

Twitterの新着をDiscordに通知したくなったので、n8nで作成したときのメモ。

前提

n8nは構築済みとする

Twitterのキー等は取得済みとする

ワークフロー

完成図。

まずは一個ずつ見ていこう。

Cron

このワークフローのトリガーはCronとして、大体よくあるゲームの公式Twitterであれば、15~30分に1回動かせばいいと思う。

*/15 * * * *

ここはそれだけで大丈夫。

Twitter

Twitterは事前にCredentialを作成しておく必要があるが、ここでも作れる。

なお、作成の際にコールバックURLが必要だったりするので注意。

Resource

Tweet

Operation

Search

Search Text

from:アカウントID -RT exclude:replies

Limit

5

Additional Fields

Compatibility

とりあえずこのような設定でいいと思う。

新着を見るにはSearchAPIを使う。

検索クエリは大体この設定にしておけば、RTやリプライが含まれない純粋な投稿が取れるはず・・・。

今回は使わないが、画像とかツイートの全文がほしいときはAdditional FieldsをExtendedにすると取得できる。

ちなみに今回はレスポンスに含まれる、created_atid_strだけが必要。

Function

n8nでは最新のやつだけを通知みたいな機能がないので、自身でやる必要がある。

const staticData = getWorkflowStaticData('global');
var pushitem= [];

if (staticData.lastData === undefined) {
  lastUnixDate = Date.parse('01 Jan 1970 00:00:00 GMT');
} else {
  lastUnixDate = Date.parse(staticData.lastData);
}

items.reverse().forEach((val, index) => {
  currentDate = val.json.created_at;
  currentUnixDate = Date.parse(currentDate);
  if (lastUnixDate < currentUnixDate) { 
   staticData.lastData = currentDate;
    pushitem.push(val);
  }
});

return pushitem;

昔どこかから拝借したものだが、これでcreate_atから投稿日を取得して、前回通知したものより新しければアウトプットするという形にしている。
ちなみにこれはもともとRSSの新着を取るようだったが、基本的にどれもこれで流用できそうだ。

Discord

ここは極めて簡単。

予めDiscordでWebhook URLを取得しておく。

Webhook URL

取得したWebhookのURL

Content

https://twitter.com/アカウントID/status/{{$json["id_str"]}}

Contentは今回ツイートのURLだけを共有したいので(Discordはembedがつくられるので)、こんな感じにしておく。

id_strがツイートのIDになるようだ。

おわりに

こんな感じでn8nを使えば簡単に最新ツイートをDiscordに送ることができる。

強いて言えば、Twitterのアクセスキーを取得したり、n8nをそもそも建てるのがだるいので、そこさえ突破してしまえば色々できるので、やって見る価値はあるかなと思う。

では、また。