지난번 편에서 네이버 캡챠 이미지 API 이용방법에 대해 알아보았다. 이번편에서 소개할 API는 캡챠 음성 API로 사용자가 음성에서 제공해주는 소리를 듣고 입력하여 검증하는 방식이다.  본 API 사용할려면 네이버 애플리케이션에 사용 API 등록이 필요하니 하단 링크를 참고하여 미리 설정해 주어야 한다. 

 

 
음성 캡차 API 적용 가이드 - 개요
음성 캡차 API는 자동 입력 방지를 위해 숫자가 포함된 음성 메시지를 전송하고 입력값을 검증하는 RESTful API입니다.
developers.naver.com/docs/utils/scaptcha/overview

 

캡챠 음성 API 역시 캡챠 이미지 API와 동일하게 사용량 제한이 있으며 이는 일 1,000건 이니 실 서비스시에는 유료 전환에 대한 고려가 반드시 필요하다. 

 

네이버 캡챠 음성 API 예제 - PHP
<?php  # https://developers.naver.com/docs/utils/scaptcha/reference/  참고
	
	define('NV_CLIENT_ID', '');
	define('NV_CLIENT_SECRET', '');

	$nkey = request_skey();
	$scaptcha = request_scaptcha($nkey);

	// 캡차 키 발급 요청 
	function request_skey(){
		$url = 'https://openapi.naver.com/v1/captcha/skey?code=0';

		// 요청 
		$response = request_curl($url); // ex) Array ( [rst] => success [data] => {"key":"v2klm4SGVHG5tiQ9"} )
		
		if( $response['rst'] != 'success'){ return false; } // 메시지 echo $response['msg'];

		$data = json_decode($response['data'],true);
		if( $data['errorCode'] > 0){ // ex) Array ( [errorMessage] => NID AUTH Result Invalid (1000) : Authentication failed. (인증에 실패했습니다.) [errorCode] => 024 )
			return false;
		}		
		

		return $data['key'];
	}

	// 캡차 음성 요청 
	function request_scaptcha($key = false){
		if($key == false){ return false; }
		$url = 'https://openapi.naver.com/v1/captcha/scaptcha?key='.$key;

		// 요청 
		$response = request_curl($url); // 성공시 음성 데이터
		
		if( $response['rst'] != 'success'){ return false; } // 메시지 echo $response['msg'];

		$data = json_decode($response['data'],true); // ex) Array ( [result] => [errorMessage] => Invalid key. [errorCode] => CT001 )
		if( $data['result'] === false){
			return false;
		}

		return $response['data'];
	}	

	// 사용자 입력값 검증 요청 
	function request_svalid($key = false, $value = false){
		if($key == false || $value == ''){ return false; }
		$url = 'https://openapi.naver.com/v1/captcha/skey?code=1&key='.$key."&value=".$value;

		// 요청 
		$response = request_curl($url); // 성공시 음성 데이터
		if( $response['rst'] != 'success'){ return false; } // 메시지 echo $response['msg'];

		$data = json_decode($response['data'],true); // ex) Array ( [result] => [errorMessage] => Invalid key. [errorCode] => CT001 )
		if( $data['result'] === false){
			return false;
		}

		return true;		
	}

	// 공통 CURL 처리 
	function request_curl($url){

		// 공통헤더
		$headers = array(
			'X-Naver-Client-Id: '.NV_CLIENT_ID,
			'X-Naver-Client-Secret: '.NV_CLIENT_SECRET
		);

		$ch = curl_init(); 
		curl_setopt($ch, CURLOPT_URL, $url); 
		curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
		curl_setopt($ch, CURLOPT_POST, 0); 
		if( count($headers) > 0){ 
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 
		}
		$data = curl_exec($ch); 

		$response = array();

		// 통신 실패 처리
		if (curl_error($ch)){ 
			$response = array('rst'=>'fail','msg'=>'CURL Error('.curl_errno( $ch ).') '.curl_error($ch));
		} 

		// 통신에 대한 성공이며, 실제 데이터에 대한 성공은 별도 처리 필요
		else{
			$response = array('rst'=>'success','data'=>$data);
		}
		curl_close($ch); 		

		return $response;
	}
?>


<?php 
if( !empty($_POST['key']) && !empty($_POST['value'])){
	$nvalid = request_svalid($_POST['key'], $_POST['value']);
	$resultMsg = '';
	if( $nvalid !== true){ $resultMsg = '인증실패'; }
	else{ $resultMsg = '인증성공'; }
?>
	<h1>네이버 캡챠 음성 인증 결과</h1>
	<h3><?php echo $resultMsg ?></h3>
	<p><a href="">다시 인증하기</a></p>
<?php
	}else{
?>
	<h1>네이버 캡챠 음성 인증 요청</h1>
	<form method="post">
		<input type="hidden" name="key" value="<?php echo $nkey ?>">
		<p><audio src="<?php echo "data:audio/wav;base64,".base64_encode($scaptcha) ?>" controls></audio></p>

		<p><input type="text" name="value" placeholder="음성 문자를 입력해주세요." style="width:200px"></p>
		<p><input type="submit" value="전송"></p>
	</form>
<?php } ?>

 

결과