Open7

mastodonを始めたので、RSSで何かをするbotを作ってみたい

MasatMasat

何を作るかはあまり考えていない。作りながら考えるつもり。なお初心者かつ少しづつ作るため時間がかかると思う。

せっかくなのでdenoで作ろうと思う。denoは環境構築のあれこれの手間が少ないので良い。

mastodon cliantのライブラリ(奇しくも名前が似ている)
https://deno.land/x/masto

作成前にmastodonのアカウントを作成し、アカウントからアプリを作成。アクセストークンを取得する

MasatMasat

サンプルを動かそうとしたが、うまくいかず。少し試行錯誤。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モジュールも簡単に取り扱えて実にいい!

MasatMasat

別のスクラップに書いた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',
});

なんか簡単すぎて拍子抜け。もう少し手を入れて遊びたい

MasatMasat

結果以下のように。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',
  });

}

MasatMasat

トークンやインスタンスは、直接書いちゃいけないと学んだ👺
よって環境変数から読み込むようにした


//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="取得したアクセストークン"