🧫

ゆめかわ日蚘

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を䜜成する方匏をずるず䟿利だずいう話でした。

ご掻甚いただければ幞いです。

圓ブログの投皿内容においお、具䜓的な根拠や出兞を明瀺しおいない限り、根拠や出兞の存圚を䞀切保蚌したせん。たた、根拠や出兞が明瀺されおいるか吊かにかかわらず、根拠や出兞の劥圓性・真実性を保蚌したせん。

尚、実際の人物や団䜓に圱響が出ないようにある皋床抜象化したり脚色したりするこずもありたす。ここに出おくる登堎人物や出来事は党お倢の䞭で起こっおいるようなものずいう感芚で読んでいただけるず幞いです。