🧫

ゆめかわ日記

MisskeyでSpotifyのナウプレBotを作ろう

今回はMisskeyでSpotifyのなうぷれを行う方法について紹介します。 今回はサーバーとGo言語を使用して構成するため、若干ややこしくなりますがお付き合いいただけると幸いです。

IFTTTでMisskeyに再生中の曲をポストする

MisskeyでSpotifyで再生中の曲を共有できれば、その曲で話題が作れるから面白いなぁということで何か使えないか模索していたところ、はるのんさんがIFTTTを使用してWebHookを投げる方法をZennで記載されていたので試してみました。

zenn.dev

IFTTTはいくつかのトリガーと、それに基づく動作をビジュアルライクに定義して使用することができるサービスです。

記事の中で紹介されていますように、再生中の曲をトリガーにして、Misskeyにその曲情報を転送します。

はるのんさんの説明がとても詳細で完ぺきだったので、迷うことなく導入することができました。本当に感謝。

再生するとしっかりと投稿される。最高!

...

しかし、僕はSpotify馬鹿なので一日に5時間ぐらい曲を再生し続けます。

おそらく皆さんはそのような使い方をされないので問題ないと思うのですが、僕のような使い方をしているとIFTTTが曲の情報を取得する挙動が徐々におかしくなり始めました。

具体的に言うと、曲の情報を取得する処理がジャムって(もたついて)しまい、30分に一回のスパンで一気に投稿するようになってしまいました。

一曲3分だとすると30分で再生する曲は10曲。それが一気にMisskeyのタイムラインに投げ込まれてしまうとフォロワーさんや同一サーバーにいる利用者の方々が困惑してしまうことになります。

IFTTTやZapierといったトリガー型サービスは、そこまで頻繁な条件の発生を想定しているものではなく、不定期だけど規則性のある条件を利用してオートメーション化する事が本来の使用用途のため、僕みたいに5時間以上再生するような音楽馬鹿がいると耐えられないとのこと。

そのため、Misskey投稿に特化したBOTサービスを自ら調達する必要が生じました。

np2mastを活用させていただく

どのように実装しようか悩んでいたところ、二年前にyudeさんという開発者の方がMastodon向けにNowPlayソフトを制作されていたので、こちらをフォークしてMisskeyバージョンを作ろうという事になりました。

github.com

コード中でMastodonとMisskeyで差が出てくる部分はAPIの認証のみであったため、そこを加筆する形でMisskey版を製作させていただいたのですが、認証部分で何故か処理に失敗してしまったので原因を探っていたところ、Spotifyのスコープを明確に指定してトークンを発行しなければならないとのことでした。

github.com

僕が書き換えたばかりに曲の情報が連続してうまく保持できないこともあり、 色々あって数か月かかりましたが完成。yudeさんのMastodonナウプレが無かったら50年掛かってたと思うので本当に助かりました。

使用方法

Githubに簡単に説明を書いていますが、僕が火星人な影響で何を言ってるのか分からないということなので、写真を併せて説明させていただきます。

このリポジトリではSpotifyのトークンを発行する準備が必要なので、手元のPCでトークンを発行してからサーバーに.envファイルを追加し実行する手順を踏みます。

使用するサーバーはDebian/Ubuntu系です。適宜環境に合わせて読み替えてください。

前提として、このサービスはGoで動いているので、手元のPCとサーバーにGoをインストールしていただく必要があります。

go.dev

公式ページを参考に導入を済ませておいてください。

リポジトリの準備

まず、リポジトリを手元のPCにクローンします。

git clone https://github.com/CAT5NEKO/np2misk.git

次に、リポジトリ内部にあるenv.exampleファイルに記載されている認証情報のうちSPOTIFY_REFRESH_TOKEN="" 以外の項目を埋めます。以下より順に進めていきましょう。

Misskeyの認証情報を登録

MISSKEY_ACCESS_TOKEN="ノートの作成/消去の権限のみを付与してください。"
MISSKEY_ENDPOINT_URL="https://example.tld"

ここではMisskeyのURLとアクセストークンを記載します。

MisskeyのURLはBotを動かすサーバーのURLを記載します。misskey.ioであればhttps://misskey.ioになります。

サーバーによってはBotを禁止している場合もございますので、利用規約をよくお読みになってから導入して下さい。

アクセストークンは設定→API で発行します。

APIの作成を押し、ノートの作成・消去の権限を与え、チェックマークを押すとアクセストークンが表示されます。

このトークンは一度だけしか表示されないのでしっかりコピーしてから画面を閉じてください。 また、このトークンがあれば、誰でもあなたのアカウントを使ってノートを作成する事が可能になるので、決してSNSに投稿したり外部に公開されないよう保管してください。

以上を追加すればこのような感じで埋まると思います。””(ダブルクォーテーション)の中に記載するようにしてください。

MISSKEY_ACCESS_TOKEN="先ほど発行したアクセストークン"
MISSKEY_ENDPOINT_URL="https://example.tld"

Spotifyの認証情報を登録

SpotifyのアクセストークンはSpotifyの開発者ページで発行します。こちらのURLに進んでください。

すでにログインを済ませているとこのような画面が出ると思いますので、そちらの右上にあるアカウントのアイコンをクリックし、Dashboardという項目に移動します。

ダッシュボードに移動するとアプリ一覧が表示されるので、CreateAppをクリック

画像の通り必要な項目を埋めていきます。

AppName:アプリの名前。なんでもいいです。
Description:アプリの説明。なんでもいいです。
WebSite:ウェブサイト。今回はBotを作るためサイトが存在しないため存在しないページを記載していただいて構いません。
CallBack:そのままで大丈夫です。

最後にWebAPIの項目にチェックし、利用規約に同意してSAVEボタンを押します。

するとこのようにアプリケーションの利用統計が表示されている項目に飛びますので、Settingというボタンを押します。

Settingページの上部にClientIDとClientSecretが記載されていますので、今回はこちらのふたつを使います。

こちらも重要な個人情報なので大切に保管してください。

こちらのページで得た情報をenvの項目に記載します。

SPOTIFY_CLIENT_ID="Client ID (上のやつ)"
SPOTIFY_CLIENT_SECRET="Client Secret (下のやつ)"

これらがそろったら、リポジトリ内部に.envファイルを作り、env.exampleを参考に情報を埋め合わせて下さい。VScode(コードエディタ)やIDE(統合開発環境)などを使うとgo buildがボタン一つで実行できることもあって便利です。ぜひご検討ください。

無料 https://code.visualstudio.com/

30日間は無料(おすすめ) https://www.jetbrains.com/ja-jp/go/download/

.envファイルの記載が住みましたら、goで書かれたソースコードを実行可能な状態にします。

ターミナルでgo buildというコマンドを入力し、実行可能なファイルを作成して実行してもらうか、IDEやエディタの再生マークのようなものを押してください。

すると、ターミナル上にURLが表示されますので、そちらを押してください。

URLに飛ぶと再度ログインが促され、許可が求められますので許可してください。 すると自動で.envファイルにREFRESH_TOKENが埋められます。

お手元のPCでご使用いただく場合であればここで再度実行していただくと処理が開始します。

サーバー上の設定

Botとして動作させるにはサーバー上に設置して恒久的に動作させる必要があります。

ここからはややコマンドが多くなるので画像は割愛させていただきます。

リポジトリの準備

今度はサーバー上でリポジトリをクローンしてください。

git clone https://github.com/CAT5NEKO/np2misk.git

そして、リポジトリ内に移動していただき、.envファイルを作成し、先ほど手元のPCで埋めた内容をコピペします。

cd np2misk
nano .env

その際にビルドもお願いします。

go build

次に同一ディレクトリ内に処理が失敗して終了した場合に蘇生するシェルを作成します。

nano run_main.sh
#!/bin/bash

cd /path/to/your/np2misk/
 
if [ -x ./np2misk ]; then
    ./np2misk
  else
    echo "Error: ./np2misk not found or not executable."
fi

while true; do
    ./np2misk
    if [ $? -eq 0 ]; then
      echo "Execution completed successfully. Exiting."
      exit 0
        else
          echo "Error occurred. Retrying..."
            sleep 1
    fi
done

必要に応じてパスやファイル名を置き換えてください。

最後に、こちらのシェルをSystemdを使用してサービス化します。

[Unit]
  Description=Run run_main script repeatedly

[Service]
  Type=simple
  ExecStart=/bin/bash /path/to/your/np2misk/run_main.sh

[Install]
  WantedBy=default.target

こちらも適宜置き換えて下さい。

保存が済んだらreload、enabledで有効化し、statusで正常に動作していることを確認します。

これでSpotify上で曲を再生すれば、投稿されるようになります。

まとめ

最後のほう火星語復活して申し訳ございません。

基本的ななうぷれであればはるのんさんの紹介されていたIFTTTの方式が一番楽ですのでそちらをご活用いただけると快適に投稿できますが、僕みたいなヘビーユーザーの場合は投稿処理に滞りが発生するので、今回のようにBotを作成する方式をとると便利だという話でした。

ご活用いただければ幸いです。

当ブログの投稿内容において、具体的な根拠や出典を明示していない限り、根拠や出典の存在を一切保証しません。また、根拠や出典が明示されているか否かにかかわらず、根拠や出典の妥当性・真実性を保証しません。

尚、実際の人物や団体に影響が出ないようにある程度抽象化したり脚色したりすることもあります。ここに出てくる登場人物や出来事は全て夢の中で起こっているようなものという感覚で読んでいただけると幸いです。