8
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-05-09

はじめに

星座を入れると今日の運勢やラッキーカラーを自動返信する「今日の運勢占い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を作成しました。
image.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/

<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
image.png

完成画像

早速今日の運勢を占いましょう!
LINE.png
ちなみに私は「牡羊座」です。なんと総合運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);
});
8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3