개발자 가이드: PHP

Blogger Data API를 사용하면 클라이언트 애플리케이션에서 Blogger 콘텐츠를 Google Data API 피드 형식으로 보고 업데이트할 수 있습니다.

클라이언트 애플리케이션은 Blogger Data API를 사용하여 새 블로그 게시물을 작성하고, 기존 블로그 게시물을 수정 또는 삭제하며, 특정 기준과 일치하는 블로그 게시물을 쿼리할 수 있습니다.

이 문서에서는 Blogger Data API의 기능에 대한 배경 지식 외에 Zend Google Data API 클라이언트 라이브러리를 사용한 기본 Data API 상호작용의 예를 제공합니다. 라이브러리에서 사용하는 기본 프로토콜에 관해 자세히 알아보려면 이 개발자 가이드의 프로토콜 섹션을 참고하세요.

목차

대상

이 문서는 Blogger와 상호작용할 수 있는 PHP 클라이언트 애플리케이션을 작성하려는 프로그래머를 위해 작성되었습니다.

이 문서에서는 사용자가 Google 데이터 API 프로토콜에 대한 일반적인 개념을 이해하고 있다고 가정합니다.

클라이언트 라이브러리에서 제공되는 클래스와 메서드에 대한 자세한 내용은 PHP 클라이언트 라이브러리 API 참조를 확인하세요. 일반적인 Blogger Data API 참조 정보는 프로토콜 참조 가이드를 참고하세요.

시작하기

클라이언트 라이브러리 설정에 관한 도움말은 시작 가이드를 참조하세요.

Zend 클라이언트 라이브러리에는 PHP 5.1.4 이상이 필요합니다. 이는 Zend 프레임워크의 일부로 사용할 수 있으며 별도 다운로드로도 제공됩니다. Blogger와 상호작용하려면 버전 1.0.0 이상의 클라이언트 라이브러리를 사용하세요.

Blogger 계정 만들기

테스트 목적으로 Blogger 계정에 가입하는 것이 좋습니다. Blogger는 Google 계정을 사용하므로 이미 Google 계정이 있으면 별도의 조치를 취할 필요가 없습니다.

샘플 코드 실행

이 문서에 표시된 모든 샘플 코드가 포함된 정상적으로 작동하는 샘플 클라이언트는 Zend Framework SVN 저장소에서 확인할 수 있습니다. 샘플은 /framework/standard/trunk/demos/Zend/Gdata/Blogger.php에 있습니다. 샘플에는 이 문서에 설명된 모든 함수가 포함되어 있습니다. 명령줄에서만 실행할 수 있습니다.

php Blogger.php -- --user=[email_address] --pass=[password]

이 샘플을 실행하거나 Zend 프레임워크를 사용하여 자체 코드를 개발하기 전에 include_path를 설정하고 적절한 클래스를 로드해야 할 수 있습니다. 포함 경로는 php.ini 설정 또는 set_include_path 메서드를 사용하여 설정할 수 있습니다. 이 코드는 핵심 Zend_Gdata 클래스, Zend_Gdata_Query 클래스, 인증 클래스 Zend_Gdata_ClientLogin에 대한 액세스를 요청합니다.

require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_Query');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');

매직 getter 및 setter 사용

PHP 클라이언트 라이브러리 전체에 개발자의 편의를 위해 매직 setter/getters 지원이 추가되었습니다. 이를 통해 기존의 setter/getter 메서드를 사용하거나 속성에 액세스하여 클래스의 속성에 안전하게 액세스할 수 있습니다. 예를 들어 $gdataObject가 이 라이브러리에 있는 객체의 인스턴스인 경우 다음 두 줄의 코드는 동일한 효과를 지닙니다.

$gdataObject->setFoo("bar");
$gdataObject->foo = "bar";

마찬가지로 다음 두 줄의 코드는 효과가 동일합니다.

$baz = $gdataObject->getFoo();
$baz = $gdataObject->foo;

마찬가지로 매직 팩토리 메서드를 사용하면 새 객체를 더 쉽게 선언할 수 있습니다. Zend 이름 지정 규칙에 따라 지정된 긴 클래스 이름을 기억하는 대신 Zend 서비스 클라이언트에서 newObject();를 호출하여 새 object를 만들 수 있습니다. 예를 들어 다음 두 스니펫 모두 새 draft 확장 객체를 선언합니다. drafts에 관한 자세한 내용은 게시물 작성 섹션을 참고하세요.

// Traditional instantiation
$gdClient = new Zend_Gdata();
$draft = new Zend_Gdata_App_Extension_Draft();

// Magic factory instantiation
$gdClient = new Zend_Gdata();
$draft = $gdClient->newDraft();

매직 setter/getter 및 팩토리는 선택사항이므로 가장 적합한 접근 방식을 사용합니다.

기타 리소스

Zend Framework의 Google Data API 구성요소 (Zend_Gdata)에 대한 기타 리소스:

Blogger 서비스에 인증

Blogger 데이터 API를 사용하여 공개 및 비공개 피드 모두에 액세스할 수 있습니다. 공개 피드는 인증이 필요하지 않지만 읽기 전용입니다. 블로그를 수정하려면 비공개 피드를 요청하기 전에 클라이언트가 인증해야 합니다. OAuth 인증, AuthSub 프록시 인증, ClientLogin 사용자 이름/비밀번호 인증의 세 가지 접근 방식 중 하나를 사용하여 인증할 수 있습니다.

Google Data API를 사용한 일반적인 인증에 대한 자세한 내용은 인증 문서를 참조하세요.

이 문서의 후속 섹션에 있는 대부분의 샘플에서는 $gdClient이라는 인증된 클라이언트 객체가 있다고 가정합니다.

OAuth 인증

Zend PHP GData 라이브러리를 사용한 OAuth 인증에 대한 문서는 Google 데이터 프로토콜 클라이언트 라이브러리의 OAuth를 참조하세요.

AuthSub 프록시 인증

AuthSub 프록시 인증은 Google 계정에 사용자를 인증해야 하는 웹 애플리케이션에서 사용합니다. 웹사이트 운영자와 클라이언트 코드는 Blogger 사용자의 사용자 이름과 비밀번호에 액세스할 수 없습니다. 대신 클라이언트는 특정 사용자를 대신할 수 있는 특수 AuthSub 토큰을 얻습니다. 자세한 내용은 AuthSub 문서를 참조하세요.

애플리케이션을 처음 방문하는 사용자는 아직 인증되지 않은 상태입니다. 이 경우 블로그에 대한 액세스 요청을 인증하려면 일부 정보와 사용자를 Google 페이지로 안내하는 링크를 표시해야 합니다. Zend 클라이언트 라이브러리는 Google 페이지의 URL을 생성하는 함수를 제공합니다. 아래 코드는 AuthSubRequest 페이지의 URL을 검색합니다.

function getAuthSubUrl()
{
  $next = getCurrentUrl();
  $scope = 'http://www.google.com/blogger/feeds/';
  $secure = false;
  $session = true;
  return Zend_Gdata_AuthSub::getAuthSubTokenUri($next, $scope, $secure, $session);
}

$authSubUrl = getAuthSubUrl();
echo '<a href=\"$authSubUrl\">login to your Google account</a>';

getAuthSubTokenUri 메서드는 AuthSubRequest 핸들러가 사용하는 쿼리 매개변수에 해당하는 다음 매개변수를 사용합니다.

다음
Google이 인증 후 사용자를 리디렉션해야 하는 페이지의 URL입니다.
범위
애플리케이션이 Blogger 피드에 액세스하기 위해 토큰을 요청함을 나타냅니다. 사용할 범위 문자열은 http://www.blogger.com/feeds/입니다 (URL 인코딩됨).
보안
클라이언트가 보안 토큰을 요청하는지 여부를 나타냅니다.
session
반환된 토큰을 다회용 (세션) 토큰으로 교환할 수 있는지 여부를 나타냅니다.

위의 예시는 보안 토큰 (secure의 값이 false)을 요청하지 않는 호출을 보여줍니다. 결과 요청 URL은 다음과 같을 수 있습니다.

https://www.google.com/accounts/AuthSubRequest?scope=http%3A%2F%2Fwww.blogger.com%2Ffeeds%2F&session=1&secure=0&next=http%3A%2F%2Fwww.example.com%2Fwelcome.php

사용자가 Google 사이트의 링크를 따라 Google 계정에 인증합니다.

사용자가 인증되면 AuthSub 시스템은 AuthSubRequest URL의 next 쿼리 매개변수에 지정된 URL로 사용자를 리디렉션합니다. AuthSub 시스템은 인증 토큰을 token 쿼리 매개변수의 값으로 해당 URL에 추가합니다. 예를 들면 다음과 같습니다.

http://www.example.com/welcome.php?token=yourAuthToken

$_GET['token']를 사용하여 토큰 값을 검색할 수 있습니다.

이 토큰 값은 일회용 AuthSub 토큰을 나타냅니다. 이 예시에서는 $session = true가 지정되었으므로 AuthSubSessionToken 서비스를 호출하는 Zend_Gdata_AuthSub::getAuthSubSessionToken 메서드를 사용하여 이 토큰을 AuthSub 세션 토큰으로 교환할 수 있습니다.

if(! isset($_SESSION['sessionToken']) && isset($_GET['token'])) {
  $_SESSION['sessionToken'] =
      Zend_Gdata_AuthSub::getAuthSubSessionToken($_GET['token']);
}

이 코드 스니펫은 먼저 AuthSub 세션 토큰이 이미 있는지 확인합니다. 그렇지 않지만 URL에 일회용 토큰이 지정된 경우 코드 스니펫은 일회용 토큰을 getAuthSubSessionToken 메서드에 전달하고 AuthSub 인터페이스는 세션 토큰을 반환합니다. 그런 다음 코드는 세션 토큰 값을 세션 변수 $_SESSION['sessionToken']에 입력합니다.

그러면 이후에 Blogger와 상호작용할 때 애플리케이션이 세션 토큰 값을 사용할 수 있습니다. Zend_Gdata_AuthSub::getHttpClient 메서드를 사용하여 AuthSub 사용자 인증 정보를 포함하도록 미리 설정된 Authorization 헤더가 있는 Zend_Http_Client 객체를 가져올 수 있습니다.

$client = Zend_Gdata_AuthSub::getHttpClient($_SESSION['sessionToken']);

ClientLogin 사용자 이름/비밀번호 인증

클라이언트가 독립형 단일 사용자 '설치' 클라이언트 (예: 데스크톱 애플리케이션)인 경우 ClientLogin 인증을 사용합니다.

다음 코드에서는 Zend_Gdata_ClientLogin::getHttpClient 메서드를 사용하여 ClientLogin 서비스에 요청을 수행하고, 인증 토큰을 검색하고, 적절한 인증 헤더가 있는 Zend_Http_Client 객체를 만듭니다. 그런 다음 이 메서드에서 반환하는 HttpClient를 사용하여 Zend_Gdata 서비스 객체를 구성합니다.

$accountType가 명시적으로 GOOGLE로 설정되어 있습니다. 이 매개변수를 설정하지 않으면 G Suite 사용자가 Blogger API를 사용할 수 없습니다.

$user = 'user@example.com';
$pass = 'secretPasswd';
$service = 'blogger';

$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service, null,
        Zend_Gdata_ClientLogin::DEFAULT_SOURCE, null, null,
        Zend_Gdata_ClientLogin::CLIENTLOGIN_URI, 'GOOGLE');
$gdClient = new Zend_Gdata($client);

샘플 요청 및 응답을 포함한 ClientLogin 인증에 대한 자세한 내용은 설치된 애플리케이션 인증 문서를 참조하세요.

참고: 지정된 세션의 모든 요청에 동일한 토큰을 사용하세요. 각 Blogger 요청마다 새 토큰을 획득하지 마세요.

참고: ClientLogin 문서에 설명된 대로 인증 요청이 실패하고 보안문자 질문을 요청할 수 있습니다. Google에서 보안문자 질문을 처리하고 처리하도록 하려면 ClientLogin 문서에 제공된 보안문자 처리 URL이 아닌 https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger로 사용자를 보내세요.

블로그 목록 가져오기

Blogger Data API는 특정 사용자의 블로그를 나열하는 피드(이 피드를 '메타피드'라고 함)를 제공합니다.

다음 샘플 코드에서는 인증된 $gdClient 객체를 사용하여 메타피드를 검색한 후 각 블로그 제목을 출력합니다.

Zend_Gdata_Query 클래스가 쿼리 URL 구성을 처리합니다. 이 경우 추가 작업을 실행할 필요는 없지만 Query 클래스의 유용성은 이 문서의 쿼리 매개변수로 게시물 검색 섹션에서 명확하게 확인할 수 있습니다.

function printAllBlogs()
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/default/blogs');
  $feed = $gdClient->getFeed($query);
  printFeed($feed);
}

function printFeed($feed)
{
  $i = 0;
  foreach($feed->entries as $entry) {
    print $i ." ". $entry->title->text . "\n";
    $i++;
  }
}

getFeed 메서드에서 사용하는 URL을 확인하세요. 기본 메타피드 URL이며 현재 인증된 사용자의 블로그 목록을 반환합니다. 다른 사용자의 피드에 액세스하려면 메타피드 URL의 default 대신 사용자의 ID를 입력합니다. 사용자 ID는 사용자 프로필 URL 끝에 있는 숫자 문자열입니다.

아래 코드 스니펫은 피드에서 블로그 ID를 추출하는 방법을 보여줍니다. 글 및 댓글에 대한 작성, 업데이트, 삭제 작업을 수행하려면 블로그 ID가 필요합니다. $index 변수는 사용자의 블로그 피드에서 사용 중인 블로그를 나타냅니다. id 필드는 tag:blogger.com,1999:user-userID.blog-blogID 형식을 취하므로 '-' 문자의 split는 결과 배열의 마지막 요소에 블로그 ID를 배치합니다.

$idText = split('-', $feed->entries[$index]->id->text);
$blogID = $idText[2];

게시물 작성

Blogger Data API를 사용하면 항목의 초안을 만들 뿐만 아니라 새 블로그 항목을 만들고 게시할 수 있습니다.

참고: 게시물의 맞춤 작성자 설정은 현재 지원되지 않습니다. 모든 새 게시물은 현재 인증된 사용자가 작성한 것처럼 표시됩니다.

블로그 게시물 게시

PHP 클라이언트 라이브러리를 사용하여 새 블로그 항목을 게시할 수 있습니다.

먼저 블로그 게시물을 나타내는 항목 인스턴스를 만듭니다. 그런 다음 블로그 게시물의 제목, 콘텐츠, 기타 속성을 설정할 수 있습니다. 마지막으로 insertEntry 메서드를 호출하여 게시물을 삽입합니다. 여기에서 새로운 Zend_Gdata_Entry, Zend_Gdata_App_Extension_TitleZend_Gdata_App_Extension_Content 객체를 사용하여 매직 팩토리 인스턴스화를 확인할 수 있습니다.

function createPublishedPost($title='Hello, world!', $content='I am blogging on the internet.')
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default';
  $entry = $gdClient->newEntry();
  $entry->title = $gdClient->newTitle($title);
  $entry->content = $gdClient->newContent($content);
  $entry->content->setType('text');

  $createdPost = $gdClient->insertEntry($entry, $uri);
  $idText = split('-', $createdPost->id->text);
  $newPostID = $idText[2];

  return $newPostID;
}

블로그 게시물 초안 작성

임시 게시물은 공개 게시물과 동일한 방식으로 생성되지만 항목 객체의 초안 속성을 설정해야 합니다. 강조 표시된 줄을 추가하여 위와 같은 블로그 게시물을 초안으로 만들 수 있습니다.

function createDraftPost($title='Salutations, world!', $content='Hmm ... not quite right, must rework the title later.')
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default';
  $entry = $gdClient->newEntry();

  $entry->title = $gdClient->newTitle(trim($title));
  $entry->content = $gdClient->newContent($content);
  $entry->content->setType('text');

  $control = $gdClient->newControl();
  $draft = $gdClient->newDraft('yes');
  $control->setDraft($draft);
  $entry->control = $control;

  $createdPost = $gdClient->insertEntry($entry, $uri);
  $idText = split('-', $createdPost->id->text);
  return $idText[2];
}

게시물의 제목이나 콘텐츠를 설정하는 것과 거의 같은 방식으로 새 Zend_Gdata_App_Extension_ControlZend_Gdata_App_Extension_Draft 객체를 만들어 항목의 제어 속성에 할당합니다.

초안 게시물을 검색하고 초안 속성을 no로 설정한 후 게시물을 업데이트하여 기존의 초안 블로그 게시물을 게시된 게시물로 전환할 수 있습니다. 다음 두 섹션에서는 게시물 검색 및 업데이트를 다룹니다.

게시물 검색

다음 섹션에서는 쿼리 매개변수를 사용하거나 사용하지 않고 블로그 게시물 목록을 검색하는 방법을 설명합니다.

인증 없이 Blogger 공개 피드를 쿼리할 수 있습니다. 따라서 공개 블로그의 게시물을 검색하기 전에 사용자 인증 정보를 설정하거나 AuthSub 인증을 수행할 필요가 없습니다.

모든 블로그 게시물 검색

사용자의 게시물을 검색하려면 블로그 메타피드를 검색하는 데 사용된 것과 동일한 getFeed 메서드를 호출하되, 이번에는 블로그 게시물 피드 URL을 보냅니다.

function printAllPosts($gdClient, $blogID)
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/posts/default');
  $feed = $gdClient->getFeed($query);
  printFeed($feed);
}

쿼리 매개변수를 사용하여 글 검색

Blogger Data API를 사용하면 지정된 기간 동안 게시 또는 업데이트된 블로그 게시물을 요청하는 등 지정된 기준과 일치하는 항목의 집합을 요청할 수 있습니다. 이렇게 하려면 쿼리 객체를 만들어 getFeed 메서드에 전달합니다.

예를 들어 기간 쿼리를 보내려면 쿼리 객체의 published-minpublished-max 매개변수를 설정합니다. 다음 코드 스니펫은 지정된 시작 시간과 종료 시간 사이에 게시된 각 블로그 게시물의 제목과 콘텐츠를 출력합니다.

function printPostsInDateRange($gdClient, $blogID, $startDate='2007-04-01', $endDate='2007-04-25')
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/posts/default');
  $query->setParam('published-min', $startDate);
  $query->setParam('published-max', $endDate);

  $feed = $gdClient->getFeed($query);
  printFeed($feed);
}

Zend_Gdata_Query 클래스의 유용한 디버깅 메서드는 구성된 인코딩된 URL을 보여주는 getQueryUrl()입니다.

참고: 현재 published-minpublished-max 쿼리 매개변수에는 매직 setter가 없습니다. 그러나 setStartIndexsetMaxResults를 사용할 수 있습니다.

Blogger 데이터 API는 다음과 같은 쿼리 매개변수를 지원합니다.

categories
피드 결과를 필터링할 카테고리 (라벨이라고도 함)를 지정합니다. 예를 들어 http://www.blogger.com/feeds/blogID/posts/default/-/Fritz/LaurieFritzLaurie 라벨이 모두 있는 항목을 반환합니다.
max-results
반환할 최대 항목 수입니다.
게시된-최소, 게시된-최대
응모작 게시 날짜의 경계입니다.
start-index
페이징을 위해 가져올 첫 번째 결과의 1부터 시작하는 색인입니다.

쿼리 매개변수에 대한 자세한 내용은 Blogger Data API 참조 가이드Google Data API 참조 가이드를 참고하세요.

게시물 업데이트

기존 블로그 게시물을 업데이트하려면 먼저 업데이트할 항목을 가져온 후 수정한 다음 save 메서드를 사용하여 Blogger로 전송합니다. 다음 코드 스니펫은 서버에서 항목을 이미 검색했다고 가정하고 블로그 항목의 제목과 콘텐츠를 수정합니다.

public function updatePost($postID, $updatedTitle='Hello, World?',
                           $updatedContent='UPDATE: Still blogging',
                           $isDraft=False)
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/posts/default/' . $postID);
  $postToUpdate = $dClient->getEntry($query);
  $postToUpdate->title->text = $this->gdClient->newTitle($updatedTitle);
  $postToUpdate->content->text = $this->gdClient->newContent($updatedContent);

  if ($isDraft) {
    $draft = $gdClient->newDraft('yes');
  } else {
    $draft = $gdClient->newDraft('no');
  }

  $control = $gdClient->newControl();
  $control->setDraft($draft);
  $postToUpdate->control = $control;

  $updatedPost = $postToUpdate->save();
  return $updatedPost;
}

참고: 게시물과 연결된 작성자 데이터를 수정하는 기능은 현재 지원되지 않습니다.

게시물 삭제

게시물을 삭제하려면 다음과 같이 게시물의 수정 URL을 $gdClient 객체의 delete 메서드에 전달합니다.

public function deletePost($gdClient, $blogID, $postID)
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/posts/default/' . $postID;
  $gdClient->delete($uri);
}

설명

Blogger Data API를 사용하면 댓글을 만들고 검색하고 삭제할 수 있습니다. 주석 업데이트는 지원되지 않으며 웹 인터페이스에서도 사용할 수 없습니다.

댓글 작성

댓글을 게시하려면 다음과 같이 항목 객체를 만들고 삽입합니다.

function createComment($gdClient, $blogID, $postID, $commentText)
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/' . $postID . '/comments/default';

  $newComment = $gdClient->newEntry();
  $newComment->content = $gdClient->newContent($commentText);
  $newComment->content->setType('text');
  $createdComment = $gdClient->insertEntry($newComment, $uri);

  $editLink = split('/', $createdComment->getEditLink()->href);
  $newCommentID = $editLink[8];

  return $newCommentID; 
}

참고: 현재 인증된 사용자가 소유한 블로그에만 댓글을 게시할 수 있습니다.

참고: 댓글의 맞춤 작성자 설정은 현재 지원되지 않습니다. 모든 새 댓글은 현재 인증된 사용자가 작성한 것처럼 표시됩니다.

댓글을 가져오는 중

게시물의 댓글 피드 URL에서 특정 게시물의 댓글을 가져올 수 있습니다.

public function printPostComments($gdClient, $blogID, $postID)
{
  $query = new Zend_Gdata_Query('http://www.blogger.com/feeds/' . $blogID . '/' . $postID . '/comments/default');
  $feed = $gdClient->getFeed($query);
  $printFeed($feed);
}

또는 블로그의 댓글 피드 URL을 사용하여 모든 게시물의 댓글을 가져올 수 있습니다.

http://www.blogger.com/feeds/blogID/comments/default

댓글 삭제 중

댓글을 삭제하려면 다음과 같이 댓글의 수정 URL을 $gdClient 객체의 delete 메서드에 전달합니다.

public function deleteComment($gdClient, $blogID, $postID, $commentID)
{
  $uri = 'http://www.blogger.com/feeds/' . $blogID . '/' . $postID . '/comments/default/' . $commentID;
  $gdClient->delete($uri);
}

맨 위로