메인 컨텐츠로 가기

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관 보기.

모든 정보가 안전하게 전송되었습니다.

  • 닫기 [x]

PHP 및 MediaWiki API를 사용하여 Wikipedia 정보에 접속하기

PHP를 사용하여 MediaWiki API를 통해 Wikipedia 항목을 찾고 검색하며 수정하기

Vikram Vaswani, 파운더, Melonfire
비크람 바스와니
Vikram Vaswani는 오픈 소스 도구 및 기술 분야를 전문으로 하는 컨설팅 서비스 회사인 Melonfire의 설립자이자 CEO이다. 그는 Zend Framework: A Beginners GuidePHP: A Beginners Guide의 저자이기도 하다.

요약:  Wikipedia는 인류 지식의 서로 다른 분야에 대한 수 백 만 개의 항목이 나와 있는 궁극적인 온라인 백과사전입니다. 웹 애플리케이션 개발자는 Wikipedia API를 통해 이러한 항목을 액세스하고 검색할 수 있습니다. 이 기사에서는 Wikipedia API를 소개하고 PHP 애플리케이션의 컨텍스트에서 이를 시연하여, PHP로 Wikipedia 컨텐츠의 다른 요소들을 검색하고 불러오는 방법을 설명합니다.

원문 게재일:  2011 년 5 월 17 일
난이도: 중급 원문:  보기 PDF:  A4 and Letter (867KB | 23 pages)Get Adobe® Reader®
페이지뷰:  2173 회
의견:  


소개

자주 사용하는 약어

  • API: Application Program Interface
  • CSRF: Cross-site request forgery
  • HTML: Hypertext Markup Language
  • HTTP: Hypertext Transfer Protocol
  • IP: Internet Protocol
  • JSON: JavaScript Object Notation
  • OOP: Object-Oriented Programming
  • PEAR: PHP Extension and Application Repository
  • REST: REpresentational State Transfer
  • WDDX: Web Distributed Data eXchange
  • XHTML: Extensible Hypertext Markup Language
  • XML: Extensible Markup Language
  • YAML: YAML Ain't Markup Language

대부분의 사람들이 Wikipedia에 대해 들어 봤을 것이다. 이는 대중이 제공하는 지식의 궁극적인 저장소이며, 생각할 수 있는 거의 모든 주제를 다루고 웹 브라우저를 통해 어느 누구나 사용할 수 있다. 어느 정보를 찾든지 Wikipedia에서 찾을 수 있으며, 종종 철저히 상세하게 나와 있다. 그리고 공개적으로 편집 가능하기 때문에 항상 업데이트된 관련 정보가 들어있다.

대부분의 사람들은 Wikipedia에 대한 한 가지 사항을 알지 못한다. 배후에 숨겨진 내용은 강력한 웹 서비스 API이며, 이를 통해 개발자들이 Wikipedia 컨텐츠에 액세스하고 검색하며 사용자 정의 웹 애플리케이션으로 통합할 수 있다는 점이다. HTTP에 걸쳐 작업하고 XML을 비롯한 다양한 다른 형식으로 된 데이터를 리턴하는 이 API는 공용 프로그래밍에 자유롭게 사용 가능하고 Wikipedia의 거대한 컨텐츠 데이터베이스로 작동되는 모든 종류의 사용자 정의 웹 애플리케이션을 작성할 수 있다.

이 기사에서 필자는 이러한 API에 대해 간략히 소개하고, 필자가 좋아하는 프로그래밍 언어인 PHP와 이를 통합하고 사용하는 방법을 보여준다. 이 기사는 API가 작업하는 방법의 기본을 설명한 다음 카테고리 나열의 실질적인 안내를 제공하여, 카테고리나 키워드별로 항목을 찾고, 항목을 검색하고 표시하며, 원격으로 컨텐츠를 추가하거나 편집한다.


API 이해하기

PHP 코드로 들어가기 전에, Wikipedia API에 대해 알아 두어야 할 몇 가지 단어를 정리해보자. 먼저, 필자는 이 기사에서 이를 "Wikipedia API"라고 하지만, API가 Wikipedia에만 고유하지 않음을 주목하자. 이는 실제로 Wikipedia를 실행하는 MediaWiki 기초 애플리케이션의 일부이므로, 이 기사에서 개괄한 기술과 API 메소드는 다른 MediaWiki 기반 wiki에서도 사용될 수도 있다. 참고자료에서 MediaWiki 및 전체 MediaWiki API 참조 매뉴얼 둘 다로 링크를 찾을 수 있다.

모든 HTTP 기반 서비스를 통해 API는 하나 이상의 입력 인수를 포함하는 HTTP 요청을 승인하고, 요청하는 클라이언트가 구문 분석하고 사용할 수 있는 응답을 리턴하여 작업한다. 오늘날 거의 모든 프로그래밍 언어가 XML을 구문 분석할 수 있는 것처럼 응답은 대개 XML 형식이다. 하지만, JSON, WDDX, YAML 또는 PHP 일련화된 경우와 같이 다른 형식으로 응답을 요청할 수도 있다.

API로의 각 HTTP 요청은 필수 "조치" 매개변수가 들어 있어야 하며, 이는 필요한 조치를 지정한다. 이 매개변수는 쿼리, 편집 또는 삭제 조작, 인증 요청 또는 기타 지원된 조치 중 어느 하나가 될 수 있다. 이 필수 매개변수 외에도 선택된 조작에 따라 추가 인수가 전달되어야 한다. — 예를 들어, 쿼리에 대한 검색 키워드, 편집 또는 삭제 조작을 위한 페이지 제목 또는 인증을 위한 사용자 이름 및 비밀번호이다.

작동 중인 API를 보려면 좋아하는 웹 브라우저에서 다음 URL에 액세스를 시도한다. (참고: 이 URL은 실제로 하나의 문자열이다. 형식화 목적을 위해서만 해당 URL은 두 행으로 나타난다.)

http://en.wikipedia.org/w/api.php?action=query&list=allcategories&acprop=size
          &acprefix=hollywood&format=xml

이 메소드는 접두부 "hollywood"로 시작하는 처음 10개의 Wikipedia 카테고리의 목록을 리턴한다. 목록 1은 이 요청에 원시 XML 응답을 설명한다.


목록 1. 예제 API 피드
   
<?xml version="1.0"?>
<api>
  <query>
    <allcategories>
      <c size="31" pages="28" files="0" subcats="3" 
        xml:space="preserve">Hollywood</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood's Rock Walk inductees</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood, California</c>
      <c size="1" pages="1" files="0" subcats="0" 
        xml:space="preserve">Hollywood, Florida</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood, Los Angeles, California</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood.com/celebrity/Wanda Shelley</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Actors</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Actress</c>
      <c size="0" pages="0" files="0" subcats="0" 
        xml:space="preserve">Hollywood Blacklist</c>
      <c size="2" pages="2" files="0" subcats="0" 
        xml:space="preserve">Hollywood Boulevard</c>
    </allcategories>
  </query>
  <query-continue>
    <allcategories acfrom="Hollywood Cemetery (Richmond)" />
  </query-continue>
</api>


카테고리 및 페이지 나열

이제 해당 API가 작업하는 방법을 이해했으니, 일부 코드를 살펴보자. 필자는 이 기사 내내 독자가 HTML 및 XML에 익숙하고, 최신 Zend 프레임워크 버전이 설치된 작동 중인 Apache/PHP 개발 환경이 있다고 가정한다. 필자는 또한 이 기사에서 사용된 PHP가 OOP 원칙을 준수하여 쓰여졌으므로 PHP에서 클래스와 오브젝트로 작업하는 것의 기본을 알고 있다고 가정한다.

API와 상호작용하려면 GET 및 POST 요청을 전송하고 응답을 처리할 수 있는 HTTP 클라이언트가 필요하다. 이를 위한 훌륭한 도구는 Zend 프레임워크의 Zend_Rest_Client 컴포넌트이며, 웹 서비스와 PHP 애플리케이션을 통합하려고 시도하는 개발자들을 위해 특별히 디자인되었다. 이 클라이언트는 서비스 엔드포인트로 GET, POST, PUT 및 DELETE 응답을 수행하는 데 사용될 수 있다. XML 응답은 Zend_Rest_Client_Response 오브젝트의 인스턴스로 리턴되어, 개별 응답 특성에 간편하게 액세스할 수 있다.

목록 2는 PHP 스크립트의 컨텍스트에서 Zend_Rest_Client를 사용하여 목록 1에서 카테고리를 검색하고 표시하는 프로세스를 설명한다.


목록 2. Wikipedia 카테고리 나열
   
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category prefix
$prefix = 'hollywood';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('allcategories');
  $wikipedia->acprefix($prefix);
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for categories starting with 
      '<?php echo $prefix; ?>'</h2>
    <ol>
    <?php foreach ($result->query->allcategories->c as $c): ?>
      <li><a href="http://www.wikipedia.org/wiki/Category:
        <?php echo $c; ?>"><?php echo $c; ?></a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

목록 2는 먼저 Zend 프레임워크의 오토로더를 초기화한 다음에 Zend_Rest_Client 컴포넌트를 로드한다. Zend_Rest_Client 오브젝트의 인스턴스가 생성자 인수로서 Wikipedia API 서비스 엔드포인트로 작성되고 초기화된다. 그러면 요청 매개변수가 정의되고 추가되며, 요청은 클라이언트 오브젝트의 get() 메소드를 사용하여 API로 전송된다. 서버로부터 XML 응답은 Zend_Rest_Client에 의해 SimpleXML 오브젝트의 세트로 자동으로 수신되고 변환되며, 이는 표준 오브젝트 특성 노테이션을 사용하여 액세스할 수 있다.

그림 1에는 목록 2의 결과물의 모습을 실례로 보여준다.


그림 1. Wikipedia 카테고리를 나열하는 웹 페이지
'hollywood'로 시작하는 Wikipedia 카테고리를 나열하는 웹 페이지의 화면 캡처

요청 매개변수가 Zend_Rest_Client를 사용하여 서버로 전달되는 방식에 주목하자. 각 매개변수는 동일한 이름으로 클라이언트 메소드를 호출하여 첫 번째 인수로서 값을 메소드로 전달하여 지정된다. 예를 들어, 매개변수 action=query를 요청으로 추가하기 위해 스크립트는 $client->action('query')을 호출한다. Zend_Rest_Client 문서에서 이에 대한 자세한 내용을 읽을 수 있다(링크는 참고자료 참조).

또한 카테고리가 아니라 카테고리 멤버의 목록을 리턴하기 위해 쿼리를 변경하여 카테고리 내에서 페이지의 나열을 검색할 수도 있다. 분명히 독자는 카테고리 이름을 입력으로서 API로 전달해야 한다. 이 태스크만 수행하는 목록 3을 생각해보자.


목록 3. 카테고리 내에서 페이지 나열
    
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category
$cat = 'Greek_legendary_creatures';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('categorymembers');
  $wikipedia->cmtitle('Category:'.$cat);
  $wikipedia->cmlimit('30');
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for pages in category 
      '<?php echo $cat; ?>'</h2>
    <ol>
    <?php foreach ($result->query->categorymembers->cm as $c): ?>
      <li><a href="http://www.wikipedia.org/wiki/
        <?php echo $c['title']; ?>">
        <?php echo $c['title']; ?></a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

목록 3은 카테고리의 이름을 지정하고 cmtitle 매개변수를 사용하여 이러한 이름을 API로 전달한다. 또한 리턴하는 결과의 수를 지정하는 cmlimit 매개변수도 주목하자. 전과 같이 Zend_Rest_Client는 요청을 전송하고 XML 응답을 SimpleXML 오브젝트로 변환하여, 쿼리의 결과를 간편하게 구문 분석하고 표시할 수 있다.

그림 2에는 목록 3의 결과물이 표시되어 있다.


그림 2. 선택한 카테고리에서 Wikipedia 페이지를 나열하는 웹 페이지
선택한 카테고리인 Greek_legendary_creatures에서 Wikipedia 페이지를 나열하는 웹 페이지의 화면 캡처

전체 텍스트 검색 수행하기

그 다음으로, 특정 키워드에 일치하는 페이지를 검색하는 것은 어떠한가? 이 태스크는 이 경우에 카테고리 멤버가 아니라 검색 결과를 나열하려는 것을 제외하고 이전 페이지에 설명한 것과 동일한 쿼리로 간편하게 완수된다. 해당 프로세스를 나열하는 목록 4를 생각해보자.


목록 4. 전체 텍스트 검색 결과 나열
    
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define search query
$query = 'michelangelo';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('search');
  $wikipedia->srwhat('text');
  $wikipedia->format('xml');
  $wikipedia->srsearch($query);

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for '<?php echo $query; ?>'</h2>
    <ol>
    <?php foreach ($result->query->search->p as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
        <?php echo $r['title']; ?>">
        <?php echo $r['title']; ?></a> <br/>
      <small><?php echo $r['snippet']; ?></small></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

목록 4는 이전에 확인한 동일한 query 조치를 사용하지만, 이 경우에 해당 매개변수는 약간 다르다. list 매개변수는 이것이 전체 텍스트 검색 조작임을 지정하는 반면, srsearch 매개변수는 해당 검색 키워드를 지정한다(이 경우는 "michelangelo"임). 또한 srwhat 매개변수를 지정하는 것도 중요하다. 이는 검색이 페이지 제목이나 페이지 텍스트에서 수행되어야 하는지 여부를 표시한다.

각 검색 결과 항목은 페이지 제목, 크기, 단어 수, 네임스페이스(이후에 더 다룰 것임) 및 페이지 컨텐츠의 스니펫을 포함한다. 그러면 독자는 이 데이터를 그림 3과 같이 HTML 웹 페이지로 형식화하고 표시할 수 있다.


그림 3. Wikipedia 검색 결과를 나열하는 웹 페이지
'michelangelo'에 대한 Wikipedia 검색 결과를 나열하는 웹 페이지의 화면 캡처

예제 애플리케이션: Wikipedia 검색

실제로 검색 키워드는 스크립트로 하드 코드되지 않지만, 그 대신에 사용자가 입력한다. 목록 5는 더 대화식이 되도록 목록 4를 개선하여, 이를 통해 사용자가 애플리케이션에서 검색 용어를 입력하고 해당 검색 용어와 일치하는 Wikipedia 페이지를 확인할 수 있다.


목록 5. 대화식 Wikipedia 검색 도구
   
<html>
  <head></head>
  <body>
    <h2>Search</h2>
    <form method="post">
      Search: <input type="text" name="q" />
    </form>

    <?php
    // if form submitted
    if (isset($_POST['q'])) {
      // load Zend classes
      require_once 'Zend/Loader.php';
      Zend_Loader::loadClass('Zend_Rest_Client');

      try {
        // initialize REST client
        $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

        // set query parameters
        $wikipedia->action('query');
        $wikipedia->list('search');
        $wikipedia->srwhat('text');
        $wikipedia->format('xml');
        $wikipedia->srsearch($_POST['q']);

        // perform request
        // iterate over XML result set
        $result = $wikipedia->get();
      } catch (Exception $e) {
          die('ERROR: ' . $e->getMessage());
      }
    ?>
    <h2>Search results for '<?php echo $_POST['q']; ?>'</h2>
    <ol>
    <?php foreach ($result->query->search->p as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
      <?php echo $r['title']; ?>">
      <?php echo $r['title']; ?></a> <br/>
      <small><?php echo $r['snippet']; ?></small></li>
    <?php endforeach; ?>
    </ol>
    <?php 
    }
    ?>

  </body>
</html>

목록 5에서는 너무 복잡한 것은 없다. 즉, 이는 사용자의 입력에 추가 확인을 간단히 수행하고 해당 입력을 srsearch 매개변수로 전달한다. 그림 4는 초기 웹 양식과 검색 결과를 설명한다.


그림 4. Wikipedia 검색에 대한 웹 양식과 해당 결과
Wikipedia 검색에 대한 웹 양식과 'fruit fly' 구의 결과 화면 캡처

페이지 컨텐츠 검색하기

MediaWiki API는 또한 prop=revisions 매개변수를 쿼리 조치에 첨부하여 페이지 컨텐츠의 현재 또는 이전 버전에 액세스할 수도 있다. 이 경우에 리턴되는 페이지의 제목을 지정해야 한다. 이를 작업하는 방법을 설명하는 목록 6을 생각해 보자.


목록 6. 페이지 컨텐츠 검색하기
    
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define page title
$query = 'The A Team';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // perform request
  // get page content as XML
  $result = $wikipedia->get();
  $content = $result->query->pages->page->revisions->rev;
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head>
  </head>
  <body>
    <h2>Page result for '<?php echo $query; ?>'</h2>
    <div>
      <?php echo $content; ?>
      </script>
    </div>
  </body>
</html>

목록 6에서 쿼리는 목록이 아니라 특성을 사용하기 때문에 지금까지 확인한 것과 약간 다르다. 특성은 페이지 세트를 검색하기 위해 어느 일부 정보를 지정하는 데 사용된다. 다수의 다른 특성들이 사용 가능하다. 이는 페이지 메타데이터, 개정, 링크, 이미지, 템플리트, 카테고리 및 기타 등등이 포함된다.

목록 6의 쿼리는 revisions 특성을 지정하고 추후에 rvprop 매개변수를 사용하여 각 개정—이 경우에 개정의 컨텐츠만 해당한다—을 위해 어느 특성을 확보하는지 지정한다. 또한 rvlimit 매개변수도 있으며, 이는 이전 여러 개정을 확보하기 위해 사용할 수 있다. 하지만, 지금으로서는 독자는 가장 최신(현재) 개정에만 관심이 있으므로 쿼리는 이 매개변수를 지정하지 않는다.

그림 5목록 6의 결과물을 설명한다.


그림 5. Wikitext에서 컨텐츠를 표시하는 웹 페이지
지속적인 형식화되지 않은 텍스트 문자열로 Wikitext에서 컨텐츠를 표시하는 웹 페이지의 화면 캡처(주제: The A-Team)

그림 5에서 확인 가능한 대로 목록 6의 결과물은 wiki 마크업에서 지정한 페이지의 컨텐츠이다(Wikitext). 하지만 웹 애플리케이션에서 이 데이터를 사용하려면 wiki 마크업에서부터 XHTML 마크업으로 이를 변환해야 한다. 미리 작성된 변환기의 수는 이 태스크에 사용 가능하지만, 더 우수한 것 중 하나는 PEAR Text_Wiki 패키지이며, 이는 Wikitext를 다양한 다른 형식 간에 변환할 수 있다.

이를 설치하려면 쉘 프롬프트에서 다음 명령을 간단히 실행한다.

shell> pear install Text_Wiki
shell> pear install Text_Wiki_Mediawiki

PEAR 설치 프로그램은 이제 PEAR 패키지 서버로 연결하고, 패키지를 다운로드하며 이를 시스템의 적절한 위치에 설치한다. 수동으로 설치하는 것을 선호한다면 참고자료에서 다운로드 링크를 찾을 수 있다.

패키지를 설치한 후에 목록 6을 개정하여 목록 7과 같이 Text_Wiki 변환기를 사용한다.


목록 7. 페이지 컨텐츠를 검색하고 XHTML로 변환하기
   
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// load wikitext converter
require_once 'Text/Wiki.php';

// instantiate a Text_Wiki object from the given class
// and set it to use the Mediawiki adapter
$wiki = & Text_Wiki::factory('Mediawiki');

// set some rendering rules  
$wiki->setRenderConf('xhtml', 'wikilink', 'view_url', 
  'http://en.wikipedia.org/wiki/');
$wiki->setRenderConf('xhtml', 'wikilink', 'pages', false);
  
// define page title
$query = 'The A Team';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->prop('revisions');
  $wikipedia->rvprop('content');
  $wikipedia->format('xml');
  $wikipedia->redirects('1');
  $wikipedia->titles($query);

  // perform request
  // get page content as XML
  $result = $wikipedia->get();
  $content = $result->query->pages->page->revisions->rev;
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head>
  </head>
  <body>
    <h2>Page result for '<?php echo $query; ?>'</h2>
    <div>
      <?php echo $wiki->transform($content, 'Xhtml'); ?>
      </script>
    </div>
  </body>
</html>

목록 7은 Text_Wiki 오브젝트를 초기화하고 Mediawiki 어댑터를 사용하도록 설정한다. 이는 또한 내부 wiki 링크에 사용하기 위한 기본 URL 접두부를 비롯하여 XHTML 변환에 사용하도록 일부 매개변수를 지정한다. 그러면 목록 7은 API를 사용하여 지정된 페이지의 컨텐츠를 검색하고, 이를 Text_Wiki 오브젝트의 transform() 메소드를 통해 전달하여 XHTML로 변환한다. 그림 6은 개정된 결과물을 보여 준다.


그림 6. XHTML로 변환 이후에 wiki 컨텐츠를 표시하는 웹 페이지
XHTML로의 변환 이후에 형식화된 wiki 컨텐츠를 표시하는 웹 페이지의 화면 캡처(주제: The A-Team)

그림 6에 표시된 대로, Text_Wiki 패키지는 Wikitext를 표준 XHTML로 변환하는 훌륭한 작업을 타당하게 수행한다. 하지만 이는 완벽하지도 않고 Wikitext 마크업의 모든 영역을 고려하지도 않는다(예를 들어, 이는 인포박스(infobox)를 절대 처리할 수 없다). 필요한 내용을 전부 수행하지 않는 것을 발견하면 이를 Steve Blinch의 Wikitext 구문 분석기로 바꾸는 것을 생각해보자(참고자료 참조). 이는 Wikitext 구문 분석과 변환의 대안을 제공한다.


URL 참조 검색 수행하기

Wikipedia의 쿼리 API의 흥미로운 영역은 특정 URL을 참조하는 페이지를 검색할 수 있다는 점이다. 이 기능은 웹 사이트가 Wikipedia 항목에 나타나는 회수를 확인해야 할 경우 매우 유용하다.

이 쿼리를 수행하려면 외부 URL 목록을 사용하고 확인 중인 특정 URL을 따라 전달하도록 쿼리를 조정해야 한다. 이를 수행할 수 있는 방법을 설명하는 목록 8을 생각해보자.


목록 8. URL을 참조하는 페이지 나열
   
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

// define category prefix
$url = 'httpd.apache.org';

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('query');
  $wikipedia->list('exturlusage');
  $wikipedia->euquery($url);
  $wikipedia->eulimit('30');
  $wikipedia->eunamespace('0');
  $wikipedia->format('xml');

  // perform request
  // iterate over XML result set
  $result = $wikipedia->get();
} catch (Exception $e) {
    die('ERROR: ' . $e->getMessage());
}
?>
<html>
  <head></head>
  <body>
    <h2>Search results for pages referencing URL 
      '<?php echo $url; ?>'</h2>
    <ol>
    <?php foreach ($result->query->exturlusage->eu as $r): ?>
      <li><a href="http://www.wikipedia.org/wiki/
      <?php echo $r['title']; ?>"><?php echo $r['title']; ?>
      </a></li>
    <?php endforeach; ?>
    </ol>
  </body>
</html>

표준 actionlist 매개변수 외에도, 목록 8은 확인할 URL(이 경우에 Apache 웹 사이트)을 지정하는 euquery 매개변수와 살펴 볼 wiki 네임스페이스를 지정하는 eunamespace 매개변수도 추가한다. 해당 URL이 "http://" 프로토콜 접두부 없이 지정되어야 함을 주목하자. 결과는 일반적인 방식으로 구문 분석되고 처리되어, 그림 7과 같은 결과물을 작성한다.


그림 7. 특정 URL을 참조하는 페이지를 표시하는 웹 페이지
특정 URL을 참조하는 페이지를 표시하는 웹 페이지의 화면 캡처: httpd.apache.org

목록 8의 네임스페이스 부분은 간략히 설명할 가치가 있다. MediaWiki API는 wiki에서 다양한 컨텐츠 유형에 대해 다수의 다른 네임스페이스를 정의한다. 각 네임스페이스는 페이지 제목으로 첨부된 접두부로 식별된다. 예를 들어, 사용자 페이지에 항상 "User:" 네임스페이스 접두부가 있는 반면, 카테고리 페이지에는 "Category:" 네임스페이스 접두부가 있다.

각 네임스페이스는 정수와도 연관되며, 이는 검색 쿼리를 필터하는 데 사용될 수 있다. 전체 네임스페이스 정수 및 접두부 목록은 MediaWiki 문서에서 찾을 수 있다(링크는 참고자료 참조). 하지만 가장 자주 사용하는 사항은 여기에 나온 다음과 같다.

  • 0: 컨텐츠 페이지의 기본 네임스페이스
  • 1: 대화 페이지의 네임스페이스
  • 2: 사용자 페이지의 네임스페이스
  • 6: 파일의 네임스페이스
  • 14: 카테고리 페이지의 네임스페이스

위의 목록에서부터 목록 8eunamespace 매개변수를 통해 쿼리만 컨텐츠 페이지로 제한하고 있다는 점이 명백해야 한다. 이 제한조건을 제거하면 지정된 URL이 포함된 사용자 페이지와 대화 페이지를 비롯한 수많은 결과를 리턴한다.


페이지 추가 및 편집하기

이 기사에서 이전의 모든 목록들은 API의 query 조치에 주목하여, 컨텐츠 저장소에서부터 다른 유형의 데이터를 검색하기 위해 이를 어떻게 사용할 수 있는지를 설명한다. 하지만, API는 새 페이지를 작성하거나 기존 페이지를 편집하는 기능을 비롯하여 다수의 다른 메소드도 지원한다. 이러한 태스크를 완수하려면 API의 edit 조치를 호출하고 이를 페이지 또는 섹션의 컨텐츠와 함께 편집되거나 작성되는 페이지의 제목에 전달한다.

모든 편집 조작은 토큰으로 완수되어야 하며, 이는 사용자 요청의 유효성 검증을 보장하고 CSRF 공격에 대해 보호한다. 토큰은 일반적으로 특수 +\ 순서로 끝나는 영숫자 문자열로 구성된다. 익명 사용자의 경우 토큰은 +\ 순서로만 구성된다.

토큰은 목록 9와 같이 편집 요청으로 첨부되어야 한다.


목록 9. 페이지 편집하기
   
<?php
// load Zend classes
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Rest_Client');

try {
  // initialize REST client
  $wikipedia = new Zend_Rest_Client('http://en.wikipedia.org/w/api.php');

  // set query parameters
  $wikipedia->action('edit');
  $wikipedia->title('Wikipedia:Sandbox');
  $wikipedia->section('new');
  $wikipedia->summary('My Section');
  $wikipedia->text('Some text');
  $wikipedia->token('+\\');
  
  // POST page data 
  $wikipedia->post();
} catch (Exception $e) {
}
?>

목록 9는 다수의 새 요청 인수를 소개한다.

  • title 인수는 편집되는 페이지를 지정한다. 이 경우에 편집은 특수 Wikipedia 샌드박스 페이지에 수행되며, 이는 실험과 테스팅에 특별히 의도되었으며 정기적인 간격으로 자동으로 지워진다.
  • section 인수는 편집되는 섹션 수를 지정한다. 특수 키워드 "new"를 사용하면 새 섹션을 추가한다. 이 인수를 제거하면 전체 페이지를 바꾼다.
  • summary 인수는 새 섹션을 작성할 때 섹션의 제목을 지정한다.
  • text 인수는 섹션 또는 페이지의 컨텐츠를 포함한다.
  • token 인수는 편집 조작에 대한 토큰을 지정한다.

이전 목록과는 달리, 편집 요청이 GET이 아니라 POST를 사용하여 전송되어야 함도 주목하자. 이는 바로 목록 9가 요청을 전송하기 위해 특별히 Zend_Rest_Client의 post() 메소드를 사용하는 이유이다. Wikipedia API가 XML 요청을 POST로 리턴하지 않기 때문에, Zend_Rest_Client가 응답을 읽을 때 SimpleXML 예외가 발생한다. 이는 바로 해당 목록이 예외를 포착하도록 쓰여지지만 실제로 이와 관련하여 아무 작업도 수행하지 않는 이유이다. 여기에서 대안 접근방식은 Zend_Http_Client를 사용하여 수동으로 POST 패킷을 작성하는 것일 수 있다.

요청이 완료된 이후에 대상 페이지에서 변경을 확인할 수 있고, 시스템의 IP 주소(익명 사용자용) 또는 사용자 이름(인증된 사용자용)이 페이지의 개정 히스토리에 나타난다. 개정 히스토리 항목은 날짜 시간소인, IP 주소 또는 사용자 이름, 편집 표시기의 유형 및 바이트 크기를 포함한다. 그림 8에 예제가 있다.


그림 8. API를 통해 수행된 편집을 보여주는 Wikipedia 페이지의 개정 히스토리
API를 통해 수행된 편집을 보여주는 Wikipedia 페이지의 개정 히스토리의 화면 캡처

결론

지난 몇 페이지에 걸쳐 이 기사는 Wikipedia에서부터 PHP 웹 애플리케이션으로 정보를 검색하고 통합하기 위해 MediaWiki API를 사용하는 방법에 대한 집중 강좌를 제공하였다. 이는 또한 네임스페이스, 특성 및 목록과 같은 이 API의 일부 고유 영역을 간단하게 연구하였고, wiki에서부터 데이터를 읽는 것뿐만 아니라 여기로 다시 데이터를 쓰기 위해 API를 어떻게 사용할 수 있는지를 예를 들어 설명하였다.

이 기사에 제시된 정보는 빙산의 일각에 불과하다. 지난 몇 페이지에 걸쳐 논의된 쿼리 모듈은 극도로 강력하고 이미지, 파일, 사용자 데이터 및 페이지 개정 데이터를 비롯하여 wiki 컨텐츠의 더 많은 측면에 액세스를 허용한다. 그리고 쿼리 모듈이 당연히 가장 자주 사용할 모듈인 반면, 추가 기존 모듈을 통해 사용자 클릭, 사용자 편집 및 사용자 등록, 기사 피드백 제출, 사용자 프로파일 정보 리턴, 페이지 편집 롤백, 파일 업로드, 사용자 경계사항 조작 및 기타 등등의 통계를 계산할 수 있다.

이 기사의 예제에서 설명하는 바와 같이 MediaWiki API는 Wikipedia 또는 기타 MediaWiki 기반 wiki에서 컨텐츠 관련 새로운 창조적인 애플리케이션을 빌드하고자 하는 개발자들을 위한 유연한 도구를 제공한다. 때때로 이로 여러 가지 시도를 해보면서 생각하는 바를 직접 실현해보는 것도 멋진 일일 것이다.


참고자료

교육

  • MediaWiki API: MediaWiki 데이터베이스에서 wiki 기능, 데이터 및 메타데이터로 편리한 액세스를 제공하도록 배워보자.

  • MediaWiki namespaces: 페이지의 용도를 기반으로 "namespaces"라는 콜렉션에 페이지를 그룹화하도록 배워보자.

  • Zend_Rest Programmer's Reference Guide: Zend_Rest_Client 컴포넌트에 대해 더 자세히 읽어보자.

  • PEAR Text_Wiki 컴포넌트: Wiki 및 BBCode 마크업을 XHTML, LaTeX 또는 일반 텍스트 마크업으로 변환하는 방법에 대해 자세히 읽어보자.

  • 필자의 더 많은 기사(Vikram Vaswani, developerWorks, 2007년 8월 - 현재): XML, 추가 Google API 및 기타 기술에 대한 기사를 읽어보자.

  • developerWorks의 XML 영역: XML 분야의 기술을 향상시키는 데 도움이 되는 참고자료를 얻을 수 있다. XML 기술 자료에서 다양한 기술 관련 기사와 팁, 튜토리얼, 표준 및 IBM Redbook을 볼 수 있다.

  • IBM XML 인증: XML 및 관련 기술에 대한 IBM 인증 개발자가 되는 방법을 찾아볼 수 있다.

  • developerWorks 오픈 소스 영역에서 오픈 소스 기술을 활용하여 개발 작업을 수행하고 이러한 기술을 IBM 제품과 함께 사용하는 데 도움이 되는 사용법 정보, 도구 및 프로젝트 업데이트를 확인할 수 있다.

  • developerWorks 기술 행사 및 웹 캐스트: 이러한 세션에 참가하여 최신 기술에 대한 정보를 얻을 수 있다.

  • Twitter의 developerWorks 페이지: 오늘 가입하여 developerWorks 트윗을 팔로우하자.

  • developerWorks podcasts: 소프트웨어 개발자의 흥미로운 인터뷰와 토론을 확인할 수 있다.

  • developerWorks on-demand demos: 입문자를 위한 제품 설치 및 설정 과정에서 숙련된 개발자를 위한 고급 기능의 활용에 이르기까지 다양한 데모를 제공한다.

제품 및 기술 얻기

토론

  • XML 영역 토론 포럼: 여러 XML 관련 토론에 참여해 볼 수 있다.

  • developerWorks 커뮤니티: 개발자가 운영하고 있는 블로그, 포럼, 그룹 및 위키를 살펴보면서 다른 developerWorks 사용자와 의견을 나눌 수 있다.

필자소개

비크람 바스와니

Vikram Vaswani는 오픈 소스 도구 및 기술 분야를 전문으로 하는 컨설팅 서비스 회사인 Melonfire의 설립자이자 CEO이다. 그는 Zend Framework: A Beginners GuidePHP: A Beginners Guide의 저자이기도 하다.

잘못된 도움말 신고

부정사용 신고

감사합니다. 이 항목은 운영자가 관심을 표시했습니다.


잘못된 도움말 신고

부정사용 신고

제출실패 신고. 나중에 다시 실행해주세요.


디벨로퍼웍스 로그인


IBM ID가 필요하세요?
IBM ID를 잊으셨습니까?


비밀번호를 잊으셨습니까?
비밀번호 변경

developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


developerWorks에 처음 로그인하면 developerWorks프로파일이 생성됩니다.귀하의 프로파일에서 동의하신 내용이 공개되지만 이 사항은 언제든지 변경 가능합니다. 귀하의 성명(숨김으로 체크되어 있어도 표시됩니다)과 디스플레이 이름은 게시한 컨텐츠나 사이트 엑세스시 표시됩니다.

화면상에 보여지는 닉네임을 정하세요.

처음 developerWorks에 로그인할 때 프로파일이 작성되므로, 이를 위해 디스플레이 이름을 선택해야 합니다. 선택하신 디스플레이 이름은 developerWorks에 게시한 컨텐츠에 표시됩니다.

3글자 이상 31글자 이하의 길이로 사용 가능합니다. dW커뮤니티 내에서는 보안상 이메일주소를 제외한 다른 이름을 지정하셔야 합니다.

3개의 &이나 대쉬를 포함해주시고 31글자내로 제한해주세요.


developerWorks 이용 약관에 동의하시는 경우 제출을 클릭하십시오. 이용 약관.

 


아티클 순위

의견

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=20
Zone=XML, 오픈 소스, 웹 개발
ArticleID=715352
ArticleTitle=PHP 및 MediaWiki API를 사용하여 Wikipedia 정보에 접속하기
publish-date=05172011
author1-email=ikram.melonfire@gmail.com
author1-email-cc=

태그

Help
검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오.

태그를 더 많이 보거나 적게 보기 위해 슬라이더 막대를 사용하십시오.

인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다.

내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.

검색 필드를 사용하여 My developerWorks 내에서 해당 태그가 사용된 모든 종류의 컨텐츠를 검색하십시오. 인기 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 최고 인기 태그를 보여줍니다. 내 태그는 특정 컨텐츠 존(예를 들어, 자바, 리눅스, WebSphere)의 귀하의 태그를 보여줍니다.