推しの配信通知をスマートウォッチとかAlexaに送ったときの忘備録

<h1>はじめに</h1>
ここ数日生活リズムが不規則になってきて、推しの配信を見逃すことがあったので見逃し寝過ごし防止に手元のデバイスに通知するようにしてみた。どこでやってることも結構単純なんだけどそれぞれでのデータ送受信で詰まることが多かった感じ。
雑だけど多分ちょっとやらなかったら忘れちゃいそうなので忘備録ってことで
<h1>全体のイメージ</h1>
↓みたいになってる
![イラスト10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523455/807f30be-f43b-a3b1-e807-33b8bf7004c7.png)
Alexaは通知でのスピーカー兼各機能ON/OFFを切り替える用、GASがメインでバックエンドの処理、node-redはスキル側からいい感じにAlexaを喋らせられるものがなかったのでそれ用って感じ。スマートウォッチ(fitbit)はメールの通知で手元に通知遅れるようにした。（ここをスキルにしてスヌーズの仕方とかいじれたらより気づきやすくなるかなとは思う）
あと、配信予定時刻にアラームを追加する機能もつけようと思ったけどうまく行ったかわかんないのでとりあえずパス。
<h1>作り方</h1>
<h3>Alexa側</h3>公式とかのサイトとかサンプル見ながら、node-jsで書いていけばまぁ大抵なんとかなった。
がっつり詰まったのがスプレッドシート書き換えたりスプレッドシートの値読み込んだりするためのGASとの連帯。なんか結構色々方法あったみたいだけど以下2つのサイト見ながらやってみた。
<a>https://miyataro.hatenablog.com/entry/2018/05/03/Amazon_echo%E3%81%A8Google_Spreadsheet%E3%81%A7%E8%82%B2%E5%85%90%E8%A8%98%E9%8C%B2%E3%82%92%E3%81%A4%E3%81%91%E3%82%8B</a>
コードはこんな感じ
<pre><code>//諸々インポート
const Alexa = require('ask-sdk-core');
const {google} = require('googleapis');
const {OAuth2Client} = require('google-auth-library');
//認証情報
const scriptID = '******';
const auth = new OAuth2Client('*****','*****');
auth.setCredentials({
    access_token:'******',
    refresh_token:'********'
});
const script = google.script('v1');
//gas呼び出しを指定
const gas = (scam,array) => {
    return new Promise((resolve, reject) => {
        script.scripts.run({
            auth: auth,
            scriptId: scriptID,
            requestBody: {
                function: scam,
                parameters: array,
                devMode: true
            }
        }, (err, result) => {
            if (err) {
                console.log(err);
                reject(new Error(err));
            } else {
                resolve(result);
            }
        });
    });
}//以下省略</code></pre>
あとはGAS側のfunction名とそれの引数の配列を指定してあげて使えば行けた。
<h3>GAS側</h3>
こっちはほぼ詰まらなかった。youtube data api君もGASにはサービスとしてあるから認証情報の登録とかもせずに
<pre><code>var yotuberesults = YouTube.Search.list('id,snippet',{
channelId:'UCIBY1ollUsauvVi4hW4cumw',
order:'date'
});</code></pre>
こんな感じで簡単に叩ける。(これは沙花叉のチャンネルの動画と配信の情報諸々取得のやつ)
<a>https://coolish.hatenablog.com/entry/2019/01/24/040125</a>
上のサイトにあるようにSearch.listをsnippetで送ったときの['items'][0]['snippet']['liveBroadcastContent']（0のところは何個目の検索結果か）のところに<table><th>none</th><th>アーカイブ済み</th><tr><th>upcoming</th> <th>配信枠</th><tr><th>live</th> <th>配信中</th></table>ってなる。あと配信枠だけ出来てるやつにid検索でVideo.listで検索かけたときの['items'][0]['liveStreamingDetails']['scheduledStartTime']に配信開始予定時刻が入ってる。

各機能のON/OFFとかはこんな感じでスプレッドシートに記載するようにしておく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523455/21126f0b-9b87-80a6-2721-17212c9cc4d4.png)

あとはGASの時間指定トリガーで指定して、スプレッドシートの機能状況に応じて動かしてあげれば大丈夫なんだけど、一個気にしなきゃいけないのがyoutube data apiくんの割当量。youtube data apiくんは各apiリクエストにコストが決まってて一日に10000コスト以上のリクエストは叩けないようになってる。searchリクエストは一回あたり100コスト食うので24時間回すことを考えると15分より短いスパンで叩くと一日中回しきれない。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523455/822ad323-69c1-d0b3-7c55-caf42c1ae864.png)
<h1>node-red</h1>
こっちは初めて使ったので色々突っかかった。とりあえず、node-red本体を入れ終わったあとのところから書く。
今回はAlexaにスクリプト側から喋らせるのにnode-red-contrib-alexa-remote2-v2を使う。パレットを追加して、ノードの設定を行うとこまでは色んなサイトに書いてある。問題はここから
このノードではノードとのアカウント連帯にAlexa-Cookie2っていうのを使っているんだけど、その設定ファイルを書き換えてあげなきゃいけない。書き換えるファイルは2つでnode-red起動ユーザーのホームディレクトリからみて
.node-red/node_modules/node-red-contrib-alexa-remote2/node_modules/alexa-cookie2
にあるalexa-cookie.js。そして2つ目がそこからさらにlib内にあるproxy.js。これらの変更はサイトによってバージョンとかも違うので一概には言えないが、自分が行った
node-red-contrib-alexa-remote2-v2@3.10.5
alexa-cookie2@3.4.3
の環境では以下のサイトに従うとうまくいった
<a>https://uepon.hatenadiary.com/entry/2020/07/28/184204</a>
この設定後node-redを再起動しないとうまく連帯できないので注意。
あとは、http requestノードでGASのウェブアプリケーションのURLをgetすることでGASのdoGet関数を叩けるので、時間トリガーを指定してあげて下のように組んだ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523455/fdd64ea2-0f8e-c129-5b36-1a4d9b3cde3c.png)
<h1>終わりに</h1>
コレで寝るときに配信を気にして寝るか悩んだりしなくて良くなるのではとか思ったり思わなかったり。（まぁそれも嫌いじゃないけど）
コレを作るにあたって、ラズベリーパイを使ったりしてみたので、そっちを使えば常駐のスクリプトも作りやすくなって、もうちょっと悪さできないかなと画策中