[PHP, API] Spam API 연동 with 네이버 스팸 공동대응센터

홈페이지를 운영하다 보면 어느순간 부터 등장해서 우리를 괴롭히는 존재가 있습니다. 바로 스팸글이죠.

IP차단도 해보고, 중복제한도 해보고 Captcha도 도입해보고 여러가지 방법으로 스팸글을 차단을 하시고 계실텐데요.

spam

오늘은 네이버에서 제공하는 스팸공동대응센터를 연동하여 차단하는 방법을 공유해 드립니다.
(같이보기: http://spam.kisa.or.kr/kor/down/down03.html)

기본 개념은 게시글의 제목과 내용을 네이버에서 제공하는 API서버로 전송을 하면 단어사용 및 기타 조건을 이용하여 스팸지수를 0에서 100까지 응답해줍니다. (높을수록 스팸일 가능성 높음)

소스코드 입니다.

class SpamFilter {
	private	static	$instance;
	
	private	$api_url	= 'antispam.openapi.naver.com';
	
	private	$id			= null;
	private	$title		= null;
	private	$content	= null;
	private	$ip			= null;
	private	$spam_score	= 0;
	
	public static function &getInstance() {
		if(!self::$instance) {
			self::$instance	= new SpamFilter;
		}
		
		$instance	= self::$instance;
			
		return $instance;
	}
	
	private function __construct() {
		$this->id	= getInquirynum();
		$this->ip	= $_SERVER['REMOTE_ADDR'];
	}
	
	function __destruct() {
	}
	
	public function setTitle($val) {
		$this->title	= $val;
	}
	
	public function setContent($val) {
		$this->content	= $val;
	}
	
	public function setIp($val) {
		$this->ip		= $val;
	}
	
	public function getXml() {
		$pubdate	= date('Y-m-d H:i:s');
		$id			= $this->id;
		$title		= $this->title;
		$content	= $this->content;
		$ip			= $this->ip;
		
		$xml	= <<< EOF
<?xml version="1.0" encoding="UTF-8"?>
<methodcall>
<params>
	<method>getSpamScores</method>
	<spamfilters>
		<item>
			<id>1</id>
		</item>
		<item>
			<id>2</id>
		</item>
	</spamfilters>
	<spamdics>
		<item>
			<id>2</id>
		</item>
	</spamdics>
	<contents>
		<item>
			<id>${id}</id>
			<title>${title}</title>
			<content><![CDATA[${content}]]></content>
			<ip>${ip}</ip>
			<pubdate>${pubdate}</pubdate>
		</item>
	</contents>
</params>
</methodcall>
EOF;

		return $xml;
	}
	
	public function getHeader($body) {
		$header = sprintf(
"POST / HTTP/1.1\r\n".
"Host: %s\r\n".
"Connection: close\r\n".
"Content-Type: application/xml; charset=UTF-8\r\n".
"Content-Length: %s\r\n\r\n".
"%s\r\n"
,$this->api_url
,strlen($body)
,$body);
		return $header;
	}
	
	public function getSpamScore() {
		$xml	= $this->getXML();
		
		$header	= $this->getHeader($xml);
		
		$fp = @fsockopen($this->api_url, '80', $errno, $errstr, 5); 
		if(!$fp) {;}
		
		fputs($fp, $header);
		
		while(trim($buffer = fgets($fp,1024)) != ""); 
		
		$data = "";
		
		while(!feof($fp)) { $data .= trim(fgets($fp, 4096));}
		
		fclose($fp);
		
		$resp_xml	= @simplexml_load_string($data);
		
		if($resp_xml) {
			$root	= $resp_xml->scores;
			$cnt	= count($root->item);
			
			if($cnt > 0) {
				$this->spam_score	= $root->item->score;
			}
		}
		
		return $this->spam_score;
	}
}

# usage
$spamFilter	=& SpamFilter ::getInstance();

$spamFilter->setTitle($title);
$spamFilter->setContent($content);

$spamScore	= $SpamFilter->getSpamScore();

if($score > 30) {
	// TODO: 스팸지수 30이상 차단
}

SpamFilter는 api연동을 위해 만든 래퍼클래스(Wrapper Class)입니다. 싱글톤(Single-ton)으로 클래스 인스턴스를 얻어와 제목과 내용을 설정해주고 getSpamScore 메소드를 통해 점수를 얻어옵니다.

특정 점수이상일 경우(저의 경우는 30~60정도로 제한) 게시글을 차단하거나 대기상태로 제한하는 방법으로 스패머의 공격에서 조금 해방되실 수 있을겁니다.

You may also like...

답글 남기기

이메일은 공개되지 않습니다.

Protected by WP Anti Spam