ブログの記事を投稿したらMastodonでトゥートする方法。
ていうか外部からMastodonにトゥートさせる、そうOAuthの話です。
TwitterのOAuth連携機能を作ったことのある人にはおなじみのアレね。アレがマストドンにもあるので。
もくじ
Mastodonへのアプリケーション登録
参考:documentation/API.md at master · tootsuite/documentation · GitHub
まず最初にアプリケーション登録を行う必要がある。
https://インスタンス名/api/v1/apps に以下のパラメータをつけてPOSTリクエストする。
POSTリクエストができればいいので方法はおまかせします。
- client_name
- クライアント名。適当につけて。
- redirect_uris
- リダイレクト先。リダイレクトしない場合は urn:ietf:wg:oauth:2.0:oob を設定する。
- scopes
- read、 write、 follow のいずれかもしくは複数を選択。複数選択時は半角スペースで区切る。今回はブログ記事を投稿したいので write。
- website
- アプリ名(via)をクリックしたときの飛び先。省略可能。
成功するとJSONが返却されるので、その中の client_id と client_secret をメモしておく。
Mastodonアカウントへのアプリケーション認証
登録したアプリケーションを自分のアカウントに認証させる。
参考:documentation/OAuth-details.md at master · tootsuite/documentation · GitHub
認証コードの取得
以下のURLにアクセスする。
1 |
https://インスタンス/oauth/authorize?client_id=(さっきのJSONの client_id の値)&redirect_uri=(さっきの redirect_uris と同じ値)&response_type=code&scope=(さっきの scopes と同じ値。半角スペースは %20 に置き換え) |
(例)
1 |
https://poofion.com/oauth/authorize?client_id=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&scope=write |
すると「アプリ XXX(さっき設定したclient_name)があなたのアカウントへのアクセスを要求しています」という画面になるので「承認」をクリック。
「認証コードをコピーしてアプリに貼り付けて下さい。」と出るので、この値をコピーする。
アクセストークンの取得
https://インスタンス名/oauth/token に以下のパラメータをつけてPOSTリクエストする。
- grant_type
- authorization_code
- redirect_uri
- さっきの redirect_uris と同じ値
- client_id
- さっきのJSONの client_id の値
- client_secret
- さっきのJSONの client_secret の値
- code
- さっきコピーした認証コードの値
成功するとJSONが返却されるので、 access_token の値をメモしておく。投稿時に必要になる。
認証済みアプリの確認
「ユーザ設定」→「アカウント」→「認証済みアプリ」で、正しく追加されていることを確認する。
IFTTT の設定
さて、あとはIFTTTを設定するだけ。
this
RSS Feed → New feed item で、自分のブログのRSSフィードを読むようにする。
that
- Webhooks → Make a web request を選択する。
- URL には https://インスタンス名/api/v1/statuses を設定する。
- Method は 「POST」を選択する。
- Content Type は 「application/x-www-form-urlencoded」を選択する。
- Body は 「access_token=(さっきメモした access_token の値)&status=(好きな値を適当に設定)&visibility=(公開範囲)」 を設定する。
- 公開範囲は direct、 private、 unlisted、 public のいずれかを設定する。
- (例)
access_token=XXXXX&status={{EntryTitle}} {{EntryUrl}}&visibility=public