霧島 ひなた

霧島 ひなた

ネオアスタルテAPIドキュメント

アドベントカレンダー25日目

はじめまして、アスタルテのサバ缶をしています。
新規ユーザーの霧島ひなたと申します。

今年は、たぶん動くと思うからリリースしようぜ!
をモットーに様々なゴミプロダクトをリリースしてきました。

めかむし、クライアント、問題を説く奴、ブログ…
そして、とうとうmastodonってめちゃくちゃ重たいし、
最近のFediverseは治安悪すぎる!!!!(えっちぃ画像とか変な人とかすごい増えた・・・)
ということで
RustでSNS作るぞい!
の有言実行を始めました。

今までこんな仕様のSNSがあればいいのにと思ってきたすべてを形にしていきたいですね!!!

まぁそんなこんなで今回は、今日までに実装されている
ネオアスタルテのAPIのドキュメントをサクッと書いていきたいと思います。

基本事項

現在、(仮称)ネオアスタルテはテスト中という扱いであり正式サービスを開始しているわけではありません。
したがってここで書かれているドキュメントの内容は正式サービス開始時、あるいは、開発過程で変更になる可能性があります。
正式サービス開始後はAPIの使用変更に伴い、開発者の対応が必須となる変更が行われる時には必ず事前にアナウンスを行い、
対応するのに必要十分な時間を確保したうえでAPIの変更を行いますが、
テストサーバーに関しては、そのような配慮は行われません。ご容赦ください。

エンドポイントは
/api/・・・
と記載しますが
テストサーバーに接続する場合は
https://test.neo.astarte.krsm.me/api/・・・
であることに注意してください。
正式サービス後はドメインを変更する必要があります。

{url}/api/・・・
など変数を用いた切り替え可能な実装をするなどの対応をしてください。

APIについての基本事項

ネオアスタルテは基本的には REST API に準拠した実装になっていますが、一部例外もあります。
開発の都合上 レスポンス200 が返ってきていてもエラーの場合があります。
正式サービスまでには正しいレスポンスが返ってくるようになります。

ネオアスタルテのAPIは get リクエストを除くそのほかすべてのリクエストで原則 Body に
Content-Type : application/json
でパラメータを乗せる必要があります。
URL上にパラメータが乗る query をネオアスタルテは解析しません。
ドキュメント上に但し書きがない場合、
パラメータ: Body
ヘッダー: Header
にそれぞれ情報を載せたうえでリクエストしてください。

パラメータには必須のものとオプションのものがあります。また必須、オプション問わず、型厳密であり、設定されたパラメータの型が一致しない場合エラーとなります。
次のような例に十分注意して下さい。
integer: 必須 int型
の場合正しく解析されるには

{  
 integer: 23  
}

である必要があります。

{  
 integer: "23"  
}  

は型変換可能な形ではありますが、エラーを返します。

ネオアスタルテが返すエラーはライブラリで処理されるものと実装されたものがあり、ライブラリで処理されるエラーを除く、そのほかは、標準エラー型として定義されています。
標準エラー型は以下のような形式をとっています。
例はユーザー登録をしようとした時、パラメータに使用できない文字列が含まれていた場合のレスポンスです。

{  
    message: "usernameには、大文字小文字のアルファベットと数字、ひらがな、カタガナ、漢字のみが利用できます。"  
}  

messageの項になぜエラーレスポンスとなったのかが日本語で記載されて変換されます。
これはユーザーにも十分理解可能な内容となっており、直接ユーザーにメッセージとして出力することも可能です。
ライブラリが返すエラーと特殊な場合を除き、そのほかは標準エラー型が返還されるためこのドキュメントでは特殊なエラーレスポンスが返る場合を除きエラーレスポンスに関する記述を省略します。

特に記載がない場合
パラメータの記載方法
名称 : 必要性 データ型 [パラメータの条件、備考]
または
名称 : 必要性 データ型 "この値でリクエストすること"

ヘッダーの記載方法
認証タイプ
Basic または Bearer

名前: 必要性

レスポンスの記載方法
名称 : データ型 [備考]
または
名称 : データ型 "必ずその値が返ってくる"

データ型が
<String型>
など<>で囲まれている場合、その項目はnullが返却される可能性があることに注意してください。

データ型にはよく使われるデータ型があり
{account_data型}
{client_owner_data型}
があります。
各データ型は以下の構造をとります。

account_data型

{  
 id: String型,
 username: String型,  
 display_name: <String型>,  
 bio: <String型>,  
 icon_url: String型,  
 header_url: <String型>  
}  

client_owner_data型

{  
 client_name: String型,  
 client_id: String型,  
 owner_account: {account_data型},  
 website: String型,  
}  

ユーザー登録

エンドポイント
api/user/create_account

リクエストタイプ
POST

パラメータ

{  
 username: 必須 String型 [3-32文字、ひらがな、カタガナ、漢字、大文字小文字英数字、アンダーバー],  
 password: 必須 String型 [8文字以上],  
 email: 必須 String型,  
}  

レスポンス

{  
 username: String型[登録したusername],  
 message: "アカウントの作成が完了しました",  
}  

エラーレスポンス:標準エラー型

メールアドレス認証

エンドポイント
api/user/email_verify

リクエストタイプ
POST

パラメータ

{
 user_id: 必須 String型 [メールアドレスに記載してる物を入力してください],
 code: 必須 String型 [メールアドレスに記載してる物を入力してください],
}

レスポンス

{
  message: "アカウントの認証が完了しました"
}

エラーレスポンス:標準エラー型

パスワードリセットリクエスト

エンドポイント
api/user/password_reset_request

リクエストタイプ
POST

パラメータ

{
    user_id: 必須 String型 自分に割り振られたユニークなID(最初にメールで送られてきてるもの),
    email: 必須 String型 登録したメールアドレス,
}

レスポンス

{
  message: "リセット用の情報が書かれたメールを送信しました"
}

メールアドレスにパスワードリセットに必要な情報が送られます。

エラーレスポンス:標準エラー型

パスワードリセット

エンドポイント
api/user/password_reset

リクエストタイプ
POST

パラメータ

{
  user_id: 必須 String型 自分に割り振られたユニークなID(最初にメールで送られてきてるもの),
  email: 必須 String型 登録したメールアドレス,
  code: 必須 String型 メールアドレスに送られているコード,
  new_password: 必須 String型 新しいパスワード(8文字以上),
  retype_new_password: 必須 String型 新しいパスワード(8文字以上),
}

レスポンス

{
  message: "パスワードの変更が完了しました。"
}

エラーレスポンス:標準エラー型

トークンの発行

エンドポイント
api/user/get_token

リクエストタイプ
POST

認証タイプ
Basic
サンプル
Basic (Base64エンコードした username:password)

ヘッダー
Authorization: 必須

パラメータ

{  
 grant_type: 必須 "password",  
 client_id: 必須 String型,  
 client_secret: 必須 String型,  
}  

レスポンス

{  
 access_token: String型,  
 token_type: String型 "Bearer",  
}

エラーレスポンス:標準エラー型

プロフィール取得

エンドポイント
api/user/profile

リクエストタイプ
GET

認証タイプ
Bearer

ヘッダー
Authorization: 必須

パラメータ

{  
 id: オプション String型  
}

レスポンス

{  
 id: String型,  
 username: String型,  
 display_name: <String型>,  
 bio: <String型>,  
 icon_url: String型,  
 header_url: <String型>,  
 spoints: Int型 [トークンの所有者以外のプロフィール取得時はなし]  
}

エラーレスポンス:標準エラー型

プロフィール変更

エンドポイント
api/user/profile

リクエストタイプ
PATCH

認証タイプ
Bearer

ヘッダー
Authorization: 必須

パラメータ

{  
 display_name: オプション String型,  
 bio: オプション String型,  
 icon_url: オプション String型 [制限付き],  
 header_url: オプション String型 [制限付き],  
}  

レスポンス

{  
 id: String型,  
 username: String型,  
 display_name: <String型>,  
 bio: <String型>,  
 icon_url: String型,  
 header_url: <String型>,  
 spoints: Int型  
}  

エラーレスポンス:標準エラー型

制限:
この項目では直接URLを指定しますが現在はアスタルテに投稿された画像のみが許可されています。
fastlyのURLのみを解析します。
jpg jpeg png gif を受け付けています。

投稿

エンドポイント
api/statuses/new_status

リクエストタイプ
POST

認証タイプ
Bearer

ヘッダー
Authorization: 必須

パラメータ

{  
 content: 必須 String型,  
 visibility: オプション String型 [現在はpublicのみ実装、そのほかは未実装],  
 reply_destination_id: オプション String型 [未実装],  
 sensitive: オプション String型 [未実装],  
 introduction_sentence: オプション String型 [未実装],  
}

レスポンス

{  
 id: String型,  
 account: {account_data型},  
 content: String型,  
 visibility: String型,  
 reply_destination_id: <String型>,  
 reply: Boolean型,  
 sensitive: Boolean型,  
 introduction_sentence: String型,  
 client_data: {client_owner_data型},  
 create_at: Date型,  
 update_at: Date型  
}  

エラーレスポンス:標準エラー型

パブリックタイムラインの取得

エンドポイント
api/timelines/public

リクエストタイプ
GET

認証タイプ
Bearer

ヘッダー
Authorization: 必須

パラメータ

{  
 newest_id: オプション String型 [指定することでそれより後の投稿を返します],  
 oldest_id: オプション String型 [指定することでそれより前の投稿を返します]  
}  

レスポンス

{  
 newest_id: <String型>,  
 oldest_id: <String型>,  
 data: Array型[{}, {}, {}, {}, ・・・・, {}] [Max20件のデータが含まれます。中に含まれるデータは、投稿の項のレスポンスデータと同じものが配列型で含まれています。]  
}  

エラーレスポンス:標準エラー型

ガチャのバックログを取得する

エンドポイント
api/games/gacha_back_log

スコープ
games

リクエストタイプ
GET

認証タイプ
Bearer

ヘッダー
Authorization: 必須

レスポンス

{  
 backlog: Array型[{}, {}, {}, {}, ・・・・, {}] [10件のデータが含まれます。中に含まれるデータは、content, fake, rarity の3つです。基本はString型ですが、fakeはnullを含む場合があります。],  
 update_at: <String型>  
}  

エラーレスポンス:標準エラー型

~~~~~~~~~~~~~~~~~~~~~
クライアント製作者向け
~~~~~~~~~~~~~~~~~~~~~

クライアント登録

エンドポイント
api/apps/create_application

リクエストタイプ
POST

認証タイプ
Bearer

ヘッダー
Authorization: 必須

パラメータ

{  
 name: 必須 String型 [一部禁止されている文字列が存在します。],  
 website: 必須 String型 [自分のwebページを宣伝することができます],  
 scope_read: オプション Bool型 [未指定の場合でもtrueになります。意図的にfalseにすることも可能です],  
 scope_write: オプション Bool型 [未指定の場合falseになります。投稿、プロフィール等編集権限],  
 scope_follow: オプション Bool型 [未指定の場合falseになります。フォロー/フォロワー編集権限],  
 scope_push: オプション Bool型 [未指定の場合falseになります。通知の受け取り権限],  
 scope_games: オプション Bool型 [未指定の場合falseになります。ゲームコンテンツ権限, この権限は一部投稿を行う場合があります。],  
}  

レスポンス

{  
 client_name: String型,  
 client_id: String型,  
 client_secret: String型,  
 website: String型,  
 scopes: String型  
}  

エラーレスポンス:標準エラー型

現在UIでのクライアント製作が実装されていないため
クライアント開発者はcurlやREST APIクライアント等を使ってクライアント登録をする必要があります。
その際、トークンを用いてクライアント登録をしますが、トークンを発行にはクライアントが必要です。
この循環を回避するため開発者は以下のクライアントデータをパラメータとして利用することがで来ます。
なお、ここではclient_idとclient_secretを公開していますが、
実際のクライアント開発ではclient_secretはユーザーが容易に見ることができないように隠すことが推奨されます。
今後実装されるAPIで開発者はクライアントのデータを変更できるようになりますが、その時に
クライアント開発者のトークン、client_id、client_secretの3つが必要となります。
クライアント開発者のトークン、client_id、client_secret が何らかの手違いで流出してしまった場合、クライアントの情報をこのAPIを用いて書き換えられる可能性があります。
十分注意してください。

client_name: API client
client_id: 01FQPQ6FR6XMDJ161EBZPYE33Q
client_secret: eWLuPziC_htXZRT9AND5fvImj26Ox.YpSlU~aqMGk0-osg1QH8b+/4EFy7VKdBwJ
scope: read write