Mastodon のクライアントアプリを .NET Core で作ってみた

Mastodon という「自由で」「オープンソースな」(Twitter のような) SNS がなんか流行りだして、もともとあった mastodon.cloud@nullkal 氏が立てたインスタンス mstdn.jp に日本人が多くあつまって祭りみたいになってる。

API ももちろんあって、 .NET 製の APIライブラリもあった。 @kagasu さん :ok_hand:

で、試しにこの「Musto.NET」を使って、 mastodon.cloud の連邦?タイムラインを表示するだけのコンソールアプリを作ってみた。

API はとってもシンプルで、次のような単純なコードでTOOTのストリーミング受信ができる。

static async void RunAsync(string email, string password)
{
    var instanceUrl = "mastodon.cloud";

    // MastodonClient.CreateApp で得たものを保存しとく必要があるけど面倒だから UnitTest(MastodonClientTests)のを使わせてもらった
    //var appRegistration = await MastodonClient.CreateApp(instanceUrl, "MastoConsoleStandard", Scope.Read);
    var appRegistration = new AppRegistration 
    {
        ClientId = "ぎっはぶをみてね",
        ClientSecret = "ぎっはぶをみてね"
    };

    var client = new MastodonClient(instanceUrl, appRegistration);
    var auth = await client.Connect(email, password);
    var streaming = client.GetPublicStreaming();

    // Register events
    streaming.OnUpdate += (_, e) =>
    {
        Console.WriteLine("--");
        Console.WriteLine($"{e.Status.CreatedAt.ToLocalTime().ToString()} - {e.Status.Account.AccountName}:");
        Console.WriteLine(e.Status.Content);
    };

    // Start streaming
    streaming.Start();
}

アプリは、まず mastodon のインスタンスにMastodonClient.CreateAppで「アプリを登録」して、AppRegistrationを得る必要がある。 これは実際には ClientIdClientSecret で、一度登録したら保存して使う。 mastodon の既定の実装では、特に制限なくすぐにレスポンスが返ってくるが、コードを変更してインスタンス管理者の承認制などにすることもできるのだろう。

そしてアプリの登録は mastodon のインスタンス毎に行わなければならないので、たとえば現在出回っているクライアントアプリは、 mastodon.cloud では使えるが mstdn.jp では使えない、ということもある。

「アプリをインスタンスに登録する」仕組みまで備えたクライアントアプリも作成可能で、Amaroq for Mastodon というアプリはそのひとつだと教えてもらった

mastodon のユーザーはインスタンス毎に違うので、そのインスタンスで作った email/password で connect する。 あとは、 OnUpdate でストリームを受信しておいて、 Start すればよい、と。

Masto.NET が .NET Standard に対応しているので、 .NET Standard な実行環境, Mac/Linux なら .NET Core がインストールされた環境なら動作する。

適切に責務分割された Twitter クライアントなら、それほど手間なく mastodon クライアントアプリになれるかも。 前述のとおり複数インスタンス対応は必要だけど。アプリが対応するインスタンスとそのClientIdClientSecretの保存のために、サーバーサイド(mBaaS)が必要になると思う。

一応わたしもアカウントつくりました→ https://mastodon.cloud/@amay077 mstdn.jp にも作ったけど、メインはこっちで。頑張ってる人は 応援したい応援した