server.js 8.69 KB
const express = require('express');
const mongoose = require('mongoose');
const db = require('mongodb');
const Festival = require('./models/Festival');
require("dotenv").config({ path: "variables.env"});

const COORDINATES = require('./coordinates');
const DISTRICT = [
    "서울특별시", "부산광역시", "울산광역시", "대구광역시", "대전광역시",
    "인천광역시", "광주광역시", "세종특별자치시", "제주특별자치도",
    "경기도", "강원도", "충청북도", "충청남도", "경상북도",
    "경상남도", "전라북도", "전라남도"
]
function parseDistrict(addr) {
    const words = addr.split(" ");
    if( DISTRICT.includes(words[0]) ) {
        return [words[0], words[1]];
    } else {
        return [];
    }
}

let request = require('request-promise-native');
let options = {
  'method': 'GET',
  'url' : 'http://api.visitkorea.or.kr/openapi/service/rest/KorService/areaBasedList'
        + '?ServiceKey=' + '2lFkvQJYgzOOhwUKiUt8aZVNpd1PpBOf%2FfMNW17cl25DE0GUEDddeR9iGnuSUpggjUoIUgamfhcvnKQ3eH1dAw%3D%3D'
        + '&contentTypeId=15&areaCode=&sigunguCode=&cat1=&cat2=&cat3=&listYN=Y&MobileOS=ETC&MobileApp=TourAPI3.0_Guide&arrange=C&numOfRows=12'
        + '&pageNo='+ 1
        + '&_type=json',

  'headers': {}
};

mongoose.connect(process.env.MONGODB_URL,{useNewUrlParser:true},(err)=>{
    if(err) {
        console.log(err);
    } else {
        mongoose.connection.db.dropCollection('festivals',function(err, result) {
            if(err) {
                console.log(err + "Reset Failed!");
            } else {
                console.log(result + "Reset Success!");
                request(options, async function (error, response, body) {
                    if (error) {
                        throw new Error(error);
                    }
                    let info = JSON.parse(body);
                    let items = info['response']['body']['items']['item'];
                    for(item of items) {
                        let Info = {
                            'public': {
                                'method': 'GET',
                                'url': 'http://api.visitkorea.or.kr/openapi/service/rest/KorService/detailCommon?'
                                + 'ServiceKey=' + '3zrQDvoNwUV9Se%2BHZv8DjCCNWRGJisQ7jjHP6LsbJqoRQ2cJpQKrHUGC4uslgXSVO9Dzb06BSC3kp9BunvIPSw%3D%3D'
                                + '&contentTypeId=' + '15'
                                + '&contentId=' + item['contentid']
                                + '&MobileOS=ETC&MobileApp=TourAPI3.0_Guide&defaultYN=Y&firstImageYN=Y&areacodeYN=Y&catcodeYN=Y&addrinfoYN=Y&mapinfoYN=Y&overviewYN=Y&transGuideYN=Y&_type=json',
                                'headers': {}
                            },
                            'detail': {
                                'method': 'GET',
                                'url': 'http://api.visitkorea.or.kr/openapi/service/rest/KorService/detailIntro?'
                                + 'ServiceKey=' + '3zrQDvoNwUV9Se%2BHZv8DjCCNWRGJisQ7jjHP6LsbJqoRQ2cJpQKrHUGC4uslgXSVO9Dzb06BSC3kp9BunvIPSw%3D%3D'
                                + '&contentTypeId=' + '15'
                                + '&contentId=' + item['contentid']
                                + '&MobileOS=ETC&MobileApp=TourAPI3.0_Guide&introYN=Y&_type=json',
                                'headers': {}
                            },
                            'weather': {
                                'method': 'GET',
                                'url': 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?'
                                + 'serviceKey=' + '2lFkvQJYgzOOhwUKiUt8aZVNpd1PpBOf%2FfMNW17cl25DE0GUEDddeR9iGnuSUpggjUoIUgamfhcvnKQ3eH1dAw%3D%3D'
                                + '&pageNo=' + '1'
                                + '&numOfRows=' + '50'
                                + '&dataType=' + 'JSON'
                                + '&base_date=' + '20211129'
                                + '&base_time=' + '0500'
                                + '&nx=' + '55'
                                + '&ny=' + '127',
                                'headers': {}
                            }
                        };
                        await request(Info.public, async function (error, response, body) {
                            if (error) {
                                throw new Error(error);
                            }
                            let pinfo = JSON.parse(body);
                            let distriction = parseDistrict(pinfo['response']['body']['items']['item']['addr1']);
                            if (!distriction) reject("탈출");

                            const newFestival = new Festival();
                            newFestival.title = pinfo['response']['body']['items']['item']['title'];
                            newFestival.addr = pinfo['response']['body']['items']['item']['addr1'];
                            newFestival.tel = pinfo['response']['body']['items']['item']['tel'];
                            newFestival.mapx = pinfo['response']['body']['items']['item']['mapx'];
                            newFestival.mapy = pinfo['response']['body']['items']['item']['mapy'];
                            newFestival.overview= pinfo['response']['body']['items']['item']['overview'];
                            newFestival.firstimage = pinfo['response']['body']['items']['item']['firstimage'];
                            newFestival.homepage = pinfo ['response']['body']['items']['item']['homepage'];
                            newFestival.district = distriction[0]; // 광역시/도
                            newFestival.city = parseDistrict[1]; // 시군구

                            await request(Info.detail, function (error, response, body) {
                                if (error) {
                                    throw new Error(error);
                                }
                                let dinfo = JSON.parse(body); 
                                newFestival.eventstartdate = dinfo['response']['body']['items']['item']['eventstartdate'];
                                newFestival.eventenddate = dinfo['response']['body']['items']['item']['eventenddate'];
                            });
                           
                            // let [nx, ny] = COORDINATES[distriction[0]][distriction[1]];

                            // Info.weather.url = 'http://apis.data.go.kr/1360000/VilageFcstInfoService_2.0/getVilageFcst?'
                            // + 'serviceKey=' + '2lFkvQJYgzOOhwUKiUt8aZVNpd1PpBOf%2FfMNW17cl25DE0GUEDddeR9iGnuSUpggjUoIUgamfhcvnKQ3eH1dAw%3D%3D'
                            // + '&pageNo=' + '1'
                            // + '&numOfRows=' + '50'
                            // + '&dataType=' + 'JSON'
                            // + '&base_date=' + '20211129'
                            // + '&base_time=' + '0500'
                            // + '&nx=' + nx
                            // + '&ny=' + ny;

                            // await request(Info.weather, function (error, response, body) {
                            //     if (error) {
                            //         throw new Error(error);
                            //     }
                            //     let winfo = JSON.parse(body); 
                                
                            //     for( let item of winfo['response']['body']['items']['item'] ) {
                                    
                            //         if(item['category']=='TMP') {
                            //             console.log('온도: '+item['fcstValue']);
                            //         } else if(item['category']=='PTY') {
                            //             let weather_code = item['fcstValue']
                                    
                            //             if (weather_code == '1'){ console.log('날씨 : 비');}
                            //             else if (weather_code == '2'){ console.log('날씨 :비/눈') ;}
                            //             else if (weather_code == '3'){ console.log('날씨 :눈') ;}
                            //             else if (weather_code == '4'){ console.log('날씨 :소나기') ;}
                            //             else{console.log('날씨 :맑음') ;}
                            //         }
                            //     }
                            // });

                            await newFestival.save().then((festival) => {
                                console.log(festival, "Save success!");
                            });
                        })/*.catch(error => {
                            console.log(error);
                        });*/
                    }
                });
            }
        });
    }
});