Misskeyの各サーバーはAPIを公開していて、そのAPIを使ってBotやツールを作れます。GoやJavaScriptなどいくつかの言語ではAPIのラッパーが存在していますが、今回はそれらを使わず標準ライブラリや標準的なツールのみを使ってAPIを叩く際のコードを紹介します。
トークンの取得方法やAPIのエンドポイントの一覧などについては省略しますので、上記のURLをご覧ください。
シェルスクリプト(curl)
フォローしているチャンネルのリストを取得
misskey_token="misskeyのトークン"
channels=$(curl "https://misskey.io/api/channels/followed" \
-H 'content-type: application/json' \
--data-raw "{\"i\":\"${misskey_token}\", \"limit\":100}" \
| jq -r ".[].name")
結果はJSONのテキストなので、jqコマンドなどで必要な情報を取り出して使います。
画像をドライブにアップロードする
folder_id="フォルダーのID"
file_id=$(curl "https://misskey.io/api/drive/files/create" \
-H 'content-type: multipart/form-data' \
-F i="${misskey_token}" \
-F folderId="${folder_id}" \
-F name="$(date --rfc-3339=seconds).jpg" \
-F file=@"misskey.jpg" \
--compressed
フォルダーのIDについては、 設定>その他の設定>開発者モード をオンにすると、ドライブのフォルダを右クリックすることでフォルダーIDが取得できるようになります。
ノートに画像を添付する際には、-F file=@test.jpg
のように@
マークを付けます。
Ruby
他のユーザーをフォローする
require 'net/http'
require 'json'
TOKEN = 'misskeyのトークン'
user_id = 'フォローする相手のID'
uri = URI.parse('https://misskey.io/api/following/create')
data = { i: TOKEN, userId: user_id }
res = Net::HTTP.post(uri, JSON[data], { 'Content-Type' => 'application/json' })
フォローする相手のIDも同様に、開発者モードをオンにすることでプロフィール画面から取得できるようになります。
WebSocketを使ってリアルタイムに通知を受け取る
ここでは、websocket-client-simpleというライブラリを使用した例を紹介します。
require 'websocket-client-simple'
require 'json'
TOKEN = 'misskeyのトークン'
HOST = 'misskey.io'
ws = WebSocket::Client::Simple.connect "wss://#{HOST}/streaming?i=#{TOKEN}"
ws.on :message do |msg|
json = JSON.parse(msg.data, symbolize_names: true)
case json[:body][:type]
when 'followed'
by = json[:body][:body]
puts "followed by @#{by[:username]}@#{by[:host] || HOST}"
when 'note'
by = json[:body][:body][:user]
puts "note by @#{by[:username]}@#{by[:host] || HOST}"
next if by[:isBot]
else
puts json[:body][:type]
end
end
ws.on :open do
puts 'open!!!'
ws.send '{ "type": "connect", "body": { "channel": "main", "id": "id" } }'
ws.send '{ "type": "connect", "body": { "channel": "localTimeline", "id": "id" } }'
end
ws.on :close do |e|
p e
exit 1
end
ws.on :error do |e|
p e
puts e.backtrace
end
loop do
sleep 1
end
このプログラムを実行すると、misskey側でイベントが起こった際にWebSocketを介してws.on :message
から始まる行が実行されます。今回はフォローされたときと、タイムラインにノートが流れた際に誰からなのか表示するようにしています。
WebSocketが接続された際にはws.on :open
から始まる行が実行され、ホストサーバー側にどのイベントを取得するのか通知します。今回はmainとlocalTimeline(LTL)を読むようにしています。idは任意に決められますが、今回は"id"
としています。
おわりに
これまで、スクリーンショットを自動でMisskeyに投稿するプログラムや、ノートに応じて返答するBotなどを作ってきました。しかしその際に参考になるプログラムがあまり無く、APIの叩き方を暗中模索することになり辛かったため今回筆を取りました。この記事を参考に読者のプログラムが動けば幸いです。皆でMisskeyやActivityHubを盛り上げていきましょう!
動作環境
$ curl --version
curl 8.6.0 (x86_64-pc-linux-gnu) libcurl/8.6.0 OpenSSL/3.2.1 zlib/1.3.1 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 libssh2/1.11.0 nghttp2/1.59.0 nghttp3/1.1.0
$ jq --version
jq-1.7.1
$ ruby -v
ruby 3.0.6p216 (2023-03-30 revision 23a532679b) [x86_64-linux]
$ gem list websocket-client-simple
websocket-client-simple (0.8.0, 0.5.1)