Node.jsアプリでMastodonを操作

こんにちは

最近ポストTwitterとしてMastodonが注目されていますね
今回はそのMastodonをNode.jsとExpressで操作する方法をご紹介します

準備

Node.jsとExpressはすでにインストールされているものとします

npm install --save mastodon-api

mastodon-apiをインストールします
www.npmjs.com

client ID・client secret・Access Tokenの取得

var express = require('express');
var app = express();

var Mastodon = require('mastodon-api');
var client_id, client_secret;
var access_token;

var base_url = 'https://instance_name'; //自分の使いたいアカウントのあるインスタンスのURL
var redirect_url = 'https://*********/callback'; //リダイレクトURL

app.get('/auth', function(request, response){
    Mastodon.createOAuthApp(base_url + '/api/v1/apps', 'AppName', 'read write follow', redirect_url)
        .then(resp => {
            client_id = resp.client_id;
            client_secret = res.client_secret;
            Mastodon.getAuthorizationUrl(client_id, client_secret, base_url, 'read write follow', redirect_url)
                .then(resp=> response.redirect(resp));
        });

app.get('/callback', function(request, response){
    Mastodon.getAccessToken(client_id, client_secret, request.query.code, base_url, redirect_url)
        .then(resp=> {
            access_token = resp;
            response.redirect('https://*********/');
        });
}

上記のコードでhttps://*********/authにアクセスするとMastodon.createOAuthAppでclient_idとclient_secretが返され、Mastodon.getAuthorizationUrlで認証URLが与えられます
その認証URLにアクセスしてログイン・アプリの操作許可をするとhttps://*********/callbackに移り、クエリパラメーターで認証コードが与えられるのでそれをMastodon.getAccessTokenに渡すとアクセストークンを取得することができます

引数・戻り値の説明

Mastodon.createOAuthApp(url, clientName, scopes, redirectUri)
URL・アプリ名・権限・リダイレクトURLを渡すと
id・client ID・client secretを返す関数です

  • 権限 : 権限の範囲、read(タイムラインなどの読み込み権限)・write(トゥート権限)・follow(フォロー権限)のうちから選べる、デフォルトでは'read write follow'
  • リダイレクトURL : リダイレクトされるURL、デフォルトではurn:ietf:wg:oauth:2.0:oob
  • client ID・client secret : それぞれ認証のために必要なもの

Mastodon.getAuthorizationUrl(clientId, clientSecret, baseUrl, scope, redirectUri)
client ID・client secret・base URL・権限・リダイレクトURLを渡すと認証URLを返す関数

Mastodon.getAccessToken(clientId, clientSecret, authorizationCode, baseUrl)
client ID・client secret・認証コード・base URLを渡すとAccess Tokenを返す関数

  • 認証コード : Access Tokenを取得するために必要なコード

ローカルでアクセストークンを取得したい場合はリダイレクトURLをurn:ietf:wg:oauth:2.0:oobにしてください(デフォルトがこれなのでわざわざ指定しなくてもよし)
ちなみに僕はMastodon.getAuthorizationUrlでリダイレクトURLを指定せずにいたため何度もinvalid grant(不正な認証)になって詰んでいました

トゥートする

app.get('/', function(request, response){
    const M = new Mastodon({
        access_token: access_token,
        timeout_ms: 60*1000,
        api_url: 'https://' + base_url + '/api/v1/',
    });
    M.post('statuses',{status: 'Hello World'});
}
画像付きの場合
M.post('media',{ file: fs.createReadStream('path/to/image.png') })
    .then(resp=>{
        const id = resp.data.id;
        M.post('statuses',{status: 'Image Toot!', media_ids: [id]});
    });

タイムライン取得

M.get('timelines/public', function(err, data, res) {
    for(key in data){
        console.log(data[key].content);
    }
}

連合タイムラインを取得したい場合は'timelines/public'
ローカルタイムラインを取得したい場合は'timelines/public?local=on'
ホームを取得したい場合は'timelines/home'

最後に、僕は今MastodonのWebクライアントを作成中です
もしよかったらログインしてみてください
Mastodeck