LoginSignup
2
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2019-06-01

タイトルを一番最初に決めたおかげで、公開から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(m@kiritan.work): <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 m@kiritan.work <p>Node.jsと和解できそう</p> 2019-06-01T04:20:45.000Z

mastodon.png
イメージ図。

アプリ認証とかについて

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

おわりに

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


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

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

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1