🤖
Spotify APIとDiscord.jsでBotを作ってみた
時間があったので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