この記事はMastodon 2 Advent Calendar 2017の記事です。 昨日はきりたんさんのきりぼっとと私でした。
末代にてMastodonをやっているきゅうりうむともうします。 唐突ですが本文に行く前に宣伝をさせてください。
私はTwitterとMastodon2つのプラットフォームに対応したWindows10向けクライアント「Flantter」を作成しています。 また.NET Standard向けに「TootNet」というMastodon向けのライブラリを作成しています。
作者は使いやすくなるように一生懸命作っているのでみなさんたくさん使ってみてください。 (GithubでStarを投げてもらうとすごく喜びます)
この「Flantter」なのですがもともとは名前の通りフランドール・スカーレットちゃんが可愛いことを広めたいと思いTwitterのみを使用することを想定して作られたクライアントなのですが、
Mastodonというプラットフォームが広まったときに「TwitterとMastodonって似てるからTwitterクライアントも簡単にMastodonクライアントに作り変えることができるのでは?」と思い
あれこれ調べながらMastodonでも使えるように作り変えられた物となっています。
今回はiOS, Android, Windows, Mac, Linux 様々なTwitterクライアントがシームレスにMastodonに移行できるよう、APIの違いなど得られた知見みたいなものを共有したいと思います。
TwitterのAPIとMastodonのAPIの違い
TwitterのAPIとMastodonのAPIは割りと似ています。 ですが一部のAPIがなかったり、微妙に違う挙動だったりします。
なので、今回TwitterAPIとMastodonAPIの対応表を作成しました!
Twitter API to Mastodon API
一部の記載する意味が無いと思ったTwitterAPIは表から削除されています。
Mastodon 2.1.0に相当するTwitterAPIとMastodonAPIの対応表です。 (2017/12/20日現在)
ここには乗っていないAPIもMastodonには存在する場合があります。
参考
Account
- GET account/settings
- 該当APIなし
- GET account/verify_credentials
- POST account/remove_profile_banner
- POST account/settings
- 該当APIなし
- POST account/update_profile
- POST account/update_profile_background_image
- POST account/update_profile_banner
- POST account/update_profile_image
Application
- GET application/rate_limit_status
- 該当APIなし
- そもそもAPI制限がない
Blocks
- GET blocks/ids
- 該当APIなし
- GET /api/v1/blocks で代用可能
- GET blocks/list
- GET /api/v1/blocks
- Mastodonではドメインをブロックする機能も存在
- POST blocks/create
- POST blocks/destroy
Collections
- GET collections/entries
- 該当APIなし
- GET collections/list
- 該当APIなし
- GET collections/show
- 該当APIなし
- POST collections/create
- 該当APIなし
- POST collections/destroy
- 該当APIなし
- POST collections/entries/add
- 該当APIなし
- POST collections/entries/curate
- 該当APIなし
- POST collections/entries/move
- 該当APIなし
- POST collections/entries/remove
- 該当APIなし
- POST collections/update
- 該当APIなし
DirectMessages
- GET direct_messages
- GET /api/v1/notifications
- exclude_types[]=follow&exclude_types[]=favourite&exclude_types[]=reblog を引数に付けることでMentionのみを取得可能
- MastodonではMentionにdirect属性を使うことで特定の相手のみにメッセージを送れるためnofiticationでDMを取得する
- GET direct_messages/events/list
- 該当APIなし
- GET direct_messages/events/show
- 該当APIなし
- GET direct_messages/sent
- 該当APIなし
- GET direct_messages/show
- GET /api/v1/statuses/:id
- MastodonではMentionにdirect属性を使うことで特定の相手のみにメッセージを送れるためStatusと区別がない
- POST direct_messages/destroy
- DELETE /api/v1/statuses/:id
- MastodonではMentionにdirect属性を使うことで特定の相手のみにメッセージを送れるためStatusと区別がない
- POST direct_messages/events/new (message_create)
- 該当APIなし
- POST direct_messages/new
- POST /api/v1/statuses
- MastodonではMentionにdirect属性を使うことで特定の相手のみにメッセージを送れる
Favorites
- GET favorites/list
- GET /api/v1/favourites
- 自分のお気に入りしか取得することができないので注意
- POST favorites/create
- POST favorites/destroy
Followers
Friends
- GET friends/ids
- 該当APIなし
- GET /api/v1/accounts/:id/following で代用可能
- GET friends/list
- GET friendships/incoming
- GET friendships/lookup
- GET friendships/no_retweets/ids
- 該当APIなし
- GET friendships/outgoing
- 該当APIなし
- GET friendships/show
- POST friendships/create
- POST /api/v1/accounts/:id/follow
- 該当AccountのAccountIdがわからない場合はこちら POST /api/v1/follows
- POST /api/v1/accounts/:id/followではRelationship, POST /api/v1/followsではAccountが返ってくるので注意
- POST friendships/destroy
- POST friendships/update
- 該当APIなし
Geo
- GET geo/id/:place_id
- 該当APIなし
- GET geo/reverse_geocode
- 該当APIなし
- GET geo/search
- 該当APIなし
Help
- GET help/configuration
- 該当APIなし
- GET help/languages
- 該当APIなし
- GET help/privacy
- 該当APIなし
- GET help/tos
- 該当APIなし
List
- GET lists/list
- GET /api/v1/lists
- Subscribeは概念自体ない
- GET lists/members
- GET lists/members/show
- 該当APIなし
- GET lists/memberships
- 該当APIなし
- GET lists/ownerships
- GET lists/show
- GET lists/statuses
- GET lists/subscribers
- 該当APIなし
- GET lists/subscribers/show
- 該当APIなし
- GET lists/subscriptions
- 該当APIなし
- POST lists/create
- POST lists/destroy
- POST lists/members/create
- POST lists/members/create_all
- 該当APIなし
- POST lists/members/destroy
- POST lists/members/destroy_all
- 該当APIなし
- POST lists/subscribers/create
- 該当APIなし
- POST lists/subscribers/destroy
- 該当APIなし
- POST lists/update
Media
Mutes
- GET mutes/users/ids
- 該当APIなし
- GET /api/v1/mutes で代用可能
- GET mutes/users/list
- POST mutes/users/create
- POST mutes/users/destroy
SavedSearches
- GET saved_searches/list
- 該当APIなし
- GET saved_searches/show/:id
- 該当APIなし
- POST saved_searches/create
- 該当APIなし
- POST saved_searches/destroy/:id
- 該当APIなし
Search
- GET search/tweets
- 該当APIなし
- Mastodonでは全文検索ができないがユーザー、ハッシュタグの候補、TootURLから該当Tootを検索することがGET /api/v1/searchで可能である
Statuses
- GET statuses/home_timeline
- GET statuses/lookup
- 該当APIなし
- [GET statuses/mentions_timeline](https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-mentions_timelin
- GET /api/v1/notifications
- exclude_types[]=follow&exclude_types[]=favourite&exclude_types[]=reblog を引数に付けることでMentionのみを取得可能
- このAPIでは他にお気に入り通知、reblog(retweet)通知、フォロー通知を取得できる
- GET statuses/oembed
- 該当APIなし
- GET statuses/retweeters/ids
- GET statuses/retweets_of_me
- 該当APIなし
- GET statuses/show/:id
- GET statuses/user_timeline
- POST statuses/destroy/:id
- POST statuses/retweet/:id
- POST statuses/unretweet/:id
- POST statuses/update
Trends
- GET trends/available
- 該当APIなし
- GET trends/closest
- 該当APIなし
- GET trends/place
- 該当APIなし
Users
- GET users/lookup
- 該当APIなし
- GET users/profile_banner
- GET users/search
- GET /api/v1/accounts/search
- GET /api/v1/search でも検索可能だが "username@domain" 形式のものを渡しても別インスタンスのユーザーは引っかからない
- GET users/show
- GET users/suggestions
- 該当APIなし
- GET users/suggestions/:slug
- 該当APIなし
- GET users/suggestions/:slug/members
- 該当APIなし
- POST users/report_spam
これを使えばあなたのTwitterクライアントもすぐにMastodonクライアントに早変わり! 自分がクライアント作者じゃなくてもオープンソースなクライアントをMastodon用に改変して公開しよう!
その他MastodonのAPIで気をつけたほうがいいところ
MastodonのAPIは若干クセがあるというか理解をしておいたほうがいい仕様が幾つかありますので書いておきます。
引数を渡した時点でtrue
GET /api/v1/timelines/publicでは引数localにtrueを指定することでlocalタイムラインを取得できます。
実際にMastodonのWebクライアントでは?local=trueを引数として渡しています。
一方でこのエンドポイントは引数に?local=falseを指定してもローカルタイムラインが帰ってきます。
このようにMastodonの一部のエンドポイントでは引数の有無で返す中身を変えてきたりするので注意しましょう。 (そもそもbooleanなんて何処にも書いてないが)
よくわからない引数を渡すとエラー
当然なのかわかりませんが、一部の引数に対応していないものを渡すとエラーが帰ってきます。json以外で。
例えばPOST /api/v1/statusesでは引数にvisibilityを指定できます。 "direct", "private", "unlisted", "public"の4つが使えますがこれ以外を指定した際にはhtmlでエラーが返ってきます。
普通そんなことないと思いますが、大文字小文字の違いでもエラーになるので少し念頭に入れておくといいかもしれないですね。
おわりに
Twitterがあんなことで荒れているさなかにこういう記事を出せるのはある意味でベストタイミングだったかもしれません。 みなさんもこの記事を参考にTwitter関連のサービスをMastodonへ移行することを考えてみてはいかがでしょうか?
明日はアドベントカレンダー最終日、hakaba-hitoyoです。 よろしくお願いします!