SlackのStatus
ここにiTunesで聞いている曲を表示させたいがためのアプリを作った。
https://github.com/narikei/nowplaying-on-slack
Statusを更新するAPI
ここを更新するにはusers.profile.set
を使います。
https://api.slack.com/methods/users.profile.set#updating_a_user_s_current_status
{
"status_text": "ANTIHERO - LiSA",
"status_emoji": ":musical_note:"
}
これを送るだけ。
const request = require('request');
const token = process.env.SLACK_API_TOKEN;
request({
url: 'https://slack.com/api/users.profile.set',
method: 'POST',
form: {
token,
profile: JSON.stringify({
status_text: 'ANTIHERO - LiSA',
status_emoji: ':musical_note:',
}),
},
}, (error, response, body) => {
if (error) {
console.error(error, response, body);
}
});
SlackのTokenは環境変数で引き渡す形式にし、
$ SLACK_API_TOKEN=xoxp-xxxx-xxxx-xxxx-xxxx node main.js
とかやるとStatusが更新されます。
Slackのアプリのscopeには users.profile:write
を許可しておく
現在再生中の曲をiTunesから取得する
playback
というライブラリーが比較的簡単に取り扱えるため、こいつを使っています。
https://github.com/jwalgran/playback
const playback = require('playback');
playback.currentTrack((res) => {
if (!res) {
return;
}
console.log(res);
// { name: 'ANTIHERO', artist: 'LiSA', album: 'Launcher' }
});
曲名、アーティスト名、アルバム名がそれぞれ取得できます。
再生中でない場合はnull
が返ってきます。
Electron化
常駐させるためにElectron化しました。とくに操作が必要なアプリではないため、
ウィンドウは作らずにapp.on('ready')
でプログラムを開始させています。
const electron = require('electron');
const request = require('request');
const playback = require('playback');
const app = electron.app;
const token = process.env.SLACK_API_TOKEN;
const sendToSlack = (message) => {
request({
url: 'https://slack.com/api/users.profile.set',
method: 'POST',
form: {
token,
profile: JSON.stringify({
status_text: message,
status_emoji: ':musical_note:',
}),
},
}, (error, response, body) => {
if (!error) {
return;
}
console.error(error, response, body);
});
};
const watchiTunes = () => {
let nowplaying;
setInterval(() => {
playback.currentTrack((res) => {
if (!res) {
return;
}
const message = `${res.name} - ${res.artist}`;
if (nowplaying === message) {
return;
}
console.log(message);
sendToSlack(message);
nowplaying = message;
});
}, 3000);
};
app.on('ready', () => {
if (!token) {
console.log('token ga naiyo');
return;
}
watchiTunes();
});