SMS로 XE 게시판에 글쓰기 XpressEngine

nateon 메신져에서 핸드폰 SMS가 수신될 때 알려주는 기능이 있습니다. 이 기능을 이용하여 간단히 서버에서 문자를 받고, 받은 SMS를 XE API(XML-RPC)로 게시판 글쓰기 구현해 보았습니다.

nateon-lib 다운로드

SMS 수신부분 SmsReceiver.java 만들기

실제 SMS를 수신하는 부분입니다. SMS를 받을 떄 execute.sh 쉘스크립트에 arguments로 보낸사람, 받는사람, 메세지를 전달하여 실행합니다.

import java.io.*;
import rath.nateon.*;
import rath.nateon.event.*;

public class SmsReceiver
{
        public static void execShell(String from, String to, String msg) throws IOException{
                String[] cmd ={"/path/to/shell script/execute.sh",from,to,msg};
                Process process = new ProcessBuilder(cmd).start();
        }

        public static void main( String[] args ) throws Exception
        {
                final NateOnMessenger nateon = new NateOnMessenger(args[0], args[1]);
                nateon.setAutoAccept(true);
                nateon.addNateOnListener( new NateOnAdapter() {
                        public void loginComplete( NateUser me ) { }

                        public void smsReceived( String to, String from, String msg )
                                throws IOException
                        {
                                SmsReceiver:execShell(from,to,msg);
                        }

                        public void channelMessage( ChatChannel channel, String from, String font, String msg )
                        {
                                try {
                                        channel.sendMessage( "there is no user" );
                                } catch( IOException e ) {
                                        e.printStackTrace();
                                }
                        }
                });

                nateon.login();
        }
}

execute.sh 만들기

간단히 인수를 전달하는 파일입니다. 단지 예제로 sendXEBoard.php를 실행했지만, 로그 등 다른 작업을 추가하시면 됩니다.

#!/bin/sh
/path/to/php/bin/php sendXEBoard.php "$1" "$2" "$3"

XE로 글등록 부분 sendXEBoard.php 만들기

XE API로 글을 등록하는 부분입니다. PHP 소켓으로 simple XML-RPC 프로토콜로 보냅니다.

글쓴이는 보낸사람 핸드폰번호 뒷자리로 비밀번호는 보낸사람 핸드폰번호로 글제목과 내용은 메세지로 등록 합니다.

<?
$config=array();
$config['path']='XE 웹설치 경로/index.php' //'/xe/index.php';
$config['host']='도메인';
$config['board_mid']='게시판 mid';
$config['port']='80';

list($dummy,$form,$to,$msg) = $argv;

$content = sprintf('<?xml version="1.0" encoding="utf-8" ?>
<methodCall>
<params>
<mid><![CDATA[%s]]></mid>
<content><![CDATA[%s]]></content>
<document_srl><![CDATA[]]></document_srl>
<title><![CDATA[%s]]></title>
<tags><![CDATA[sms]]></tags>
<allow_comment><![CDATA[Y]]></allow_comment>
<allow_trackback><![CDATA[Y]]></allow_trackback>
<nick_name><![CDATA[%s]]></nick_name>
<password><![CDATA[%s]]></password>
<email_address><![CDATA[]]></email_address>
<homepage><![CDATA[]]></homepage>
<act><![CDATA[procBoardInsertDocument]]></act>
<module><![CDATA[board]]></module>
</params>
</methodCall>',$config['board_mid'],$msg,$msg,substr($form,-4),$form);

$header = sprintf(
                "POST %s HTTP/1.1\r\n".
                "Host: %s\r\n".
                "Content-Type: application/xml\r\n".
                "Content-Length: %s\r\n\r\n".
                "%s\r\n",
                $config['path'],
                $config['host'],
                strlen($content),
                $content); 

$fp = @fsockopen($http['host'], $http['port'], $errno, $errstr, 5);
if($fp){
        fputs($fp, $header);
        fclose($fp);
}
?>

최종 SmsReceiver 실행!

java SmsReceiver 네이트온계정 비밀번호 &

SmsReceiver를 실행하게 되면 네이트온 메신져 클라이언트가 실행된다고 보시면 됩니다. 즉 SmsReceiver로 실행한 계정은 일반 PC에 설치된 네이트온은 사용하지 못하게 됩니다. 전 회사에서 네이트온이 되지 않기 때문에 과감히 실행했습니다;

Tag :

Leave Comments