はじめに
星座を入れると今日の運勢やラッキーカラーを自動返信する「今日の運勢占いBOT」を作ってみました。
占いBOTを作った目的
子供のころから星を見るのが大好きで、今でも星の誕生だったり、意味だったり、はたまた運命だったりを考え、日々、思いを馳せています。
そんな私は、やっぱり、星占いにも関心があり、ほぼほぼ毎朝、「今日の占いカウントダウン」をかかさずチェックしています。
ただ、最近、毎朝時間がなく、見れていないんです。
「スマホに占いのアプリでも入れようかな?」とも考えてみたのですが、今回、LINEでBotを作る!という課題がでたこともあり、「じゃあ、自分で作ってみようかな?」と思い作成することにしました。
プログラミング力まだまだですが、がんばって作ってみました!
開発手順
下記の流れで、開発を進めていきました。
・LINE Developers 登録&設定
・Heroku 登録&設定
・node.jsで実装
LINE Developersの登録&設定、およびHerokuの登録&設定については下記URLを参照ください。
<参考サイト>
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を作成しました。
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/
<Heroku>
https://www.bing.com/
<今回使用した星占いのApi>
https://jugemkey.jp/api/waf/api_free.php
開発準備
1.Heroku CLIインストール
インストール手順については、以下を参照してください。
https://developers.line.biz/ja/docs/messaging-api/getting-started/
2.Herokuへのログイン、環境設定
Herokuへのログイン、webhookの設定方法等が詳細に記載されています。
今回は、こちらをがっつり参考にさせていただいているので、詳細な内容は割愛させていただきました。
https://qiita.com/abemaki29/items/44d2015561c31ea9628e
3.Webhookの設定
今回は、星占いApiから結果を返したいので、LINE Developers上で以下の様に設定します。
Webhook送信:利用する
Webhook URL:https://<アプリケーション名>.herokuapp.com/callback
完成画像
早速今日の運勢を占いましょう!
ちなみに私は「牡羊座」です。なんと総合運1位!やりましたー!
おわりに
初めてHerokuを使ってみましたが、意外と楽しく開発することができました。
今回はかなりシンプルな内容になってしまったので、もう少し勉強して「星占いBot」をさらにパワーアップさせたいと思います。
サンプルコード(全文)
'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);
});