Руководство разработчика: PHP

API данных Blogger позволяет клиентским приложениям просматривать и обновлять контент Blogger в виде фидов API данных Google.

Ваше клиентское приложение может использовать API данных Blogger для создания новых сообщений в блогах, редактирования или удаления существующих сообщений в блогах и запроса сообщений в блогах, соответствующих определенным критериям.

В дополнение к некоторым сведениям о возможностях Blogger Data API в этом документе приведены примеры базовых взаимодействий с Data API с использованием клиентской библиотеки Zend Google Data API . Если вам интересно узнать больше о базовом протоколе, используемом библиотекой, см. раздел « Протокол» этого руководства разработчика.

Содержание

Аудитория

Этот документ предназначен для программистов, которые хотят писать клиентские приложения PHP, которые могут взаимодействовать с Blogger.

В этом документе предполагается, что вы понимаете общие идеи протокола API данных Google .

Справочную информацию о классах и методах, предоставляемых клиентской библиотекой, см. в справочнике API клиентской библиотеки PHP . Общие справочные сведения об API данных Blogger см. в справочном руководстве по протоколу .

Начиная

Справку по настройке клиентской библиотеки см. в Руководстве по началу работы .

Для клиентской библиотеки Zend требуется PHP 5.1.4 или более поздней версии. Он доступен как часть Zend Framework , а также как отдельная загрузка . Для взаимодействия с Blogger используйте клиентскую библиотеку версии 1.0.0 или более поздней.

Создание учетной записи блогера

Вы можете зарегистрировать учетную запись Blogger в целях тестирования. Blogger использует учетные записи Google , поэтому, если у вас уже есть учетная запись Google, все готово.

Запуск примера кода

Полноценный рабочий пример клиента, содержащий весь приведенный в этом документе пример кода, доступен в репозитории Zend Framework SVN . Образец находится по адресу /framework/standard/trunk/demos/Zend/Gdata/Blogger.php . Образец содержит все функции, описанные в этом документе. Его можно запустить только из командной строки:

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

Перед запуском этого примера или разработкой собственного кода с использованием Zend Framework вам может потребоваться установить 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');

Использование магических геттеров и сеттеров

Во всей клиентской библиотеке PHP добавлена ​​поддержка магических сеттеров/геттеров для удобства разработчиков. Они обеспечивают безопасный доступ к свойствам класса с использованием традиционных методов установки/получения или путем доступа к свойствам. Например, если $gdataObject является экземпляром объекта в этой библиотеке, то следующие две строки кода будут иметь одинаковый эффект:

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

Точно так же эти две строки кода имеют одинаковые эффекты:

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

Точно так же волшебные фабричные методы упрощают объявление новых объектов. Вместо того, чтобы запоминать длинные имена классов, предусмотренные соглашением об именовании Zend, вы можете создать новый object , вызвав newObject(); на клиенте службы Zend. Например, следующие два фрагмента кода объявляют новый 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();

Волшебные сеттеры/геттеры и фабрики необязательны, поэтому используйте тот подход, который вам больше подходит.

Другие источники

Другие ресурсы для компонента Zend Framework API данных Google (Zend_Gdata):

Аутентификация в службе Blogger

Вы можете получить доступ как к общедоступным, так и к частным фидам с помощью Blogger Data API. Публичные каналы не требуют аутентификации, но доступны только для чтения. Если вы хотите изменить блоги, ваш клиент должен пройти аутентификацию, прежде чем запрашивать частные каналы. Он может выполнять аутентификацию с использованием любого из трех подходов: аутентификация OAuth , аутентификация прокси-сервера AuthSub или аутентификация имени пользователя/пароля ClientLogin .

Дополнительные сведения об аутентификации с помощью Google Data API в целом см. в документации по аутентификации .

В большинстве примеров в последующих разделах этого документа предполагается, что у вас есть аутентифицированный клиентский объект с именем $gdClient .

OAuth-аутентификация

Документацию по аутентификации OAuth с использованием библиотеки Zend PHP GData см. в разделе OAuth в клиентских библиотеках протокола данных Google .

Аутентификация прокси-сервера AuthSub

Прокси-аутентификация AuthSub используется веб-приложениями, которым необходимо аутентифицировать своих пользователей в учетных записях Google. Оператор веб-сайта и клиентский код не имеют доступа к имени пользователя и паролю пользователя Blogger; вместо этого клиент получает специальные токены AuthSub, которые позволяют клиенту действовать от имени конкретного пользователя. Более подробную информацию смотрите в документации AuthSub .

Когда пользователь впервые посещает ваше приложение, он еще не прошел аутентификацию. В этом случае вам нужно отобразить некоторую информацию и ссылку, направляющую пользователя на страницу Google для аутентификации вашего запроса на доступ к их блогам. Клиентская библиотека Zend предоставляет функцию для создания URL-адреса страницы Google. Код ниже извлекает URL-адрес страницы AuthSubRequest:

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):

следующий
URL-адрес страницы, на которую Google должен перенаправить пользователя после аутентификации.
сфера
Указывает, что приложение запрашивает токен для доступа к фидам Blogger. Используемая строка области видимости — http://www.blogger.com/feeds/ (разумеется, в кодировке URL).
безопасный
Указывает, запрашивает ли клиент маркер безопасности.
сеанс
Указывает, можно ли обменять возвращенный токен на многоцелевой (сеансовый) токен.

В приведенном выше примере показан вызов, который не запрашивает безопасный токен (значение 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 перенаправляет его на URL-адрес, указанный в next параметре запроса URL-адреса AuthSubRequest. Система AuthSub добавляет токен проверки подлинности к этому URL-адресу в качестве значения параметра запроса token . Например:

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

Вы можете получить значение токена, используя $_GET['token'] .

Это значение токена представляет одноразовый токен AuthSub. В этом примере, поскольку было указано $session = true , этот токен можно обменять на токен сеанса AuthSub с помощью метода Zend_Gdata_AuthSub::getAuthSubSessionToken , который вызывает службу AuthSubSessionToken :

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 , чтобы получить объект Zend_Http_Client с предустановленным заголовком Authorization для включения учетных данных AuthSub:

$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, запрос аутентификации может завершиться ошибкой и запросить проверку CAPTCHA. Если вы хотите, чтобы Google выдавал и обрабатывал запрос CAPTCHA, отправьте пользователя на https://www.google.com/accounts/DisplayUnlockCaptcha?service=blogger (а не на URL-адрес обработки CAPTCHA, указанный в документации ClientLogin).

Получение списка блогов

API данных Blogger предоставляет фид, в котором перечислены блоги определенного пользователя; этот канал известен как «метаканал».

Следующий пример кода использует аутентифицированный объект $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++;
  }
}

Обратите внимание на URL-адрес, используемый методом getFeed . Это URL метафида по умолчанию; он возвращает список блогов для текущего аутентифицированного пользователя. Чтобы получить доступ к каналу для другого пользователя, вы можете указать идентификатор пользователя вместо значения по default в URL-адресе метаканала. Идентификатор пользователя — это строка цифр в конце URL-адреса профиля пользователя.

Фрагмент кода ниже демонстрирует, как извлечь идентификатор блога из фида. Идентификатор блога понадобится вам для создания, обновления и удаления сообщений и комментариев. Переменная $index указывает, какой блог в ленте блогов пользователя используется. Поле id имеет вид tag:blogger.com,1999:user-userID.blog- blogID , поэтому split символа '-' помещает идентификатор блога в последний элемент результирующего массива.

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

Создание постов

API данных Blogger позволяет создавать и публиковать новые записи в блогах, а также создавать черновики записей.

Примечание . Установка собственного автора для сообщений в настоящее время не поддерживается. Все новые сообщения будут отображаться так, как если бы они были созданы текущим аутентифицированным пользователем.

Публикация сообщения в блоге

Вы можете использовать клиентскую библиотеку PHP для публикации новых записей в блоге.

Во-первых, создайте экземпляр записи для представления сообщения в блоге. Затем вы можете установить заголовок, содержание и другие атрибуты сообщения в блоге. Наконец, вызовите метод insertEntry , чтобы вставить сообщение. Здесь вы можете увидеть работу волшебной фабрики с новыми Zend_Gdata_Entry , Zend_Gdata_App_Extension_Title и Zend_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_Control и Zend_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);
}

Получение сообщений с использованием параметров запроса

API данных Blogger позволяет запрашивать набор записей, соответствующих заданным критериям, например, запрашивать сообщения в блоге, опубликованные или обновленные в указанном диапазоне дат. Для этого вы создаете объект запроса и передаете его методу getFeed .

Например, чтобы отправить запрос диапазона дат, установите параметры published-min и published-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 является getQueryUrl() , который покажет вам созданный закодированный URL.

Примечание . В настоящее время не существует волшебных сеттеров для параметров запроса publish published-min и published-max . Однако вы можете использовать setStartIndex и setMaxResults .

API данных Blogger поддерживает следующие параметры запроса:

категории
Задает категории (также известные как метки) для фильтрации результатов веб-канала. Например, http://www.blogger.com/feeds/ blogID /posts/default/-/Fritz/Laurie возвращает записи с ярлыками Fritz и Laurie .
максимальные результаты
Максимальное количество возвращаемых записей.
опубликовано-мин., опубликовано-макс.
Границы дат публикации записей.
начальный индекс
Отсчитываемый от 1 индекс первого извлекаемого результата (для разбиения по страницам).

Дополнительные сведения о параметрах запроса см. в Справочном руководстве по API данных Blogger и Справочном руководстве по API данных Google .

Обновление сообщений

Чтобы обновить существующую запись в блоге, сначала извлеките запись, которую хотите обновить, затем измените ее, а затем отправьте в Blogger, используя метод save . Следующий фрагмент кода изменяет заголовок и содержимое записи блога, предполагая, что вы уже получили запись с сервера.

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-адрес редактирования сообщения методу delete вашего объекта $gdClient , например:

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

Комментарии

API данных Blogger позволяет создавать, извлекать и удалять комментарии. Обновление комментариев не поддерживается (и недоступно в веб-интерфейсе).

Создание комментариев

Чтобы опубликовать комментарий, создайте объект записи и вставьте его следующим образом:

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-адрес редактирования комментария методу delete вашего объекта $gdClient следующим образом:

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

Вернуться к вершине