【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/follows?uri=townsguild@another-guild.com&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' => 'townsguild@another-guild.com', 'bearer_token' => access_token})  
res = http.request(req)

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

ちなみにtownsguild@another-guild.comの部分はフォロー先のユーザーアカウントです。メールアドレスのような形式ですがMastodonではこう記述するそうです。

あとがき

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