웹마스터 팁


----2010년 5월 13일 어렵다고 하는 분들이 많아서 예제로 파일소스 올립니다. 첨부되어있으니 첨부된 파일의 주석보시고 실행해보세요

 

----원본-(다시 수정 09. 04.30)

 


간단 요약하자면

다른 사이트 게시판의 내용을 가져와서->가져온 부분을 제목/내용 부분으로 나눈후->
그 것을 블로그api기능을 이용하여 -> php로 만들어진 새글 추가입력 페이지를 이용해서
새게시물로 만든다. -> 반복한다(자동 새로고침이용하면, 자동글쓰기)->게시판 통째로 베껴오기.

여기에 필요한 기능이

1. xe 블로그 api 기능(외부에서 xe게시판에 글을 쓸수 있게 해주는 기능입니다. )-기본설정이 off되어있습니다. 애드온에서 on으로.
2. 외부에서 xe게시판을 보통 프로그램을 이용해서 쓰는데 우리는 이걸 php 프로그램을 이용해서 넣을 예정입니다. php 프로그램.
3.  다른 사이트의 게시판 내용을 베껴올 프로그램(갈쿠리 라는 갈무리 프로그램)

일단 1, xe 블로그 api 기능을 애드온설정에서 on으로 해주시고, 2. 외부에서 글을 쓸수 있는 php 프로그램에 블로그 api 주소(보통 http:// 자신계정/xe/게시판모듈이름/api ) 하고 사용자 id와 비밀번호를 적고 제목하고 내용을 적습니다. 그리고  xmlrpc.inc 파일과 이 php문서를 자신의 계정(어느곳이든상관없음)에 넣어주시고 , 이 문서주소로 접속하시면 , 이 php 프로그램이 xe 블로그 api기능을 통해 게시판에 글을 올리게 됩니다. 여기까지됐으면 기본기능이구여 , 여기에 우리는 3, 외부에서 글을 베껴오는 프로그램 [갈쿠리] 를 이용해서 글을 가져와서 제목/내용으로 나누고 이 걸 위 php프로그램 문서의 제목 내용에 들어가는 것으로 대체해주시면, 다른 게시판의 내용을 베껴서 저장할 수 있게 되는 것이죠. 여기서 더 고급기능이라면 4. 자동으로 글 주소가 변하는 예를들어 글숫자가 no=1이라면 이걸 30초마다 1->2로 2에서 3으로 하게 만드러주시면 30초마다 자동으로 페이지가 리로드되면서 새로운글이 30초마다 저장되져. 자동으로말이죠.


 


이런식으로 자동화시키면, 다른 사이트의 내용을 긁어와서 내 게시판에 한번에 등록할
수 있게 되는 것이죠.

그럼 간단히 데모를 통해 어떤 기능인지 살펴보기로하죠.


http://www.kita.net/newtri2/center/market_view.jsp?s_con=0&nGubun=5&s_text=&sStartDt=&sEndDt=&sOrder=&board_code=70000&gubun=10&curpage=1&count=y&no=22202


그런데 주소를 잘 보시면 맨 끝에 &no=22202 로 끝나져? 이번호를 다른 숫자로 새로고침할때 마다 바꿔주시면 내용이 바뀌고
바뀌 내용을 제목/내용으로 긁어와서 blogapi와 제가만든 php 코드를 이용해서 새글로 넣고
또 그 긁어와서 새글작성하는 php 문서를 30초마다 새로고침하게 하면, 새로고침할때마다 글은 바뀌게 되기때문에
내용도 계속 바뀌죠. 그런식으로 글을 등록했습니다.


아래 게시판이 긁어와서 블로그 api를 이용 php로 자동새로고침해서 글작성하게 만든 게시판입니다.
한번 잘 만들어주시면 글을 무한정 긁어와서 넣을수 있어요!!   

http://xavaz.cafe24.com/xe/var

백문이 불여일견이라해서 ,, 데모페이지를 만들어봤어여

http://www.kita.net/newtri2/center/market_view.jsp?s_con=0&nGubun=5&s_text=&sStartDt=&sEndDt=&sOrder=&board_code=70000&gubun=10&curpage=1&count=y&no=22202 이 글의 주소에서 22202 라는 번호를 따와서

no를 22202 라고 하면

http://xavaz.cafe24.com/copyboard.php?no=22202 

위의 주소로 이동하시면 글이 게시판에 자동으로 등록되어있을겁니다. 하시면 22202 번 글이 , 게시판에 자동으로 등록되어있을겁니다. 번호를 22203 이렇게 바꾸셔도 되구여 글 번호가 존재하는 한 말이죠. 게시판 목록가서 맘에 드는 no 번호를 no=이부분에, 집어넣어주시면 등록되어

확인은 http://xavaz.cafe24.com/xe/var 에 가셔서 확인해보세여, 글이 등록되어있을것입니다.

이제 한번 만들어 보자구여

1. 먼저 블로그 api 기능을 애드온 설정에서 켠다!

xe에 블로그api라는 애드온이 있어요.
이것이 머냐하면, 외부에서 게시판글을 쓸수 있도록 설정해주는 건데
예를들어 윈도우 라이브 라이터나 다른 외부 프로그램이나 웹에서 작성할 수 있도록 하는 기능인데요, 게시판에 접속해서 일일히 글을 작성하지 않고 외부에서 프로그램을 이용해서 id/비밀번호하고 그 게시판 api주소를 저장해주시고 쓰면 글이 자동으로 게시판에 등록되는 것이지요. 이걸 메타 블로그 형식이라고 부른답니다. 기본적으로 설정이 꺼져있어요. 사용하실려면 애드온 모듈에 가셔서 온으로 켜주세요.

2. 우리는 외부 프로그램을 php 프로그램이 있는 문서를 쓸 텐데요. 이걸 만들어 주셔야 합니다. 메모장을 열어서 아래 php 코드 파일을 적어서 저장할때 확장명을 php로 저장해주시고 계정에 xmlrpc.inc 파일과 함께 같은 폴더(아무폴더)에 넣어주시고, 이 php문서에 접속해주시면, 프로그램 안에 있는 id/ 비밀번호/ 게시판 api 주소/ 제목/ 내용이 들은 이 php문서대로 글이 게시판에 저장되게 된답니다.

아래 php 코드 파일과 xmlrpc.inc 파일이 같은 폴더내에 있어야합니다.(xmlrpc파일은 아래 주석설명 참조)

<?php
//requires xmlrpc.inc from http://phpxmlrpc.sourceforge.net/
//!!중요!! xmlrpc파일이 필요함, 위 주소로 가서 zip파일을 다운로드, 압축해제후 lib폴더에 있는 xmlrpc.inc파일을 넣어주세요.
//아 그리고, xe에서 애드온 메뉴에서 블로그api 기능의 기본설정이 off되어있는데 그걸 on 해주셔야 작동되겠죠?

require_once('xmlrpc.inc');

$g_blog_url = "기본주소/xe/모듈명/api";
$g_id = "xe아이디(기본으로 관리자 admin으로)";
$g_passwd = "비번";

$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';

function metaWeblog_newPost( $blogid, $title, $content)
{
  global $g_id;
  global $g_passwd;
  global $g_blog_url;
 
  $client = new xmlrpc_client( "{$g_blog_url}");
  $f = new xmlrpcmsg("metaWeblog.newPost", // metaWeblog.newPost method
    array(
      new xmlrpcval("{$blogid}", "string"), // blogid.
      new xmlrpcval($g_id, "string"), // user ID.
      new xmlrpcval($g_passwd, "string"), // password
      new xmlrpcval( // body
          array(
            'title'        => new xmlrpcval($title, "string"),
            'description'    => new xmlrpcval($content, "string"),
           
        ), "struct"),
      new xmlrpcval(true, "boolean") // publish
    )
  );

  $f->request_charset_encoding = 'UTF-8';

  $response = $client->send($f);
  echo  $blogid.$title.$content;
 
}

$blogid="xe아이디(기본으로, admin으로 설정하시길 권장해요. 관리자일 경우 admin)";
$title="제목";
$content="내용";


metaWeblog_newPost( $blogid, $title, $content);

?>

2. 이제 게시판에 글이 제목에는 php문서에 써진대로 "제목" 이라고 써지고, 내용에는 "내용"이라고 글이 올라가게되는 것을 보셨을 겁니다. 이제 우리는 이 기능을 이용해서, 좀 더 고급기능을 써야겠죠? 그래서 우리는 다른 사이트의 게시판 내용을 베껴와서 이걸 위 문서의 "제목"에 제목을 넣고 "내용"에 내용을 넣어주시면 게시글을 베껴올 수 있겠죠?

이걸 가능하게 해줄 기능이 바로 갈쿠리 라는 베껴오기 php프로그램입니다. 위의 문서에 이 소스를 같이 추가해주시면, 먼저 이 프로그램이 내용을 베껴오고 이 베껴온 내용을 아래의 글 저장하는 php프로그램에게 제목과 내용을 분리해서 넣어주면 베껴온 글이 자신의 게시판으로 저장이 되겠지요?  -



 그 다음에 다른 사이트의 내용을 정규식 같은 것을 이용해서 가져와야 겠죠?
이것은 자세한 내용은 다음 주소로 가셔서.보세요(약간 힘드실수도)

http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=48559&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%B1%DC%BE%EE&sop=and

위 게시물 가시면 php코드를 복사 붙여넣기 하시고 나서
예를 들어 
하고 아래php코드를 같이 넣어주시면 예제 볼수 있으실겁니다.
물론 주소하고 voidsetpattern의 조건을 바꾸주셔야 겠지요. voidesetpattern($아무거나이름, $자르기시작부분, $자르기마지막부분);
이런식으로. 자세한 설명은 위의 링크를 참조하세요. 위 게시판 예제가 좀 쌩뚱맞게 안되서 , 예제는 아래 걸 해주시면 됩니다.

{ 위 글에서 복사한 php 함수코드(위게시물안에 있는 <?php ~ ?>부분 (엄청길더라구요)  }에다가 아래부분 추가해주시면 긁어오기예제;

<?
$buf = new GalKuRi;
$buf->voidSetPattern('keyword',')));">','<');
$buf->voidParsePage('http://search.naver.com/search.naver?where=nexearch&query='.urlencode('아디다스').'+ '+ '&frm=t1&sm=top_hty');
print_r($buf->parse_value);   ?>

이런식으로 해주시면 아디다스 연관 검색어가 갈무리되어 나오게 됩니다.
이것과 비슷하게 원하는 긁어올 대상을 조건 넣어서 가져온후

우리는 이런식으로 긁어온 것을 게시판에 올려야 되죠.(블로그 api주소와 아이디, 비번이 필요하죠)
그리고 또 제목, 내용에 들어갈 변수가 필요하게 되죠, 위에서 가져온 것을 여기에 넣어도 괜찮고
여러가지 응용하실 수 있으실 겁니다.

그것이 바로 요겁니다. 
좀 복잡하셧을지 모르지만, 잘 보시면, 응용력이 엄청 무한한 것 같습니다. 전 이거 할려고 아주 날밤 깟씁니다.
여러분은 그런일 없이 편히 사용해주셧으면 합니다. ㅎㅎ

제가 만든 글작성 프로그램의 소스를 공개하자면 이렇습니다. 좀 길어여; 갈쿠리 프로그램소스도 통째로 잇어서, 이 소스에서 자신에게 맞게 설정하시면 될듯합니다. 아이디나 비번이나 그런것들요. 갈쿠리 프로그램에서 가져올 url 자를 부분 설정등.

아래는 제가 쓰고 있는 copyboard.php 부분의 소스 입니다. 참고하시고 설정을 변경하셔서 사용하시면 됩니다. 여기서 사용하게되는 건, 배열부분지식정도 필요한듯합니다. 베껴올때 설정한대로 가져오면 1개가 아니라 두개가 나올수도 있으므로 배열로 되죠.  


<?php
 
/******************************************************************************
*    프로그램명    : 갈쿠리
*    버젼                : 1.01
*    변경일            : 2006-09-14
*    작성자            : 강용석
*    메일                : zzr600@hanmail.net
*    용도                : 텍스트 파싱
******************************************************************************/

class GalKuRi {
    // public
    var $response_header        = '';                // 응답헤더 저장
    var $contents                    = '+ '';                // 페이지 전체 내용 저장
    var $parse_value                = array();        // 결과가 저장될 배열

    // private
    var $_goods_no                = 0;                // 결과배열에 저장할때 쓰일 상품 번호
    var $_offset                        = 0;                // 검색 시작 번지
    var $_page_no                    = 0;                // 페이지 별로 읽을 경우 페이지 번호 저장변수
    var $_page_var                    = '';                // 페이지 별로 읽을 경우 페이지 변수명을 저장하는 변수
    var $_parse_pattern            = array();        // 읽어들일 문자 패턴 2차원배열
    var $_process_func            = '';                // 페이지 별로 처리할때 결과를 처리할 외부함수
    var $_roop                        = 1;                // 페이지를 계속 파싱할지 여부
    var $_set_cookies            = '';                // 쿠키 저장
    var $_set_referer                = '';                // 레퍼러 저장
    var $_skip_offset                = array();        // 건너뛸 문장
    var $_wait                            = 0;                // 한페이지 처리후 멈춤시간(단위 초)

    function voidSetPattern($field,$token_start,$token_end,$del_str='') {
        /********************************************************************
        * public
        * 파싱할 패턴문자 설정
        * ex) $buf->voidSetPattern(필드명,시작문자,끝문자,[지울문자]);
        *
        * 텍스트 내용중 < 와 > 사이에 있는 문자열을 name 이라는 이름으로 빼내고
        * 결과문자열중 \ 를 지우고자 하는경우
        * ex) $buf->voidSetPattern('name','<','>','\');
        ********************************************************************/
        if($field == '_default_')
            $this->voidError('_default_ 는 사용할수 없는 단어입니다.' );

        $this->_parse_pattern[$field] = array($token_start,$token_end,$del_str);
    }

    function voidSetSkipOffset($field,$token) {
        /********************************************************************
        * public
        * 파싱후 패턴과 동일한 문자가 중간에 존재하여 그부분의 뒷부분 부터 파싱을 원할경우
        * ex) $buf->voidSetSkipOffset(필드명,찾을문자);
        *
        * name 필드 파싱후 다음 파싱 패턴과 동일한 문자가 있을경우 건너뜀
        * ex) $buf->voidSetSkipOffset('name'+ ','<');
        *
        * 필드명을 _default_ 라고 설정할경우 파싱전 해당 문자로 이동을 한후에
        * 파싱을 시작함. default 시작위치를 설정
        * ex) $buf->voidSetSkipOffset('_default_','<');
        ********************************************************************/
        $this->_skip_offset[$field] = $token;
    }

    function voidSetCookie($var,$value) {
        /********************************************************************
        * public
        * 쿠키를 설정합니다.
        * ex) $buf->voidSetCookie(쿠키명,쿠키값);
        ********************************************************************/
        $this->_set_cookies .= $var.'='.urlencode($value).';';
    }

    function voidSetReferer($ref) {
        /********************************************************************
        * public
        * 레퍼러를 설정합니다.
        * ex) $buf->voidSetReferer(레퍼러);
        ********************************************************************/
        $this->_set_referer = $ref;
    }

    function voidSetPage($var,$func='',$page=1) {
        /********************************************************************
        * public
        * 페이지 처리를 원할경우 설정
        * ex) $buf->voidSetPage(페이지변수명,[외부처리함수],[시작페이지]);
        * 하나의 주소에 연속된 페이지가 존재할경우 계속 읽어들일수 있습니다.
        *
        * 페이지변수 pagenum=1,2,3,4,5 식으로 페이지가 존재하는 경우
        * ex) $buf->voidSetPage('pagenum','func',1);
        *
        * 주의) 페이지가 많을경우 배열에 결과값이 계속 쌓이므로 리소스가 커질수 있으니
        * 생성자에 설정할수 있는 외부 함수를 이용하여 페이지 마다 바로 처리하시기 바라며
        * 역시나 시간이 오래 걸릴수 있으니 쉘모드에서 실행하시기 바랍니다.
        ********************************************************************/
        $this->_page_var = $var;
        $this->_page_no = $page;
        $this->_process_func = $func;
    }

    function voidSetSleep($sec) {
        /********************************************************************
        * public
        * 페이지 처리시 완료후 잠시 멈춰있을 시간입니다.
        * ex) $buf->voidSetSleep(초);
        ********************************************************************/
        $this->_wait = $sec;
    }

    function voidGetAllContents($url,$method = 'get',$port = '80') {
        /********************************************************************
        * public
        * 전체 페이지 내용을 긁어오는 부분입니다.
        * ex) $buf->voidGetAllContents(주소,[메소드],[포트]);
        *
        * 결과 값은
        * $buf->response_header; 응답헤더만 별도 저장
        * $buf->contents; 전체페이지 내용저장
        ********************************************************************/
        if($method != 'get' && $method != 'post')
            $this->voidError('+ 'method 값이 다릅니다. '.$method);

        $url_info = parse_url($url)undefinedundefined;
        $fp = fsockopen($url_info['host'+ '], $port, $errno, $errstr);
        if(!$fp) {
            $this->voidError($errstr.' ('.$errno.')');
        }
        
        if($method == 'post')    {
            fputs($fp,"POST ".$url_info['path']." HTTP/1.0\r\n");
            fputs($fp,"Host: ".$url_info['host']."\r\n");
            fputs($fp,"User-Agent: PHP Script\r\n");

            if($this->_set_referer)
                fputs($fp,"Referer: ".$this->_set_referer."\r\n");

            if($this->_set_cookies)
                fputs($fp,"Cookie: ".$this->_set_cookies."\r\n");

            fputs($fp,"Content-Type: application/x-www-form-urlencoded\r\n");
            fputs($fp,"Content-Length: ".strlen($url_info['query'])."\r\n");
            fputs($fp,"Connection: close\r\n\r\n");
            fputs($fp,$url_info['query']);
        }
        else {
            fputs($fp,"GET ".$url_info['path'].($url_info['query'] ? '?'.$url_info['query'+ '] : '')." HTTP/1.0\r\n");
            fputs($fp,"Host: ".$url_info['host']."\r\n");
            fputs($fp,"User-Agent: PHP Script\r\n");

            if($this->_set_referer)
                fputs($fp,"Referer: ".$this->_set_referer."\r\n");

            if($this->_set_cookies)
                fputs($fp,"Cookie: ".$this->_set_cookies."\r\n");

            fputs($fp,"Connection: close\r\n\r\n");
        }

        $this->contents = '';
        $this->response_header = '';

        while(trim($buf = fgets($fp,1024)) != "") { //응답헤더를 읽어옵니다.
            $this->response_header .= $buf;
        }

        while(!feof($fp)) { //내용을 읽어옵니다.
            $this->contents .=  fgets($fp,1024);
        }
        fclose($fp);
    }

    function voidParsePage($url,$method = 'get',$port = '80') {
        /********************************************************************
        * public
        * 파싱하는 부분 main 이 되겠습니다.
        * 페이징 처리와 계속 파싱할것인지 결정을 하고
        * 외부함수 처리 역시 여기서 합니다.
        * ex) $buf->voidParsePage(주소,[메소드],[포트]);
        *
        * _default_ 오프셋이 있으면 그쪽으로 이동시키고 패턴에 등록된 것만큼 반복을 합니다.
        * name,img,price 패턴이 등록되 있다면
        * name파싱,img파싱,price파싱을 계속 반복합니다.
        * 더이상 내용이 없다면 종료시키거나 페이지설정이 되있다면
        * 다음페이지를 읽어들여서 다시 파싱을 반복하고 페이지가 없을때까지 반복 파싱.
        ********************************************************************/
        $this->_roop = 1;
        $page_now = $this->_page_no;
        $page = '';
        $key = array_keys($this->_parse_pattern);
        $cnt=count($key);

        while($this->_roop) {
            $this->_goods_no = 0;
            $this->_offset = 0;
            $parse_count = 0;
            $this->voidGetAllContents($url.$page,$method,$port);
        
            if($this->_skip_offset['_default_'])
                $this->voidGetOffset($this->_skip_offset['_default_']);

            if($this->_roop) {
                while($this->_roop) {
                    for($i=0;$i<$cnt;$i++) {
                        $this->voidGetText($key[$i]);
                        if(!$this->_roop) {
                            if($cnt != count($this->parse_value[$this->_goods_no]))
                                unset($this->parse_value[$this->_goods_no]);
                            break;
                        }
                        $parse_count++;
                    }
                    $this->_goods_no++;
                }
            }

            if($this->_page_var) {
                if($parse_count >= $cnt) {
                    $page = '&'.$this->_page_var.'='.(++$page_now);
                    $this->_roop = 1;
                    if($this->_wait)
                        sleep($this->_wait);
                }
                else {
                    $this->_roop = 0;
                    break;
                }
            }
            
            if($this->_process_func) {
                call_user_func($this->_process_func,$this->parse_value);
                $this->parse_value = array();
            }
        }
    }

    function voidGetOffset($str) {
        /********************************************************************
        * private
        * 검색위치를 건너뛰는 부분입니다.
        * ex) $buf->voidGetOffset(문자);
        * 해당문자가 없으면 종료합니다.
        ********************************************************************/
        $tmp_offset = strpos($this->contents,$str,$this->_offset);
        if($tmp_offset)
            $this->_offset = $tmp_offset + strlen($str);
        else
            $this->_roop = 0;
    }

    function voidGetText($field) {
        /********************************************************************
        * private
        * 패턴 사이의 문자열을 추출하는 부분입니다.
        * ex) $buf->voidGetText(필드);
        * 역시나 해당문자가 없으면 종료합니다.
        ********************************************************************/
        $spos = strpos($this->contents,$this->_parse_pattern[$field][0],$this->_offset);
        if(!$spos) {
            $this->_roop = 0;
            return;
        }
        $spos += strlen($this->_parse_pattern[$field][0]);

        $epos = strpos($this->contents,$this->_parse_pattern[$field][1],$spos);
        if(!$epos) {
            $this->_roop = 0;
            return;
        }
        $this->_offset = $epos + strlen($this->_parse_pattern[$field][1]);

        $str = substr($this->contents,$spos,$epos-$spos);

        if($this->_parse_pattern[$field][2])
            $this->parse_value[$this->_goods_no][$field] = str_replace("\r\n",'',str_replace($this->_parse_pattern[$field][2],'',trim($str)));
        else
            $this->parse_value[$this->_goods_no][$field] = str_replace("\r\n",'',trim($str));

        if($this->_skip_offset[$field])
            $this->voidGetOffset($this->_skip_offset[$field]);
    }

    function voidError($msg) {
        exit($msg);
    }
}


//여기까지는 프로그램 소스이고 다음부터 설정하는 곳입니다.


$buf = new GalKuRi;

//아래는 (변수명, "자르기 시작할 문자" , "자르기 끝낼 문자") 로 하시면 변수명으로배열로 저장
$buf->voidSetPattern('title','<b>','</b>');
$buf->voidSetPattern('content'+ ','<p><!--StartFragment--></p>','</body>');

$url='http://www.kita.net/newtri2/center/market_view.jsp?s_con=0&nGubun=5&s_text=&sStartDt=&sEndDt=&sOrder=&board_code=70000&gubun=10&curpage=1&count=y&no='.$no;

$buf->voidParsePage($url);

//print_r($buf->parse_value);
$parse_value=$buf->parse_value;

/* 위의 예를 보자면 http://www.kita.net/newtri2/center/market_view.jsp?s_con=0&nGubun=5&s_text=&sStartDt=&sEndDt=&sOrder=&board_code=70000&gubun=10&curpage=1&count=y&no=22202 라는 페이지에서 소스보기해서 보시면 html 소스가 나오져 그 파일에서
위에 $buf->voidsetpattern () 이 부분에서 설정한 문자열을 잘라오는 겁니다. 여기에서 우리는 title과 content라는 변수명으로 제목과 게시판의 내용을 가져오는 겁니다. 이 변수가 바로 api기능을 활용해서 게시판에 글을 쓰는 프로그램에서 $title  = $parse_value[0][title];
$content= $parse_value[0][content]; 위에서 잘라온 내용을 넣어주어서 글을 등록하는 겁니다. $parse_value[0][content] 는 배열인데요, 배열에서 0(첫번째) content라는 곳의 정보를 $content에 삽입한다는 말입니다. 

위의 url 에 들어가서 잘라올 부분의 태그를 적어주셔야 하죠. 전 제목은 <b>~~</b> 이 둘 사이에 있어서 이렇게 잘라왓고, 내용은 <p>~ </body> 로 가져 왓습니다. 이런건 자신이 수동으로 해주셔야 합니다. 게시판 같은경우 똑같은 태그가 반복되므로 한번만하시면 다음 부터는 되죠.
*/

//echo $title;
//echo $content;

//requires xmlrpc.inc from http://phpxmlrpc.sourceforge.net/
require_once('xmlrpc.inc');

$g_blog_url = "게시판주소/api";
$g_id = "admin";
$g_passwd = "비번";

$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';

function metaWeblog_newPost( $blogid, $title, $content)
{
  global $g_id;
  global $g_passwd;
  global $g_blog_url;
 
  $client = new xmlrpc_client( "{$g_blog_url}");
  $f = new xmlrpcmsg("metaWeblog.newPost", // metaWeblog.newPost method
    array(
      new xmlrpcval("{$blogid}", "string"), // blogid.
      new xmlrpcval($g_id, "string"), // user ID.
      new xmlrpcval($g_passwd, "string"), // password
      new xmlrpcval( // body
          array(
            'title'        => new xmlrpcval($title, "string"),
            'description'    => new xmlrpcval($content, "string"),
           
        ), "struct"),
      new xmlrpcval(true, "boolean") // publish
    )
  );

  $f->request_charset_encoding = 'UTF-8';

  $response = $client->send($f);
  echo  $blogid.$title.$content;
 
}
$blogid="admin";

$title  = $parse_value[0][title];
$content= $parse_value[0][content];

function change_to_utf($utfStr) {
  if (iconv("UTF-8","UTF-8",$utfStr) == $utfStr) {
    return $utfStr;
  }
  else {
    return iconv("EUC-KR","UTF-8",$utfStr);
  }
}

$title = change_to_utf($title);
$content = change_to_utf($content);

metaWeblog_newPost( $blogid, $title, $content);

?>



 

좀 더 발전된 데모: 22202 한번 지정해주면, 자동으로 30초후 22203 이라는 주소로 이동하게 되서, 다음글도 저장되는 페이지를 자바스크립트를 이용한 데모입니다.

http://xavaz.cafe24.com/copyboard_view.php  여기 들어가시면 22202 번 글이 자동으로 한번등록되고 30초후(좀 길죠?) 글이 아이프레임으로 다음번글을 등록합니다. 그러면 게시판에 다음 글이 등록되어있겠죠? 게시판은 http://xavaz.cafe24.com/xe/var 가시면 확인해보자구여. 벌써글이 여러개가 등록되었죠??? 30초라는 시간은 너무 짧게 하면 잘 안되는 것 같아서 안정적으로 하게 하기 위해서 좀 길게 잡았구여. 소스는 아래에, a라는 변수를 세션으로 저장하구여, 그 변수보다 하나씩 높게하고 리플레시 시켜서 copyboard.php를 불러오게 해서 다음번글이 저자오디게 만들었습니다. 이런식으로 구상하면 한번 켜놓고 컴퓨터를 잇으면 자동으로 글이 수천개? ㅎㅎ (에러로 잘안되는글도 있더군여,..) 등록하실수 있습니다. 아래 폼인풋에서 22202는 그 문서로 이동하자는 폼이구여 그러면 거기서부터 번호가 시작되져

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=euc-kr" />
<title>Untitled Document</title>
<script language='javascript'>
  window.setTimeout('window.location.reload()',30000); //10초마다 리플리쉬 시킨다 1000이 1초가 된다.
 </script>
</head>

<body>

<?
 
@session_start();
$a = $HTTP_SESSION_VARS["a"] + 1;
session_register("a");

$b= 22202;
$b=$b-$a;


$url='http://xavaz.cafe24.com/copyboard.php?no='.$b;
?>
<iframe src="./<?=$url?>" width="880" height="600"></iframe>
<form action="copyboard_view.php" method="post">
<input name="no" type="text" value="22202"/>
<label>
  <input type="submit" name="button" value="go" />
</label>
</form>
</body>
</html>


 


 

제목 글쓴이 날짜
글 작성시 미리 저장된 서식 불러오기. [10] file 개돌 2009.07.09
새로운 쪽지 유무에 따라 이미지 변경하는 법 [2] 멀티비타민 2013.12.16
관리권한 없이도 특정그룹에게 비밀글 열람 및 댓글작성 권한 부여하는 방법 ( 부운영자등을 위해) sejin7940 2018.04.26
게시판 본문읽기에서 컨텐츠 이미지와 텍스트 분리하여 출력하기 forest535 2018.04.09
EXIF 메타정보 필요하신 분 있으시면 forest535 2018.04.09
XEDITON 레이아웃에 다국어(국기) 선택 버튼 추가하기 [7] file ehii 2015.04.15
댓글을 역순으로 출력하는 팁 (최근댓글이 가장 위에) [8] sejin7940 2012.02.10
게시글 상하단에 광고삽입하기 veplay2 2018.03.08
winamp 방송정보 알아오기 (2005년 새로 코딩한 버전) [8] file 이승원 2005.05.06
[강추]!! 긁어와서 [자동]으로 게시글로!! [메타 블로그] php 로 넣기!!! xe블로그api를 이용한.. [51] file 김기철980 2009.01.29
css팁 : 웹폰트 저장소 Dotcomsoft 2018.01.17
css 팁 : 색상코드 검색이필요할때 Dotcomsoft 2018.01.17
모바일에서 유투브 동영상 크기 300px고정 [28] 패시브 2012.07.31
XE에 채팅 연동 하기 [1] younggyo 2017.12.15
bitnami ssl 클라우드플레어 설정법 키큰아이 2017.12.06
성공적인 홈페이지 제작을 위해 점검해야 될 사안 웹369 2017.12.05
제로보드에서 iframe 높이 자동(유동적)조절(파폭,IE, 오페라,사파리,IETester) [11] file hhgyu 2010.09.17
통합검색의 기본값을 '제목' 이 아니라 '제목+내용' 으로 하고 픈 경우 [2] sejin7940 2017.02.24
모바일앱, 모바일 어플에서 카카오톡, 카카오 스토리 앱으로 공유하기 한꼬마 2017.10.31
폰갭 모바일 사진 분석 부터 번역까지 아토피뉴스 2017.10.16