毎朝時間がなくて星占いチェックができないなら、自分で作ってみよう！と「今日の運勢占いBot」を作ってみた！

#はじめに
星座を入れると今日の運勢やラッキーカラーを自動返信する「今日の運勢占いBOT」を作ってみました。
#占いBOTを作った目的
子供のころから星を見るのが大好きで、今でも星の誕生だったり、意味だったり、はたまた運命だったりを考え、日々、思いを馳せています。
そんな私は、やっぱり、星占いにも関心があり、ほぼほぼ毎朝、「今日の占いカウントダウン」をかかさずチェックしています。<br>
ただ、最近、毎朝時間がなく、見れていないんです。<br>
「スマホに占いのアプリでも入れようかな？」とも考えてみたのですが、今回、LINEでBotを作る！という課題がでたこともあり、「じゃあ、自分で作ってみようかな？」と思い作成することにしました。<br>
プログラミング力まだまだですが、がんばって作ってみました！
#開発手順
下記の流れで、開発を進めていきました。<br>
・LINE Developers 登録&設定
・Heroku 登録&設定
・node.jsで実装<br>
LINE Developersの登録&設定、およびHerokuの登録&設定については下記URLを参照ください。<br>
＜参考サイト＞
https://developers.line.biz/ja/docs/messaging-api/getting-started/
https://note.com/on_bass/n/n0495484a2b2b
#環境
Visual Studio Code　
Heroku
Node.js
#LINE BOTの仕組みについて
今回は、勉強も兼ねてHerokuを使ってLINE BOTを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/17ec3980-ed33-03fb-690e-55a8aa0169f2.png)
1.  ユーザーがボットにメッセージを送ると、Webhookを利用し、Messaging APIを通して、Herokuへリクエストを送信します。
2.  Herokuが受け取ったリクエストを、Node.jsで実装したソースコードが処理し、値をHerokuへ返します。
3.  Herokuが受け取った応答リクエストを、Messaging APIへ送ります。
　(応答リクエストは、JSON形式でHTTPSを使って送信されます。)
4.  LINEが受け取り、データが表示されます。
という流れで、データの授受が行われます。

＜Messaging Api＞
https://developers.line.biz/ja/docs/messaging-api/getting-started/<br>
＜Heroku＞
https://www.bing.com/ <br>
＜今回使用した星占いのApi＞
https://jugemkey.jp/api/waf/api_free.php<br>
#開発準備
####１．Heroku CLIインストール
インストール手順については、以下を参照してください。
https://developers.line.biz/ja/docs/messaging-api/getting-started/<br>
####２．Herokuへのログイン、環境設定　　
Herokuへのログイン、webhookの設定方法等が詳細に記載されています。
今回は、こちらをがっつり参考にさせていただいているので、詳細な内容は割愛させていただきました。
https://qiita.com/abemaki29/items/44d2015561c31ea9628e
####３．Webhookの設定
今回は、星占いApiから結果を返したいので、LINE Developers上で以下の様に設定します。
Webhook送信：利用する
Webhook URL：https://<アプリケーション名>.herokuapp.com/callback
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/88baef44-8e95-9b88-f645-fe27be36bfb9.png)
#完成画像
早速今日の運勢を占いましょう！
![LINE.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1268391/9cf2109d-77dc-c878-94c2-4ca11c594b6d.png)
ちなみに私は「牡羊座」です。なんと総合運１位！やりましたー！
#おわりに
初めてHerokuを使ってみましたが、意外と楽しく開発することができました。
今回はかなりシンプルな内容になってしまったので、もう少し勉強して「星占いBot」をさらにパワーアップさせたいと思います。
#サンプルコード（全文）
```cpp
'use strict'; 
const http = require('http');
//初期設定
var express = require("express");
var app = express();
var cfenv = require("cfenv");
require('dotenv').config();
var request = require("request");
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({
 extended: true
}));
app.use(bodyParser.json());
var urlLine = process.env.Channel_endpoint //LINEエンドポイント設定(.envより取
得)
var botKey = process.env.Channel_access_token 
//apiというPOSTがurlにきたらテキスト返信するように設定
const asyncwrap = fn => (req, res, next) => fn(req, res, next).catch(next);
app.post("/api", asyncwrap(async (req, res) => {
 
 var userMessage = req.body["events"][0]["message"]["text"]; 
 //牡羊→0 牡牛座→1 双子座 蟹座　獅子座　乙女座　天秤座　蠍座　射手座　山羊
座　水瓶座　魚座
 if(userMessage==="牡羊座" || userMessage==="牡牛座" || userMessage==="双子座
" || userMessage==="蟹座" || userMessage==="獅子座" || userMessage==="乙女座" ||
userMessage==="天秤座" || userMessage==="蠍座" || userMessage==="射手座" || 
userMessage==="山羊座" || userMessage==="水瓶座" || userMessage==="魚座"){
 //callback処理をしました(uranai関数終了後に次に進むように同期)
 uranai(userMessage,function(message) {
 console.log("同期中")
 console.log(message) 
 //受け取った値の手直し(json形式のままでは送信できない)
 const text=userMessage+"の今日の運勢\n-----------------------\n・ラ
ッキーアイテム: "+message.item+"\n・金運: "+message.money+"\n・総合運: 
"+message.total+"\n・仕事運: "+message.job+"\n・ラッキーカラー: 
"+message.color+"\n・恋愛運: "+message.love+"\n・占い: "+message.content
 //送信形式
 var options = {
 method: "POST",
 uri: urlLine,
 body: {
 replyToken: req.body.events[0].replyToken, 
 messageNotified: 0,
 messages: [ 
 {
 contentType: 1,
 type: "text",
 text: text,
 }
 ]
 },
 auth: {
 bearer : botKey
 },
 json: true
 };
 console.log(options)
 request(options, function(err, res, body) {
 });
 res.send("OK");
 })
 } 
 else{
 var options = {
 method: "POST",
 uri: urlLine,
 body: {
 replyToken: req.body.events[0].replyToken,
 messageNotified: 0,
 messages: [
 
 {
 contentType: 1,
 type: "text",
 text: "現在は「星座」のみテキストを受け付けています",
 }
 ]
 },
 auth: {
 bearer : botKey
 },
 json: true
 };
 request(options, function(err, res, body) {
 });
 res.send("OK");
 }
 
}));
//占いから結果を取得するfunction
function uranai(seiza,callbackFunc){
 //日付取得→事前にnpm install date-utilsにてインストール require('date-utils');
 var dt = new Date();
 var DATE = dt.toFormat("YYYY/MM/DD");
 const req = 'http://api.jugemkey.jp/api/horoscope/free/'+DATE; //APIより
(url+日付(YYYY/MM/DD形式)にて返答あり)
 
 http.get(req, res => {
 var body ='';
 res.setEncoding('utf8');
 res.on('data', (chunk) => {
 body += chunk;
 });
 res.on('end', () => {
 res = JSON.parse(body);
 //牡羊→0 牡牛座→1 双子座 蟹座　獅子座　乙女座　天秤座　蠍座　射手座　
山羊座　水瓶座　魚座
 if(seiza==="牡羊座"){
 var num=0;
 }else if(seiza==="牡牛座"){
 var num=1;
 }else if(seiza==="双子座"){
 var num=2;
 }else if(seiza==="蟹座"){
 var num=3;
 }else if(seiza==="獅子座"){
 var num=4;
 }else if(seiza==="乙女座"){
 var num=5;
 }else if(seiza==="天秤座"){
 var num=6;
 }else if(seiza==="蠍座"){
 var num=7;
 }else if(seiza==="射手座"){
 var num=8;
 }else if(seiza==="山羊座"){
 var num=9;
 }else if(seiza==="水瓶座"){
 var num=10;
 }else if(seiza==="魚座"){
 var num=11;
 }
 const all_data=res.horoscope;
 const minimal_data=all_data[DATE];
 const ohitsuziza=minimal_data[num];
 const uranai_content=ohitsuziza.content;
 //console.log(uranai_content);
 //return console.log(uranai_content)
 //callbackFunc(uranai_content); //注意：通常の関数処理では非同期接続とな
りデータが得られなかった→同期処理
 callbackFunc(ohitsuziza); });
 })
 .on('error', e => {
 console.error(e.message);
 });
 
 
}
// サーバ起動→LINE botを作る際には必ず必要
var appEnv = cfenv.getAppEnv();
app.listen(appEnv.port, "0.0.0.0", function() {
 console.log("server starting on " + appEnv.url);
});
```