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 이 필요 합니다.
Comments List
안녕하세요. 저도 비슷한 문제에 봉착해서 어떻게 해결하셨는지 조언 듣고 싶어서 연락드립니다.
서버 최초 접속 시
<html><script lang=javascript>
document.cookie = '_accessKey2=4K0vhJlSdVkvJXFyslMRDa8MH1-L9cIG'
window.location.reload();
</script></html>
코드로 리로드 시키는데, 문제는 OCX단에서 보내는 요청도 이 코드가 응답으로 와서 문제입니다.
해당 웹서버를 우리가 관리하는게 아닌터라 어떤 단(?)에서 어떤 녀석(?)이 위 코드를 뿌려주는건지 알 수 있을까요?
처리는 간단합니다. 해당 코드가 쿠키를 구어서 보내라는 의미이기 때문에 쿠키 데이터를 넣어서 query를 다시 보낸 것 입니다. :-)
위 코드는 해당 웹서버가 보내주는 것일 겁니다..
ㅎㅎ 쓸데 없는 행동을 한 것을 안 것인지, 이번달에 보니 풀어 버렸네요. :-)
오오오오 +_+