[GoogleAppsScript] 占いをLINEに通知する

# はじめに
LINE Notifyを使用して占いを通知するBOTを作成しました。
<img width="256" alt="1_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/5166d5fd-0810-2d47-e87b-1759f227556f.png">

GoogleAppsScript（GAS）にて1日1回通知プログラムを実行します。
そのプログラムでは、[占い配信](http://jugemkey.jp/api/waf/api_free.php#ApiDescription)からその日の占い情報を取得して、[LINE Notify](https://notify-bot.line.me/ja/)に通知します。

```plantuml
@startuml
GoogleAppsScript -> GoogleAppsScript: 1日1回起動
activate GoogleAppsScript
  GoogleAppsScript -> "占い配信 API": GET /horoscope
  activate "占い配信 API"
    GoogleAppsScript <-- "占い配信 API": 占い情報
  deactivate "占い配信 API"
  GoogleAppsScript -> "LINE Notify": ...POST /notify
deactivate GoogleAppsScript
activate "LINE Notify"
  "LINE Notify" -> "LINE Notify": 対象のユーザーに通知
deactivate "LINE Notify"
@enduml
```

# 占い配信API
- [占い配信 Web Ad Fortune API版](http://jugemkey.jp/api/waf/api_free.php#ApiDescription)
- [API仕様](http://jugemkey.jp/api/waf/api.php)
- powerd by [JugemKey](http://jugemkey.jp/api/)
- 【PR】[原宿占い館 塔里木](http://www.tarim.co.jp/)

毎日全12星座を星座毎に占いデータを配信するAPIです。商用で使用する場合は有料となります。使用する場合は、利用規約をご確認ください。

# LINE Notify
- [LINE Notify](https://notify-bot.line.me/ja/)
- [API仕様](https://notify-bot.line.me/doc/ja/)

LINEアカウントのメッセージを通じてユーザーに配信するAPIです。 ユーザーアカウントやグループに通知することが可能です。

## アクセストークンの発行手順
1. https://notify-bot.line.me/ja/ にアクセスする。
2. LINEのアカウントでログインする。
<img width="835" alt="2_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/847c7a57-b16f-8706-52a6-4f9e94bd2829.png">

3. 「トークンを発行する」を押下する。
<img width="621" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/02506880-dfcb-2be4-03b4-c1a54c4cfd2d.png">

4. トークンを発行する対象を選択します。「トークン名」に入力して、「発行する」を押下する。（対象がグループの場合は、グループメンバーに「LINE Notify」を招待する必要がある）
<img width="345" alt="4_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/5bb44aab-5baa-c44b-88ce-796ab198c0be.png">

5. 発行したトークンをコピーする。
<img width="349" alt="5_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/479966d8-a7ee-0e1e-872e-c715f49eb4d7.png">

6. 発行済みのアカウントやグループは連携済みとなる。（解除する場合は、「解除」を押下する）
<img width="660" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/d3995a4f-c3ce-5b0d-bcda-b4155dfc2aca.png">

# GoogleAppsScript
1. GoogleAppsScriptを開いて、以下のスクリプトを実装します。`LINE_NOTIFY_TOKEN`にLINE Notifyで発行したトークンを指定する。`USER_LIST`にユーザーの星座を指定する。

```JavaScript:main.gs
/**
 * 占い配信BOT
 * 
 * powerd by JugemKey: http://jugemkey.jp/api/
 * 【PR】原宿占い館 塔里木: http://www.tarim.co.jp/
 */
const LINE_NOTIFY_TOKEN = '*****'; // ※ここにLINE NOTIFY用のアクセストークンを指定する
const zodiacSign = {
    ARIES: 0, // 牡羊座
    TAURUS: 1, // 牡牛座
    GEMINI: 2, // 双子座
    CRAB: 3, // 蟹座
    LEO: 4, // 獅子座
    VIRGO: 5, // 乙女座
    LIBRA: 6, // 天秤座
    SCORPIO: 7, // 蠍座
    SAGITTARIUS: 8, // 射手座
    GOAT: 9, // 山羊座
    AQUARIUS: 10, // 水瓶座
    FISH: 11, // 魚座
};

// ※ここに通知したいユーザーの星座を指定する
const USER_LIST = [{
        name: 'A男',
        sign: zodiacSign.ARIES
    },
    {
        name: 'B子',
        sign: zodiacSign.SAGITTARIUS
    }
];
const WEEKDAY = ["日", "月", "火", "水", "木", "金", "土"];

/**
 * メイン処理
 */
function main() {
    try {
        let nowDt = new Date();
        let targetDt = Utilities.formatDate(nowDt, 'Asia/Tokyo', 'yyyy/MM/dd');
        let res = getHoroscope(targetDt);
        console.log(res);

        let horoList = res['horoscope'][targetDt];
        let dt = Utilities.formatDate(nowDt, 'Asia/Tokyo', `MM/dd(${WEEKDAY[nowDt.getDay()]})`);
        let message = `\n今日の占いだよ!!\n\n--- ${dt} ----\n\n`;
        for (let i in USER_LIST) {
            let user = USER_LIST[i];
            let horoObj = horoList[user.sign];
            message += `< ${user.name}(${horoObj.sign}) >\n`;
            message += `ランキング: ${horoObj.rank}位\n`;
            message += `総合運: ${getStar(horoObj.total)}\n`;
            message += `恋愛運: ${getStar(horoObj.love)}\n`;
            message += `仕事運: ${getStar(horoObj.job)}\n`;
            message += `金運  : ${getStar(horoObj.money)}\n`;
            message += `ラッキーアイテム: ${horoObj.item}\n`;
            message += `ラッキーカラー: ${horoObj.color}\n`;
            message += `${horoObj.content}\n`;
            message += `\n`;
        }
        sendLineNotify(message);

    } catch (e) {
        console.error(e.stack);
    }
}

/**
 * 星を取得する
 * @param {Number} num 
 */
function getStar(num) {
    let message = '';
    for (let i = 0; i < 5; i++) {
        if (i < num) {
            message += '★';
        } else {
            message += '☆';
        }
    }
    return message;
}

/**
 * 占い情報を取得する
 * @param {String} date 日付 
 */
function getHoroscope(date) {
    let url = `http://api.jugemkey.jp/api/horoscope/free/${date}`;
    let options = {
        'method': 'get',
        'validateHttpsCertificates': false
    };
    let response = UrlFetchApp.fetch(url, options);
    return JSON.parse(response.getContentText('UTF-8'));
}

/**
 * LINEにメッセージを送信する
 * @param {String} message メッセージ 
 */
function sendLineNotify(message) {
    let url = 'https://notify-api.line.me/api/notify';
    let options = {
        'method': 'post',
        'headers': {
            'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
            'Authorization': `Bearer ${LINE_NOTIFY_TOKEN}`
        },
        'payload': `message=${message}`
    };
    let response = UrlFetchApp.fetch(url, options);
    return JSON.parse(response.getContentText('UTF-8'));
}
```

2. 「編集」->「現在のプロジェクトのトリガー」を押下する。
<img width="329" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/55eeb269-564a-13ee-152d-1c7f15e99501.png">

3. 「トリガーを追加」を押下する。
<img width="791" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/1cc6985a-bb1b-8558-71f7-d722a6783666.png">

4. プログラムを実行する条件を入力して、「保存」を押下する。
<img width="415" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50563/9365b219-09a4-2752-4edb-555d1ed06f34.png">

# 参考リンク
- [PythonでLINEにメッセージを送る](https://qiita.com/moriita/items/5b199ac6b14ceaa4f7c9)
- [今日の占い結果をPythonで取得してみた](https://qiita.com/tottu22/items/6aac6690dbca951ddb47)

# さいごに
ソースコードをGitHubに公開しています。

- [ソースファイルはこちら](https://github.com/yunbow/GoogleAppsScript-LINE-Horoscope)

以上です。