【Rails】SNS「Mastodon」のインスタンス名を取得したり自動フォローしたり


個人開発のWebアプリまちかどルートをv4.6にバージョンアップしました。

SNS「Mastodon」のアカウントでログインできるようにしてあります。

せっかくなので、MastodonのAPIをいくつか使ってみました。

※ここではログイン認証の方法について詳しく触れません。こちらの記事をご参考ください

RailsなサービスでMastodonとのOauth連携を実装する
https://qiita.com/foloinfo/items/48389328da43d73ae7a0

インスタンス名の取得

上の画面写真でいうところの「十日町市のMastodon」がインスタンス名の例です。ユーザーによって参加しているインスタンスが違います。それを下記のコードで自動的に取得します。

uri = URI.parse("https://#{domain}/api/v1/instance")
json = Net::HTTP.get(uri)
result = JSON.parse(json)
@user.instance_title = result['title']

インスタンス名の取得APIについてはアクセストークン不要なので簡単でした。

自動フォロー

こちらはアクセストークンが必要です。なので下記のようなコードになりました。

client = Mastodon::REST::Client.new(base_url: "https://#{domain}", bearer_token: access_token)
uri = URI.parse("https://#{domain}/api/v1/accounts/relationships?bearer_token=#{access_token}&id=1")
json = Net::HTTP.get(uri)
result = JSON.parse(json)
if result[0]['following'].to_s == 'false'
  client.follow(1)
end

APIを叩いたレスポンスからフォローの有無をチェックし、未フォローだったら(falseだったら)フォローする、という流れです。

Mastodonで注意する点は、Twitterと違ってユーザーを特定するIDが英文字主体のアカウント名ではなく数字の番号である点です。調べる方法はこちらの記事が参考になります。

Mastodon ユーザーのユーザID番号の簡単な確認方法
https://qiita.com/KEINOS/items/c501bd433aa84d0d0108

リモートフォローの場合

Mastodonでは他のインスタンスのユーザーをフォローすることを「リモートフォロー」と呼んでいるそうです。インスタンスが異なればドメインやサーバーも違うので、そうしたユーザーを自動フォローさせるには工夫が必要でした。

uri = URI.parse("https://#{domain}/api/v1/[email protected]&bearer_token=#{access_token}")
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Post.new(uri.path)
req.set_form_data({'uri' => '[email protected]', 'bearer_token' => access_token})
res = http.request(req)

APIをPOSTメソッドで叩きます。その際、フォロー元のユーザーのアクセストークンを使うほか、SSL通信を行う必要があるらしく上記のようなコードになりました。

ちなみに[email protected]の部分はフォロー先のユーザーアカウントです。メールアドレスのような形式ですがMastodonではこう記述するそうです。

あとがき

Mastodonはオープンソースで開発されていてバージョンアップの頻度が高いと思います。自作のWebアプリによさそうなAPIが追加されたら今後も積極的に活用してみたいです。

ほかにも書いているのでよかったらご覧ください
https://qrunch.net/@west2538onRails