AJAX

AJAX 우회해서 네이버 가져오기

psys 2020. 8. 4. 14:43
728x90

네이버 index.html 가져오기

정책에 의해 막혔다고 나옴..

            v_ajax.open("get", "http://naver.com/index.html", true)
CORS(Cross-Origin Resource Sharing)
※ 기본 정책이 same-origin 
origin(출처)
3개로 구성이 되어있다.
프로토콜+서버명(도메인)+포트번호
세 가지 중에 하나라도 다르다면 origin이 다르다고 말함
1) http://localhost:80(웹서버는 기본적으로 80번이 생략)
2) https://localhost:80
1)과 2)는 프로토콜이 다르기에 origin이 다르다.
3) http://localhost:80(웹서버는 기본적으로 80번이 생략)
4) http://psy.com:80
3과 4는 서버명이 다르기에 origin이 다르다
5) http://localhost:80
6) http://localhost:8080
5와 6은 포트번호가 다르기에 origin이 다르다

origin이 다르면 함부로 가져오지 못함.
내 사이트에서도 프로토콜이나 포트번호가 다르다면 가져오지 못함.

AJAX는 데이터 가져온 후 가공이 가능하기에 막아놓는 것

 

 오픈 API(Open Application Programming Interface)
public api

누구나 사용할 수 있도록 공개된 API
자기들이 가진 자료를 서비스

 

AJAX 우회

AJAX는 대부분 same-origin정책으로 인해 다른 사이트(도메인)의 정보를 못가져옴

이때 내 서버를 경유해서 데이터를 받으면 사용 할 수 있다.

 

1. AJAX틀 생성

<script>
    var v_xhr = new XMLHttpRequest();
    v_xhr.open("get", "around.php", true);
    v_xhr.send();

    v_xhr.addEventListener("readystatechange", function () {
        if (v_xhr.readyState == 4 && v_xhr.status == 200) {
            alert(v_xhr.responseText);
        }
    });
</script>

 

2. around.php 생성

오류가 있긴해도 네이버 창이 뜬다.

<?php
    $content = file_get_contents("https://naver.com");
    echo $content;
?>

file_get_contents함수는 url내용을 읽는 함수로 자바로 만들면 조금 길어진다. (보통 자바의 URL클래스를 이용해서 만든다.)

마치 함수가 브라우저 역할을 해준다.!!

 

3. 네이버사이트

클라이언트에서 접속하면 막히는데 서버쪽에서는 접속이 가능

왜?

>> 서버쪽 신분이 확실하기 때문(로그상 아이피가 남기때문)

cross-origin문제 발생 시, 대부분 이런식으로 서버 경유로 문제를 해결

<body>
    <div id="id_disp"></div>
</body>
<script>
    var v_xhr = new XMLHttpRequest();
    v_xhr.open("get", "around.php", true);
    v_xhr.send();

    v_xhr.addEventListener("readystatechange", function () {
        if (v_xhr.readyState == 4 && v_xhr.status == 200) {
            document.getElementById("id_disp").innerHTML =
                v_xhr.responseText;
        }
    });
</script>

 

4. 구글뉴스

get방식으로 "?search='검색하고싶은내용'"을 넣어줘야 제대로 동작한다.
json으로 넘어온다.

<?php
  $fileContents= file_get_contents("https://news.google.com/rss/search?q=".urlencode($_GET["search"])."&hl=ko&gl=KR&ceid=KR:ko");
  /* xml문자열 -> xml문서 -> json */
  $simpleXml = simplexml_load_string($fileContents);
  $json = json_encode($simpleXml);
  echo $json;
?>

혹시 "search=검색내용"을 해도 계속 새로고침을 할 수 없음이 나온다면

1) php7.2-xml이 설치되지 않았기 때문!! 따라서 php7.2-xml을 설치해준다

sudo apt install php7.2-xml

2) 그 후 아파치서버를 재시작해준다

sudo service apache2 restart

 

4.1 구글뉴스 검색

<!DOCTYPE html>
<meta charset="UTF-8">

<body>
    <input type="text" id="id_search" value=""><br>
    <input type="button" value="구글뉴스검색" onclick="f_search()">
</body>
<script>
    var v_txt = document.getElementById("id_search");

    function f_search() {
        var v_xhr = new XMLHttpRequest();
        // ajax는 대부분 same-origin정책으로 인해 다른 사이트(도메인)의 정보를 못가져옴
        // 이때 사용하는 방법이 내 서버를 경유해서 데이타를 받음
        // v_xhr.open("get", "around.php", true);
        v_xhr.open("get", "구글뉴스불러오기.php?search="+v_txt.value, true);
        v_xhr.send();

        v_xhr.addEventListener("readystatechange", function () {
            if (v_xhr.readyState == 4 && v_xhr.status == 200) {
                console.log(JSON.parse(v_xhr.responseText));
            }
        });
    }
</script>

 

4.2 아이템 가져오기

<!DOCTYPE html>
<meta charset="UTF-8">

<body>
    <input type="text" id="id_search" value=""><br>
    <input type="button" value="구글뉴스검색" onclick="f_search()">
    <div id="id_idsp"></div>
</body>
<script>
    var v_txt = document.getElementById("id_search");
    var v_div = document.getElementById("id_idsp");
    function f_search() {
        var v_xhr = new XMLHttpRequest();
        v_xhr.open("get", "구글뉴스불러오기.php?search=" + v_txt.value, true);
        v_xhr.send();

        v_xhr.addEventListener("readystatechange", function () {
            if (v_xhr.readyState == 4 && v_xhr.status == 200) {
                var v_items = JSON.parse(v_xhr.responseText).channel.item;
                console.log(v_items)
            }
        });
    }
</script>

 

4.3 타이틀과 링크만 뿌리기

<!DOCTYPE html>
<meta charset="UTF-8">

<body>
    <input type="text" id="id_search" value=""><br>
    <input type="button" value="구글뉴스검색" onclick="f_search()">
    <div id="id_idsp"></div>
</body>
<script>
    var v_txt = document.getElementById("id_search");
    var v_div = document.getElementById("id_idsp");
    function f_search() {
        var v_xhr = new XMLHttpRequest();
        // ajax는 대부분 same-origin정책으로 인해 다른 사이트(도메인)의 정보를 못가져옴
        // 이때 사용하는 방법이 내 서버를 경유해서 데이타를 받음
        // v_xhr.open("get", "around.php", true);
        v_xhr.open("get", "구글뉴스불러오기.php?search=" + v_txt.value, true);
        v_xhr.send();

        v_xhr.addEventListener("readystatechange", function () {
            if (v_xhr.readyState == 4 && v_xhr.status == 200) {
                var v_items = JSON.parse(v_xhr.responseText).channel.item;
                var v_tblStr = "<table border=2>";
                for (var i = 0; i < v_items.length; i++) {
                    v_tblStr += "<tr>";
                    v_tblStr += "<td>" + (i + 1) + "</td>";
                    v_tblStr += "<td><a href='" + v_items[i].link + "'>"
                        + v_items[i].title + "</a></td>";
                    v_tblStr += "</tr>";
                }

                v_tblStr += "</table>";
                v_div.innerHTML = v_tblStr;
            }
        });
    }
</script>

 

4.4 마우스 올리면 색 변하게

<!DOCTYPE html>
<meta charset="UTF-8">

<body>
    <input type=text id="id_search" value=""><br>
    <input type=button value="구글뉴스검색" onclick="f_search()"><br>
    <div id="id_disp"></div>
</body>
<script>
    var v_disp = document.getElementById("id_disp");
    var v_schWord = document.getElementById("id_search");
    function f_search() {
        var v_xhr = new XMLHttpRequest();
        // ajax는 대부분 same-origin정책으로 인해 다른 사이트(도메인)의 정보를 못가져옴
        // 이때 사용하는 방법이 내 서버를 경유해서 데이타를 받음
        v_xhr.open("get", "구글뉴스불러오기.php?search=" + v_schWord.value, true);
        v_xhr.send();

        v_xhr.addEventListener("readystatechange", function () {
            if (v_xhr.readyState == 4 && v_xhr.status == 200) {
                var v_items = JSON.parse(v_xhr.responseText).channel.item;
                var v_tblStr = "<table id='id_tbl' border=1>";
                for (var i = 0; i < v_items.length; i++) {
                    v_tblStr += "<tr>";
                    v_tblStr += "<td>" + (i + 1) + "</td>";
                    v_tblStr += "<td><a href='" + v_items[i].link + "'>"
                        + v_items[i].title + "</a></td>";

                    v_tblStr += "</tr>";
                }
                v_tblStr += "</table>";
                v_disp.innerHTML = v_tblStr;

                var v_table = document.getElementById("id_tbl");
                var v_tbody = v_table.children[0];
                var v_tr = v_tbody.children;  //
                // console.log(v_tr);  // 눈으로 확인
                for(var i=0;i<v_tr.length;i++){
                    v_tr[i].addEventListener("mouseover", function(){
                        this.style.backgroundColor="pink";
                    });
                    v_tr[i].addEventListener("mouseout", function(){
                        this.style.backgroundColor="";
                    });
                }
            }
        });
    }
</script>

 

ˇ this사용하지 않고 v_tr[i]사용하기

더보기

 

1) 

                function f_regEvent(v_tr) {
                    v_tr.onmouseover = function () {
                        v_tr.style.backgroundColor = "pink";
                    }
                    v_tr.onmouseout = function () {
                        v_tr.style.backgroundColor = "";
                    }
                }
                for (var i = 0; i < v_tr.length; i++) {
                    //  별도함수 사용하여
                    // 이벤트 등록에 반복문 i값의 영향 피하기
                    f_regEvent(v_tr[i]);
                }
            }

2)

                function f_regEvent(index) {
                    v_tr[index].onmouseover = function () {
                        v_tr[index].style.backgroundColor = "pink";
                    }
                    v_tr[index].onmouseout = function () {
                        v_tr[index].style.backgroundColor = "";
                    }
                }
                for (var i = 0; i < v_tr.length; i++) {
                    //  별도함수 사용하여
                    // 이벤트 등록에 반복문 i값의 영향 피하기
                    f_regEvent(i);
                }

1)

<!DOCTYPE html>
<meta charset="UTF-8">

<body>
    <input type=text id="id_search" value=""><br>
    <input type=button value="구글뉴스검색" onclick="f_search()"><br>
    <div id="id_disp"></div>
</body>
<script>
    var v_disp = document.getElementById("id_disp");
    var v_schWord = document.getElementById("id_search");
    function f_search() {
        var v_xhr = new XMLHttpRequest();
        v_xhr.open("get", "구글뉴스불러오기.php?search=" + v_schWord.value, true);
        v_xhr.send();

        v_xhr.addEventListener("readystatechange", function () {
            if (v_xhr.readyState == 4 && v_xhr.status == 200) {
                var v_items = JSON.parse(v_xhr.responseText).channel.item;
                var v_tblStr = "<table id='id_tbl' border=1>";
                for (var i = 0; i < v_items.length; i++) {
                    v_tblStr += "<tr>";
                    v_tblStr += "<td>" + (i + 1) + "</td>";
                    v_tblStr += "<td><a href='" + v_items[i].link + "'>"
                        + v_items[i].title + "</a></td>";

                    v_tblStr += "</tr>";
                }
                v_tblStr += "</table>";
                v_disp.innerHTML = v_tblStr;

                var v_table = document.getElementById("id_tbl");
                var v_tbody = v_table.children[0];
                var v_tr = v_tbody.children;

                function f_regEvent(v_tr) {
                    v_tr.onmouseover = function () {
                        v_tr.style.backgroundColor = "pink";
                    }
                    v_tr.onmouseout = function () {
                        v_tr.style.backgroundColor = "";
                    }
                }
                for (var i = 0; i < v_tr.length; i++) {
                    //  별도함수 사용하여
                    // 이벤트 등록에 반복문 i값의 영향 피하기
                    f_regEvent(v_tr[i]);
                }
            }
        });
    }
</script>

2)

<!DOCTYPE html>
<meta charset="UTF-8">

<body>
    <input type=text id="id_search" value=""><br>
    <input type=button value="구글뉴스검색" onclick="f_search()"><br>
    <div id="id_disp"></div>
</body>
<script>
    var v_disp = document.getElementById("id_disp");
    var v_schWord = document.getElementById("id_search");
    function f_search() {
        var v_xhr = new XMLHttpRequest();
        v_xhr.open("get", "구글뉴스불러오기.php?search=" + v_schWord.value, true);
        v_xhr.send();

        v_xhr.addEventListener("readystatechange", function () {
            if (v_xhr.readyState == 4 && v_xhr.status == 200) {
                var v_items = JSON.parse(v_xhr.responseText).channel.item;
                var v_tblStr = "<table id='id_tbl' border=1>";
                for (var i = 0; i < v_items.length; i++) {
                    v_tblStr += "<tr>";
                    v_tblStr += "<td>" + (i + 1) + "</td>";
                    v_tblStr += "<td><a href='" + v_items[i].link + "'>"
                        + v_items[i].title + "</a></td>";

                    v_tblStr += "</tr>";
                }
                v_tblStr += "</table>";
                v_disp.innerHTML = v_tblStr;

                var v_table = document.getElementById("id_tbl");
                var v_tbody = v_table.children[0];
                var v_tr = v_tbody.children;

                function f_regEvent(index) {
                    v_tr[index].onmouseover = function () {
                        v_tr[index].style.backgroundColor = "pink";
                    }
                    v_tr[index].onmouseout = function () {
                        v_tr[index].style.backgroundColor = "";
                    }
                }
                for (var i = 0; i < v_tr.length; i++) {
                    //  별도함수 사용하여
                    // 이벤트 등록에 반복문 i값의 영향 피하기
                    f_regEvent(i);
                }
            }
        });
    }
</script>

 

 

더보기

 공개(public) 오픈API 사이트

 

더미 이미지 제공

via.placeholder.com/500x60.png?text=psy

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>dumyImg</title>
</head>
<body>
    <img src="https://via.placeholder.com/500x60.png?text=psy">
</body>
</html>

'AJAX' 카테고리의 다른 글

(JSON이용)AJAX일반화  (0) 2020.08.03
AJAX예제  (0) 2020.08.03
AJAX(Asynchronous Javascript And Xml)  (0) 2020.08.03