<?php
/**
 *	ÇÁ·Î±×·¥¸í	: °¥Äí¸®
 *	¹öÁ¯				: 1.0.0.2
 *	º¯°æÀÏ			: 2006-09-10
 *	ÀÛ¼ºÀÚ			: °­¿ë¼®
 *	¸ÞÀÏ				: wyseburn(at)gmail.com
 *	¿ëµµ				: ÅØ½ºÆ® ÆÄ½Ì
 */

class GalKuRi {
	// public
	var $response_header		= '';				// ÀÀ´äÇì´õ ÀúÀå
	var $contents					= '';				// ÆäÀÌÁö ÀüÃ¼ ³»¿ë ÀúÀå
	var $parse_value				= array();		// °á°ú°¡ ÀúÀåµÉ ¹è¿­

	// private
	var $_goods_no				= 0;				// °á°ú¹è¿­¿¡ ÀúÀåÇÒ¶§ ¾²ÀÏ »óÇ° ¹øÈ£
	var $_offset						= 0;				// °Ë»ö ½ÃÀÛ ¹øÁö
	var $_page_no					= 0;				// ÆäÀÌÁö º°·Î ÀÐÀ» °æ¿ì ÆäÀÌÁö ¹øÈ£ ÀúÀåº¯¼ö
	var $_page_var					= '';				// ÆäÀÌÁö º°·Î ÀÐÀ» °æ¿ì ÆäÀÌÁö º¯¼ö¸íÀ» ÀúÀåÇÏ´Â º¯¼ö
	var $_parse_pattern			= array();		// ÀÐ¾îµéÀÏ ¹®ÀÚ ÆÐÅÏ 2Â÷¿ø¹è¿­
	var $_process_func			= '';				// ÆäÀÌÁö º°·Î Ã³¸®ÇÒ¶§ °á°ú¸¦ Ã³¸®ÇÒ ¿ÜºÎÇÔ¼ö
	var $_roop						= 1;				// ÆäÀÌÁö¸¦ °è¼Ó ÆÄ½ÌÇÒÁö ¿©ºÎ
	var $_set_cookies			= '';				// ÄíÅ° ÀúÀå
	var $_set_referer				= '';				// ·¹ÆÛ·¯ ÀúÀå
	var $_skip_offset				= array();		// °Ç³Ê¶Û ¹®Àå
	var $_wait							= 0;				// ÇÑÆäÀÌÁö Ã³¸®ÈÄ ¸ØÃã½Ã°£(´ÜÀ§ ÃÊ)

	/**
	 * public
	 * ÄíÅ°¸¦ ¼³Á¤ÇÕ´Ï´Ù.
	 * ex) $buf->voidSetCookie(ÄíÅ°¸í,ÄíÅ°°ª);
	 */
	function voidSetCookie($var,$value) {
		$this->_set_cookies .= $var.'='.urlencode($value).';';
	}

	/**
	 * public
	 * ·¹ÆÛ·¯¸¦ ¼³Á¤ÇÕ´Ï´Ù.
	 * ex) $buf->voidSetReferer(·¹ÆÛ·¯);
	 */
	function voidSetReferer($ref) {
		$this->_set_referer = $ref;
	}

	/**
	 * public
	 * ÆäÀÌÁö Ã³¸®¸¦ ¿øÇÒ°æ¿ì ¼³Á¤
	 * ex) $buf->voidSetPage(ÆäÀÌÁöº¯¼ö¸í,[¿ÜºÎÃ³¸®ÇÔ¼ö],[½ÃÀÛÆäÀÌÁö]);
	 * ÇÏ³ªÀÇ ÁÖ¼Ò¿¡ ¿¬¼ÓµÈ ÆäÀÌÁö°¡ Á¸ÀçÇÒ°æ¿ì °è¼Ó ÀÐ¾îµéÀÏ¼ö ÀÖ½À´Ï´Ù.
	 *
	 * ÆäÀÌÁöº¯¼ö pagenum=1,2,3,4,5 ½ÄÀ¸·Î ÆäÀÌÁö°¡ Á¸ÀçÇÏ´Â °æ¿ì
	 * ex) $buf->voidSetPage('pagenum','func',1);
	 *
	 * ÁÖÀÇ) ÆäÀÌÁö°¡ ¸¹À»°æ¿ì ¹è¿­¿¡ °á°ú°ªÀÌ °è¼Ó ½×ÀÌ¹Ç·Î ¸®¼Ò½º°¡ Ä¿Áú¼ö ÀÖÀ¸´Ï
	 * »ý¼ºÀÚ¿¡ ¼³Á¤ÇÒ¼ö ÀÖ´Â ¿ÜºÎ ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ÆäÀÌÁö ¸¶´Ù ¹Ù·Î Ã³¸®ÇÏ½Ã±â ¹Ù¶ó¸ç
	 * ¿ª½Ã³ª ½Ã°£ÀÌ ¿À·¡ °É¸±¼ö ÀÖÀ¸´Ï ½©¸ðµå¿¡¼­ ½ÇÇàÇÏ½Ã±â ¹Ù¶ø´Ï´Ù.
	 */
	function voidSetPage($var,$func='',$page=1) {
		$this->_page_var = $var;
		$this->_page_no = $page;
		$this->_process_func = $func;
	}

	/**
	 * public
	 * ÆäÀÌÁö Ã³¸®½Ã ¿Ï·áÈÄ Àá½Ã ¸ØÃçÀÖÀ» ½Ã°£ÀÔ´Ï´Ù.
	 * ex) $buf->voidSetSleep(ÃÊ);
	 */
	function voidSetSleep($sec) {
		$this->_wait = $sec;
	}

	/**
	 * public
	 * ÆÄ½ÌÇÒ ÆÐÅÏ¹®ÀÚ ¼³Á¤
	 * ex) $buf->voidSetPattern(ÇÊµå¸í,½ÃÀÛ¹®ÀÚ,³¡¹®ÀÚ,[Áö¿ï¹®ÀÚ]);
	 *
	 * ÅØ½ºÆ® ³»¿ëÁß < ¿Í > »çÀÌ¿¡ ÀÖ´Â ¹®ÀÚ¿­À» name ÀÌ¶ó´Â ÀÌ¸§À¸·Î »©³»°í
	 * °á°ú¹®ÀÚ¿­Áß \ ¸¦ Áö¿ì°íÀÚ ÇÏ´Â°æ¿ì
	 * ex) $buf->voidSetPattern('name','<','>','\');
	 */
	function voidSetPattern($field,$token_start,$token_end,$del_str='') {
		if($field == '_default_')
			$this->voidError('_default_ ´Â »ç¿ëÇÒ¼ö ¾ø´Â ´Ü¾îÀÔ´Ï´Ù.' );

		$this->_parse_pattern[$field] = array($token_start,$token_end,$del_str);
	}

	/**
	 * public
	 * ÆÄ½ÌÈÄ ÆÐÅÏ°ú µ¿ÀÏÇÑ ¹®ÀÚ°¡ Áß°£¿¡ Á¸ÀçÇÏ¿© ±×ºÎºÐÀÇ µÞºÎºÐ ºÎÅÍ ÆÄ½ÌÀ» ¿øÇÒ°æ¿ì
	 * ex) $buf->voidSetSkipOffset(ÇÊµå¸í,Ã£À»¹®ÀÚ);
	 *
	 * name ÇÊµå ÆÄ½ÌÈÄ ´ÙÀ½ ÆÄ½Ì ÆÐÅÏ°ú µ¿ÀÏÇÑ ¹®ÀÚ°¡ ÀÖÀ»°æ¿ì °Ç³Ê¶Ü
	 * ex) $buf->voidSetSkipOffset('name','<');
	 *
	 * ÇÊµå¸íÀ» _default_ ¶ó°í ¼³Á¤ÇÒ°æ¿ì ÆÄ½ÌÀü ÇØ´ç ¹®ÀÚ·Î ÀÌµ¿À» ÇÑÈÄ¿¡
	 * ÆÄ½ÌÀ» ½ÃÀÛÇÔ. default ½ÃÀÛÀ§Ä¡¸¦ ¼³Á¤
	 * ex) $buf->voidSetSkipOffset('_default_','<');
	 */
	function voidSetSkipOffset($field,$token) {
		$this->_skip_offset[$field] = $token;
	}

	/**
	 * public
	 * ÀüÃ¼ ÆäÀÌÁö ³»¿ëÀ» ±Ü¾î¿À´Â ºÎºÐÀÔ´Ï´Ù.
	 * ex) $buf->voidGetAllContents(ÁÖ¼Ò,[¸Þ¼Òµå],[Æ÷Æ®]);
	 *
	 * °á°ú °ªÀº 
	 * $buf->response_header; ÀÀ´äÇì´õ¸¸ º°µµ ÀúÀå
	 * $buf->contents; ÀüÃ¼ÆäÀÌÁö ³»¿ëÀúÀå
	 */
	function voidGetAllContents($url,$method = 'get',$port = '80') {
		if($method != 'get' && $method != 'post')
			$this->voidError('method °ªÀÌ ´Ù¸¨´Ï´Ù. '.$method);

		$url_info = parse_url($url);
		$fp = fsockopen($url_info['host'], $port, $errno, $errstr);
		if(!$fp) {
			$this->voidError($errstr.' ('.$errno.')');
		}
		
		if($method == 'post')	{
			fputs($fp,"POST ".$url_info['path']." HTTP/1.0\r\n");
			fputs($fp,"Host: ".$url_info['host']."\r\n");
			fputs($fp,"User-Agent: PHP Script\r\n");

			if($this->_set_referer) 
				fputs($fp,"Referer: ".$this->_set_referer."\r\n");

			if($this->_set_cookies)
				fputs($fp,"Cookie: ".$this->_set_cookies."\r\n");

			fputs($fp,"Content-Type: application/x-www-form-urlencoded\r\n");
			fputs($fp,"Content-Length: ".strlen($url_info['query'])."\r\n");
			fputs($fp,"Connection: close\r\n\r\n");
			fputs($fp,$url_info['query']);
		}
		else {
			fputs($fp,"GET ".$url_info['path'].($url_info['query'] ? '?'.$url_info['query'] : '')." HTTP/1.0\r\n");
			fputs($fp,"Host: ".$url_info['host']."\r\n");
			fputs($fp,"User-Agent: PHP Script\r\n");

			if($this->_set_referer) 
				fputs($fp,"Referer: ".$this->_set_referer."\r\n");

			if($this->_set_cookies)
				fputs($fp,"Cookie: ".$this->_set_cookies."\r\n");

			fputs($fp,"Connection: close\r\n\r\n");
		}

		$this->contents = '';
		$this->response_header = '';

		while(trim($buf = fgets($fp,1024)) != "") { //ÀÀ´äÇì´õ¸¦ ÀÐ¾î¿É´Ï´Ù.
			$this->response_header .= $buf;
		}

		while(!feof($fp)) { //³»¿ëÀ» ÀÐ¾î¿É´Ï´Ù.
			$this->contents .=  fgets($fp,1024);
		}
		fclose($fp);
	}

	/**
	 * public
	 * ÆÄ½ÌÇÏ´Â ºÎºÐ main ÀÌ µÇ°Ú½À´Ï´Ù.
	 * ÆäÀÌÂ¡ Ã³¸®¿Í °è¼Ó ÆÄ½ÌÇÒ°ÍÀÎÁö °áÁ¤À» ÇÏ°í
	 * ¿ÜºÎÇÔ¼ö Ã³¸® ¿ª½Ã ¿©±â¼­ ÇÕ´Ï´Ù.
	 * ex) $buf->voidParsePage(ÁÖ¼Ò,[¸Þ¼Òµå],[Æ÷Æ®]);
	 *
	 * _default_ ¿ÀÇÁ¼ÂÀÌ ÀÖÀ¸¸é ±×ÂÊÀ¸·Î ÀÌµ¿½ÃÅ°°í ÆÐÅÏ¿¡ µî·ÏµÈ °Í¸¸Å­ ¹Ýº¹À» ÇÕ´Ï´Ù.
	 * name,img,price ÆÐÅÏÀÌ µî·ÏµÇ ÀÖ´Ù¸é
	 * nameÆÄ½Ì,imgÆÄ½Ì,priceÆÄ½ÌÀ» °è¼Ó ¹Ýº¹ÇÕ´Ï´Ù.
	 * ´õÀÌ»ó ³»¿ëÀÌ ¾ø´Ù¸é Á¾·á½ÃÅ°°Å³ª ÆäÀÌÁö¼³Á¤ÀÌ µÇÀÖ´Ù¸é
	 * ´ÙÀ½ÆäÀÌÁö¸¦ ÀÐ¾îµé¿©¼­ ´Ù½Ã ÆÄ½ÌÀ» ¹Ýº¹ÇÏ°í ÆäÀÌÁö°¡ ¾øÀ»¶§±îÁö ¹Ýº¹ ÆÄ½Ì.
	 */
	function voidParsePage($url,$method = 'get',$port = '80') {
		$this->_roop = 1;
		$page_now = $this->_page_no;
		$page = '';
		$key = array_keys($this->_parse_pattern);
		$cnt=count($key);

		while($this->_roop) {
			$this->_goods_no = 0;
			$this->_offset = 0;
			$parse_count = 0;
			$this->voidGetAllContents($url.$page,$method,$port);
		
			if($this->_skip_offset['_default_'])
				$this->voidGetOffset($this->_skip_offset['_default_']);

			if($this->_roop) {
				while($this->_roop) {
					for($i=0;$i<$cnt;$i++) {
						$this->voidGetText($key[$i]);
						if(!$this->_roop) {
							unset($this->parse_value[$this->_goods_no]);
							break;
						}
						$parse_count++;
					}
					$this->_goods_no++;
				}
			}

			if($this->_page_var) {
				if($parse_count >= $cnt) {
					$page = '&'.$this->_page_var.'='.(++$page_now);
					$this->_roop = 1;
					if($this->_wait)
						sleep($this->_wait);
				}
				else {
					$this->_roop = 0;
					break;
				}
			}
			
			if($this->_process_func) {
				call_user_func($this->_process_func,$this->parse_value);
				$this->parse_value = array();
			}
		}
	}

	/**
	 * private
	 * °Ë»öÀ§Ä¡¸¦ °Ç³Ê¶Ù´Â ºÎºÐÀÔ´Ï´Ù.
	 * ex) $buf->voidGetOffset(¹®ÀÚ);
	 * ÇØ´ç¹®ÀÚ°¡ ¾øÀ¸¸é Á¾·áÇÕ´Ï´Ù.
	 */
	function voidGetOffset($str) {
		$tmp_offset = strpos($this->contents,$str,$this->_offset);
		if($tmp_offset)
			$this->_offset = $tmp_offset + strlen($str);
		else
			$this->_roop = 0;
	}

	/**
	 * private
	 * ÆÐÅÏ »çÀÌÀÇ ¹®ÀÚ¿­À» ÃßÃâÇÏ´Â ºÎºÐÀÔ´Ï´Ù.
	 * ex) $buf->voidGetText(ÇÊµå);
	 * ¿ª½Ã³ª ÇØ´ç¹®ÀÚ°¡ ¾øÀ¸¸é Á¾·áÇÕ´Ï´Ù.
	 */
	function voidGetText($field) {
		$spos = strpos($this->contents,$this->_parse_pattern[$field][0],$this->_offset);
		if(!$spos) {
			$this->_roop = 0;
			return;
		}
		$spos += strlen($this->_parse_pattern[$field][0]);

		$epos = strpos($this->contents,$this->_parse_pattern[$field][1],$spos);
		if(!$epos) {
			$this->_roop = 0;
			return;
		}
		$this->_offset = $epos + strlen($this->_parse_pattern[$field][1]);

		$str = substr($this->contents,$spos,$epos-$spos);

		if($this->_parse_pattern[$field][2])
			$this->parse_value[$this->_goods_no][$field] = str_replace("\r\n",'',str_replace($this->_parse_pattern[$field][2],'',trim($str)));
		else
			$this->parse_value[$this->_goods_no][$field] = str_replace("\r\n",'',trim($str));

		if($this->_skip_offset[$field])
			voidGetOffset($this->_skip_offset[$field]);
	}

	function voidError($msg) {
		exit($msg);
	}
	
	function voidReset() {
		// public
		$this->response_header		= '';				// ÀÀ´äÇì´õ ÀúÀå
		$this->contents				= '';				// ÆäÀÌÁö ÀüÃ¼ ³»¿ë ÀúÀå
		$this->parse_value				= array();		// °á°ú°¡ ÀúÀåµÉ ¹è¿­
	
		// private
		$this->_goods_no				= 0;				// °á°ú¹è¿­¿¡ ÀúÀåÇÒ¶§ ¾²ÀÏ »óÇ° ¹øÈ£
		$this->_offset					= 0;				// °Ë»ö ½ÃÀÛ ¹øÁö
		$this->_page_no				= 0;				// ÆäÀÌÁö º°·Î ÀÐÀ» °æ¿ì ÆäÀÌÁö ¹øÈ£ ÀúÀåº¯¼ö
		$this->_page_var				= '';				// ÆäÀÌÁö º°·Î ÀÐÀ» °æ¿ì ÆäÀÌÁö º¯¼ö¸íÀ» ÀúÀåÇÏ´Â º¯¼ö
		$this->_parse_pattern			= array();		// ÀÐ¾îµéÀÏ ¹®ÀÚ ÆÐÅÏ 2Â÷¿ø¹è¿­
		$this->_process_func			= '';				// ÆäÀÌÁö º°·Î Ã³¸®ÇÒ¶§ °á°ú¸¦ Ã³¸®ÇÒ ¿ÜºÎÇÔ¼ö
		$this->_roop					= 1;				// ÆäÀÌÁö¸¦ °è¼Ó ÆÄ½ÌÇÒÁö ¿©ºÎ
		$this->_set_cookies			= '';				// ÄíÅ° ÀúÀå
		$this->_set_referer				= '';				// ·¹ÆÛ·¯ ÀúÀå
		$this->_skip_offset				= array();		// °Ç³Ê¶Û ¹®Àå
		$this->_wait					= 0;				// ÇÑÆäÀÌÁö Ã³¸®ÈÄ ¸ØÃã½Ã°£(´ÜÀ§ ÃÊ)
	}
}
?>
