Subway Tooterにタイムラインを表示してみた

これはFediverse Advent Calendar 2020(第三会場)7日目の記事です。

はじめまして。もちすん(motisn)です。現在はもっぱらベスフレにいます。
今回は10月くらいに遊んでた内容について書きます。

序文(動機とか)

マストドンの通信はActivityPubに従って行われていると聞きます。また、インターネットを見るとActivityPubを実装した記事をいくつか見つけることができます*1*2。以前私もこれらを見ながらJavaScriptでちまちま真似をして、自作のアカウントがユーザー検索に現したりリプライを送って遊びました。
そうすると、マストドンから脱出して自分でActivityPub互換のSNSを構築したくなります(注:以降そんな話は出てこない)が、そのためにはGUIも自ら書く必要があります。悲しいことに私はそのような難しいことはできませんので、どこかのGUIをただ乗りする選択をします。

…というわけでタイトルのSubway Tooterにタイムラインを表示する話になります。タイムラインと言っても流れるようなあれは今回やりません。前もって用意したJSONファイルをSubway Tooterのアクセスに対して返すだけです。以下、処理について説明していきます。細かいところは*3API METHODSを見てください。大まかな流れを書くので力尽きました…

本文(処理とか)

Subway Tooter(以下ST)はMastodon(やMisskey)APIでサーバーとやりとりします。そこでまずSTにマストドン(ミスキー)ユーザーだと認めて貰う必要があります。STの「アカウント追加」でアクセストークンを選択して、サーバーのアドレスを入力しOKを押すと、アクセストークンが入力できます。このアクセストークンをもって、STはサーバーの/api/v1/accounts/verify_credentialsにアクセスを試みます。サーバーが返すべきアカウント情報は文献[3]を見るといろいろ書いてありますが、最低限以下のもので十分です。

account = {
    "username": "motisn",
    "acct": "motisn",
};

文字列は適宜変えてください(なんでもいいです)。これをJSON.stringfyしてヘッダーに{'Content-Type' : 'application/json'}をつけて返すようにします。ここまで行うとSTに新たなカラムを生やすことができます(表示内容は実装によると思います)。f:id:motisn:20201207021328p:plain:h512:w288

次にタイムラインの表示を目指します。ここでアクセスログを見ると、

クライアントのIPアドレス - - [07/Dec/2020:01:06:10 +0900] "POST /api/meta HTTP/2.0" 404 15 "-" "SubwayTooter/4.3.4 Android/9"
クライアントのIPアドレス - - [07/Dec/2020:01:06:10 +0900] "GET /api/v1/instance HTTP/2.0" 200 47 "-" "SubwayTooter/4.3.4 Android/9"
クライアントのIPアドレス - - [07/Dec/2020:01:06:12 +0900] "GET /api/v1/accounts/verify_credentials HTTP/2.0" 200 37 "-" "SubwayTooter/4.3.4 Android/9"
クライアントのIPアドレス - - [07/Dec/2020:01:06:12 +0900] "GET /api/v1/filters HTTP/2.0" 404 15 "-" "SubwayTooter/4.3.4 Android/9"
クライアントのIPアドレス - - [07/Dec/2020:01:06:12 +0900] "GET /api/v1/timelines/home?limit=80 HTTP/2.0" 200 593 "-" "SubwayTooter/4.3.4 Android/9"
クライアントのIPアドレス - - [07/Dec/2020:01:06:12 +0900] "GET /api/v1/notifications?limit=80 HTTP/2.0" 404 15 "-" "SubwayTooter/4.3.4 Android/9"

のように続いていくのがわかります。最初の2つはミスキーかマストドンどちらのサーバーであるかを確認しています。先に/api/metaにアクセスが来てるのは、一時期ミスキーがマストドン互換APIにしていたため、先にミスキーを調べないと区別がつかないからだそうです。
5行目を見ると実装するべきものが見えますね。再び文献[3]を見るとまたいろいろ書いてありますが、ここもシンプルにいきましょう(ここも文字列は適当に変えてください)。

[
    {
        "uri":"https://ap.motisn.net/motisn/statuses/0",
        "content":"\u003cp\u003eはろはろ~\u003c/p\u003e",
        "account":{
            "username":"motisn",
            "acct":"motisn@ap.motisn.net",
            "display_name":"(・8・)",
        }
    }
]

本当はcontentやdisplay_nameも無くていい(usernameで置き換えられる)んですが、さすがに味気ないので。複数表示させたい場合は、[...,{toot2},{toot1}]と並べてください。結果は以下の様になります。
f:id:motisn:20201207015251p:plain:h512:w288
やったね!

終わりに

(試してたときにちょっと質問したりしたので謝辞を入れてたけど、よく考えたら大げさだし恥ずかしくなったので今更ながら消した)
今回の話はAPの実装とは関係ないので、簡単に試すことができます。次に進む方向としては、例えばSTからトゥートできるようにすることが考えられます。STで送られたトゥートは/api/v1/statusesで受けることになるので、内容をパースして…そこからどうするのでしょう(出来たら記事にしている)。トゥートを単純にJSONで持っているとつらくなってくるので、何かデータベース的なものがいりそうです。難しそうですね。私はここで疲れちゃいました。
10月に試したときから、このネタならアドベントカレンダー初参加できるのではないかと思っていたので、無事に書けてよかったです。いざ書き始めたら当時動いたはずだったのが動かなくて非常に焦りました。10月から何か変わったんですかね…
実はこの記事は7日の0時を回ってから慌てて書いています。4日から書き始めたはずですが…計画的に書けるようになりたいですね。