🤖

Spotify APIとDiscord.jsでBotを作ってみた

3 min read

時間があったのでDiscord Botを作ってみました。
SpotifyのAPIはSpotify Web API Nodeという素晴らしいラッパーライブラリがあるのでそれを使いました。

axiosやらなんやらで直接URLを叩いてもいいのですがせっかくライブラリがあるのでそっちを使いました。使わなくてもSpotify APIは使えます。

とりあえず基本のmessageCreateイベントでloginと入力されたらログイン用のURLを返すようにします。(Spotify APIのAuthenticationの関係でここだけはブラウザを開かないといけないっぽいです。もし間違ってたら教えていただけると幸いです。)
Authentication用のURLはSpotify API ライブラリの以下のメソッドで作れます。scopeとstateはお好みです。参考

createAuthorizeURL(scope, state)

ログインの雰囲気としてはこんな感じです。

//ログインする
client.on("messageCreate", async (message: Message) => {
  if (message.content == "login") {
    let mySpotifyApi = new MySpotifyApi();
    let a = mySpotifyApi.spotifyUserLogin(message.author);
    message.channel.send(a.authorizeURL);
  }
}

まずはMySpotifyApiというクラスを作ってSpotifyWebApiをラップ(?)します。

export class MySpotifyApi {
  spotifyApi: SpotifyWebApi;
  access_token_expires_after: number;
  constructor() {
    this.spotifyApi = new SpotifyWebApi({
      clientId: SPOTIFY_CLIENT_ID,
      clientSecret: SPOTIFY_CLIENT_SECRET,
      redirectUri: OAUTH2_CALLBACK_URL,
    });
    this.access_token_expires_after = -1;
  }
}

Authenticationはライブラリのメソッドが使えます。(以下はもちろんMySpotifyApiクラスのメソッドです。)

async authCodeGrant(code: string, state: string) {
	let data = await this.spotifyApi.authorizationCodeGrant(code);
	if (data) {
	  console.log("The token expires in " + data.body["expires_in"]);
	  console.log("The access token is " + data.body["access_token"]);
	  console.log("The refresh token is " + data.body["refresh_token"]);
	  this.access_token_expires_after = Date.now() + Number(data.body["expires_in"]) * 1000;
	  // Set the access token on the API object to use it in later calls
	  this.spotifyApi.setAccessToken(data.body["access_token"]);
	  this.spotifyApi.setRefreshToken(data.body["refresh_token"]);
	} else {
	  console.log("Something wrong in auth code grant!");
	}
}
//spotifyからのリダイレクトを受ける
app.post("/", function (request: Request, response: Response) {
  console.log("POST /");
  if (request.body && request.body.code) {
	mySpotifyApi.authCodeGrant(
		request.body.code,
		request.body.state
      );
  }
});

とりあえずSpotify APIのAuthenticationは完了したのでまずはユーザーのSpotify上のプロフィール情報をフェッチします。

  async getMe(): Promise<any> {
    // Get the authenticated user
    try {
      return new Promise((resolve, reject) => {
        this.spotifyApi
          .getMe()
          .then(
            function (data) {
              console.log("Some information about the authenticated user");
              resolve(data.body);
            },
            function (err) {
              console.log("Something went wrong!", err);
              reject(err);
            }
          )
          .catch((err) => {
            console.log(err);
            reject(err);
          });
      });
    } catch {
      console.log("error in getMe");
    }
  }

そのほかのメソッドもほぼほぼ同じようなパターンで使えます。

今記事は以上です。

Discussion

ログインするとコメントできます