twitterのAPI制限が厳しくなったため他のサービスを探したところ、MisskeyでもAPIを公開しているのでkotlinで呼び出しできるか試してみました。
以前にもMastodonというサービス(ソフトの名称でもあります)がありましたが、
MisskeyもMastodonと同様に分散型のSNSで複数のサーバに分かれてそれぞれ運営されています。
準備
ここでは、Misskeyサーバの中でも最大手である Misskey.io でAPIを試してみます。
Misskey APIの主な仕様は以下のようになります。
- APIはPOSTメソッドで呼び出します。(一部例外を除く)
- データは主にJSON形式でやりとりします。
- API呼び出し時にはリクエストボディにアクセストークンを指定します。
APIとアクセストークンについては以下にドキュメントがあります。
https://misskey-hub.net/docs/api
APIの呼び出しには認証のためアクセストークンが必要です。
misskey.ioでアカウントを作成し、設定のAPIから『アクセストークンの発行』を行います。
取得したアクセストークンは、”i”というパラメータ名でリクエストボディに含める必要があります。
開発
IntelliJでKotlin/Gradleのプロジェクトを作成します。
APIではJsonを使用するため、Jsonを扱えるjacksonというライブラリを追加します。
build.gradle.kts の dependencies の箇所に jackson-module-kotlin を追加します。
dependencies {
implementation("com.fasterxml.jackson.module:jackson-module-kotlin:2.14.2")
}
サンプルコードを記載するのに Main.kt ファイルを作成しておきます。
object Main {
@JvmStatic
fun main(args: Array) {
}
}
ローカルタイムライン取得
APIリファレンスを参照し、API呼び出しのコードを実装します。
まずはローカルタイムラインを取得します。
ローカルタイムラインは各ユーザーの投稿したノート(twitterでのツイートにあたります)を取得できます。
ローカルタイムラインAPIのリファレンスは以下にあります。
https://misskey-hub.net/docs/api/endpoints/notes/local-timeline.html
いくつかパラメータがありますが、あまり必須のものはなさそうです。
limitが取得する最大件数のようです。
また、ここでは省略されていますが、アクセストークンを”i”というパラメータ名で指定する必要があります。
とりあえず動作確認のため、パラメータiとlimitだけ指定します。
レスポンスではNoteの配列が返ります。
Noteにはいくつかパラメータがありますが、必要そうなのはid, createdAt, text, userくらいでしょうか。
パラメータ名のuserではUserが返ります。
こちらも必要そうなのはid, username, nameくらいでしょうか。
以上の仕様から、APIでやり取りするデータの入れ物となるデータクラスを作成します。
data class LocalTimelineReq(
val i: String,
val limit: Int = 10
)
@JsonIgnoreProperties(ignoreUnknown = true)
data class User(
val id: String,
val username: String,
val name: String?
)
@JsonIgnoreProperties(ignoreUnknown = true)
data class Note(
val id: String,
val createdAt: String,
val text: String?,
val user: User
)
注意点として、jacksonの仕様でオブジェクトにない項目があるとエラーになるので、不要な項目は無視するよう、
@JsonIgnoreProperties(ignoreUnknown = true) を指定します。
また、ドキュメントには記載がないですが、User.nameはnullの場合があるのでString?型にしておきます。
では実際の呼び出しのコードです。
呼び出しのパラメータを作成し、jacksonObjectMapperでJSONに変換します。
val input = LocalTimelineReq(
i = accessToken,
limit = 20
)
val mapper = jacksonObjectMapper()
val inputJson = mapper.writeValueAsString(input)
URL, Content-Type, 呼び出しのパラメータを指定してリクエストを作成します。
val url = "https://misskey.io/api/notes/local-timeline"
val req =
HttpRequest
.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(inputJson))
.build()
リクエストを使用してAPIを呼び出し、レスポンスを取得します。
val client = HttpClient.newBuilder().build()
val res = client.send(req, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
レスポンスからデータのJSONをデータクラスのオブジェクトに変換します。
ここではNoteの配列が取得できます。
val resultJson = res.body()
val output = mapper.readValue(resultJson, Array::class.java)
取得したデータを適当に出力します。
for (p in output) {
if (p.text != null) {
val user = p.user.name ?: p.user.username
println("user=${user} text=${p.text}")
}
}
}
コードを実行してノートが取得できれば成功です。
アクセストークンが無効な場合等は403エラーが返ります。
ノートの投稿
次はノートを投稿してみます。
APIリファレンスは以下にあります。
https://misskey-hub.net/docs/api/endpoints/notes/create.html
必要そうなパラメータは visibility, textでしょうか。
レスポンスではcreatedNoteというパラメータ名が返ります。
以上の仕様から、データクラスを作成します。
data class CreateNoteReq(
val i: String,
val visibility: String,
val text: String?
)
@JsonIgnoreProperties(ignoreUnknown = true)
data class CreateNoteRes(
val createdNote: Note
)
実際の呼び出しのコードです。
ノート作成用のデータクラスを作成します。
val input = CreateNoteReq(
i = accessToken,
text = message,
visibility = visibility
)
val inputJson = mapper.writeValueAsString(input)
URLは /api/notes/create を指定します。
val url = "https://misskey.io/api/notes/create"
val req =
HttpRequest
.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(inputJson))
.build()
返されたレスポンスからCreateNoteResを取得します。
val client = HttpClient.newBuilder().build()
val res = client.send(req, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8))
val output = mapper.readValue(resultJson, CreateNoteRes::class.java)
println("create: id=${output.createdNote.id} id=${output.createdNote.createdAt} ")
ノートの新規に発行されたIDが取得できれば成功です。
このように、kotlinのデータクラスとjacksonライブラリを使うとJSON形式を用いたAPI呼び出しをスマートに開発することができます。
サンプルコード
https://github.com/ito-mmj/misskey-sample
東京都心在住のフルリモート勤務エンジニア。サーバサイドの開発担当で得意な言語はC#。