app.js 9.12 KB
var express = require('express');
const request = require('request');
const TARGET_URL = 'https://api.line.me/v2/bot/message/reply'
const TOKEN = '9odQvyPPtDEzqHdfdk8Q8ua6dgrffTQuJnpkYuM6Q0VTREhmU+NJ0BAVCIfo2gEDtD37TYC0TZ7MrijHZeA592eUwzb+quftcHXBa0hye5iZHK0G4HiZCnB9C2bLgQvgQVJ47DwGeBQlwaNVJvze1AdB04t89/1O/w1cDnyilFU='
const PAPAGO_URL = 'https://openapi.naver.com/v1/papago/n2mt'
const PAPAGO_D_URL = 'https://openapi.naver.com/v1/papago/detectLangs'
const PAPAGO_ID = 'tA41WEd_nbzy0nZcUQks'
const PAPAGO_SECRET = '6DHwov9gg2'
const WEATHER_TARGET_URL = 'http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst';
const weather_key = 'CuIdcpULvcissE3Jk7AyAXok4bR4j6xyNkhfmWxOI9%2BxCs%2FkI%2F4v4j4rz3DDsQZVeuJTrWQhzQ3CV4JkeykMSw%3D%3D';
const bodyParser = require('body-parser');
var app = express();
var async = require('async');
const { resolve } = require('path');
var Language_Detect_Array = new Array();
var User_Info_Array = new Array();
var Weahter_Info_Array = new Array();

Weahter_Info_Array[0] =
{
    "Location" : '수원',
    "nx" : 61,
    "ny" : 120
}
Weahter_Info_Array[1] =
{
    "Location" : '서울',
    "nx" : 60,
    "ny" : 127
}

Language_Detect_Array[0] =
{
    "Message" : '영어',
    "PapagoLanguage" : 'en'
}
Language_Detect_Array[1] =
{
    "Message" : '일본어',
    "PapagoLanguage" : 'ja'
}
Language_Detect_Array[2] =
{
    "Message" : '프랑스어',
    "PapagoLanguage" : 'fr'
}
Language_Detect_Array[3] =
{
    "Message" : '한국어',
    "PapagoLanguage" : 'ko'
}

User_Info_Array[0] =
{
    UserId : null,
    UserPapagoLanguage : ''
}

app.use(bodyParser.json());
app.post('/hook', function (req, res) {

    var eventObj = req.body.events[0];
    var message = eventObj.message.text;
    var replyToken = eventObj.replyToken;
    var userid = eventObj.source.userId;

    if(message == '날씨') weathercheck(replyToken); else AsyncFunction(message, replyToken, userid);

    res.sendStatus(200);
});

async function AsyncFunction(message, replyToken, userid)
{
    var User_Location = search_user_info(userid); 
    var DetectLanguage = await detector(message);
    if(DetectLanguage != 'ko') var TransToKoreanMessage = await trans(DetectLanguage, message, 'ko'); else var TransToKoreanMessage = message;
    var DetectLanguageChange = Detect_Papago_Language_Change(TransToKoreanMessage, User_Location);
    if(DetectLanguage != User_Info_Array[User_Location].UserPapagoLanguage) var TransToUserSettingMessage = await trans(DetectLanguage, message, User_Info_Array[User_Location].UserPapagoLanguage);
    var Messaging = await messaging(TransToUserSettingMessage, replyToken, DetectLanguageChange);
    console.log("log-Message: ", Messaging);
}

async function weathercheck(replyToken)
{
    var timevalue = make_time()
    var url = make_url(timevalue)
    var persentofweawther = await weather_get(url);
    var Messaging = await messaging(persentofweawther, replyToken, 1);
    console.log("log-Message: ", Messaging);
}

function detector (message)
//언어 감지
{  
    return new Promise(function(resolve, reject)
    {
        request.post
        (
            {
                url: PAPAGO_D_URL,
                headers:
                {
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    'X-Naver-Client-Id': `${PAPAGO_ID}`,
                    'X-Naver-Client-Secret': `${PAPAGO_SECRET}`
                },
                body: 'query='+message,
                json:true
            },(error, response, body) => 
            {
                if(!error && response.statusCode == 200)
                {
                    var DetectLanguage = body.langCode;
                    resolve(DetectLanguage);
                }
                else
                {
                    reject(new Error('Request is failed'));
                }
            }
        )
    })
}

function messaging(message, replyToken, DetectLanguageChange)
//메시지 보내기
{
    return new Promise(function(resolve, reject)
    {
        if(DetectLanguageChange)
        request.post
        (
            {
                url: TARGET_URL,
                headers: 
                {
                    'Authorization': `Bearer ${TOKEN}`
                },
                json: 
                {
                    "replyToken":replyToken,
                    "messages":
                    [
                        {
                            "type":"text",
                            "text":message
                        }
                    ]
    
                }
            }, (error, response, body) =>
            {
                if(!error && response.statusCode == 200)
                resolve('정상적으로 전송 되었습니다.');
            }
        );
    })
}

function trans (DetectLanguage, message, TransLanguage)
//언어 번역
{
    return new Promise(function(resolve, reject)
    {
        request.post(
            {
                url: PAPAGO_URL,
                headers: 
                {
                    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
                    'X-Naver-Client-Id': `${PAPAGO_ID}`,
                    'X-Naver-Client-Secret': `${PAPAGO_SECRET}`
                },
                body: 'source='+DetectLanguage+'&target='+TransLanguage+'&text='+message,
                json:true
            },(error, response, body) => 
            {
                if(!error && response.statusCode == 200)
                {
                    var transMessage = body.message.result.translatedText;
                    console.log('transMessage: ', transMessage);
                    resolve(transMessage);
                }
            }
            );
    })
}

function search_user_info (userid)
//유저 생성 또는 위치 찾기
{
    for(var i in User_Info_Array)
    {
        if (User_Info_Array[i].UserId == userid)
        {
            //기존 유저
            return i;
            break;
        }
        else if ( i == User_Info_Array.length-1)
        {
            //새로운 유저
        User_Info_Array[User_Info_Array.length] = 
            {
                UserId : userid,
                UserPapagoLanguage : 'en'
            }
            return User_Info_Array.length-1;
        }
    }
}

function Detect_Papago_Language_Change (TransToKoreanMessage, User_Location)
//번역 언어 변경 감지
{
    console.log('user의 정보는',User_Info_Array[User_Location]);
    for(var i in Language_Detect_Array) // Detect Language change 
    {
        if (TransToKoreanMessage == Language_Detect_Array[i].Message)
        {
            //언어 변경 감지o
            User_Info_Array[User_Location].UserPapagoLanguage = Language_Detect_Array[i].PapagoLanguage;
            return 0;
            break;
        }
        else if ( i == Language_Detect_Array.length-1)
        {
            //언어 변경 감지x
            return 1;
        }
    }
}

function make_time()
{
    var today = new Date();
    var value = new Object();
    var dd = today.getDate();
    var mm = today.getMonth()+1;
    var yyyy = today.getFullYear();
    var hours = today.getHours();
    var minutes = today.getMinutes();

    for (var i = 1; i<8; i++)
    {
        var temp = i+1;
        if(3*i-1 <= hours && 3*temp-1 >= hours)
        {
            if(3*i-1<10)
            value.hours = '0'+3*i-1;
            else
            value.hours = 3*i-1;
            value.hours = 3*i-1+'00';
            break;
        }
    }
 
    if(minutes < 30){
        // 30분보다 작으면 한시간 전 값
        hours = hours - 1;
        if(hours < 0){
            // 자정 이전은 전날로 계산
            today.setDate(today.getDate() - 1);
            dd = today.getDate();
            mm = today.getMonth()+1;
            yyyy = today.getFullYear();
            hours = 23;
        }
    }
    if(hours<10) {
        hours='0'+hours
    }
    if(mm<10) {
        mm='0'+mm
    }
    if(dd<10) {
        dd='0'+dd
    } 
    today = yyyy+""+mm+""+dd;

    value.today = today;
    return value;
}

function make_url(timevalue)
{
    var serviceKey = weather_key;
    var pageNo = '1';
    var numOfRows = '5';
    var dataType = 'JSON';
    var base_date = timevalue.today;
    var base_time = timevalue.hours;
    var nx = '61';
    var ny = '120';

    var url = `${WEATHER_TARGET_URL}`;
    url += '?serviceKey='+serviceKey;
    url += '&pageNo='+pageNo;
    url += '&numOfRows='+numOfRows;
    url += '&dataType='+dataType;
    url += '&base_date='+base_date;
    url += '&base_time='+base_time;
    url += '&nx='+nx;
    url += '&ny='+ny;
    return url;
}


function weather_get (url)
{
    return new Promise(function(resolve, reject)
    {
    request.get(
        {
            url: url,
        },(error, response, body) => 
        {
            if(!error && response.statusCode == 200)
            {
                var weatherObj = JSON.parse(response.body);
                resolve('4시간 안에 비가 올 확률은'+weatherObj.response.body.items.item[0].fcstValue+'%입니다.');
            }
            else{
                console.log('Error', error);
            }
        }
    )
    });
}

  app.listen(3000, function () {
    console.log('Linebot listening on port 3000!');
  });