웹마스터 팁
[강추]!! 긁어와서 [자동]으로 게시글로!! [메타 블로그] php 로 넣기!!! xe블로그api를 이용한..
2009.01.29 03:05
----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초마다 저장되져. 자동으로말이죠.
이런식으로 자동화시키면, 다른 사이트의 내용을 긁어와서 내 게시판에 한번에 등록할
수 있게 되는 것이죠.
그럼 간단히 데모를 통해 어떤 기능인지 살펴보기로하죠.
그런데 주소를 잘 보시면 맨 끝에 &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>
댓글 51
-
아방스
2009.02.07 11:02
.....모르겟군 ^^;;; -
미니미
2009.02.09 23:57
기발하네요...저도 위의 정규표현식 때문에 날밤깠던 기억이 새롭습니다.
굳~! -
김기철980
2009.02.28 13:27
질문: 안녕하세요...님께서 작성하신 팁을 보고 문의드립니다. 몇번을 읽어봤는데.... 개념자체가 안잡혀서 어떻게 사용하는지 이해를 못하겠습니다. 예를들면.. 제로보드 질답게시판의 글을 실시간으로 제가 만든 게시판으로 싱크를 맞춰서 똑같이 복사하려고 한다면... php소스는 어디에 삽입해야하며 어느곳에 업로드해야하는지..등.. 개념이 부족합니다... 조금 더 자세히 이해할 수 있도록 도와주세요..
답변:
개념자체가 안 잡히신다면.... 글 한번 더 잘 보시고 생각 좀 더 하셔야 될 것 같구요. 좀 제가 올린 글이 초보자가 이해하기에는 좀 난해합니다. 그리고 ,,,, 제가 올린 글은 사람들에게 친절하게 설명하는 글이 아니라, 제가 한 일들이 이런 비슷한 것을 하는 분들께 조금이나마 수월하게 하시라고 참고하라고 글을 올린거에요.. 제가 올린 글은, php에 대한 개념이 잡혀있고 어느정도 아는 상태에서, 노력을 한다는 조건에서, 제 글을 보시면, 시간이 걸리더라도 해낼실 수 있을 정도의 도움이라고 보시면 되요...
본론으로, 답변: 님이 말하는 기능은 약간 머리를 써야 될 것 같습니다. 대충 설명하자면, 이중으로 프로세스를 거쳐야 될 것 같습니다.
galkuri 라는 정규식 추출php 프로그램은, 긁어올 주소와 정규식을 이용한 패턴 정의로 이 두가지로 되는데, 먼저, 게시판 주소 예를들어, http://www.zeroboard.com/zbxe_qna 이라고 하면, 이 주소를 글에있는 긁어오기 php 프로그램을 이용해서 , 패턴으로 그html에 있는 글 주소를 추출해야 합니다. 글이 여러가지 많겠죠. 한 페이지에, 그래서 배열로 저장이 되겠구여, 그런데, 가장 최근거 하나만 한다고 하면, 배열에서 0 번째걸 저장하면 되겠쬬? 그걸 변수로 저장하고, 그 변수를 다시, galkuri 프로그램의 주소부분에 넣어주시고, 또 그 글의 내용과 제목을 추출해 줄 정규식 패턴 정의해주시고 나서, 블로그 api php프로그램을 이용해서 게시판에 넣어주시면 될 것 같습니다.
다시 간단하게 말하면, 게시판 리스트에서 최근글의 주소를 추출하고, 그 주소를 갈쿠리프로그램의 주소에 넣어주시고, 또 그 글에서의 제목과 내용을 추출해 내시고 블로그 api기능이용하시면됩니다. 그리고 자동으로 하실려면 이중 구조를 하셔야 할지도 모르겠습니다. php파일을 iframe 으로 플로와서, php파일 안의 iframe에서 php파일을 불러와서, 부모창에서 iframe의 주소를 변경해주시는 자바스크립트를 이용하면 좋구요. 자바스크립트에 시간 기능, 몇초마다 갱신이라던지 하시면 자동이 될듯합니다.
아 그리고, 어느에 그 php부분을 넣어야 한다고 물으셨는데, 이 질문자체가 이 기능을 잘 이해하지 못하시는 거라 생각합니다... 이 파일은 어디에다가 놓아도 상관없습니다. xe와 관련없이 외부적으로 돌아가는 프로그램입니다. 심지어 다른 서버에 php를 이용해서도 님의 게시판에 글을 올릴수 있습니다... 완전 독립적인 프로그램인것이죠... php 부분은 xe와 관계없이 독자적으로 하시는 겁니다. 어디에 두셔도 상관없습니다. 어차피 php내에서 xe 게시판 주소와 모든 내용이 다 들어 있으니, 어디있어도 상관없습니다.
제가 생각해도, 이해 못하실만한 답변으로 보이지만,,, 이정도가 제가 할 수 있는 정도네요....네 감사합니다. -
dsfdsf
2009.03.16 00:54
convert dvd to mp4 formats:http://www.cxbsoft.com/dvd-to-mp4.html
convert dvd to 3gp formats:http://www.cxbsoft.com/dvd-to-3gp.html
convert dvd to flv formats:http://www.cxbsoft.com/dvd-to-flv.html
convert dvd to ipod formats:http://www.cxbsoft.com/dvd-to-ipod.html -
건즈
2009.04.28 11:29
설명해주신 대로 해봤지만 글이 작성되지 않았습니다. 어느 부분이 잘못되었는지 모르겠군요.
1) api_test라는 이름의 게시판을 만들고 blog_api를 사용하도록 추가했습니다. 다음은 api_test의 api 관련 코드입니다.
2) 글 등록할 php 코드를 작성했습니다.
3) 그 다음 제 계졍의 blogapi라는 폴더에 두 파일을 올렸습니다.
4) 다음과 같이 브라우저에서 metablog.php를 호출했습니다.
5) 하지만 글이 게시되지 않습니다.
확인 좀 부탁드리겠습니다.
-
글쓴이
2009.04.30 16:27
블로그 api 설정이 기본적으로 설정이 꺼져있어요. 사용하실려면 애드온 모듈에 가셔서 온으로 켜주세요. <-이거 하셨는지요?
그리고, blogid 있잖아여, 그걸 아마 제 생각엔 admin 으로 기본으로 하지 않으면 않됬었던걸로 기억이... 아닐수도 있구요 혹시나...
음 위에것도 아닌데도 안된다면, 제가 한 버젼하고 또 다를수도 있어서 그런거 아닐가 라는 생각하고...
또 제가 이거 한지 오래되서,,,, 제가 제거 다시한번해보고 안되면 이메일로 주세여; 제가;;; 잘 글을 안봐서... 운좋게도 글쓴지 얼마 안지나 답변을 쓰게되서 ㅎㅎ
아 금방 제걸 해봤는데 잘 되는데요...
-
보스매니아
2009.05.01 16:12
어렵다 ㅜㅜ -
김기철980
2009.05.01 19:11
좀 어려운 내용에 , 제 글도 어려운 거 같아서, 다시 수정했어요... 다시한번 보시면, 기본적인 기능인 php프로그램 이용해서 게시판에 글쓰기까지는 하실수 있을거에요. 여기까지 하시면, 다음 갈쿠리 프로그램(링크된) 을 대충 어떤 쓰는지 알고 , 이걸 이용해서 자신이 원하는 사이트의 글을 자신의 게시판에 올리시면 될거에요 ;; 좀 어렵죠?;;;;;;;;
-
다 영
2009.05.15 21:40
2. 이제 게시판에 글이 제목에는 php문서에 써진대로 "제목" 이라고 써지고, 내용에는 "내용"이라고 글이 올라가게되는 것을 보셨을 겁니다.
위에서 저는 "제목", "내용" 이런글 안올라오던데요,,
XML-RPC: xmlrpcmsg::parseResponse: HTTP error, got response: HTTP/1.1 404 Not Found
이렇게 뜨고 게시판엔 아무변화가 없어요,,,
참고로 1.2.2버전이요,, -
a
2009.05.19 12:43
음, 제 생각엔, php문서에서 자신의 계정을 잘 적으셨는지 id, 나 password 나 블로그게시판 주소를여,
아니면, xmlrpc.inc 파일이 없거나, 아니면 경로가 잘못 입력되었거나...
ㅇ -
ㅇ
2009.05.19 12:47
아래 사용자 설정 변수만 잘 해주시면 될듯해여.
$g_blog_url = "설치경로~/xe/모듈명/api";
$g_id = "xe아이디";
$g_passwd = "비번";$blogid="admin";
$title="제목";
$content="내용"; -
show
2009.05.22 08:01
$blogid="admin";
$title="제목";
$content="내용";타이틀값과 컨텐츠값을 저렇게 밖에 못주나여?
알아서 입력은 못하나여?
-
a
2009.05.27 23:59
알아서 입력하는 폼을 만들고 페이지로 전송시켜주면 되겠죠?
그리고 글 읽어보시면, 다른 페이지를 자동으로 복사해서 붙여넣는 프로그램도 있어여,그걸이용해서 하면 자동으로 되는거져;;;
정독하시길;
-
보스매니아
2009.05.22 17:11
전 원래 간단하게 제목/내용 남기는것까진 됬었는데,
XE 업그레이드후 안되네요
-
ㅁ
2009.05.28 00:00
네 그런것 같군요. 제가 1.2. 버젼부터는 원활히 잘 작동하지 않는것 같네요..
아마도 안정화 작업된이후에나 두고봐야 할듯,, 1.2 버젼으로는 선뜻 업글이 쉽지 않던데;
아직 불안정한 면이 많아서... 제가 만든 위젯플그램도 1.2에선 안되더라구여; 왜인지는 모르겟지만;
너무 많이 바껴서 그런걸까여? 호환성에도...
-
차차차
2009.06.09 15:06
한번 사용해 보고 싶은데요. 저도 게시글에 '제목,내용'이 입력되게 하는데 까지는 되는데,
그다음 갈쿠리 소스하고, 첨부하라는 소스하고 어떻게 하는지 모르겠네요. 이러한 소스를 처음의 소스 안에 넣으라는 이야기 인지??
글 등록할 php소스가 a.php 이고, 'xmlrpc.inc'랑 동일한 디렉토리에 넣은다음, 갈구리나 이런 것은 어찌되는지..
링크된 데모페이지에서 테스트는 아주 잘 되는데요.
이왕 팁에 올려주시는 김에, 데모 페이지에서 사용하시는 화일을 첨부해 주시면 안될까요?
그걸 보고 분석좀 해 보면 쉽게 응용하고 이해될수 있을텐데..
가능하다면 감사하겠습니다.
-
ㅁ
2009.06.10 10:26
글등록할 소스에 갈쿠리 프로그램 소스를 넣으시고 설정을 하신후 가져온 내용을 글 등록하는 프로그램에서의 변수에 대입하시면 그 내용이 등록이 되겟지요? 요청해주셔서 글 맨 아래에 소스를 첨부할게요. 파일로는 귀찮은듯 해서;;
-
다 영
2009.07.11 00:39
글쓴이님~ 요거 미리보기페이지는 XE몇버전인가요??
-
김기철980
2010.05.13 01:05
1.1 버전인듯합니다.; 작동이 왜 안돼는지는 잘 모르겠네요. 버젼과 상관없이 돼야 맞는건데 말이죠, API 기능을 지원한다면
-
leecher776
2010.04.17 20:41
copyboard.php 공유하여 줄수 잇을가요?
다 잘 따라하엿는데요 좀 더 발전된 데모를 따라하려다가
$url='http://xavaz.cafe24.com/copyboard.php?no='.$b;
여기서 $b의 값이 넘어가지 못하는데요
no이 함수를 어떻게 설정하여 죄는지 가르쳐 주실수 잇을가요 ?
copyboard.php?no=1111
이런식으로 하면
$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;
여기에 $no에로 b의 값을 준단말이요 근데 어떻케 실현하죠?mail: leecher0726@hotmail.com 답변줫으면 감사하겟습니다...
-
김기철980
2010.05.13 00:54
어렵다고 하시는 분들이 많아서 첨부해놨습니다. 쉽게 주석달아서 설명되어 있어요.
무슨말인지 잘모르겠습니다만, 대충, 22202에서 세션으로 접속할때마다 $a 의 값이 1만큼 증가해서,
새로고침할때마다 1,2,3, 이런식으로 올라가니 $b=$b-$a니깐, $b의 값은 22202,22201,22200,22199, 이런식으로 내려갈겁니다.
그런식으로 새로고침할때마다 22202 글 업로드되고, 30초후, 22201 글 작성되고, 그런식입니다. 반대로 글숫자를 올라가고싶으면 $b=$b+$a 로 해주시면 되겟죠, 기본글(첨글)을 제가 22202 로 설정해놧으니 이것도 바꾸셔도 되구여.
그냥 특정값을 보내고 싶으시면 copyboard.php?no=원하는글번호 , 이렇게 적으셔도 되구요,
또 새로고침이 브라우저 버젼,종류에 따라 작동안될수도 있으니 이건 한번 찾아보셔야 될것 같습니다.
-
dlkorean
2010.04.18 02:37
copyboard.php
copyboard_view.php
이 두파일 공유가능한가요? 위에 써져 잇는 소스랑은 조금 틀린것 같은데요 .... ....
마지막에 자동으로 아이프레임으로 돌리는데서 돌아안가고 한페이지만 자꾸나와서 문의 드릴려구 그러는데요
dlkorean@gmail.com 으로 메일 보내줄수잇을가요 감사합니다....
-
김기철980
2010.05.13 00:56
공유는 의미가 없는 것 같구요(사실상 같으니), 그래서 첨부파일로 주석달아 설명했으니 한번해보세요.
아이프레임 문제의 경우, 어떤브라우저를 쓰느냐(종류,버전)에 따라 다르게 나타날수 있으니, 한번 연구해보셔야할 내용같습니다.
-
하얀마법
2010.05.30 17:39
소스에 오타가 있는 것 같아요.
$url_info = parse_url($url)undefinedundefinedundefined;
이 부분을
$url_info = parse_url($url)undefined;
이렇게 수정하시면, 작동이 잘 됩니다.
그리고, 질문이 있습니다.
혹시, 로그인해야 하는 페이지는 어떻게 해야하는지 알고 계시나요?
로그인 후 접근 권한이 있는 상태에서 갈무리 하고 싶은데요.
방법을 알려주시면 감사하겠습니다.
-
하얀마법
2010.05.30 17:41
아.. 이게 XE에서 오타를 추가시키는 군요..
$url_info = parse_url($url)undefinedundefinedundefined;
이것을$url_info = parse_url($url)undefined;
이렇게 수정하세요.
-
하얀마법
2010.05.30 17:41
이구... 코드 하일라이트도 오타 추가되네요.. ㅠ
undefined 이건 다 지우세요. ㅠㅠ
-
제민이
2010.10.07 16:23
첨부파일에 올려준 index.php 소스에서 아래부분에서 안되고 있습니다.
"
//깨짐방지위해 UTF8로 변환
$title = change_to_utf($title);
$content = change_to_utf($content);"
위 코드를 빼면은 깨져서 등록은 잘 됩니다.
하지만 처음 소스대로 위 코드를 삽입하면 글등록 조차 안됩니다.
무엇인 문젠가요?
깨짐방지위해 UTF8로 변환 코드에서문제가 있는 건 가요.?
아니면 xe에서설정이나 서버문젠가요?
바쁘데 죄송하지만 확인해 주시기 바랍니다.
감사합니다.
-
Alex
2013.02.16 01:07
아 왜 안되지... 제일 첨에 나오는 소스로 해봤는데 제목 내용 이게 아예 안들어가네요
오류메세지도 없는데...
-
Alex
2013.02.16 01:15
아 , 됐다 ^^
1.5.4.2 버젼에 문제가 있었네요
http://www.xpressengine.com/index.php?document_srl=21644025&search_keyword=api&mid=qna
참고하세요.
-
KTK
2013.03.05 16:59
혹시성공하셨다면 ㅠㅠ XE로 만들어진 사이트에서 게시글 가저오는 예제 하나 알려주시면 안될까요 ㅠㅠ 도저히 모르겠네요 ㅠㅠ 정말 간곡히 부탁드립니다.
-
국이래용
2013.03.07 13:40
제목은 Untitled 내용은 아무것도 안나오는데요..이거 어떻해야 할지 모르겠네요.
-
KTK
2013.03.07 22:43
이거정말 사용하고 싶네요 ㅠ
-
제이디600
2013.03.24 11:59
1.7.3.0에서 아무 반응이 없네요. 다른분들은 1.7.3.0에서 정상 작동하는지요
-
playok.myid.net
2013.06.24 11:23
좋은 정보 감사합니다.
rpc를 이용한 blog api 등록까지만 제가 필요한 부분이였습니다.
잘 되네요~~ 감사합니다^.
-
kukuriko
2013.07.27 15:55
으악 왜안되는거지
-
정도의길을걷기싫다
2013.07.27 16:03
되지를 않는다.. ㅠ 이거 해보겠다고 두시간가량의 시간을 소비했네
그래도 경험이니 만족 ^^
-
맞장
2013.07.29 12:12
1.7에서도 잘 작동 됩니다. ^^
간단한 사용기는 http://matzang.com/80194996517 이곳에 적었습니다.
-
리더한
2013.07.29 16:14
맞장님 정말 반갑고 기쁩니다.
6개월 이상을 매달려도 성공을 못하고 있는데
이렇게 당당하게 성공하셨다는 분을 뵙게 되었으니
다시한번 희망이 생깁니다. 흑흑. 정말 눈물날 지경이에요.
또 도전해봐야겠습니다. 정말로 정말로 힘들고 도저히 제 힘으로 되지 않을때
문의글 한번 드리겠습니다.
그때 도움의 한말씀 꼭 부탁드릴게요~
-
맞장
2013.07.29 17:52
반갑습니다. ^^
제 블로그글 보시면 좀 쉽게 하실 수 있을거에요.
-
국이래용
2013.07.29 17:01
맞장님 저는 왜 타이틀은 다긁어오는데 내용은 못긁어 오는지 모르겠네요.ㅠㅠ
-
맞장
2013.07.29 17:50
사이트마다 긁어오는 설정은 틀려서 그럴거에요. ^^;
-
socialskyo
2013.07.29 21:34
저도 ^^ 제가 원하는 링크는 제목 밖에 긁어오질 못하네요^^;
-
맞장
2013.07.29 23:57
긁어오실 사이트 주소와 부분을 올려줘보세요~ ^^;
-
socialskyo
2013.07.30 01:59
링크 삭제^^ 괜한 오해가..있을수 있으므로
입니다.
-
맞장
2013.07.30 12:23
제 블로그에 보시면...
$l_content1 = explode('<content:encoded>',$l_title1[1]);
$l_content2 = explode(']]></content:encoded>',$l_content1[1]);
이부분이 있습니다.
이걸..
$l_content1 = explode('<!-- EAP_CONTENT -->',$l_title1[1]);
$l_content2 = explode('<!-- /EAP_CONTENT -->',$l_content1[1]);
이렇게 하시면 됩니다...
그러나 저작권에 문제가 있습니다. 출처에 확인을 하시고 퍼가셔야 될거에요.
-
쿨럭이
2015.02.17 17:50
안녕하세요~ 저역시 몇년간 풀리지 않다가 맞장님 내용보고 아하 되긴하네 싶더라구요.
다만 여기서 만약 같은 xe 게시판(스케치북게시판)의 내용을 가져오려면
어떻게 수정하여야될까요?
-
반걸
2015.03.31 18:17
정말 대박 기능입니다... @맞장님 덕분에 쉽게 할수있었습니다 김기철님이 알려주신방법으로 하면 자동기능이고 , @맞장님 이 이 알려주신대로하면 반자동이네요 ㅎㅎ 정말 진심으로 감사드립니다
-
반걸
2015.04.01 02:04
마지막 4번소스가 듣지않아서
set_time_limit(0);
session_start();
$a = $_SESSION['a'];
$a++;
$_SESSION['a'] = $a;
$b = 100;
$b=$b+$a;echo "
<script language='javascript'>
window.setTimeout('window.location.reload()',7000);
</script>
";로 자동화 시켰습니다. 눈깜짝할새에 5페이지가 뚝딱 채워집니다. 감탄이 절로...
-
키스미베이베
2015.09.08 04:08
안녕하세요 염치불구하고 질문 하나만 부탁드리겠습니다 ㅜㅜ
맞장님 블로그의 글에서
$s->fetch('http://feeds.feedburner.com/typepad/style_me_pretty'); //긁을주소
이부분에서 넘버링이 있으면 예를들어 http://abc.com&id=1, http://abc.com&id=2, http://abc.com&id=3 .....
이렇게 넘버링이 있으면$s->fetch('http://abc.com&id='.$no); 를하고
http://사이트주소/index.php?no=1 이렇게 입력하면 1번글이 긁어지고 이러는것 아닌가요...
넘버링 부분만 해결되면 싹다 해결될거같은데... 부탁드립니다. -
리더한
2016.08.06 20:37
아휴. 또 이걸로 몇일을 보내고 있네요. ㅠㅠ
위에 보면 제가 쓴 댓들이 있는데 정확히 3년전이네요.
3년전에도 해결이 안되었는데 지금껏 아무 진전이 없으니 제 머리가 돌인거죠?
다시해보는데도 답을 못찾았습니다.
게시물에서 설명하고 계시는 글등록 php로는
기본적인 것 - 제목을 제목이라 입력하고 내용을 내용이라 입력하는 것 까지만 됩니다.
그리고, 첨부해주신 파일(인덱스,펑션) 2개 다운받아서 설정하고 실행해보니
인덱스 파일을 실행시키면
제가 원하는대로 제목과 내용을 브라우저로는 가져오는데 (http://주소/폴더/index.php를 실행시킨 화면)
게시판에는 등록이 되지 않고 있습니다.
제 생각에는 인덱스 파일 즉, 글등록php의 오류가 아닌가하는 생각이 드는데요.
혹시나 이 댓들을 보시는 분 중에 본 게시물과 관련하여 속시원히 해결하신 분 있으시면
제발 좀 불쌍한 인생하나 구제 좀 해주십시오~~~