本記事は、ハンズラボ Advent Calendar 2022 13日目の記事です。
ドキドキしながらのQiita初投稿です。よろしくお願いいたします。
はじめに
みなさん、リモートワーク中に運動不足になっていませんか?
今回は、運動不足解消の一助となるべく、Google Apps Scripts(GAS)を利用して自宅でもできる筋トレ動画を垂れ流すSlack botを作ってみました。
作ったもの
なかやまきんに君さんの再生リスト「自宅で筋トレ」の動画の中から、ランダムで一つの動画を、毎朝Slackの特定のチャンネルに通知します。
やったこと
- Slack botを作成するために、Slackアプリを新規作成する。
- 筋トレ動画をSlackへ通知するために、GASのプログラムを作成する。
- GASのプログラムを定期実行するために、トリガーを設定する。
Slack botの作成準備
https://api.slack.com/ にアクセスし、「Create an app」をクリックしてSlackアプリを新規作成します。
「From scratch」をクリックします。
App Nameにはアプリ名(任意・後から変更可)を入力します。Pick a workspace to develop your app in:ではワークスペース名を選択します。
左サイドメニューの「OAuth & Permissions」を選択して、実装に使うWeb API methodsに応じて必要な権限を付与します。今回は、Bot Token Scopesにchat:write
の権限を付与します。
左サイドメニューの「Install App」を選択して、「Install to Workspace」をクリックします。Slack APIを利用するのに必要なので、Bot User OAuth Tokenが発行されたらコピーしておきます。
Slackのチャンネルにアプリを追加していないと、Slack botからメッセージを投稿することができません。チャンネル詳細画面の「インテグレーション」からアプリを追加することができます。私はこの操作をすっかり忘れていて、地味にハマりました。
これでSlack側の準備は完了です。
YouTube Data APIを利用するための準備
YouTube Data APIを利用すると、動画や再生リスト、登録チャンネルなどに関する情報を取得することができます。
このAPI、利用するためにはGoogle Cloud Platform(GCP)への登録やAPIキーが必要…という記事を何度か見かけましたが、GASを利用する場合はそういった手順は不要だそうです。GASで「サービス」を追加するだけで、YouTube Data APIを利用することができます。
GASのエディタにて、「サービス」の十字マークを選択します。
一覧の中からYoutube Data API v3を選択し、「追加」ボタンをクリックします。
「サービス」の下にYouTubeが追加されていれば、こちらも準備完了です。
GASのプログラムを作成する
YouTubeの再生リストの情報を取得し、スプレッドシートに書き込む
// 再生リストID
const PLAYLIST_ID = '<再生リストID>';
// 書き込み対象のシート情報
const SHEET_NAME = 'シート1';
/**
* スプレッドシートに動画情報を書き込む
*/
function updateSheet() {
// スプレッドシートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
// 指定の再生リストから動画情報を取得
const items = getPlaylistItems(PLAYLIST_ID);
// シートを一括クリア
sheet.clear();
// スプレッドシートに書き込む
sheet.getRange(1, 1, items.length, items[0].length).setValues(items);
}
/**
* 指定した再生リストの動画に関する情報を、配列として返す
*/
function getPlaylistItems(playlistId) {
const playlistItems = YouTube.PlaylistItems.list(
'snippet', // 再生リストのアイテムに関する基本情報(タイトル、再生リスト内の位置など)
{
playlistId: playlistId, // 再生リストID
maxResults: 50 // アイテムの最大数
}
);
// 返却用の配列
const playlistData = [];
for (const item of playlistItems.items) {
const title = item.snippet.title;
const url = 'https://www.youtube.com/watch?v=' + item.snippet.resourceId.videoId
+ '&list=' + item.snippet.playlistId;
playlistData.push([title, url]);
}
return playlistData;
}
「再生リストID」には、お好みの再生リストIDを指定してみてください。YouTubeの再生リストのURLはhttps://www.youtube.com/playlist?list=XXXX
のようになっており、XXXX
の部分が「再生リストID」です。
// 再生リストID
const PLAYLIST_ID = '<再生リストID>';
YouTube Data APIのPlaylistItems.list
メソッドの公式リファレンスはこちらです。
スプレッドシートのデータを取得し、Slackに通知する
// SlackAPIで設定したトークン
const TOKEN = '<Bot User OAuth Token>';
// Slackチャンネル
const CHANNEL_ID = '<チャンネルID>';
/**
* Slackチャンネル宛にメッセージを送信する
*/
function postMessageToRecommendHomeWorkout() {
// スプレッドシートからデータを取得
const data = readSheet();
// メッセージを作成
const di = Math.floor(Math.random() * data.length);
const words = ['パワー!', 'ヤー!', 'ハッ(笑顔)'];
const wi = Math.floor(Math.random() * words.length);
const message = words[wi] + '\n\n*' + data[di][0] + '*\n' + data[di][1];
console.log(message);
// 送信内容
const params = {
'method' : 'post',
'payload' : {
'token': TOKEN,
'channel': CHANNEL_ID,
'username': '自宅筋トレのすゝめ',
'icon_emoji': ':nakayamakinnikun:',
'text': message
}
};
// slackにメッセージを送信
const url = 'https://slack.com/api/chat.postMessage';
UrlFetchApp.fetch(url, params);
}
/**
* スプレッドシートから動画情報を読み込む
*/
function readSheet() {
// スプレッドシートを取得
const sheet = SpreadsheetApp.getActiveSpreadsheet().getSheetByName(SHEET_NAME);
// シート内の全データを取得
const values = sheet.getDataRange().getValues();
return values;
}
「チャンネルID」には、メッセージの送信先となるSlackのチャンネルのものを指定してください。アプリ版Slackを使用している場合は、該当のチャンネル名を右クリックして「リンクをコピー」してみてください。コピーされたURLはhttps://YYYY.slack.com/archives/ZZZZ
のようになっており、ZZZZ
の部分が「チャンネルID」です。
// slackチャンネル
const CHANNEL_ID = '<チャンネルID>';
Slack APIのchat.postMessage
メソッドの公式リファレンスはこちらです。
動作確認
updateSheet
を実行すると、「シート1」に動画のタイトルとURLが書き込まれます。
postMessageToRecommendHomeWorkout
を実行すると、指定したSlackのチャンネルにメッセージを投稿します。
トリガーを設定する
トリガーを追加して、作成したGASのプログラムを定期実行させます。
Slackにメッセージを投稿するpostMessageToRecommendHomeWorkout
関数を選択し、任意の設定をします。今回は、「時間主導型」「日付ベースのタイマー」「午前7時〜8時」にトリガーを設定してみます。
設定した時間にSlackのチャンネルへメッセージが届いたら、成功です。
おわり
お疲れさまでした。
ここまで読んでくださり、ありがとうございました。
このSlack botのおかげで、1日1回の筋トレを継続することができています。
余談になりますが、現職のSlackには、分報や多種多様なカスタム絵文字があります。私は筋トレ動画の通知先を自分の分報にしており、筋トレが完了したら「済」の絵文字を押しています。また、分報チャンネルを見ている社員の方から、「応援しています」や「えらい」などの絵文字を押していただくことがあり、モチベーションにつながっています。
筋トレは一人でも行えるものですが、Slackを通じてお互いに応援し合うことで、日々の筋トレが楽しくなるかもしれません。
参考