🤖

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

2021/09/19に公開

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

とりあえず基本の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