2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

MisskeyのAPIの叩き方(curl, Ruby)

Last updated at Posted at 2024-02-13

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)
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?