본문 바로가기
카카오봇

카카오봇 만들기 (6) : 현재 날씨 받아오기

by Half-Dev 2020. 3. 17.

안녕하세요.

이번에는 카카오 봇을 통해서 현재 날씨를 받아오겠습니다.

 

저는 모바일 네이버에 있는 날씨를 사용하도록 하겠습니다.


의정부 날씨에 대한 div태그를 보면 엄청 많이 포함된 것을 볼 수 있습니다.

이것을 그대로 받아서 사용하게 되면 당연히 보기 힘들어질 것입니다.

 

여러 번 요청을 하자니 시간은 오래 걸리니 받은 데이터를 변수에 담아서 처리해주도록 하겠습니다.


1. 날씨 데이터 받아오기

 

1
2
3
4
5
6
7
8
9
10
11
function response(room, msg, sender, isGroupChat, replier, ImageDB) {
    Weather(msg, replier);
 }
 
function Weather(msg, replier) {
    if(msg == "날씨") {
        var data=org.jsoup.Jsoup.connect("https://m.search.naver.com/search.naver?&query=의정부%20날씨").get(); 
        w_stu = data.select(".text_info .figure_text");
        replier.reply(w_stu);
    }
}
cs

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function response(room, msg, sender, isGroupChat, replier, ImageDB) {
    Weather(msg, replier);
 }
 
function Weather(msg, replier) {
    if(msg == "날씨") {
        var data=org.jsoup.Jsoup.connect("https://m.search.naver.com/search.naver?&query=의정부%20날씨").get(); 
        w_stu = data.select(".text_info .figure_text");
        w_num = data.select(".inner span.figure_result");
 
        replier.reply(w_num);
    }
}
 
cs

 

 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function response(room, msg, sender, isGroupChat, replier, ImageDB) {
    Weather(msg, replier);
 }
 
function Weather(msg, replier) {
    if(msg == "날씨") {
        var data=org.jsoup.Jsoup.connect("https://m.search.naver.com/search.naver?&query=의정부%20날씨").get(); 
        w_stu = data.select(".text_info .figure_text");
        w_num = data.select(".inner span.figure_result");
        now_temp = data.select(".weather_graphic .temperature_text > strong");
 
        replier.reply(now_temp);
    }
}
 
cs


 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function response(room, msg, sender, isGroupChat, replier, ImageDB) {
    Weather(msg, replier);
 }
 
function Weather(msg, replier) {
    if(msg == "날씨") {
        var data=org.jsoup.Jsoup.connect("https://m.search.naver.com/search.naver?&query=의정부%20날씨").get(); 
        w_stu = data.select(".text_info .figure_text");
        w_num = data.select(".inner span.figure_result");
        now_temp = data.select(".weather_graphic .temperature_text > strong");
        up_temp = data.select(".up_temperature strong");
        down_temp = data.select(".down_temperature strong");
        feel_temp = data.select(".feeling_temperature strong");
        text = data.select(".temperature_info .summary");
 
        replier.reply(text);
    }
}
cs


2. 데이터 정리하기

이렇게 많은 데이터들을 확보했으니 정리해주도록 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
function response(room, msg, sender, isGroupChat, replier, ImageDB) {
    Weather(msg, replier);
 }
 
function Weather(msg, replier) {
    if(msg == "날씨") {
        var str = "[현재 날씨]\n";
        var str2 = "";
 
        var data=org.jsoup.Jsoup.connect("https://m.search.naver.com/search.naver?&query=의정부%20날씨").get(); 
        w_stu = data.select(".text_info .figure_text"+ "";
        w_num = data.select(".inner span.figure_result"+ "";
        now_temp = data.select(".weather_graphic .temperature_text > strong"+ "";
        up_temp = data.select(".up_temperature strong"+ "";
        down_temp = data.select(".down_temperature strong"+ "";
        feel_temp = data.select(".feeling_temperature strong"+ "";
        text = data.select(".temperature_info .summary"+ "";
       
        w_stu = w_stu.replace(/<[^>]+>/g,"");
        w_stu = w_stu.split("\n");
        w_num = w_num.replace(/<[^>]+>/g,""); w_num = w_num.split("\n");
        now_temp = now_temp.replace(/<[^>]+>/g,""); now_temp = now_temp.split("\n");
        up_temp = up_temp.replace(/<[^>]+>/g,""); up_temp = up_temp.split("\n");
        down_temp = down_temp.replace(/<[^>]+>/g,""); down_temp = down_temp.split("\n");
        feel_temp = feel_temp.replace(/<[^>]+>/g,""); feel_temp = feel_temp.split("\n");
        text = text.replace(/<[^>]+>/g,""); text = text.split("\n");
        
        //문자열 필터링
        text = text[0].split("아요");
        now_temp = now_temp[0].split("현재 온도");
 
        //출력
        str += 
            "온도 : " + now_temp[0+ "\n" +
            "최고:" + up_temp + " | 최저:" + down_temp + " | 체감:" + feel_temp + "\n" +
            text[0+ "습니다. (" + text[1+ ")";
        str2 = 
            "미세먼지 : " + w_num[0+ "(" + w_stu[0+ ") \n" +
            "초미세먼지 : " + w_num[1+ "(" + w_stu[1+ ") \n" +
            "자외선 : " + w_num[2+ "(" + w_stu[2+ ")";
        
        replier.reply(str);
        replier.reply(str2);
    }
}
cs


3. 마무리 작업(지역 입력하기)

지금 이상태로는 의정부 날씨만 검색하게 됩니다.

다른 지역을 입력하면 날씨정보가 나올 수 있도록 해봅시다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function response(room, msg, sender, isGroupChat, replier, ImageDB) {
    Weather(msg, replier);
 }
 
function Weather(msg, replier) {
    msg = msg.split(" ");
    if(msg[0== "날씨" && msg[1!= undefined && msg[2== undefined) {
        var str = "[현재 " + msg[1+ " 날씨]\n";
        var str2 = "";
 
        var data=org.jsoup.Jsoup.connect("https://m.search.naver.com/search.naver?&query=" + msg[1+ "%20날씨").get(); 
        w_stu = data.select(".text_info .figure_text"+ "";
        w_num = data.select(".inner span.figure_result"+ "";
        now_temp = data.select(".weather_graphic .temperature_text > strong"+ "";
        up_temp = data.select(".up_temperature strong"+ "";
        down_temp = data.select(".down_temperature strong"+ "";
        feel_temp = data.select(".feeling_temperature strong"+ "";
        text = data.select(".temperature_info .summary"+ "";
       
        w_stu = w_stu.replace(/<[^>]+>/g,"");
        w_stu = w_stu.split("\n");
        w_num = w_num.replace(/<[^>]+>/g,""); w_num = w_num.split("\n");
        now_temp = now_temp.replace(/<[^>]+>/g,""); now_temp = now_temp.split("\n");
        up_temp = up_temp.replace(/<[^>]+>/g,""); up_temp = up_temp.split("\n");
        down_temp = down_temp.replace(/<[^>]+>/g,""); down_temp = down_temp.split("\n");
        feel_temp = feel_temp.replace(/<[^>]+>/g,""); feel_temp = feel_temp.split("\n");
        text = text.replace(/<[^>]+>/g,""); text = text.split("\n");
        
        //문자열 필터링
        text = text[0].split("아요");
        now_temp = now_temp[0].split("현재 온도");
 
        //출력
        str += 
            "온도 : " + now_temp[0+ "\n" +
            "최고:" + up_temp + " | 최저:" + down_temp + " | 체감:" + feel_temp + "\n" +
            text[0+ "습니다. (" + text[1+ ")";
        str2 = 
            "미세먼지 : " + w_num[0+ "(" + w_stu[0+ ") \n" +
            "초미세먼지 : " + w_num[1+ "(" + w_stu[1+ ") \n" +
            "자외선 : " + w_num[2+ "(" + w_stu[2+ ")";
        
        replier.reply(str);
        replier.reply(str2);
    }
}
 
cs
 

댓글