2007. 10. 29. 15:26

MNCAST 플래시 동영상 정보 수집 BOT


<?php
/**
 * bot_mncast.php
 * Create on Wed Sep 12 14:12:45 KST 2007
 * Last modified on Wed Sep 12 14:12:45 KST 2007
 * @author Kang YongSeok <wyseburn(at)gmail.com>
 *
 * mncast 플래시 동영상 정보수집 bot
 */
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
 * MNCAST 상세보기 페이지에서 태그내용을 리턴
 *
 * @param text $html
 * @return text
 */
function getMncastTag($html) {
	$spos = strpos($html,"function loadComplete()");
	$spos = strpos($html,"printMovieInfo",$spos);
	for($i=0;$i<13;$i++) {
		$spos = strpos($html,'"',$spos+1);
	}
	
	$epos = strpos($html,'"',$spos+1);
	return substr($html,$spos+1,$epos-$spos-1);
}

/**
 * 형태소로 잘라진 검색어를 쿼리형태로 리턴
 *
 * @param int $no
 * @param text $str
 * @return text/null
 */
function getSearchKeywordQuery($no,$str){
	if(empty($str))
		return NULL;
		
	$txt = file_get_contents("XXXXXXXXX/getKeyword.php?keyword=".urlencode($str));

	if(empty($txt))
		return NULL;

	if(strpos($txt,'_'))
		return "(".$no.",'".str_replace('_',"'),(".$no.",'",$txt)."')";
	else
		return "(".$no.",'".$txt."')";
}

/**
 * 태그,태그,태그 형식을 쿼리형식으로 리턴
 *
 * @param int $no
 * @param text $str
 * @return text
 */
function getTagQuery($no,$str) {
	if(empty($str))
		return NULL;
	
	if(strpos($str,','))
		return "(".$no.",'".str_replace(',',"'),(".$no.",'",$str)."')";
	else
		return "(".$no.",'".$str."')";
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// 에러출력을 제어
ini_set("display_errors","0");

// 수집내용을 저장할 로그파일을 설정
$log_filename = "~계정/log/mncast/LOG".date("Ymd").".txt";
$now_hour = date("H");

// 쉘모드에서 실행하므로 인자값을 받아 처리
// ex)/usr/local/php/bin/php /경로/bot_mncast.php 4 & ==> argv[0] = "not_mncast.php", argv[1] = "4"
// 페이지 번호를 설정하면 페이지번호로 읽어들임
if($argv[1] && ctype_digit($argv[1])) {
	$pagenum = $argv[1];
} else {
	$pagenum = 1;
}

// mncast 카테고리별 목록(전체) 페이지 수집 LOOP
do {
	// 플래시 중복체크 (이미 수집한 플래시 확인용)
	$duplication_count = 0;
	// 한페이지에서 수집한 플래시의 수
	$collect_count = 0;
	
	// mncast의 경우 1~20 페이지는 HTML Caching을 사용하므로 페이지를 2개로 구성
	if($pagenum <= 20) {
		$list_url = "http://www.mncast.com/category/Html/cate0-1-".$pagenum.".html";
	} else {
		$list_url = "http://www.mncast.com/category/categoryList.asp?cate=0&sort=1&page=".$pagenum;
	}
	
	// 페이지의 HTML Source 를 읽어 들임
	// getPageSource 함수 소스(http://wyseburn.tistory.com/52)
	$html = getPageSource($list_url);
	
	// 읽어들인 HTML Source에서 플래시 정보만 Parsing
	// parseString 함수 소스(http://wyseburn.tistory.com/54)
	// USE_STATIC 설정을 하면 static 변수를 기억하여 계속 사용가능
	while(($str = parseString(&$html[1], "<div id='s_player'>", "</div>",USE_STATIC)) !== NULL) {
		
		// 상세보기 페이지를 읽어들이기 위한 key(md5)를 time으로 설정
		$now_time = time();
		
		// 이미지명과 이미지명속에 포함된 파일코드(파일명)를 읽음
		$flash_flv_image = parseString($str, "<img src='", "'");
		$spos = strrpos($flash_flv_image,"/") + 1;
		$epos = strrpos($flash_flv_image,'.') - $spos;
		$filename = substr($flash_flv_image,$spos,$epos);
		
		if(empty($filename)) {
			continue;
		}
	
		// 파일코드를 이용하여 플래시 정보XML 파일을 호출후 정보 추출
		$xml = getPageSource("http://dory.mncast.com/_MovieInfoXML_.php?movieID=".$filename);
		$flash_flv_title = parseString(&$xml[1],"<title>","</title>");
		$flash_flv_hit = parseString(&$xml[1],"<viewcnt>","</viewcnt>");
		$flash_flv_url = parseString(&$xml[1],"<url>","</url>");
		$flash_flv_playtime = parseString(&$xml[1],"<duration>","</duration>");
		$flash_flv_num = parseString(&$xml[1],"<num>","</num>");
		$flash_flv_contents = parseString(&$xml[1],"<content>","</content>");
		
		$flash_flv_category1 = parseString(&$xml[1],"<cate1>","</cate1>");
		$flash_flv_category2 = parseString(&$xml[1],"<cate2>","</cate2>");
		$flash_flv_category = getCategoryCode($flash_flv_category1, $flash_flv_category2);
		
		// 파일코드에 포함된 등록 시간을 추출
		$tmp_time = substr($filename,-14);
		$flash_flv_time = mktime(substr($tmp_time,8,2),substr($tmp_time,10,2),substr($tmp_time,12,2),substr($tmp_time,4,2),substr($tmp_time,6,2),substr($tmp_time,0,4));

		if(empty($flash_flv_num)) {
			continue;
		}
		
		// 추출된 플래시가 이미 등록되있는지 확인
		$result = mysql_query("SELECT COUNT(*) FROM flash_flv_info WHERE no = ".$flash_flv_num);
		if(@mysql_result($result,0)) {
			// 이미 등록된 플래시가 4회이상 존재한다면 이후 정보는 이미 추출한 정보이므로 종료
			if($duplication_count >= 4) {
				// 로그 저장
				saveText($log_filename, $now_hour."|".$pagenum."|".$collect_count."|".$duplication_count."\n");
				exit;
			}
			$duplication_count++;
			continue;
		}
		
		// 상세보기에서 필요한 정보추출을 위해 상세보기 HTML Source 추출
		$tag = getPageSource("http://www.mncast.com/player/index.asp?mnum=".$flash_flv_num."&tKey=".$now_time."&eKey=".md5($now_time));
		// 상세보기에서 태그내용을 추출
		$flash_flv_tag = getMncastTag(&$tag[1]);
		if($flash_flv_tag === ',') {
			$flash_flv_tag = '';
		}
		
		// 추출한 flash 영상 정보를 등록
		$result = mysql_query("
			INSERT INTO flash_flv_info SET 
				no=".$flash_flv_num.", 
				category=".$flash_flv_category.", 
				category1=".$flash_flv_category1.", 
				category2=".$flash_flv_category2.", 
				play_time=".$flash_flv_playtime.", 
				hit=".$flash_flv_hit.", 
				reg_time=".$flash_flv_time.", 
				tag='".$flash_flv_tag."', 
				image_url='".$flash_flv_image."', 
				flv_url='http://".$flash_flv_url.".flv', 
				title='".mysql_real_escape_string($flash_flv_title)."' 
		");
		
		if(mysql_affected_rows()) {	
			// 제목을 형태소로 분리하여 검색키워드로 저장
			$keyword_query = getSearchKeywordQuery($flash_flv_num,$flash_flv_title);
			if($keyword_query) {
				mysql_query("INSERT INTO flash_flv_keyword (no, keyword) VALUES ".$keyword_query);
			}
			
			if($flash_flv_tag) {
				// 태그를 테이블에 저장
				$tag_query = getTagQuery($flash_flv_num,$flash_flv_tag);
				if($tag_query) {
					mysql_query("INSERT INTO flash_flv_tag (no, tag) VALUES ".$tag_query);
				}
			}
			
			// 상세보기를 별도 테이블에 저장(홈페이지 상세보기이외에는 사용처가 없으므로 분리)
			mysql_query("INSERT INTO flash_flv_contents (no, contents) VALUES (".$flash_flv_num.",'".mysql_real_escape_string($flash_flv_contents)."')");
			
			// flv 파일이 필요할경우 flash 파일을 저장
			// 원격 파일을 로컬에 저장하는 함수 (http://wyseburn.tistory.com/53)
			// getRemoteFile($flash_flv_url,"경로/".$filename.".flv");
			
			$collect_count++;
		}
	}
	
	// HTML Source 페이지의 내용을 리셋
	parseString("", "", "", USE_STATIC | USE_RESET);
	// 로그를 저장 (http://wyseburn.tistory.com/80)
	saveText($log_filename, $now_hour."|".$pagenum."|".$collect_count."\n");
	$pagenum++;
	
} while($collect_count);
?>