Skip to content

Instantly share code, notes, and snippets.

@mimikun
Last active June 20, 2024 09:30
Show Gist options
  • Save mimikun/890e69a6ace3f48581e464cc6fe380c3 to your computer and use it in GitHub Desktop.
Save mimikun/890e69a6ace3f48581e464cc6fe380c3 to your computer and use it in GitHub Desktop.
MastodonAPIの仕様など

Mastodon API をcURLで叩いてみる

今回実験に使うMastodonインスタンスは自分のインスタンスにしました。 多分他のインスタンスでもやり方は同じだと思います。

まずはアプリケーションを登録しないといけないので登録します。

Mastodon APIの叩き方を見て作業します。

環境

OS: macOS 10.13 ターミナル: zsh

OAuth2クライアントを登録

以下は一例です。

MASTODON_HOST=mstdn.mimikun.jp
CLIENT_NAME=トゥートテスト
curl -X POST -sS https://${MASTODON_HOST}/api/v1/apps \
  -F "client_name=${CLIENT_NAME}" \
  -F "redirect_uris=urn:ietf:wg:oauth:2.0:oob" \
  -F "scopes=read write follow"

すると、このようなJSONが返ってきます。

{"id":"13","name":"トゥートテスト","website":null,"redirect_uri":"urn:ietf:wg:oauth:2.0:oob","client_id":"CLIENT_ID","client_secret":"CLIENT_SECRET"}%

アクセストークン取得

さきほど取得したclient_idclient_secretを使ってMastodonインスタンスから認証を受け、アクセストークンを取得します。

curl -X POST -d "client_id=CLIENT_ID&client_secret=CLIENT_SECRET&grant_type=password&username=EMAIL_ADDRESS&password=PASSWORD&scope=${SCOPES:-read write follow}" -Ss https://mstdn.mimikun.jp/oauth/token

このようにアクセストークンが返ってきました。

{"access_token":"MY_ACCESS_TOKEN","token_type":"bearer","scope":"read write follow","created_at":1513769204}%

早速TLの取得をしてみます。

ACCESS_TOKEN=MY_ACCESS_TOKEN
curl --header "Authorization: Bearer ${ACCESS_TOKEN}" -sS https://mstdn.mimikun.jp/api/v1/timelines/home

投稿APIのパラメータ

公式ドキュメントにはこうありました。

かならず必要なのはstatusだけで、他は任意でした。

Field Description Optional
status The text of the status no
in_reply_to_id local ID of the status you want to reply to yes
media_ids Array of media IDs to attach to the status (maximum 4) yes
sensitive Set this to mark the media of the status as NSFW yes
spoiler_text Text to be shown as a warning before the actual content yes
visibility Either "direct", "private", "unlisted" or "public" yes

パラメータの説明

  • in_reply_to_id
    • リプライ先のID
  • media_ids
    • メディアファイルのID(配列で渡す)
  • sensitive
    • NSFWにするかどうか(true or false)
    • デフォルトはfalse
  • spoiler_text
    • CW(内容注意)の説明文
  • visibility
    • 公開範囲(direct , private , unlisted or public)
    • デフォルトはpublic

1. 投稿(トゥート)

日本語や空白は%エンコードが必要らしいです。

ACCESS_TOKEN=MY_ACCESS_TOKEN
STATUS=Toot%20Test%20for%20cURL
curl -X POST -Ss https://mstdn.mimikun.jp/api/v1/statuses \
  --header "Authorization: Bearer ${ACCESS_TOKEN}" \
  -d "status=${STATUS}"

レスポンスです。

{"id":"99206380879954851","created_at":"2017-12-20T11:27:19.597Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mstdn.mimikun.jp/users/mimikun/statuses/99206380879954851","content":"\u003cp\u003eToot Test for cURL\u003c/p\u003e","url":"https://mstdn.mimikun.jp/@mimikun/99206380879954851","reblogs_count":0,"favourites_count":0,"favourited":false,"reblogged":false,"muted":false,"pinned":false,"reblog":null,"application":{"name":"トゥートテスト","website":null},"account":{"id":"1","username":"mimikun","acct":"mimikun","display_name":"","locked":false,"created_at":"2017-12-11T14:12:58.689Z","note":"\u003cp\u003e所謂本垢\u003c/p\u003e","url":"https://mstdn.mimikun.jp/@mimikun","avatar":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/accounts/avatars/000/000/001/original/0bda64b42f18263b.jpeg","avatar_static":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/accounts/avatars/000/000/001/original/0bda64b42f18263b.jpeg","header":"https://mstdn.mimikun.jp/headers/original/missing.png","header_static":"https://mstdn.mimikun.jp/headers/original/missing.png","followers_count":30,"following_count":53,"statuses_count":84},"media_attachments":[],"mentions":[],"tags":[],"emojis":[]}%     

2. 画像あり投稿

Twitterと同じような感じで

  1. 画像をアップロード
  2. その画像のIDを取得
  3. 投稿APIに画像IDを添えて叩く です。

Media APIを叩いてみます。

ACCESS_TOKEN=MY_ACCESS_TOKEN
curl -X POST -Ss https://mstdn.mimikun.jp/api/v1/media \
  --header "Authorization: Bearer ${ACCESS_TOKEN}" \
  -F "file=@test.png"

レスポンスが返ってきました。

{"id":"3103","type":"image","url":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/media_attachments/files/000/003/103/original/25d3906d25574413.png","preview_url":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/media_attachments/files/000/003/103/small/25d3906d25574413.png","remote_url":null,"text_url":"https://mstdn.mimikun.jp/media/csCiyShtqflXQnXu_hc","meta":{"original":{"width":1280,"height":768,"size":"1280x768","aspect":1.6666666666666667},"small":{"width":400,"height":240,"size":"400x240","aspect":1.6666666666666667}},"description":null}%    

画像IDはarrayで渡さないといけないので、media_ids[]=3103とします。

ACCESS_TOKEN=MY_ACCESS_TOKEN
STATUS=Image%20Toot%20Test%20for%20cURL
MEDIA_ID=3103
curl -X POST -Ss https://mstdn.mimikun.jp/api/v1/statuses \
  --header "Authorization: Bearer ${ACCESS_TOKEN}" \
  -d "status=${STATUS}&media_ids[]=3103"

レスポンスが返ってきました。

{"id":"99206533341780974","created_at":"2017-12-20T12:06:05.903Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"https://mstdn.mimikun.jp/users/mimikun/statuses/99206533341780974","content":"\u003cp\u003eImage Toot Test for cURL\u003c/p\u003e","url":"https://mstdn.mimikun.jp/@mimikun/99206533341780974","reblogs_count":0,"favourites_count":0,"favourited":false,"reblogged":false,"muted":false,"pinned":false,"reblog":null,"application":{"name":"トゥートテスト","website":null},"account":{"id":"1","username":"mimikun","acct":"mimikun","display_name":"","locked":false,"created_at":"2017-12-11T14:12:58.689Z","note":"\u003cp\u003e所謂本垢\u003c/p\u003e","url":"https://mstdn.mimikun.jp/@mimikun","avatar":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/accounts/avatars/000/000/001/original/0bda64b42f18263b.jpeg","avatar_static":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/accounts/avatars/000/000/001/original/0bda64b42f18263b.jpeg","header":"https://mstdn.mimikun.jp/headers/original/missing.png","header_static":"https://mstdn.mimikun.jp/headers/original/missing.png","followers_count":31,"following_count":53,"statuses_count":87},"media_attachments":[{"id":"3103","type":"image","url":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/media_attachments/files/000/003/103/original/25d3906d25574413.png","preview_url":"https://s3-ap-northeast-1.amazonaws.com/mstdn.mimikun.jp/media_attachments/files/000/003/103/small/25d3906d25574413.png","remote_url":null,"text_url":"https://mstdn.mimikun.jp/media/csCiyShtqflXQnXu_hc","meta":{"original":{"width":1280,"height":768,"size":"1280x768","aspect":1.6666666666666667},"small":{"width":400,"height":240,"size":"400x240","aspect":1.6666666666666667}},"description":null}],"mentions":[],"tags":[],"emojis":[]}%               

まとめ・参考文献など

基本Twitterと似たような感じでした。

公式ドキュメント