まあね。。。あんまり良くないんですよ。
でも公式アカウントの情報をみたいじゃないですか?
んで、今回は前も書いた気がしなくもないですが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分くらいですかね。
先程取得した認証情報と一緒に設定します。
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
では、また。
@[email protected] 画像がないときにうまく動かなかったのと、メディア取得周りが汚かったのできれいにした。