뭘 이런걸..

Posted
Filed under Tech/Tip & Trick
저번달에 비해 KRNIC (정확하게는 kisa.or.kr 이죠) data를 가져오려다 보니, access 제한을 걸어 놓았더군요. 처음 접속했을 때 특정 쿠키가 없으면 쿠키를 set하고 reload 하도록 되어 있는데, 문제는 이걸 javascript 로 처리해 놓았다는 것 입니다. 즉 java script를 지원하지 않는 w3m, wget, links, lynx 같은 브라우저들은 접근 조차 할 수 없다는 얘기이죠.

libkrisp가 KRNIC data를 이용해서 parsing 하는 것이라서 script 화를 해 놓았는데, 이 스크립트가 작동하지 않아서 보니.. 이런 변경 사항이 있었습니다. 그래서.. 뚫을 수 있는 스크립트를 다시 만들어 보았습니다.

Class KRNIC_data { static public $useragent = 'Mozilla/4.0 ' . '(compatible; MSIE 6.0; Windows NT 5.1; ' . '.NET CLR 1.1.4322; .NET CLR 2.0.50727)'; function get ($url) { if ( false === ($cookie = self::getCookie ($url)) ) return false; if ( false === ($data = self::getPage ($url, $cookie)) ) return false; return $data; } function getPage ($url, $cookie = '') { $c = curl_init ($url); curl_setopt ($c, CURLOPT_URL, $url); curl_setopt ($c, CURLOPT_TIMEOUT, 60); curl_setopt ($c, CURLOPT_NOPROGRESS, 1); curl_setopt ($c, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($c, CURLOPT_USERAGENT, self::$useragent); $src = array ('!http[s]?://!', '!/.*!'); $dst = array ('', ''); $host = preg_replace ($src, $dst, $url); $header[] = 'Host: ' . $host; #$header[] = 'Excpet:'; curl_setopt ($c, CURLOPT_HEADER, 0); curl_setopt ($c, CURLOPT_NOBODY, 0); curl_setopt ($c, CURLOPT_HTTPHEADER, $header); curl_setopt ($c, CURL_FAILONERROR, 1); curl_setopt ($c, CURLOPT_SSL_VERIFYPEER, false); if ( $cookie ) curl_setopt ($c, CURLOPT_COOKIE, $cookie); $data = curl_exec($c); if ( empty ($data) ) { error_log ('Error: ' . curl_error ($c), 0); return false; } curl_close ($c); return $data; } function getCookie ($url) { $data = self::getPage ($url); preg_match ('/(_accessKey2=[^\']+)\'/', $data, $m); if ( ! trim ($m[1]) ) { error_log ('Error: Can\'t get krnic cookies => ' . $m[1], 0); return false; } return $m[1]; } } $site = 'https://ip.kisa.or.kr/ip_cate_stat/stat_05_04_toexcel.act'; echo KRNIC_data::get ($site); exit (0);


이 스크립트를 작동 하시기 위해서는 curl extension 이 필요 합니다.
2009/12/04 18:52 2009/12/04 18:52
이혜원

안녕하세요. 저도 비슷한 문제에 봉착해서 어떻게 해결하셨는지 조언 듣고 싶어서 연락드립니다.

서버 최초 접속 시
<html><script lang=javascript>
document.cookie = '_accessKey2=4K0vhJlSdVkvJXFyslMRDa8MH1-L9cIG'
window.location.reload();
</script></html>
코드로 리로드 시키는데, 문제는 OCX단에서 보내는 요청도 이 코드가 응답으로 와서 문제입니다.

해당 웹서버를 우리가 관리하는게 아닌터라 어떤 단(?)에서 어떤 녀석(?)이 위 코드를 뿌려주는건지 알 수 있을까요?

김정균

처리는 간단합니다. 해당 코드가 쿠키를 구어서 보내라는 의미이기 때문에 쿠키 데이터를 넣어서 query를 다시 보낸 것 입니다. :-)

위 코드는 해당 웹서버가 보내주는 것일 겁니다..

김정균

ㅎㅎ 쓸데 없는 행동을 한 것을 안 것인지, 이번달에 보니 풀어 버렸네요. :-)

redjade

오오오오 +_+