본문 바로가기

프로그래밍/PHP

주유소검색소스

<?
// 최저가 주유소를 검색하는 폼을 출력
// 배열로 저장된 시 이름과 구 이름을 자바 스크립트로 출력
function printForm () {
 global $cName;
 echo "<script language=\"javascript\">
 function changeCity(a,b) {
  switch(a) {";
   foreach($cName as $k=>$v) {
    echo "\n\t\tcase '$k':\n";
    $i=1;
    $len=count($v);
    if(!preg_match("/lgtelecom/",$_SERVER[HTTP_USER_AGENT])) echo "\t\t\tb.length=$len;\n";
    foreach($v as $city) {
     echo "\t\t\tb.options[$i]=new Option('$city');\n";
     $i++;
    }
    echo "\t\t\tb.disabled = false;";
    echo "\n\t\t\tbreak;\n";
   }
   echo "\n\t\tdefault:\n\t\t\tb.disabled = true;\n\t\t\tbreak;";
 echo "\n\t\t}\n}\n</script>";

 echo "<div align='center'><H2>주유소 최저가 검색</H2>\n<FORM name='searchOil' action=\"/oz\">\n";
 echo "<SELECT NAME='cityName' onChange=\"javascript:changeCity(this.value, statName);\">\n";
 echo "\t<OPTION value=\"\">특별/광역/시도</OPTION>\n";

 foreach($cName as $k=>$v) {
  echo "\t<OPTION value='$k'>$k</OPTION>\n";
 }

 echo "</SELECT>\n";
 echo "<select name=\"statName\">\n\t<option value=\"\">시/군/구</option>\n</select>\n";
 echo "<INPUT type='text' name='streetName' size=\"8\">";
 echo "<INPUT type='submit' value='찾기'>";
 echo "<script language=\"javascript\">changeCity(document.searchOil.cityName.value, document.searchOil.statName);</script>\n";
 echo "<INPUT type='hidden' name='op' value='search'>";
 echo "</FORM></div>\n";
}

// HTTP를 이용해서 다른 사이트의 웹 페이지를 가져오는 함수
function getQuery($host_ip, $port, $query) {
 // 참조 URL을 검사할 수 있기 때문에 참조 URL을 가짜로 만듬
 $referer = "http://".$_SERVER["HTTP_HOST"].$_SERVER["REQUEST_URI"];

 // fsockopen 함수를 이용해서 쿼리를 날림
 $fp = @fsockopen($host_ip, $port,  &$errno, &$errstr, 10);
 if(!$fp) {
  echo "$errstr: $errno <br>\n";
 }else {
  @fwrite($fp, "GET $query HTTP/1.1\r\nHost: $host_ip\r\nUser-Agent: DoA/1.1\r\nReferer: $referer\r\nConnection: Close\r\nAccept-Encoding: gzip, deflate\r\n\r\n");
  while(!@feof($fp)) {
   $list .= @fgets($fp, 1024);
  }
 }
 @fclose($fp);

 // 받은 데이터를 헤더와 몸체로 분리
 list($header, $body) = preg_split("/\r\n\r\n/", $list, 2);

 // gzip으로 압축된 경우 패킷을 분리
 $body_array=preg_split("/\r\n[0-9a-fA-Z][0-9a-fA-Z]*\r\n/", "\r\n$body");

 // 불필요한 부분을 버림
 array_pop($body_array);
 array_shift($body_array);

 foreach($body_array as $value) {
  $body1.=$value;
 }

 // gzip으로 압축된 부분만 추출
 // 파일로 저장한 뒤 gzip의 압축을 품
 // gzip 인코딩을 사용하지 않으면 속도가 너무 느리기 때문에 gzip을 사용
 $body=substr($body1, 10, strlen($body1)-1);
 fileSave("a.gz", $body);
 $body=gzinflate($body);
 return $body;
}

// 파일을 저장하는 함수
function fileSave($file, $data) {
 $f=fopen($file, "w");
 fputs($f, $data);
 fclose($f);
}

// 주유소 정보를 배열로 저장한 뒤 반환
function getBankInfo($body) {
 $list=explode(';', $body);
 foreach($list as $value) {
  if(preg_match("/'([0-9][0-9]*)','([^']*)','([^']*)','([^']*)',([.0-9][.0-9]*),([.0-9][.0-9]*),'([0-9])','([YN])','([-,0-9,][-,0-9,]*)','([-,0-9,][-,0-9,]*)','([-,0-9,][-,0-9,]*)','([-,0-9,][-,0-9,]*)','([-,0-9,][-,0-9,]*)','([-,0-9,][-,0-9,]*)','([YN])'/", $value, $oil_info)) {
   $code=$oil_info[1];
   $oil[$code][name]=$oil_info[2];
   $oil[$code][bank]=$oil_info[3];
   $oil[$code][date]=$oil_info[4];
   $oil[$code][x]=$oil_info[5];
   $oil[$code][y]=$oil_info[6];
   $oil[$code][flag]=$oil_info[7];
   $oil[$code][yes]=$oil_info[8];
   $oil[$code][advance]=str_replace(',', '', $oil_info[9]);
   $oil[$code][gasolin]=str_replace(',', '', $oil_info[10]);
   $oil[$code][cost1]=str_replace(',', '', $oil_info[11]);
   $oil[$code][lightoil]=str_replace(',', '', $oil_info[12]);
   $oil[$code][lampoil]=str_replace(',', '', $oil_info[13]);
   $oil[$code][boiler]=str_replace(',', '', $oil_info[14]);
   $oil[$code][no]=$oil_info[15];
  }
 }
 return $oil;
}

// 배열을 이용해서 주유소 목록 생성
function printBankList($oil) {
 global $icon;
 echo "<table border=1 cellpadding=2 cellspacing=0 align=center>\n";
 echo "<caption>$_GET[cityName] - $_GET[statName]</caption>\n";
 echo "<tr><th colspan=2>주유소</th><th>고급</th><th>휘발유</th><th>기타</th><th>경유</th><th>등유</th><th>보일러</th><th>날짜</th></tr>\n";
 foreach($oil as $key=>$value) {
  $bank = $value[bank];
  $img=$icon[$bank];
  list($xcoord)=explode('.', $value[x]);
  list($ycoord)=explode('.', $value[y]);
  $name=urlencode($value[name]);
  echo "<tr><td><IMG src='$img' align=absmiddle></td><td><a href='http://maps.naver.com/?x=00&y=00&title=' target=_blank></a> <a href='http://maps.naver.com/?x=00&y=00&title=' target='_blank' title='이 링크를 새창으로 엽니다.' style='text-decoration: none'><IMG src='http://offree.net/plugins/zExternalLink/external.png' align='middle'></a></td><td align=center>$value[advance]</td><td align=center>$value[gasolin]</td><td align=center>$value[cost1]</td><td align=center>$value[lightoil]</td><td align=center>$value[lampoil]</td><td align=center>$value[boiler]</td><td>$value[date]</td></tr>\n";
 }
 echo "</table>\n";
}

// 도움말
function help() {
// OPINET 폐쇄 요청으로 프로그램의 기능을 죽이고 공지를 출력하도록 바꿈
 echo <<<___HELP___
<DIV style="text-align: center"><div style="padding:10px; background-color:#F7F7F7; border:1px solid #CCCCCC; text-align: justify; width=600px">
<FIELDSET><LEGEND> 공지 </LEGEND><STRONG>OPINET의 요청으로 이 오즈용 주유소 최저가 검색 서비스를 폐지</STRONG>합니다. 공공 사이트이고 인터넷에 올라온 데이타를 프로그램을 이용해서 자동으로 수집한 것이기 때문에 큰 문제가 없을 것으로 생각했습니다. 그러나 이 것 역시 불법으로 사이트 폐지 요청이 들어와서 어쩔 수 없이 폐지하게 되었습니다. 그 동안 이용해 주신 것에 대해 감사드립니다. 아울러 석유공사 측에 이 프로그램의 소스를 제공해서 빠른 시일 내에 유사 검색 서비스가 생길 수 있도록 하겠습니다.</FIELDSET>
<P>
<!--<UL>
 <LI><a href="http://www.opinet.co.kr/">석유공사</a> <a href='http://www.opinet.co.kr/' target='_blank' title='이 링크를 새창으로 엽니다.' style='text-decoration: none'><IMG src='http://offree.net/plugins/zExternalLink/external.png' align='middle'></a>(<a href="http://www.opinet.co.kr/">www.opinet.co.kr</a> <a href='http://www.opinet.co.kr/' target='_blank' title='이 링크를 새창으로 엽니다.' style='text-decoration: none'><IMG src='http://offree.net/plugins/zExternalLink/external.png' align='middle'></a>)의 주유소 최저 가격 검색 데이타를 이용합니다. 다만 이 사이트가 너무 느리고 <STRONG>오즈에서 사용할 수 없기 때문</STRONG>에 오즈용으로 만든 것입니다.
<P>
 <LI>지도 데이타는 오즈 전용폰에 최적화 되어 있는 네이버 지도를 사용했습니다.
<P>
 <LI><STRONG>사용법</STRONG>
 <OL>
  <LI> 특별/광역/시도에서 시 또는 도를 선택하면 시/군/구 활성화됩니다.
  <LI>시/군/구에서 시, 군 또는 구를 선택하고 찾기 단추를 누릅니다.
  <LI>검색 결과를 동으로 제한하려면 세번째 입력 창에 동의 이름을 입력합니다. 한가지 주의할 것은 대치동, 대치1동처럼 동을 정확히 입력해야 합니다.
  <LI>나타난 목록에서 주유소 이름을 클릭하면 해당 주유소의 지도로 이동합니다.
 </OL>
<P>
 <LI><STRONG>개선점</STRONG>
 <UL>
  <LI>정렬 기능은 추가하고 있습니다.
  <LI>개선 사항은 제 블로그의 <a href="http://offree.net/entry/LGT-OZ-Searching-Oil-Bank">LGT OZ용 주유소 최저가 검색 서비스</a>라는 글에 남겨 주시기 바랍니다.
 </UL>
</UL>-->
</DIV></div>
___HELP___;
}

// html 머릿말 출력
function html_header() {
 echo <<<___HEADER___
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>OZ: 주유소 최저가 검색</title>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=EUC-KR">
<META NAME="AUTHOR" CONTENT="QAOS.com | 주유소 최저가 검색">
<META NAME="COPYRIGHT" CONTENT="Copyright (c) 1996-2005 by QAOS.com">
<META NAME="KEYWORDS" CONTENT="OZ, 오즈, 주유소 최저가 검색, LH2300, 아르고폰, 터치웹폰">
<META NAME="DESCRIPTION" CONTENT="오즈 전용 단말기로 주유소 최저가를 검색할 수 있도록 한 서비스입니다.">
<meta NAME="ROBOTS" CONTENT="NOARCHIVE">
</HEAD>
<body >
___HEADER___;
}

// html 꼬릿말 출력
function html_footer() {
$GLOBALS['adl_count_params']=true;
@include_once $GLOBALS['HTTP_SERVER_VARS']['DOCUMENT_ROOT'].'/twatch_include/logger.php';

 echo "<br> <div style='font-size: 15px; text-align: center'>Powered by <A HREF=\"http://qaos.com/\" target=_blank>QAOS.com</A></div>";
 echo "</body></html>";
}

global $cName, $icon;
// 시 정보와 구정보를 배열로 생성
// OPINET은 AJAX로 처리하고 있지만 속도가 너무 느리며
// 새로운 동이 자주 생기는 것이 아니므로 하드 코딩함
$cName=array(
 '서울특별시'=>array("강남구","강동구","강북구","강서구","관악구","광진구","구로구","금천구","노원구","도봉구","동대문구","동작구","마포구","서대문구","서초구","성동구","성북구","송파구","양천구","영등포구","용산구","은평구","종로구","중구","중랑구"),
 '부산광역시'=>array("강서구","금정구","기장군","남구","동구","동래구","부산진구","북구","사상구","사하구","서구","수영구","연제구","영도구","중구","해운대구"),
 '대구광역시'=>array("남구","달서구","달성군","동구","북구","서구","수성구","중구"),
 '인천광역시'=>array("강화군","계양구","남구","남동구","동구","부평구","서구","연수구","옹진군","중구"),
 '광주광역시'=>array("광산구","남구","동구","북구","서구"),
 '대전광역시'=>array("대덕구","동구","서구","유성구","중구"),
 '울산광역시'=>array("남구","동구","북구","울주군","중구"),
 '경기도'=>array("가평군","고양시덕양구","고양시일산동구","고양시일산서구","과천시","광명시","광주시","구리시","군포시","김포시","남양주시","동두천시","부천시소사구","부천시오정구","부천시원미구","성남시분당구","성남시수정구","성남시중원구","수원시권선구","수원시영통구","수원시장안구","수원시팔달구","시흥시","안산시단원구","안산시상록구","안성시","안양시동안구","안양시만안구","양주시","양평군","여주군","연천군","오산시","용인시기흥구","용인시수지구","용인시처인구","의왕시","의정부시","이천시","파주시","평택시","포천시","하남시","화성시"),
 '강원도'=>array("강릉시","고성군","동해시","삼척시","속초시","양구군","양양군","영월군","원주시","인제군","정선군","철원군","춘천시","태백시","평창군","홍천군","화천군","횡성군"),
 '충청북도'=>array("괴산군","단양군","보은군","영동군","옥천군","음성군","제천시","증평군","진천군","청원군","청주시상당구","청주시흥덕구","충주시"),
 '충청남도'=>array("계룡시","공주시","금산군","논산시","당진군","보령시","부여군","서산시","서천군","아산시","연기군","예산군","천안시","청양군","태안군","홍성군"),
 '전라북도'=>array("고창군","군산시","김제시","남원시","무주군","부안군","순창군","완주군","익산시","임실군","장수군","전주시덕진구","전주시완산구","정읍시","진안군"),
 '전라남도'=>array("강진군","고흥군","곡성군","광양시","구례군","나주시","담양군","목포시","무안군","보성군","순천시","신안군","여수시","영광군","영암군","완도군","장성군","장흥군","진도군","함평군","해남군","화순군"),
 '경상북도'=>array("경산시","경주시","고령군","구미시","군위군","김천시","문경시","봉화군","상주시","성주군","안동시","영덕군","영양군","영주시","영천시","예천군","울릉군","울진군","의성군","청도군","청송군","칠곡군","포항시남구","포항시북구"),
 '경상남도'=>array("거제시","거창군","고성군","김해시","남해군","마산시","밀양시","사천시","산청군","양산시","의령군","진주시","진해시","창녕군","창원시","통영시","하동군","함안군","함양군","합천군"),
 '제주특별자치도'=>array("서귀포시","제주시"));

// 사용되는 아이콘의 경로
$icon=array('HDO'=> "/imgs/hdo.png", 'SKE'=>'/imgs/ske.png', 'GSC'=>"/imgs/gsc.png", 'SOL'=>'/imgs/sol.png', 'ETC'=>'/imgs/etc.png');

if($_GET[op] == '' ) {
// 옵션이 억으면 HTML 폼을 출력
 html_header();
 echo "<br />";
 printForm();
 help();
 html_footer();
}else {
// 옵션이 있으면 검색 결과를 출력
 html_header();
 echo "<br />";
 printForm();

 $host='www.opinet.co.kr';
 $timestamp=time();
 $cityName=urlencode($_GET[cityName]);
 $statName=urlencode($_GET[statName]);
 $streetName=urlencode($_GET[streetName]);

 $query="/gis.do?cmd=gis.region.list×tamp=$timestamp&searchType=C&orderName=&sidoNm=$cityName&sigunNm=$statName&dongNm=$streetName&pollDivCd=&osNm=";

 $body=getQuery($host, 80, $query);

 if(preg_match("/데이터가 없습니다./", $body)) {
  echo "<div style='text-align: center; font-size: 14px; color: red'>데이터가 없습니다.</div>";
  exit;
 }

 $body=preg_replace("|.*(<script[^>]*>(.*)</script>).*|is","\2", $body);
 $body=preg_replace("/(parent.JsInvokInMap|parent.mapframe.BeginAddPOI()|parent.mapframe.AddPOI|\"|parent.mapframe.EndAddPOI\('Y'\))/is", '', $body);
 $body=str_replace("('", "'", $body);
 $body=str_replace("')'", "'", $body);
 $body=preg_replace("/(^;|;;;*)/", '', $body);

 $oil = getBankInfo($body);
 printBankList($oil);
 html_footer();
}
?>

'프로그래밍 > PHP' 카테고리의 다른 글

php파일 호출시 Notice 발생  (0) 2017.12.03
timezone settings 에러 발생  (0) 2017.12.03