【Node.js】Masto.jsでMastodonのタイムラインを見る with TypeScript


タイトルを一番最初に決めたおかげで、公開から30分間ぐらいタイトル詐欺になっていました。申し訳ございません。

Masto.js とは?

  • MastodonのAPIをぶっ叩くためのライブラリ1
  • ブラウザでもNode.jsでも動く。

今回は初歩の初歩なので、Node.jsでしか試してないです。

インストール

npm i --save mastoこれで終わり。npmさまさまですね。

環境

  • Wnidows10 1903
  • WSL Ubuntu 18.04 LTS
  • Node 10.16.0
  • npm 6.9.0
  • TypeScript 3.5.1
  • Masto.js 2.1.1

VSCodeのターミナルでWSLを呼び出して使っています。WSLすごいですね。これ2まで出るんですよ。
ちなみに今回はTypeScriptを使っていますが、JavaScriptでも動くんじゃなかろうかと思います。

使い方

を載せたいのですが、実行しようとしたらエラーが出たので軽く解決2しておきます。

面倒そうなタイプのエラー

(TypeScriptだけに)
くだらんギャグを飛ばしてる場合じゃありません。なんかtsc兄貴が

Module '"/mnt/c/Users/user/Documents/GitHub/KannaBot/node_modules/eventemitter3/index"' can only be default-imported using the 'esModuleInterop' flag
This module is declared with using 'export =', and can only be used with a default import when using the 'esModuleInterop' flag.

などと長ったらしいエラーを吐き出しやがりました。
import Masto from 'masto'(後述)をやめてconst Masto = require('masto')で呼んだらコンパイル通りましたが、型をanyにされるのは嫌なので解決策を探すことに。しかしググっても出てこない
node_modules深層のほうの型定義ファイルでexport =になってるのが原因くさいのでそこに向かい、export defaultにすり替えてみます。するとコンパイルが通りました。なんというか、どうなってるのか、全然わからん!

Node.jsに詳しい方、どなたかご教示願います。
「こんなエラー出ずに普通に動いたけど…」「エラー出た…」という方も教えてくださると嬉しいです。

気を取り直して…

local.ts

import Masto from "masto";

(async () => {
    const client = await Masto.login({
        uri: //hogehoge
    });
    const stream = await client.streamCommunityTimeline();

    stream.on('update', status => {
        console.log(`${status.account.display_name}(${status.account.acct}): ${status.content}  ${status.created_at}`);
    });
})()

hogehogeの部分は適当なインスタンスに変えてください。
streamCommunityTimeline()はローカルTLのストリーミングです。streamPublicTimeline()に変えると、連合TLのストリーミングができます。

stream.on()のコールバックにより、新しいトゥートが来るたび
もみにす/Mominis(mn): <p>平和そう</p> 2019-06-01T04:12:04.753Z
もみにす/Mominis([email protected]): <p>Node.jsと和解できそう</p> 2019-06-01T04:20:45.000Z
こんな感じのトゥート内容がconsoleに垂れ流されます。

下の表は、上にあるconsole.logの中身メソッドの紹介です。uriを"best-friends.chat"に設定したときのものになっており、他のインスタンスから見ると若干変わって見えるやもしれません。

status.account.display_name status.account.acct status.content status.created_at
自由に変更できる、ディスプレイネーム。 メンションするときとかに使う変更不可の名前。他鯖の人には@ドメイン名がつく。 トゥート内容。 トゥート日時。
もみにす/Mominis mn <p>平和そう</p> 2019-06-01T04:12:04.753Z
もみにす/Mominis [email protected] <p>Node.jsと和解できそう</p> 2019-06-01T04:20:45.000Z


イメージ図。

アプリ認証とかについて

アプリ認証になると大変そうだし、この記事は初歩の初歩だし、インスタンスへの登録なしで使えるAPIだけ叩きました。登録が必要な本格APIについてはあとで書くつもりです。

おわりに

TypeScript要素なかった…タグ付け詐欺だ…


  1. ライブラリ、であってると思うんだけど用語の暗記が適当すぎて自信がない。 

  2. その場しのぎ、とも言います。