まあね。。。あんまり良くないんですよ。

でも公式アカウントの情報をみたいじゃないですか?

んで、今回は前も書いた気がしなくもないですがn8nとモロヘイヤを利用してMastodonに投稿する方法についてメモがてら書いておきます。

準備

n8nをインストールします。

私はDockerを使用していますが、この後curlを使いたいのでDockerイメージを自分でビルドしておく必要があります。

Dockerfile

FROM n8nio/n8n

RUN apk --update add curl

後は起動して適当に設定しておく。

Twitterのアクセスキーなどを取得する

やり方は省きます。

Consumer KeyとConsumer Secretをとりましょう。

適当に英語で申請しても意外とする許可されます(が、マスクの前にやったやつなので今は知りません)

サーバにモロヘイヤを導入する

自分のサーバにモロヘイヤを導入してWebhookを使えるようにしておきましょう。

これを使って投稿をします。

なので、Pleroma,Mastodon,Misskeyなどに投稿が可能です。

Workflow

ここは前もDiscordに投稿するやつで書きましたが、ほぼ一緒です。

ここではプリキュアプリティストアのアカウント @pps_as を例として作成します。

Cron

まあ好きなタイミングで、オススメは30分くらいですかね。

Twitter

先程取得した認証情報と一緒に設定します。

Search Textには取得したいアカウントIDなどを含んたクエリを記載します。

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

リミットは大体5くらい。

今回は画像もほしいのでModeはExtendedにします。

新着取得

n8nは新着だけを・・みたいなことができないので自力でやる必要があります。

まあ適当ですが大体こんな感じでやれば行けます。

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

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

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

return pushitems;

メディア取得

若干雑ですが、モロヘイヤに画像を渡すためにこんな感じで設定します。

一旦photoのみですね。

Twitterの情報にextended_entitiesが存在したら、そこに書かれているURLを取得してきます。

ついでにここでcURL用に成形します。

var pushitems = [];
var attachments = [];

items.forEach((val, index) => {
  attachments = [];
  full_text = val.json.full_text;
  if ('extended_entities' in val.json){
    media = val.json.extended_entities.media;
    media.forEach((v, index) => {
      if (v.type == 'photo'){
        attachments.push({"image_url": v.media_url_https});
      }
    })
    pushitems.push({ body: {"text": full_text + "\n#precure_fun", "attachments": attachments }});
  }else{
    pushitems.push({ body: {"text": full_text + "\n#precure_fun"}});
  }
});

return pushitems;

cURL Mulukhiya

これは Execute Commandを使用します。

curl https://mstdn.example.com/mulukhiya/webhook/xxxxxxxxxxxxxxxxxxxxx \
-H 'Content-Type: application/json' \
-X POST \
-d @- << EOF
{{ JSON.stringify($json["body"])}}
EOF

こんな感じでcURLで渡してあげます。

多分メディアがなくてもうまくいくかな・・・?


あとは動かしてみて投稿されればおk!

簡単ですが、自分のメモ用なのでご容赦を。

ああ、あとMastodonしか動作確認してないですw

では、また。