情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでMastodonのフォローリクエストが来ているユーザーやブロックやミュートしているユーザーを取得する

そもそもMastodonとは何?

Mastodonとは何かについて知りたい方は下の記事を参照してください。

準備

Mastodonのフォローリクエストが来ているユーザーやブロックやミュートしているユーザーを取得するには取得するユーザーの種類に応じて適切なMastodonのAPIを呼び出さなければなりません。

MastodonのAPIを呼び出すにはアクセストークンが必要になりますので、事前に取得しておく必要があります。

Mastodonのアクセストークンを手動で取得する方法については下の記事を参照してください。

Mastodonのアクセストークンを自動で取得する方法については後日記事を書く予定です。

フォローリクエストが来ているユーザーやブロックやミュートしているユーザーの取得

下のようなユーザーを取得するには現在のユーザー(APIを呼び出しているユーザー)のインスタンスの下のようなパスに対してGETHTTPリクエストを行います。

  • 現在のユーザーに対してフォローリクエストを行っている(フォローリクエストがまだ承認も拒否もされていない)ユーザー・・・/api/v1/follow_requests
  • 現在のユーザーがブロックしているユーザー・・・/api/v1/blocks
  • 現在のユーザーがミュートしているユーザー/api/v1/mutes

また、上の3つのHTTPリクエストには下のようなクエリパラメータを指定することもできます。

  • max_id・・・特定の範囲のユーザーを取得する場合に指定します。範囲の上端を番号として指定します。このクエリパラメータを指定した場合には指定した番号以下で、指定した番号に最も近い0人以上のユーザーが取得されます。
  • since_id・・・特定の範囲のユーザーを取得する場合に指定します。範囲の下端を番号として指定します。このクエリパラメータを指定した場合には指定した番号より大きく、指定した番号に最も近い0人以上のユーザーが取得されます。
  • limit・・・取得するユーザーの数の最大値を指定します。

また、上の3つのHTTPリクエストに対するHTTPレスポンスのボディはユーザーを表すオブジェクトの配列から成るJSONとなります。

ユーザーを表すオブジェクトは下のようなプロパティを有します。

  • id・・・ユーザーの番号です。
  • username・・・ユーザーの識別子です。
  • acct・・・ユーザーの完全な識別子です。ユーザーが異なるインスタンスに所属している場合にはインスタンスの名称が含まれます。
  • display_name・・・ユーザーの名称です。
  • locked・・・ユーザーをフォローする場合にユーザーからの承認が必要かどうかです。
  • created_at・・・ユーザーが作成された日時です。
  • followers_count・・・ユーザーがフォローされているユーザー(ユーザーのフォロワー)の数です。
  • following_count・・・ユーザーがフォローしているユーザー(ユーザーのフォロイー)の数です。
  • statuses_count・・・ユーザーのトゥートの数です。
  • note・・・ユーザーのプロフィールです。
  • url・・・ユーザーのウェブページのURLです。
  • avatar・・・ユーザーの画像のURLです。
  • header・・・ユーザーのヘッダ画像のURLです。

また、上の3つのHTTPリクエストに対するHTTPレスポンスのLinkヘッダフィールドにはボディに含まれているユーザーの前のユーザーを取得するためのリンクを表すprevリンクと後のユーザーを取得するためのリンクを表すnextリンクが設定されています。

なお、GETHTTPリクエストを行う方法に関しては下の記事を参照してください。

ただし、HTTPリクエストを行う際にはAuthorizationヘッダフィールドの値にアクセストークンを設定しなければなりません。ただし、アクセストークンの冒頭にはBearerと1文字の空白を付加しなければなりませんので注意してください。

サンプルコード1

mstdn.jpインスタンスの現在のユーザーのフォローリクエストが来ているユーザーを5人取得するGETHTTPリクエストを行い、HTTPレスポンスのボディをJSONとして標準出力に出力します。また、HTTPレスポンスのLinkヘッダフィールドの値も標準出力に出力します。

mastodon-follow-requests.js

var http = require('http');
var https = require('https');
var concatStream = require('concat-stream');
var mimelib = require('mimelib');
var jschardet = require('jschardet');
var iconvLite = require('iconv-lite');
var pump = require('pump');

var u = {
    protocol: 'https:', 
    hostname: 'mstdn.jp', 
    path: '/api/v1/follow_requests', 
    headers: {
        'Authorization': 'Bearer 1a5429d614323f78d6254d4c1a2446c53f6a027807ff73a2a237963fecc9ff44'
    }
};

var client = (u.protocol === 'https:' ? https : http).get(u, function (res) {
    if (res.statusCode === 200) {
        var writable = concatStream(function (data) {
            var encoding = undefined;
            if (res.headers['content-type'] !== undefined) {
                encoding = mimelib.parseHeaderLine(res.headers['content-type']).charset;
            }
            if (encoding === undefined) {
                encoding = jschardet.detect(data).encoding;
            }
            if (encoding !== undefined && iconvLite.encodingExists(encoding)) {
                console.log(JSON.parse(iconvLite.decode(data, encoding)));
                console.log(res.headers['link']);
            }
            else {
                console.error('can\'t detect encoding.');
                process.exit(1);
            }
        });
        pump(res, writable, function (err) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
        });
    }
    else {
        console.error(http.STATUS_CODES[res.statusCode]);
        process.exit(1);
    }
});
client.setTimeout(10000, function () {
    console.error('timeouted.');
    client.abort();
});
client.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

実行結果

C:\work\node>node mastodon-follow-requests.js
[]
undefined

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-mastodon, Node.js