1

주제: BlogAPI 0.9.2 (Blogger, MetaWeblog)

지난 글 ( http://www.tattertools.com/ko/forum/vie … php?id=652 )에 이어 버전업된 릴리즈를 공개합니다.

원문은 http://coolengineer.com/tt/233 에 있습니다.
MetaWeblog API가 추가되어 버전을 하나 올렸습니다.
그리고, Sandbox에 있는 XMLRPC 클래스를 가져와서 호출부터 응답까지 모두 태터툴즈의 클래스를 사용하도록 수정하였습니다.

Versions:
* Version 0.9.0 (2006-06-06):
+ New
    - 최초 공개 버전
    - Blogger API 구현

* Version 0.9.1 (2006-06-10):
+ New
    - 긴 ID에 대하여 alias를 둘 수 있음 (.htaliases)
+ Change
    - Response를 태터툴즈가 제공하는 XMLRPC 클래스를 이용함.
      아직 xmlrpc 요청사항 parsing은 class_path_parser.php 를 이용.

* Version 0.9.2 (2006-06-13):
+ New
    - MetaWeblog API 구현 (Writely.com,Zoundry에서 테스트)
    - TEST: Writely.com: Category를 Tag로 취급하여 구현.
    - TEST: Zoundry: Category를 추가할 수 없음. (Zoundry의 Category는 TT의 분류인가?)
+ Change
    - Call/Response 모두 태터툴즈가 제공하는 XMLRPC 클래스를 이용함.
    - 더이상 class_path_parser.php 를 이용하지 않음.
    - Debug file을 .ht 로 시작하도록 변경

* Version 0.9.3 (2006-06-13):
+ New
    - MetaWeblog: metaWeblog.getCategories 추가함.
    - MetaWeblog: Performancing(firefox plugin)을 위해 content 에도 본문을 넣음.
    - TEST: Performancing(firefox plugin)에서 content 에도 본문을 넣어 테스트.

download: http://coolengineer.com/files/blogapi/BlogAPI-0.9.2.zip
download: http://coolengineer.com/files/blogapi/BlogAPI-0.9.3.zip

0.9.3 으로 올렸습니다.

coolengineer (2006-06-13 18:36:48)에 의해 마지막으로 수정

2

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

MetaWeblog API 기다리고 있었습니다!!!

바로 테스트 해봐야 겠습니다. 감사드립니다 smile

3

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

우와
바로 MS워드 2007 베타로 블로그 포스팅 테스트 들어갑니다^^

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

4

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

긴장 만빵입니다. 점심먹고 잠시 고쳐 릴리즈 한다는 것이 한 시간이 지났군요.
어서 일 해야지. 놀면 안됩니다.

5

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

BlogAPI-0.9.2.zip 파일에 metaweblog.php 파일이 없습니다. 확인 부탁 드립니다.

6

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

MS word2007에서 잘 되지 않아서 (이건 word의 오류인듯 합니다) 플러그인 소스를 열어보니 무지하게 복잡하네요... stand-alone에 가깝군요^^

컴포넌트로 이미 구현된 명령들에 대해서 어떻게 설명을 드릴 수 있을까 생각해 보았습니다.

그러고보니 이런 물건이 있습니다. 태터툴즈 1.0에서 함께 내놓으려고 했던 플러그인인 MetaWeblog API 1.0 입니다.
xml부분은 1.0.6에 맞도록 적당히 손 봐 놓았습니다.

태터툴즈 안이 어떻게 생겼는지 분석하기에는 시간이 걸립니다^^. 이 플러그인을 보시고 어떤 부분들이 가능한지 파악하시는데 도움이 되셨으면 합니다. smile 분석할 시간을 줄이실 수 있지 않을까 합니다 smile

참고로, 아래의 플러그인은 현재 동작을 보장하지 못합니다. ㅎㅎ rc3였나? 까지만 존재했던 플러그인이죠.


index.xml

<?xml version="1.0" encoding="utf-8"?>
<plugin>
  <title>MetaWeblog API</title>
  <title xml:lang="ko">MetaWeblog API</title>
  <link>http://www.tattertools.com/plugins</link>
  <version>1.0 test</version>
  <description xml:lang="ko">MetaWeblog API의 태터툴즈 구현입니다. newPost/editPost/getPost/getRecentPosts를 지원하고 있습니다. URL은 {블로그 주소}/plugin/MetaWeblogAPI/ 입니다.</description>
  <description xml:lang="en">MetaWeblog API for Tattertools. Supports newPost/editPost/getPost/getRecentPosts functions. URL is {weblog URL}/plugin/MetaWeblogAPI/ </description>
  <license>GPL</license>
  <author xml:lang="ko" link="http://www.tattertools.com"><![CDATA[태터앤컴퍼니]]></author>
  <author xml:lang="en" link="http://www.tattertools.com"><![CDATA[Tatter & Company]]></author>
  <safety changeData="yes" exposeData="no" accessLocal="no" accessRemote="no" accessRaw="no" />
  <requirements>
    <tattertools>1.0</tattertools>
    <component>Eolin.PHP.XMLRPC</component>
    <component>Tattertools.Model.Entry</component>
  </requirements>
  <binding>
    <listener event="/plugin/MetaWeblogAPI/">serveMetaWeblogAPI</listener>
  </binding>
</plugin>

index.php

<?
requireComponent('Eolin.PHP.XMLRPC');
requireComponent('Tattertools.Control.Auth');

function serveMetaWeblogAPI($target, $mother) {
    $xmlrpc = new XMLRPC();
    $xmlrpc->registerMethod('metaWeblog.newPost', 'metaWeblog_newPost');
    $xmlrpc->registerMethod('metaWeblog.editPost', 'metaWeblog_editPost');
    $xmlrpc->registerMethod('metaWeblog.getPost', 'metaWeblog_getPost');
    $xmlrpc->registerMethod('metaWeblog.getRecentPosts', 'metaWeblog_getRecentPosts');
    if (!$xmlrpc->receive())
        $xmlrpc->sendFault();
}

function metaWeblog_newPost($blogid, $username, $password, $item, $publish) {
    if (!Auth::login($username, $password))
        return new XMLRPCFault(1, 'Incorrect username or password');
        
    if (empty($item['title']))
        return new XMLRPCFault(1, 'The title is required');
    if (empty($item['description']))
        return new XMLRPCFault(1, 'The description is required');
    
    requireComponent('Tattertools.Model.Entry');
    $entry = new Entry();
    $entry->title = $item['title'];
    $entry->content = $item['description'];
    if ($publish)
        $entry->visibility = 'public';
    if ($entry->add())
        return strval($entry->id);
    else
        return new XMLRPCFault(1, 'Could not post');
}

function metaWeblog_editPost($postid, $username, $password, $item, $publish) {
    if (!Auth::login($username, $password))
        return new XMLRPCFault(1, 'Incorrect username or password');
    
    if (empty($item['title']))
        return new XMLRPCFault(1, 'The title is required');
    if (empty($item['description']))
        return new XMLRPCFault(1, 'The description is required');
    
    requireComponent('Tattertools.Model.Entry');
    $entry = new Entry();
    if (!$entry->select($postid))
        return new XMLRPCFault(1, 'Post was not found');
    $entry->title = $item['title'];
    $entry->content = $item['description'];
    if ($publish)
        $entry->visibility = 'public';
    if ($entry->update())
        return true;
    else
        return new XMLRPCFault(1, 'Could not edit a post');
}

function metaWeblog_getPost($postid, $username, $password) {
    if (!Auth::login($username, $password))
        return new XMLRPCFault(1, 'Incorrect username or password');
        
    requireComponent('Tattertools.Model.Entry');
    $entry = new Entry();
    if (!$entry->select($postid))
        return new XMLRPCFault(1, 'Post was not found');
    return getmetaWeblogItem($entry);
}

function metaWeblog_getRecentPosts($blogid, $username, $password, $numberOfPosts) {
    if (!Auth::login($username, $password))
        return new XMLRPCFault(1, 'Incorrect username or password');
        
    requireComponent('Tattertools.Model.Entry');
    $entry = new Entry();
    if (!$entry->select())
        return new XMLRPCFault(1, 'Post was not found');
    $items = array();
    do {
        array_push($items, getmetaWeblogItem($entry));
    } while ($entry->moveNext() && --$numberOfPosts);
    return $items;
}

function getmetaWeblogItem($entry) {
    return array('postid' => $entry->id, 'title' => $entry->title, 'description' => $entry->content, 'dateCreated' => gmdate('Ymd\TH:i:s', $entry->published));
}
?>
"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

7

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

또하나 도움을 드리자면, 플러그인 호출시 실제 경로인 plugins 대신 그냥 plugin/블라블라 식으로 경로 호출이 있을 경우, mod_rewrite에 의하여 blog/plugin/index.php를 부르게 되고, 이 파일에 의하여 자동으로 plugin/블라블라 이벤트가 호출되게 됩니다.

위의 소스에서의 호출 방식의 이해에 도움이 되셨으면 합니다. smile

"Everything looks different on the other side."

-Ian Malcomm, from Michael Crichton's 'The Jurassic Park'

8

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

새로운 0.9.2 를 올렸습니다. 다시 받으시면 metaweblog.php 가 있습니다.
그리고, 위의 rc3까지 존재했었다는 MetaWeblog를 보니 metaweblog.php와 흡사한걸요.. wink

그리고, index.xml에 listener에 등록하여 사용하는 방식이 잘 동작하지 않습니다.

RewriteEngine On
RewriteBase /tt/
RewriteCond %{ENV:REDIRECT_SURI} !^$
RewriteRule (.*) - [L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ $1/ [L]
RewriteRule ^$ blog/index.php [E=SURI:1,L]
RewriteRule ^[0-9]+$ blog/item.php [E=SURI:1,L]
RewriteRule ^favicon\.ico$ blog/favicon.ico.php [E=SURI:1,L]
RewriteRule ^index\.gif$ blog/index.gif.php [E=SURI:1,L]
RewriteCond %{QUERY_STRING} (^|&)pl=([0-9]+)
RewriteRule ^index\.php$ %2 [NE,L]
RewriteRule ^index\.php$ blog/index.php [E=SURI:1,L]
RewriteRule ^index\.xml$ blog/rss/index.php [E=SURI:1,L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule !^(blog|cache)/ - [L]
RewriteRule ^(entry|attachment|category|keylog|tag|search|plugin)/? blog/$1/index.php [E=SURI:1,L]
RewriteRule ^(.+)/[0-9]+$ blog/$1/item.php [E=SURI:1,L]
RewriteRule ^(.+)$ blog/$1/index.php [E=SURI:1,L]

제 .htaccess가 이렇게 되고, index.xml에

  <binding>
    <listener event="/plugin/BlogAPI/">serveMetaWeblogAPI</listener>
  </binding>

를 넣었는데도

http://...../tt/plugin/BlogAPI/

로 접근하면 404가 나옵니다. 저도 한참 해보다가 안돼서 직접 plugins/BlogAPI 를 접근하는 방법을 쓴것이거든요..

9

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

0.9.3 으로 올렸습니다. 링크는 맨 위글에 수정하였습니다.

10

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

디렉토리 퍼미션을 수정해야 되는군요 smile
제 블로그에서 newPost는 잘 되네요

11

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

coolengineer 작성:

http://...../tt/plugin/BlogAPI/

로 접근하면 404가 나옵니다. 저도 한참 해보다가 안돼서 직접 plugins/BlogAPI 를 접근하는 방법을 쓴것이거든요..

해결하셨나요?
제 기억이 맞다면 끝에 /를 입력하면 안됐던걸로 기억합니다.

한번 http://...../tt/plugin/BlogAPI 까지만해서 적용을 해보세요. smile

12

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

호진님께서 여기만 0.9.3을 등록하셨군요.
0.9.3에서 Performacing + Metaweblog 잘 동작하는 것을 확인하였습니다.
http://spbear.com/168
아직 쓰는 법이 어려워서 고전하시는 분들이 계셔서 간단하게 사용법 정리해 봤습니다.

13

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

0.9.3까지는 plugins/BlogAPI 를 직접 접근하여 xmlrpc를 받고,
디렉토리 퍼미션이 필요했던 이유가 아마 blog/index.php 에서 태터 버전을 읽어서 캐싱(?)하는 파일을 하나 만들어 놓는 것 때문에
생긴 문제 같습니다. 약간 신중하지 못했군요. yikes

plugin/BlogAPI 와 같이 event handler를 통해 접근하는 내공(!)을 익혔으니 0.9.4 에서는 접근 방법이 바뀔 것이고,
디렉토리 권한도 필요하지 않게 될 것 입니다. 다만, 0.9.3까지의 방법인 plugins/BlogAPI 방법을 유지하지 않을 생각이므로 각자의
블로그 툴의 xml url 을 수정하셔야 될 것 같습니다.

14

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

앗.. 그랬군요.
tatterversion.inc 파일이 생성되고 나면 문제가 발생하지 않는게 그 이유였네요.

15

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

우오오..감동의 도가니탕입니다 smile
저도 실험해봐야겠네용 smile

16

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

사용해 보고 싶은데 아직 1.0.6으로 업그래이드를 못해서.. :'(

실험 블로그가 아닌 본 블로그에 사용해도 데이터에는 별 지장 없겠죠?

JWC (2006-06-16 03:29:46)에 의해 마지막으로 수정

17

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

1.0.5 도 됩니다. wink

18

답글: BlogAPI 0.9.2 (Blogger, MetaWeblog)

0.9.4 를 릴리즈 하였으므로 본 쓰레드는
http://www.tattertools.com/ko/forum/vie … php?id=785
요기로 연결해주세요.