Open7
mastodonを始めたので、RSSで何かをするbotを作ってみたい
何を作るかはあまり考えていない。作りながら考えるつもり。なお初心者かつ少しづつ作るため時間がかかると思う。
せっかくなのでdenoで作ろうと思う。denoは環境構築のあれこれの手間が少ないので良い。
mastodon cliantのライブラリ(奇しくも名前が似ている)
作成前にmastodonのアカウントを作成し、アカウントからアプリを作成。アクセストークンを取得する
サンプルを動かそうとしたが、うまくいかず。少し試行錯誤。npmモジュールとして読み込むことにする。
import { mastodon,login } from 'npm:masto@5.7.0';
const masto = await login({
url: 'mastodonインスタンスのURL',
accessToken: '作成したアクセストークン',
});
const s: mastodon.v1.Status = await masto.v1.statuses.create({
status: 'Hello from #mastojs!',
visibility: 'unlisted',
});
console.log(s);
npmモジュールも簡単に取り扱えて実にいい!
別のスクラップに書いたRSSの取得と組み合わせる。
import { login } from 'npm:masto@5.7.0';
import { parseFeed } from 'https://deno.land/x/rss/mod.ts';
//マストドンオブジェクト
const masto = await login({
url: 'mastodonインスタンスのURL',
accessToken: '作成したアクセストークン',
});
//Feedの取得
const response = await fetch(
'https://deno.com/feed',
);
const xml = await response.text();
const { entries } = await parseFeed(xml);
const title = entries[0].title.value;
const link = entries[0].links[0].href;
const toot = title + '\n' + link;
//Tootする
const s: mastodon.v1.Status = await masto.v1.statuses.create({
status: toot,
visibility: 'unlisted',
});
なんか簡単すぎて拍子抜け。もう少し手を入れて遊びたい
pythonでtootする方法を書いている方の記事の中に公開レベルについての記載があったので当記事も修正
'public' から 'Unlisted'に修正しました
今日はランダムの使い方を学ぶ。MDNはわかりやすい。
結果以下のように。for文の中はconstかletか悩む(どちらでも動くけど)
import { login } from 'npm:masto';
import { parseFeed } from 'https://deno.land/x/rss/mod.ts';
//ランダムな整数を得る
function getRandomInt(max) {
return Math.floor(Math.random() * max);
};
const masto = await login({
url: 'mastodonインスタンスのURL',
accessToken: 'アクセストークン',
});
//RSSを読み込む
const response = await fetch(
'https://deno.com/feed',
);
const xml = await response.text();
const { entries } = await parseFeed(xml);
//直近5件のうちの2件をランダムにtoot
for (let index = 0; index < 2; index++) {
const randamnumber = getRandomInt(5);
const title = entries[randamnumber].title.value;
const link = entries[randamnumber].links[0].href;
const toot = title + '\n' + link;
const s: mastodon.v1.Status = await masto.v1.statuses.create({
status: toot,
visibility: 'unlisted',
});
}
トークンやインスタンスは、直接書いちゃいけないと学んだ👺
よって環境変数から読み込むようにした
//Mastodonにログイン
const masto: Mastodon = await login({
//環境変数から取得
url: Deno.env.get('MASTODON_URL'),
accessToken: Deno.env.get('MASTODON_ACCESS_TOKEN'),
});
環境半数はこんな感じ
# The URL of the Mastodon instance to use
MASTDON_URL="インスタンスのURL"
# The access token of the bot account
MASTODON_ACCESS_TOKEN="取得したアクセストークン"