다음 책검색 API -> 알라딘 API 2번째 정보
다음 책검색 API -> 알라딘 API 2번째
본문
http://sir.co.kr/bbs/board.php?bo_table=g4_qa&wr_id=182365
jacobswell님이 수정을 해주시긴 했는데 [검색 결과가 없습니다.]라고만 표시가 되는군요.
어디가 문제인지 확인 해주시면 감사하겠습니다.
jacobswell님이 수정을 해주시긴 했는데 [검색 결과가 없습니다.]라고만 표시가 되는군요.
어디가 문제인지 확인 해주시면 감사하겠습니다.
댓글 전체
드디어 성공했습니다... ajax형태로 만들기 위해 머리를 좀 썼습니다. 그런데 jquery는 에러가 나서 안되어예전방식으로 일단 성공했습니다. 코드 나갑니다:
1. 스킨폴더에 aladin_query.php파일을 만듭니다. 내용은 다음과 같습니다:
<?php
$g4_path = '../../..';
include_once("$g4_path/common.php");
$aladin_ttbkey = $_REQUEST['ttbkey'];
$aladin_search_url = 'http://www.aladin.co.kr/ttb/api/ItemSearch.aspx';
$aladin_pageno = (int)$_REQUEST['pageno'];
$aladin_q = urlencode($_REQUEST['q']);
$aladin_max_results = (int)$_REQUEST['maxresults'];
$url = $aladin_search_url.'?TTBKey='.$aladin_ttbkey.
'&Query='.$aladin_q.
'&QueryType=Title'.
'&MaxResults='.$aladin_max_results.
'&Start='.$aladin_pageno.
'&Output=JS&Target=Book';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 0);
curl_setopt($curl, CURLOPT_REFERER, "");
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$buffer = curl_exec ($curl);
curl_close($curl);
echo $buffer;
?>
여기 보면 common.php파일을 인쿨루드 했는데요... 그건 나중에 혹 있을 charset을 위해 넣은 겁니다.
2. write.skin.php에 다음의 코드로 바꾸어 주세요:
/* 여기부터 책검색 */
var aladin_ttbkey = "<?php echo $board['bo_2'];?>";
var aladin_search_url = '<?php echo $board_skin_path;?>/aladin_query.php';
var aladin_pageno = 1;
var aladin_max_results = 12;
function getHttpRequest()
{
if (window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP"); // 5.0 이후 버전
}
catch(e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP"); // 5.0 이전 버전
}
catch(e1) {
req = null;
}
}
}
else if (window.XMLHttpRequest) {
try {
req = new XMLHttpRequest();
}
catch (e) {
req = null;
}
}
return req;
}
function pingSearch()
{
var req = getHttpRequest();
if (!req) return;
var url = aladin_search_url +
'?ttbkey=' + aladin_ttbkey +
'&q=' + encodeURI(document.getElementById('aladin_q').value) +
'&maxresults=' + aladin_max_results +
'&pageno=' + aladin_pageno;
req.open('GET', url, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.status == 200) {
var json_text = req.responseText;
if (json_text.substr(json_text.length-1, 1) == ';') {
json_text = json_text.substr(0, json_text.length -1);
}
var json_data = eval('(' + json_text + ')');
pongSearch(json_data);
}
}
}
req.send(null);
}
function pongSearch(z)
{
var r = document.getElementById('aladin_rst');
//var book_page = document.getElementById('book_page');
r.innerHTML = '';
if(!z.totalResults || z.item.length <= 0)
{
r.innerHTML = "검색 결과가 없습니다.";
return;
}
else
{
book_title = new Array();
book_author = new Array();
book_translator = new Array();
book_category = new Array();
book_pub_nm = new Array(); //출판사
book_pub_date = new Array(); //출판일
book_link = new Array();
book_description = new Array(); //책소개
book_img = new Array(); //이미지
book_img_l = new Array(); //큰이미지
var ul = document.createElement('ul');
for (var i = 0; i < z.item.length; i++)
{
book_title[i] = escapeHtml(z.item[i].title);
book_author[i] = escapeHtml(z.item[i].author);
book_translator[i] = null; // escapeHtml(z.item[i].author); // 알라딘은 번역자는 제공하지 않는다.
book_category[i] = escapeHtml(z.item[i].categoryName);
book_pub_nm[i] = escapeHtml(z.item[i].publisher);
book_pub_date[i] = escapeHtml(z.item[i].pubDate);
book_link[i] = escapeHtml(z.item[i].link);
book_description[i] = escapeHtml(z.item[i].description);
book_img[i] = z.item[i].cover; // 알라딘은 이미지가 하나밖에 제공하지 않는다.
book_img_l[i] = z.item[i].cover;
var li = document.createElement('li');
if(z.item[i].cover)
li.innerHTML = "<img src=\'"+z.item[i].cover+"\' onclick=\'gogo("+i+")\' style=\'cusor:pointer;\'>";
else
li.innerHTML = "<a href=# onclick=\'gogo("+i+")\'>"+z.item[i].title+"</a>";
ul.appendChild(li);
}
r.appendChild(ul);
//var totalpage = Math.ceil(z.totalResults/z.itemsPerPage);
//if(totalpage > 1)
//book_page.innerHTML = " 검색결과("+z.startIndex+"쪽/"+totalpage+"쪽)";
}
}
// HTML태그 안 먹게 하는 함수
function escapeHtml(str)
{
str = str.replace(/&/g, "&");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
return str;
}
window.onload = aladin_init;
function aladin_init() {
document.getElementById('aladin_btn').onclick = function() {
pingSearch();
};
<? if($w) { ?>
document.getElementById('aladin_q').value = "<?php echo strip_tags($write[wr_2]);?>";
pingSearch();
<? } ?>
};
function gogo(book_num)
{
document.fwrite.wr_1.value = book_category[book_num];
document.fwrite.wr_2.value = book_title[book_num];
if(book_translator[book_num])
document.fwrite.wr_3.value = book_author[book_num]+"/"+book_translator[book_num];
else
document.fwrite.wr_3.value = book_author[book_num];
document.fwrite.wr_4.value = book_pub_nm[book_num];
document.fwrite.wr_5.value = book_pub_date[book_num];
document.fwrite.wr_6.value = book_description[book_num];
document.fwrite.wr_link1.value = book_link[book_num];
document.fwrite.wr_9.value = book_img_l[book_num];
document.fwrite.wr_10.value = book_img[book_num];
}
/* 여기까지 책검색 */
3. 그리고 키는 여분필드 bo_2에 넣어 주시면 됩니다. 혹 bo_1에 넣고 싶다면 위의 aladin_ttbkey를 수정하면 됩니다....
정상적으로 나오는 것을 확인했으므로 제대로 적용했으면 나올겁니다. 그런데 책이 수직 일렬로 배열될 텐데 그건 css를 추가해서 해결하시면 됩니다...
1. 스킨폴더에 aladin_query.php파일을 만듭니다. 내용은 다음과 같습니다:
<?php
$g4_path = '../../..';
include_once("$g4_path/common.php");
$aladin_ttbkey = $_REQUEST['ttbkey'];
$aladin_search_url = 'http://www.aladin.co.kr/ttb/api/ItemSearch.aspx';
$aladin_pageno = (int)$_REQUEST['pageno'];
$aladin_q = urlencode($_REQUEST['q']);
$aladin_max_results = (int)$_REQUEST['maxresults'];
$url = $aladin_search_url.'?TTBKey='.$aladin_ttbkey.
'&Query='.$aladin_q.
'&QueryType=Title'.
'&MaxResults='.$aladin_max_results.
'&Start='.$aladin_pageno.
'&Output=JS&Target=Book';
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_POST, 0);
curl_setopt($curl, CURLOPT_REFERER, "");
curl_setopt($curl, CURLOPT_TIMEOUT, 5);
$buffer = curl_exec ($curl);
curl_close($curl);
echo $buffer;
?>
여기 보면 common.php파일을 인쿨루드 했는데요... 그건 나중에 혹 있을 charset을 위해 넣은 겁니다.
2. write.skin.php에 다음의 코드로 바꾸어 주세요:
/* 여기부터 책검색 */
var aladin_ttbkey = "<?php echo $board['bo_2'];?>";
var aladin_search_url = '<?php echo $board_skin_path;?>/aladin_query.php';
var aladin_pageno = 1;
var aladin_max_results = 12;
function getHttpRequest()
{
if (window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP"); // 5.0 이후 버전
}
catch(e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP"); // 5.0 이전 버전
}
catch(e1) {
req = null;
}
}
}
else if (window.XMLHttpRequest) {
try {
req = new XMLHttpRequest();
}
catch (e) {
req = null;
}
}
return req;
}
function pingSearch()
{
var req = getHttpRequest();
if (!req) return;
var url = aladin_search_url +
'?ttbkey=' + aladin_ttbkey +
'&q=' + encodeURI(document.getElementById('aladin_q').value) +
'&maxresults=' + aladin_max_results +
'&pageno=' + aladin_pageno;
req.open('GET', url, true);
req.onreadystatechange = function() {
if (req.readyState == 4) {
if (req.status == 200) {
var json_text = req.responseText;
if (json_text.substr(json_text.length-1, 1) == ';') {
json_text = json_text.substr(0, json_text.length -1);
}
var json_data = eval('(' + json_text + ')');
pongSearch(json_data);
}
}
}
req.send(null);
}
function pongSearch(z)
{
var r = document.getElementById('aladin_rst');
//var book_page = document.getElementById('book_page');
r.innerHTML = '';
if(!z.totalResults || z.item.length <= 0)
{
r.innerHTML = "검색 결과가 없습니다.";
return;
}
else
{
book_title = new Array();
book_author = new Array();
book_translator = new Array();
book_category = new Array();
book_pub_nm = new Array(); //출판사
book_pub_date = new Array(); //출판일
book_link = new Array();
book_description = new Array(); //책소개
book_img = new Array(); //이미지
book_img_l = new Array(); //큰이미지
var ul = document.createElement('ul');
for (var i = 0; i < z.item.length; i++)
{
book_title[i] = escapeHtml(z.item[i].title);
book_author[i] = escapeHtml(z.item[i].author);
book_translator[i] = null; // escapeHtml(z.item[i].author); // 알라딘은 번역자는 제공하지 않는다.
book_category[i] = escapeHtml(z.item[i].categoryName);
book_pub_nm[i] = escapeHtml(z.item[i].publisher);
book_pub_date[i] = escapeHtml(z.item[i].pubDate);
book_link[i] = escapeHtml(z.item[i].link);
book_description[i] = escapeHtml(z.item[i].description);
book_img[i] = z.item[i].cover; // 알라딘은 이미지가 하나밖에 제공하지 않는다.
book_img_l[i] = z.item[i].cover;
var li = document.createElement('li');
if(z.item[i].cover)
li.innerHTML = "<img src=\'"+z.item[i].cover+"\' onclick=\'gogo("+i+")\' style=\'cusor:pointer;\'>";
else
li.innerHTML = "<a href=# onclick=\'gogo("+i+")\'>"+z.item[i].title+"</a>";
ul.appendChild(li);
}
r.appendChild(ul);
//var totalpage = Math.ceil(z.totalResults/z.itemsPerPage);
//if(totalpage > 1)
//book_page.innerHTML = " 검색결과("+z.startIndex+"쪽/"+totalpage+"쪽)";
}
}
// HTML태그 안 먹게 하는 함수
function escapeHtml(str)
{
str = str.replace(/&/g, "&");
str = str.replace(/</g, "<");
str = str.replace(/>/g, ">");
return str;
}
window.onload = aladin_init;
function aladin_init() {
document.getElementById('aladin_btn').onclick = function() {
pingSearch();
};
<? if($w) { ?>
document.getElementById('aladin_q').value = "<?php echo strip_tags($write[wr_2]);?>";
pingSearch();
<? } ?>
};
function gogo(book_num)
{
document.fwrite.wr_1.value = book_category[book_num];
document.fwrite.wr_2.value = book_title[book_num];
if(book_translator[book_num])
document.fwrite.wr_3.value = book_author[book_num]+"/"+book_translator[book_num];
else
document.fwrite.wr_3.value = book_author[book_num];
document.fwrite.wr_4.value = book_pub_nm[book_num];
document.fwrite.wr_5.value = book_pub_date[book_num];
document.fwrite.wr_6.value = book_description[book_num];
document.fwrite.wr_link1.value = book_link[book_num];
document.fwrite.wr_9.value = book_img_l[book_num];
document.fwrite.wr_10.value = book_img[book_num];
}
/* 여기까지 책검색 */
3. 그리고 키는 여분필드 bo_2에 넣어 주시면 됩니다. 혹 bo_1에 넣고 싶다면 위의 aladin_ttbkey를 수정하면 됩니다....
정상적으로 나오는 것을 확인했으므로 제대로 적용했으면 나올겁니다. 그런데 책이 수직 일렬로 배열될 텐데 그건 css를 추가해서 해결하시면 됩니다...

document.getElementById('aladin_btn').onclick = function() {
이부분에서 자바에러가 뜨네요.
혹시 검색 버튼부분도 수정을 해야하나요?
이부분에서 자바에러가 뜨네요.
혹시 검색 버튼부분도 수정을 해야하나요?
아 죄송합니다... 그건 얘기 안드렸네요... b를 aladin_btn으로 p를 aladin_p로 r을 aladin_rst로 수정해서 작업했었습니다. 그러니까 거꾸로 하시거나 혹은 b,p,r로 너무 단순하게 되어 있다고 생각되면 저 처럼 바꾸면 되요...

<input id="aladin_q" class='ed' maxlength=40 size=45 style="height: 22px;">
<input id="aladin_btn" type=image src="<?=$board_skin_path?>/img/btn_search.gif" border=0 align="absmiddle">
검색부분을 이렇게 바꿨습니다.
그런데 이번에는 이부분에서 구문오류가 뜨는군요.
var json_data = eval('(' + json_text + ')');
<input id="aladin_btn" type=image src="<?=$board_skin_path?>/img/btn_search.gif" border=0 align="absmiddle">
검색부분을 이렇게 바꿨습니다.
그런데 이번에는 이부분에서 구문오류가 뜨는군요.
var json_data = eval('(' + json_text + ')');
구문 에러가 나는 원인은 aladin_query.php파일에서 php 오류가 났을 가능성이 큽니다.
만일을 위해서 var json_text = req.responseText; 다음에 alert(json_text);라고 입력 후 창에 입력된 값을 확인해 보세요. 만일 호스팅에서 curl을 지원하지 않으면 불가 합니다.
다음의 경우 callback함수가 잘 작동되지만 알라딘의 경우 callback 함수 입력을 받기는 하는데 파라미터값이 엉터리로 오기 때문에 이전에 적은 소스에서는 "검색 결과가 없습니다" 라는 메시지만 보여줘요. 그래서 지금의 방식으로 바꾸었는데 지금의 방식은 호스팅업체에서 curl을 지원해야 합니다. 대부분 지원하므로 먼저 어떤 에러가 뜨는지 확인부터 해야 할 것 같아요.
아! 그리고 <div id="r"></div> 로 되어 있는 것도 <div id="aladin_rst"></div>로 바꾸세요.
만일을 위해서 var json_text = req.responseText; 다음에 alert(json_text);라고 입력 후 창에 입력된 값을 확인해 보세요. 만일 호스팅에서 curl을 지원하지 않으면 불가 합니다.
다음의 경우 callback함수가 잘 작동되지만 알라딘의 경우 callback 함수 입력을 받기는 하는데 파라미터값이 엉터리로 오기 때문에 이전에 적은 소스에서는 "검색 결과가 없습니다" 라는 메시지만 보여줘요. 그래서 지금의 방식으로 바꾸었는데 지금의 방식은 호스팅업체에서 curl을 지원해야 합니다. 대부분 지원하므로 먼저 어떤 에러가 뜨는지 확인부터 해야 할 것 같아요.
아! 그리고 <div id="r"></div> 로 되어 있는 것도 <div id="aladin_rst"></div>로 바꾸세요.

내용이 아무것도 없는 상태로 경고창이 뜨는군요.
일단 호스팅업체에 curl 지원하는지 문의해보겠습니다.
일단 호스팅업체에 curl 지원하는지 문의해보겠습니다.
만일 curl을 지원하면 게시판에 올려놨으니 다운받아 해보세요.
http://sir.co.kr/bbs/board.php?bo_table=g4_skin&wr_id=99393&page=&posting=ok&sca=&sfl=&stx=&sst=&sod=&spt=0
http://sir.co.kr/bbs/board.php?bo_table=g4_skin&wr_id=99393&page=&posting=ok&sca=&sfl=&stx=&sst=&sod=&spt=0

감사합니다^^
적용 된 스킨으로 설치하니 잘 작동하는군요^^
적용 된 스킨으로 설치하니 잘 작동하는군요^^