LINE公式でオンラインサロン作ってみたい
LINE公式でオンラインサロン作ってみたい
の続きになります。
LINEオンラインサロン全体像
・サブクス決済は自動でLINE上で行える
・フリーで質問・相談のチャットが可能
・チャットでは解決できない事をzoomなどでオンライン個別相談を行う
・対象ユーザーに向けてお知らせ一斉送信
上記の機能を考えました。
技術的な流れとしては
・LINE Payのサブクス決済をLINE上で実装
・Google Calendar API(webAPI)からカレンダー情報を取得
・LINE Messaging APIを利用して、空きスケジュールなどの情報を対象ユーザーに向けて一斉送信
それでは、google calendar APIからスケジュール情報を取得&LINEへ送信の構築部分を紹介します。
google calendar APIからスケジュール取得
普段からgoogle calendarをよく利用しています。
google calendarにプライベートと仕事のスケジュールを全て管理しておき、お客様はスケジュールの空いている所にピンポイントで予約を入れられるので、スケジュール調整が自動化出来てとても便利です。
そこで、node.jsでgoogle calendar情報を取得させるコードを見つけたので実装してみる事にしました。
node.jsでgoogle calendarを扱う前に、Google APIsで認証キーの発行が必要です。
Google APIsでAPIキー発行
公式ドキュメントのEnable the Google Calendar APIボタンをクリックしてキーを発行します。
Google API でプロジェクト新規作成
プロジェクト名入力
APIを有効化
OAuth同意
認証情報作成
今回、node.jsを利用します。
任意のサービスアカウント名を入力します。
ロールはオーナーにしました。
秘密キーが自動ダウンロードされました。
【認証情報】の中にサービスアカウントが増えています。
クリックしてみると
google calendarでのアクセス権限
カレンダーへアクセスして、歯車アイコンをクリックして設定をしていきます。
node.jsを利用
パッケージを利用します。
npm install node-google-calendar
configファイル作成
// ----------------------
// ④ タイムゾーン(日本)
// ----------------------
const TIMEZONE = 'UTC+09:00';
module.exports.calendarUrl = CALENDAR_URL;
module.exports.serviceAcctId = SERVICE_ACCT_ID;
module.exports.calendarId = CALENDAR_ID;
module.exports.key = KEY;
module.exports.timezone = TIMEZONE;
/*************************
sample.js
*************************/
// ----------------------
// パッケージのインスタンス生成
// ----------------------
var Calendar = require('node-google-calendar'),
config = require('./credentials/calendar-config'),
calId = config.calendarId.myCal;
var cal = new Calendar(config);
// ----------------------
// カレンダーイベントの取得
// ----------------------
// 取得する対象期間を指定
// timeMinからtimeMaxの間のカレンダーイベントが取得される
var params = {
timeMin: '2020-12-01T06:00:00+09:00',
timeMax: '2020-12-31T06:00:00+09:00',
}
cal.Events.list(calId, params)
.then(calEvents => {
console.log(calEvents);
})
.catch(err => {
console.log(err.message);
});
timeの箇所を取得したい期間にします。
実際に取得をしたデータ
他にも色々出来る
カレンダー情報を受け取ったのですが、削除したり追加したり色々出来るみたいです。
Enentsの構造についてのリファレンスを見つけました。
Google Calendar API Enents
また、今回はcal.Event.listとしたのですが、
listの部分をdeleteやgetなど、色々変える事でgoogleカレンダーを便利に使えそうです。
Google Calendar API Methods
せっかくなので、LINEにデータを送りたい
取得されるcalEventsはJSON形式なので、LINEに送りたいと思って実装したところ
let msg = calEvents;
カレンダーから取得した値をメッセージに代入できなくてはまりました。
調べると
console.log(JSON.stringify(value));
このような形式で書いてあげると解決できるみたいです。無事、出力されました。
参考サイト:console.logでJSON形式の値が[object Object]になる時
LINE botへメッセージを送る時も、【text: JSON.stringify(msg) 】と記述をしたところ、無事チャットボットに返答がありました!
【text: msg】だとbotに情報が何も送れず、この部分の解決にとても苦労しました。
cal.Events.list(calId, params)
.then(calEvents => {
console.log(calEvents);
let msg = calEvents;
console.log(JSON.stringify(msg));
return client.replyMessage(event.replyToken, {
type: 'text',
text: JSON.stringify(msg)
});
})
.catch(err => {
console.log(err.message);
});
LINEへカレンダー情報が送れることが分かったので
特定LINEユーザーへ送信
LINE公式アカウントでオンラインサロンを運用する際に、空きスケジュールを自動取得、一斉送信という仕組みもあっても良いのかなと思ったので、LINE Messaging APIのmulticastという機能も使ってみる事にしました。
replayMessageをmulticastへ変更しています。
cal.Events.list(calId, params)
.then(calEvents => {
console.log(calEvents);
let msg = calEvents;
console.log(JSON.stringify(msg));
// return client.replyMessage(event.replyToken, {
return client.multicast(['USER-ID'], {
type: 'text',
text: JSON.stringify(msg) //← ここに入れた言葉が実際に返信されます
});
})
.catch(err => {
console.log(err.message);
});
まとめ
JSONで受けとったデータがそのまま送られているので、必要な情報だけを送れるように引き続き考察を続けていきたいと思います。
今回、Google Calendar APIを利用する為に参考にしたサイトは以下です。
とても分かりやすく、エラーなく実装が行えました。
node.jsでGoogleカレンダーを操作する方法。nodeパッケージ「node-google-calendar」使用。
googleカレンダーから情報を取得する方法は
LINE公式でオンラインサロン作ってみたいこちらに書きました