PHP

소걸음 2009. 7. 24. 13:36
머리말: 이 게시물은 퍼가셔도 됩니다. 하지만 머리말과 작성자는 꼭 명시해주셨으면 합니다.
===================================================================================

트랙백 구현하기 - 4. PHP로 트랙백 핑 받기

Download #1에 풀소스가 첨부되어 있습니다.

보내는 부분은 완료되었으니 이제는 반대로 트랙백을 받는 부분을 알아보도록 하겠습니다. 보내는 것보다 훨씬 쉽습니다. 이번에도 개요를 보도록 하지요.

1. POST로 url,title,blog_name,excerpt변수를 GET이나 POST로 해당 글에 관련된 정보(게시판 ID나 글번호)를 받는다.
2. 위의 변수들이 모두 존재하는지 검사하고, 그렇지 않으면 에러 출력 후 작동을 끝낸다.
3. 해당 변수가 모두 정상적인지를 확인하고 그렇지 않으면 에러 출력 후 작동을 끝낸다.
4. 위 과정을 모두 통과했을 경우 DB에 트랙백의 내용을 저장하고 에러 없음을 리턴한다.

이제 풀소스를 보죠.


그림이 찌그러져 보일 경우에는 클릭해서 새창으로 띄워 보세요.

이번에는 함수화가 아니라 단일 파일로 회신할 것입니다. 보낼 때와는 다르게 6개의 변수를 받아야 하는데, 트랙백의 기본인 $url,$title,$blog_name,$excerpt와 트랙백을 받는 글의 정보를 나타내는 변수, 이렇게 최소한 5개의 변수가 필요합니다. 저의 경우는 글의 정보를 나타내는 변수로 $id와 $no 두개를 사용했습니다.

여기서 트랙백을 받을 때 달랑 트랙백을 받는 파일만을 만들어두면 안되겠지요. 트랙백을 보낼 수 있는 주소를 알려주어야 합니다. 1편의 그림 2를 다시 보겠습니다.

그림 2: 트랙백 과정 - 1

이처럼 글 하단에 적절한 주소를 알려주어야 합니다. 여기에서 글의 정보를 나타내는 변수를 알려주는 것입니다. 보시다시피 GET방식으로 변수를 나열하고 있습니다. 이 그림에서는 $bid와 $id가 그것이 될 것입니다. 이 주소로 트랙백을 보내면 $url,$title,$blog_name,$excerpt는 POST로, $bid,$id는 GET으로 전달되어 오겠지요.

응답을 회신할 때의 규칙도 다시금 회상해 봅시다. 2편의 내용을 다시 끄집어내 보겠습니다.

에러가 없을 때에는

<?xml version="1.0" encoding="euc-kr(혹은 iso-8859-1)"?>
<response>
    <error>0</error>
</response>

의 내용을, 에러가 있을 시에는

<?xml version="1.0" encoding="euc-kr(혹은 iso-8859-1)"?>
<response>
    <error>1</error>
    <message>에러의 내용</message>
</response>

를 출력해줍니다.

위 형식에 맞게 회신해 주어야겠죠.

응답 후 자료를 DB에 넣어야겠지요. 여기서 에러가 나면 또 이것을 반환해야 합니다. DB에 정상적으로 자료를 입력했다 해도 끝이 아닙니다. 사용자가 해당 글을 읽을 때 코멘트가 달린 것처럼 어느 곳에서 트랙백이 왔는지 알 수 있도록 내용을 출력해주어야 합니다.

글로 써보니 복잡하기 이를 데 없군요. 준비는 여기까지로 그만두고, 소스를 뜯어보며 자세한 방법을 알아봅시다.


header("Content-Type: text/xml");
echo("<?xml version=\"1.0\" encoding=\"euc-kr\"?>\n<response>\n");

당연히 XML이라는 사실을 알려주어야겠지요. 회신 규칙에 따라 <response>택까지 출력합니다.


if(!$id or !$no or !$_POST[url] or !$_POST[title] or !$_POST[blog_name] or !$_POST[excerpt]) {
    $msg = "";

위에서 말했듯이 저는 $url,$title,$blog_name,$excerpt와 글의 정보인 $id,$no를 전달받을 것입니다. $url,$title,$blog_name,$excerpt는 POST방식으로 전달되고 $id,$no는 GET으로 전달됩니다(단 $id와 $no는 어떤 방식이라고 규정하지 않고 그냥 받아올 것입니다). 그러므로 저 6개의 변수가 모두 존재해야 합니다. 하나라도 빠져 있는 경우에 에러를 내야겠죠.

    if(!$id) $msg .= " id";
    if(!$no) $msg .= " no";
    if(!$_POST[url]) $msg .= " url";
    if(!$_POST[title]) $msg .= " title";
    if(!$_POST[blog_name]) $msg .= " blog_name";
    if(!$_POST[excerpt]) $msg .= " excerpt";

부족한 6개의 변수 중 정확이 어느 것이 빠졌는지를 검사해 $msg에 넣습니다. 사실 이럴 필요 없이 에러문에 그냥 어떤 "변수 부족"이라고만 써도 됩니다만 친절하게(?) 빠진 변수를 설명해주기로 했습니다.

    die("<error>1</error>\n<message>Missing Parameter(s) :".$msg."</message>\n</response>");
}

무엇이 빠졌는지를 출력하며 PHP 실행을 끝내버립니다. 여기서 변수 부족 에러는 완전히 걸러집니다.

if($id != "정상적인 ID") die("<error>1</error>\n<message>Wrong Parameter : id</message>\n</response>");
if($no != "정상적인 글번호") die("<error>1</error>\n<message>Wrong Parameter : no</message>\n</response>");

이제 변수가 올바른지를 검사해야 합니다. 글의 정보와 관련된 2개의 변수만 검사하면 되겠지요. 이 부분은 각자 자신에 맞게 고쳐주어야 합니다. 전체적인 맥락은 해당 포스트가 존재하는지를 검사해서 잘못되었을 경우 에러를 낸다는 것입니다. 제로보드를 예로 들어 볼까요.

$ti = @mysql_fetch_row(mysql_query("select count(*) from zetyx_admin_table where id = '$id'"));
if(!$ti[0]) die("생략");
$tn = @mysql_fetch_row(mysql_query("select count(*) from zetyx_board_$id where no = '$no'"));
if(!$tn[0]) die("생략");

거듭 말씀드리지만 자신에 맞게 고치셔야 합니다.

mysql_query("insert into 트랙백테이블 values ('','$id','$no','$url','$title','$blog_name','$excerpt','UNIX_TIMESTAMP()','')")
                or die("<error>1</error>\n<message>DB Query error</message>\n</response>");

위 과정을 모두 거친 완벽한 트랙백 핑에 한해서 DB에 해당 내용을 삽입합니다. 이 역시 자신에 맞게 고쳐주시면 됩니다. 역시 핵심은 DB에 해당하는 모든 자료를 넣되, 자료를 넣는데 실패했을 경우 에러와 함께 프로그램을 종료시키는 것입니다.

echo("<error>0</error>\n</response>");

이제 트랙백 핑의 긴 여정도 끝입니다. 최종적으로 무사통과라는 회신을 돌려줍니다.

핑의 일은 끝입니다만 앞에서 말씀드렸듯이 해당하는 글 하단에 트랙백 정보를 알려주어야 합니다. 이건 이 시리즈에서는 생략하겠습니다. 단순히 자료를 뽑아오는 것 뿐이니 충분히 쉽게 할 수 있으리라 생각됩니다.

지금까지 비교적 최신 기술인 트랙백을 보내고 받는 과정을 알아봤습니다. 게시판이나 블로그에 응용해 보세요. 그리고 성공하신 분들은 http://micsland.com/mblog/tb.php?id=test&no=3 에 트랙백을 한번 보내주시면 감사하겠습니다 :D

 

 

 

모니터 그래픽 카드 다년간의 노하우 와 최고의 장비로 성심 성의것
수리를 약속드림니다 무조건 교환이 아닌 직접 수리를 약속드리며
어려운경기에 같이 도와가면서 살수 있도록 노력 하구 있읍니다
카페 방문후 전화 주시면 아는 선에서는 성심 성의것 도와드리것을
약속드림니다 cafe.daum.net/282848 방문후 전화 주세요
리페어 의 모든것을 하구있읍니다 017-650-0360 임니다
언제든 지우셔도 됨니다 죄송함니다
다녀갑니다..경인년한해두행복하세요^^
좋은글 잘 보고 갑니다~~ 좋은 하루 되세요~^^
창업 영업 아르바이트 에 관심있으시면 들려주세요~
좋은 곳 방문하여 흔적남기고 갑니다. ^^
좋은글 잘 보고 갑니다~~ 좋은 하루 되세요~^^
올한해 좋은 일만 생기세요 ~~
카페 가입해주시면 많이 도움이 될거같읍니다 가입 해주심 감사하겠습니다

 
 
 

PHP

소걸음 2009. 7. 24. 13:35

 머리말: 이 게시물은 퍼가셔도 됩니다. 하지만 머리말과 작성자는 꼭 명시해주셨으면 합니다.
===================================================================================

트랙백 구현하기 - 3. PHP로 트랙백 핑 보내기

Download #1에 풀소스가 첨부되어 있습니다.

이제 본격적인 프로그래밍의 영역으로 넘어가 PHP로 직접 핑을 보내고 답변을 가져오는 소스를 짜보도록 하겠습니다. 우선 프로그램을 작성하기에 앞서 개념을 정리해보도록 하죠.

1. 트랙백 주소가 유효한지 검사해서 존재하지 않을 경우 취소시킨다
2. 보낼 트랙백 핑 데이터를 정리한다.
3. 서버에 접속한 후 트랙백 핑을 보내고 응답을 받는다.
4. 올바른 XML 답변이 오지 않을 경우 트랙백 주소가 아닌 것으로 간주하고 취소시킨다.
5. XML 답변을 분석해 오류가 발생한 경우 취소시킨다.
6. 위 과정을 모두 통과했을 경우 완료시킨다.

위 내용을 염두하고 우선 풀소스를 보도록 합시다.


그림이 찌그러져 보일 경우에는 클릭해서 새창으로 띄워 보세요.

보시다시피 우리는 이번 소스를 함수화해서 만들 것입니다. 따라서 위 과정보다 앞서 어떤 변수를 받아야 하는가에 대해 생각해 보아야 합니다. 핑을 보낼 때 필요한 url,title,blog_name,excerpt 변수 외에 트랙백 주소 URL을 나타내는 변수도 받아야 합니다. "트랙백 주소 URL을 나타내는 변수"를 $t_url이라고 두겠습니다. 정리하면, $t_url,$url,$title,$blog_name,$excerpt의 5개 변수를 기입받아야 합니다.

function send_tb($t_url,$url,$title,$blog_name,$excerpt) {

에러 문자열을 $tb_error_str에 담아 사용하도록 하겠습니다. 이를 위해 전역변수 선언을 해줍니다.

     global $tb_error_str;

그 다음 첫째 단계인 주소 유효성 검사입니다. fopen으로 해당 URL을 열어서 파일포인터가 없으면 해당 주소가 존재하지 않는 것으로 간주하겠습니다.

     $p_fp = @fopen($t_url,'r');
     if($p_fp) fclose($p_fp);
     else {
          $tb_error_str = "트랙백 URL이 존재하지 않습니다.";
          return false;
     }

본문 내용을 정리해야 합니다. 우선 제목과 본문 요약의 태그를 제거하여야 합니다. 핑을 보낼 때에는 rawurlencode()를 사용해 인코딩시킵니다. 이는 "믹스"를 "%B9%CD%BD%BA"따위로 고쳐주는 것으로, 검색엔진에서 한글 검색시 주소창에 보이는 그것입니다. 단 urlencode()와는 다르게 공백을 +로 표시하지 않고 공백 역시 인코딩합니다(urlencode() 를 사용해도 무방한 것으로 알려져 있습니다).
이렇게 정리한 내용을 $t_data에 넣습니다. $t_data는 HTTP 변수 전송 형식을 따라, 변수=값&변수=값의 형태로 만듭니다.

     $title = strip_tags($title);
     $excerpt = strip_tags($excerpt);
     $t_data = "url=".rawurlencode($url)."&title=".rawurlencode($title).
               "&blog_name=".rawurlencode($blog_name)."&excerpt=".rawurlencode($excerpt);

소켓 연결을 위해 트랙백 대상 주소를 정리합니다. 만약 트랙백 주소 자체에 "변수=값"형태의 쿼리가 있다면 이를 $t_data 뒤에 붙여넣습니다. 또한 포트 정보가 없는 경우 웹서버 기본포트인 80을 입력해줍니다.

     $uinfo = parse_url($t_url);
     if($uinfo[query]) $t_data .= "&".$uinfo[query];
     if(!$uinfo[port]) $uinfo[port] = "80";

이제 보낼 내용을 정리해야 합니다. 이는 HTTP프로토콜에 규정된 형태인데, 자세한 형식의 내용은 그리 중요치 않습니다. 간단하게 트랙백 URL 서버의 해당 주소에 POST로 $t_data의 변수들을 넘겨주는 거라고 생각하시면 됩니다. 여기서 User-Agent부분에는 자신의 프로그램 이름 따위를 넣어주시면 됩니다(없어도 상관없습니다).

     $send_str = "POST ".$uinfo[path]." HTTP/1.1\r\n".
                 "Host: ".$uinfo[host]."\r\n".
                 "User-Agent: MTools\r\n".
                 "Content-Type: application/x-www-form-urlencoded\r\n".
                 "Content-length: ".strlen($t_data)."\r\n".
                 "Connection: close\r\n\r\n".
                 $t_data;

이제 데이터를 정리했으니 3번째 단계로 넘어가 핑을 보내고 답변을 받아와야 합니다. 핑을 보낼 때에는 fsockopen을 통해 해당 서버에 연결한 후 fputs로 위 내용을 전송해주면 됩니다.

     $fp = fsockopen($uinfo[host],$uinfo[port]);
     fputs($fp,$send_str);

그리고 응답을 가져옵니다. while문을 통해 128바이트씩 끝까지 가져오도록 하겠습니다. 응답을 가져왔으면 연결을 종료합니다.

     while(!feof($fp)) $response .= fgets($fp,128);
     fclose($fp);

이제 돌아온 정보를 분석해봐야 합니다. 우선 XML의 형태로 되돌아오지 않았을 경우 트랙백 주소가 아닌 일반 주소로 간주합니다. 우리는 택의 유무로 간단하게 검사해 보겠습니다.

     if(!strstr($response,"<response>")) {
          $tb_error_str = "올바른 트랙백 URL이 아닙니다.";
          return false;
     }

존재한다면 이제 XML부분을 뽑아와야 합니다. $response안에 담긴 내용은
HTTP/1.1 200 OK
...................
Content-Type: text/xml
등의 기본 헤더 정보 이후에야 출력 내용이 등장합니다. 그러므로 XML의 시작 부분부터 마지막 택인 </response>까지만을 잘라내서 처리하도록 하겠습니다.

     $response = strchr($response,"<?");
     $response = substr($response,0,strpos($response,"</response>"));

마무리 부분만 남았습니다. 뽑아온 자료에 에러가 포함되어있는지를 확인합니다. 간단하게 <error>0</error>가 포함되어 있을 경우 성공으로 간주합니다(<message>의 유무도 좋습니다. 단 원칙대로라면 정규식을 통해 각 택의 내용을 불러와 검사해야 합니다). 그렇지 않을 경우 <message></message>사이의 에러 내용을 돌려줍니다.

     if(strstr($response,"0")) return true;
     else {
          $tb_error_str = strchr($response,"<message>");
          $tb_error_str = substr($tb_error_str,0,strpos($tb_error_str,"</message>"));
          $tb_error_str = str_replace("<message>","",$tb_error_str);
          $tb_error_str = "트랙백 전송중 오류가 발생했습니다: $tb_error_str";
          return false;
     }

//함수끝
}

이제 소스부분은 끝났습니다. 실제 사용시에는

$res = send_tb("트랙백 URL","글 URL","제목","블로그 이름","내용");
if(!$res) {
     echo("트랙백 전송시 에러 발생: $tb_error_str");
} else {
     //성공시 처리
}

와 같이 사용하면 됩니다.

 
 
 

PHP

소걸음 2009. 7. 24. 13:33

머리말: 이 게시물은 퍼가셔도 됩니다. 하지만 머리말과 작성자는 꼭 명시해주셨으면 합니다.
===================================================================================

트랙백 구현하기 - 2. 트랙백의 형식

앞에서 트랙백은 트랙백 핑이라는 형태로 전달된다고 했습니다. 그렇다면 이 트랙백 핑과 답변의 형식을 알아야 내용을 전송할 수 있을텐데요, 이것은 정형화된 구조이므로 프로토콜이라고 할 수 있습니다.

먼저 트랙백 핑을 보내는 방법입니다. 트랙백 핑은 상대 서버로 4가지 POST변수를 넘겨주는 형태로 처리됩니다. 이 4가지 변수는 url,blog_name,title,excerpt 인데요, 이름에서 짐작하실 수 있듯이 새로 작성되는 글의 URL, 블로그의 이름, 글 제목, 글 내용을 담고 있는 변수들입니다.

우선 핑을 보내기 전에 트랙백 주소가 실제로 존재하는지를 점검하기 위해 fopen등의 함수로 해당 주소를 일단 열어보는 등의 과정을 거치게 됩니다. 이후 실제 핑을 보낼 때에는 상대 서버에 접근해서 데이터를 넘겨줘야 하므로 fsockopen등의 네트워크 함수나 소켓 함수를 사용합니다.

핑을 받은 서버에서는 내용을 정리하고 답변을 줘야 할 텐데요, 물론 url,blog_name,title,excerpt의 POST변수를 받아 일련의 과정을 처리하게 됩니다. 일단 넘어온 해당 변수의 이상유무와 원본 게시물의 존재여부 등을 검사한 후 답변을 해 주어야 합니다.

답변은 XML을 출력하는 형태로 이루어지는데요, 에러가 없을 때에는

<?xml version="1.0" encoding="euc-kr(혹은 iso-8859-1)"?>
<response>
    <error>0</error>
</response>

의 내용을, 에러가 있을 시에는

<?xml version="1.0" encoding="euc-kr(혹은 iso-8859-1)"?>
<response>
    <error>1</error>
    <message>에러의 내용</message>
</response>

를 출력해줍니다. 물론 에러가 없을 때에만 DB에 내용을 저장해야겠죠.

그럼 다시 핑을 보내는 서버로 돌아오면, 해당 프로그램이 저 출력 내용을 다시 가져와서 해석하게 됩니다. 만약 에러가 없다면 문제 없이 글 등록을 완료시키면 될 것이고, 있다면 에러의 내용을 작성자에게 출력해 줍니다.


그림 1: 트랙백 프로토콜 정리


이 과정을 총정리한 것이 위 그림입니다. 정리하자면, url,blog_name,title,excerpt의 네 변수를 POST로 보내면 XML로 성공/오류 여부의 답변이 반환되는 것이라 할 수 있습니다.


다음편에서는 본격적으로 프로그래밍의 범주로 들어가, PHP로 트랙백 핑을 보내는 방법에 대해 설명하겠습니다.