ブログの記事を投稿したら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