웹마스터 팁

http://www.hbkr.net/msn주의 : 제가 PHP에 대해서는 잘 몰라서 소스가 무척 허접할수도 있습니다.

첨부파일은 MSN Messenger 프로토콜에 대한 내용입니다.

( 적용사이트 - http://www.hbkr.net )
제로보드와 MSN 메신저를 어떻게 잘 활용을 해볼까 생각하다가...  이런 방법을 생각해봤습니다.
회원가입시 입력하는 MSN ID에 공개여부가 공개로 설정된 회원들에 대해서
자신이 작성한 글에 리플이나 코멘트가 달릴때 MSN 메신저로 알려주는 방법...

hb-msg.jpg

그러기 위해서는 일단 자신의 사이트에서 로봇으로 사용할 MSN ID 를 하나 등록해야 합니다.
가장 기초적인 준비작업이 되겠죠?
(저같은 경우는 hbrobot@hotmail.com 으로 등록.. http://www.hbkr.net)
그리고 회원들은 hbrobot@hotmail.com를  대화상대로 추가해놓거나, 메세지를 받을수 있도록 설정이 되어 있어야 겠찌요.

이제. 제가 적용한 예를 중심으로 이야기 하겠습니다.
제로보드에서 게시물, 코멘트 등록과는 별개로 메세지를 주어야 하기때문에 새창으로 열어
멀리 숨겨놓았다가 -_-;; 메세지작업이 끝나면 닫아주는 방식으로 작성했습니다.
Hidden Frame을 이용하는 방법이나.. 기타 여러가지로 할수도 있겠죠...

일단 PHP파일을 만듭니다. 새창에서 호출될 파일이지요... 소스는 다음과 같습니다.
(http://navyism.com 의 navyism님의 '웹상에서 MSN 상태 표시하기' 소스를 많이 참조 하였습니다.
좋은 소스올려주신 navyism께 감사..)

<?
// DEFINE
define("__MSN_IP__"                  ,"messenger.hotmail.com");  //MSN Messenger Server Address
define("__MSN_PORT__"                ,1863);                     //MSN Messenger Server Port
define("__MSN_VER__"                ,0);                        //Version
define("__MSG_BUFFER__"                ,100);                      
define("__MSG_RETRY_CNT__"        ,30);                        
define("__ROBOT_ID__"                ,"hbrobot@hotmail.com");    //Robot ID (Robot으로 사용할 ID)
define("__ROBOT_PW__"                ,"******");                 //Robot PassWord
define("__TRUE__"                        ,1);

$SEND_CNT = 0;

//응답을 받지 못할때 여러번 시도하기 위해 만든 함수들..
function ResetTry(&$retry){
        $retry =0;
}

function CHKReTry(&$retry){
        $retry++;
        if($retry>__MSG_RETRY_CNT__){
                echo "<script>window.close()</script>";
                exit;
        }
}

function WaitResponse(&$FP,&$MSG){
        ResetTry($TRY_WAIT);
        while(__TRUE__){
                CHKReTry($TRY_WAIT);
                $MSG = @fgets ($FP, __MSG_BUFFER__);
                if($MSG){
                        break;
                }
        }
        
}

//접속을 위한 함수
function MSNConn (&$FP,&$REF_IP,&$REF_HASH,&$SEND_CNT)
{
        @fclose ($FP);
        $FP = @fsockopen ($REF_IP,__MSN_PORT__);

        @fputs ($FP, "VER $SEND_CNT MSNP7 MSNP6 MSNP5 MSNP4 CVROrn");
        WaitResponse($FP,$temp);

        $SEND_CNT++;
        @fputs ($FP, "INF " . ($SEND_CNT) . "rn");
        WaitResponse($FP,$temp);

        $SEND_CNT++;
        @fputs ($FP, "USR " . ($SEND_CNT) . " MD5 I ".__ROBOT_ID__."rn");
        WaitResponse($FP,$temp);
        
        $REF_IP = eregi_replace ("^.+NS "        , "", $temp);
        $REF_IP = eregi_replace (":.+$"        , "", $REF_IP);
                
                if(eregi ("USR", $temp))
                {
                        $REF_IP = "ok";
                        $REF_HASH = eregi_replace ("^.+MD5 S ", "", $temp);
                }
}


//---------------------------------------------------------------------------
$msn_id = $HTTP_GET_VARS[id]; // Messege를 보낼 상대방 ID : $id 는 받아오는 값입니다
$msn_id = @trim ($msn_id);  

//주소를 MSN Server로 설정하고 접속
$REF_IP = __MSN_IP__;
MSNConn ($FP_MSB,$REF_IP,$REF_HASH,$SEND_CNT);

for($i = 0; $i < 4; $i++)
{
        if($REF_IP != "ok")
        {
                //접속후에 받아온 $REF_IP로 재접속
                MSNConn ($FP_MSB,$REF_IP,$REF_HASH,$SEND_CNT);
        }
        else
        {
                break;
        }
}

//패스워드
$pass = __ROBOT_PW__;
$pass = md5 (trim($REF_HASH).$pass);
@fputs ($FP_MSB, "USR $SEND_CNT MD5 S $passrn");

WaitResponse($FP_MSB,$temp);

$SEND_CNT++;
WaitResponse($FP_MSB,$temp);

@fputs ($FP_MSB, "CHG $SEND_CNT NLNrn");
WaitResponse($FP_MSB,$temp);
$SEND_CNT++;

@fputs ($FP_MSB, "XFR $SEND_CNT SBrn");
$temp = @fgets ($FP_MSB, __MSG_BUFFER__);
$SEND_CNT++;

while(__TRUE__)
{
        if(!eregi ("XFR", $temp))
        {
        @fputs ($FP_MSB, "XFR $SEND_CNT SBrn");
        $temp = @fgets ($FP_MSB, __MSG_BUFFER__);
        }
        else
        {
                break;
        }
}

$temp = explode (" ", $temp);
$uid = $temp[5];

$host = explode (":", $temp[3]);
$RCV_USER = $host[0];

$FP_USR = @fsockopen ($RCV_USER,__MSN_PORT__);

@fputs ($FP_USR, "USR 0 ".__ROBOT_ID__." $uidrn");
WaitResponse($FP_USR,$temp);

ResetTry($TRY_CAL);
while(__TRUE__){
        CHKReTry($TRY_CAL);
        @fputs ($FP_USR, "CAL 1 $msn_idrn");  //상대방을 CALL
        WaitResponse($FP_USR,$temp);
        
        if(eregi ("^CAL", $temp) && eregi ("ring", $temp))
        {
                
                ResetTry($TRY_JOI);
                 while(__TRUE__)
                {
                        CHKReTry($TRY_JOI);
                        WaitResponse($FP_USR,$temp);
                      if(eregi("JOI", $temp))break; //상대방이 대화에 응답하면 ..
                }
              
            // ★여기서 부터 메세지를 보내는 부분.. ------------------------------------
            // 한글로 보내면 글자가 깨지는데 이부분에 대해서 해결 못함.. (되시는 분 알려주세요.. ㅠㅠ)
                $sendMsg="HB-ROBOT Service!rnClick this URLrn".$sUrl; //내가 보낼 메세지 $sUrl 인자값
                if($arg1)$sUrl=$sUrl."&".$arg1; // 인자값 추가.

            //아래부분은 그대로 해서 보내야 함.. FN=%EA%B5%B4%EB%A6%BC; EF=B; CO=8000; CS=81; PF=32 이부분은 폰트관련 부분인듯..
              $strbldmsg="MIME-Version: 1.0rn".
                          "Content-Type: text/plain; charset=UTF-8rn".
                          "X-MMS-IM-Format: FN=%EA%B5%B4%EB%A6%BC; EF=B; CO=8000; CS=81; PF=32rnrn".
                                $sendMsg;
        
              $strmessage="MSG 2 N ".strlen($strbldmsg)."rn".$strbldmsg;
                @fputs ($FP_USR,$strmessage); // 메세지를 보낸다.
                $SEND_CNT++;
                break;
        }
}

// 종료...
@fclose ($FP_MSB);
@fclose ($FP_USR);
echo "<script>window.close()</script>";
?>


그 다음은.. lib.php 파일 마지막부분 쯤에 추가하는 함수입니다.
function HBRobotCall($sfather,$sid,$sno){ //$sfather 원본게시물, $sid 게시판아이디, $sno 게시물
        if(($sid)&&($sno)&&($sfather)){

                $sUrl = "http://www.hbkr.net/board/view.php?id=".$sid; //게시판 주소. "제로보드경로 + view.php?id=" 의 형태야겠져
                $arg1 = "no=".$sno; //인자값 추가.. 게시물번호

                $fdata=mysql_fetch_array(mysql_query("select ismember from  zetyx_board"."_".$sid."  where no='".$sfather."'"));
            $member=member_info();

                if (($fdata[ismember]>0)&&($member[no]!=$fdata[ismember])) { //자기가 작성한 글에 자신이 리플,코멘트달때는 타지않음.
                        $sdata = mysql_fetch_array(mysql_query("select msn from zetyx_member_table where no='".$fdata[ismember]."' and open_msn = '1'"));
                        if($sdata[msn]){
                                $Hb_Robot_URL = "http://www.hbkr.net/common/hbrobot.php?id="; // 위에 작성한 파일의 주소입니다.
                                                                                      // "파일주소?id="의 형태로 해야 다음줄에서.. -_-; (먼 설명을 이따위로 하는지..)
                                $Hb_Call = $Hb_Robot_URL.$sdata[msn]."&sUrl=".$sUrl."&arg1=".$arg1; //주소 + msnid + 게시판주소 + 게시판번호

                                // 새창으로 띄웁니다... 숨겨놓기 위해서 left=9999,top=9999 로 설정..
                                echo "<script>n";
                                echo "var HB_Robot = window.open('".$Hb_Call."','HB_Robot','width=1,height=1,left=9999,top=9999');n";
                                echo "</script>n";
                        }
        }
}

음..
그다음은..
comment_ok.php 파일의 107번째 라인쯤에..

// 회원일 경우 해당 해원의 점수 주기
        @mysql_query("update $member_table set point2=point2+1 where no='$member[no]'",$connect) or error(mysql_error());

라고 써있는 아래줄에
HBRobotCall($parent,$id,$no); // 라고 추가합니다.

그다음은...
write_ok.php 파일의 433 번째 라인쯤에

                // 응답글 보내기일때;;
                if($s_data[reply_mail]&&$s_data[email]) {

                        if($use_html<2) $memo=nl2br($memo);
                        $memo = stripslashes($memo);

                        zb_sendmail($use_html, $s_data[email], $s_data[name], $email, $name, $subject, $memo);
                }

라고 써있는 아래줄에
HBRobotCall($father,$id,$no); //라고 추가합니다..

이렇게 하면 되겠지요..
음....
일단 제가 운영하는 사이트에 적용한대로 올려놓기는 했는데요.
제가 알고 있는 문제점들도 많이 있습니다.
예를들자면.. 여러명이 동시에 글을 작성하는 경우, 해당파일을 계속 여는경우,
해당 사용자가 MSN 로그인이 안되있는경우... - 이경우는 메세지가 보내지지 않고 끝나므로 별문제는 되지 않음..

하지만 여러사람이 함께 의견을 나누면 더 좋은 방법이 나오겠지요.
그래서.. 부족한 소스이지만 창피를 무릅쓰고 올려봅니다.

참고적으로다가 MSN 메신저를 잘 활용할수 있는 사용자+개발자 그룹 사이트를 만들고 있는 중인데요.
아직 미완성이지만.. MSN 메신저에 대해서 사용,개발 에 관련된 자료나, 내용들이 있으면
함께 공유할수 있으면 좋겠습니다. 관심있으신 분은 한번 방문해 주세요.
http://www.hbkr.net/msn


악플도 좋습니다. 리플 마니마니 달아주세요.