Использование cURL для взаимодействия со службами Google Data

Внимание : эта страница посвящена старым API Google, API данных Google. Она актуальна только для API, перечисленных в каталоге API данных Google , многие из которых были заменены новыми. Информацию о конкретном новом API см. в документации к нему. Информация об авторизации запросов с помощью нового API представлена в разделе «Аутентификация и авторизация учётных записей Google» .

Райан Бойд, команда Google Data API
Сентябрь 2007 г.

Введение

По сути, API данных Google используют формат данных Atom (XML) и протокол HTTP для передачи данных, расширяя протокол публикации Atom . Мы публикуем ряд клиентских библиотек для упрощения взаимодействия с API данных Google. Однако вы всегда можете использовать более простые инструменты для работы с нашими сервисами, и это довольно просто, если следовать нашим рекомендациям.

cURL — это приложение командной строки для выполнения запросов с использованием различных протоколов, включая HTTP. cURL часто используется разработчиками для тестирования служб Google Data, поскольку он поддерживает функциональность HTTP, необходимую для взаимодействия с API на низком уровне.

cURL поддерживает только HTTP-соединение, поэтому для работы с приложением необходимо знать протокол Google Data , протокол, специфичный для данной службы, и используемый формат данных XML. В этой статье упоминаются и другие инструменты, упрощающие эти задачи.

В этой статье используются примеры, основанные на API данных веб-альбомов Picasa. Однако все эти примеры можно легко применить и к другим API данных Google .

Получение и установка cURL

cURL обычно входит в стандартную установку многих платформ UNIX/Linux. Попробуйте ввести curl в вашей любимой оболочке, чтобы проверить, установлен ли инструмент и находится ли он в вашей PATH . Если инструмент у вас не установлен, посетите страницу загрузки на сайте cURL, чтобы получить официальный исходный код или двоичный пакет, предоставленный пользователем. Обратите внимание, что утилита командной строки использует библиотеку libcurl , которая может быть доступна в виде отдельного пакета для загрузки, поэтому, если вы не компилируете из исходного кода, обязательно загрузите двоичный пакет вместо пакета libcurl. Пакеты с поддержкой SSL необходимы, если вы хотите использовать cURL для получения токенов аутентификации или доступа к некоторым службам Google Data, требующим использования SSL для запросов.

Аутентификация в службе данных Google

Аутентифицированные запросы к Google Data выполняются путём добавления HTTP-заголовка к запросу, который содержит токен аутентификации ClientLogin (для настольных компьютеров/мобильных приложений) или AuthSub (для веб-приложений). Для тестирования с использованием cURL ClientLogin является более простым методом, описанным ниже. Заголовки аутентификации AuthSub можно использовать с cURL, но более сложный процесс получения токенов выходит за рамки этой статьи.

Использование ClientLogin

ClientLogin предназначен для установленных (настольных и мобильных) приложений. При использовании этого метода аутентификации приложение, используя API Google Data, напрямую обрабатывает имя пользователя и пароль.

Запрос аутентификации для ClientLogin принимает имя пользователя, пароль и имя сервиса в качестве переменных формы POST. Эти переменные передаются в виде аргументов Email , Passwd и service соответственно. Этот запрос возвращает ответ с несколькими токенами, один из которых может быть использован для отправки запросов к сервису Google Data. Обратите внимание, что аргументы данных, передаваемые с помощью curl , должны быть закодированы в URL, если они содержат символы, не входящие в набор ASCII, которые часто встречаются в аргументах Email и Passwd . Вы можете указать curl закодировать эти аргументы в URL с помощью флага --data-urlencode .

Пример запроса:

curl https://www.google.com/accounts/ClientLogin \
--data-urlencode Email=brad.gushue@example.com --data-urlencode Passwd=new+foundland \
-d accountType=GOOGLE \
-d source=Google-cURL-Example \
-d service=lh2

Пример ответа:

SID=DQAAAHYBADCv2pSv7nflacDNwz3zEDUGtrSvNVDcpkSfddi77b3U5sEaHmP8YLWhmA36F9rk85mL8J5dqo4apn0T1vKz0fPGI9Xtnuet6cuE2ZzYvrNIwbSC_HjTqF4zudNQnnlDuD2wqZT-g1qXI8KhGAQZV4NexHZoQPlabTsGuRZeIBxj1A
LSID=EUBBBIaBADCl-kNxvRVmcQghpt3cqSMfEooKR9flLOUZqwgP9OrZS83gse-KSdTNeXhxsET7FYenDhceP9lIPOmesH-t9qh-AWUHjjMdZEbUNeF9mWyzln6Z-FajaiG-cVFkqW0ZJ8ZbnCP30xXj6xFK6QxaAcqy_9Pej8jhEnxS9E61ftQGPg
Auth=EUBBIacAAADK-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxsET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfagZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh

Подробную информацию о параметрах, использованных в этом запросе, см. в документации ClientLogin. В этом примере мы используем API данных Picasa Web Albums. Имя сервиса ( service ) — lh2 . Имена других сервисов Google Data можно найти на странице часто задаваемых вопросов по API Google Data .

Значение токена Auth в приведённом выше ответе — единственное значение, необходимое для аутентификации в сервисах Google Data. Значение этого токена формируется в HTTP-заголовок, который затем используется для каждого запроса к сервису Google Data.

curl --silent --header "Authorization: GoogleLogin auth=EUBBIacAAADK\
-kNxvRVmcQghpt3cqSMfEooLNMflLNIQqwgP9OrZS83gs-KSdTNeXhxs\
ET7FYePWmaD8Vsy1V4LSUGMUP48Je2TO8OcjBj6HgAtPhiZeX-gKDfag\
ZDK44j4n-Tkb44nhOnp2_QPSnBj3Z2vYwOEDjjG3Q53aQVC2132JKOuGh" \
"http://picasaweb.google.com/data/feed/api/user/default"

Примечание : Описанный выше метод экранирования символов новой строки с помощью символов обратной косой черты ('\') не работает в командной оболочке Windows, поэтому при запуске curl в Windows необходимо ввести всю команду в одну строку.


Получение каналов и записей

В API данных Google получение каналов и записей осуществляется посредством выполнения HTTP- GET к URL-адресу с необязательным набором параметров запроса. Поскольку мы выполняем GET -запрос, в curl необходимо передать только заголовок авторизации и URL-адрес. В примере ниже будет использоваться API данных веб-альбомов Picasa, и он будет использоваться для получения списка альбомов, принадлежащих аутентифицированному пользователю. Обратите внимание, что в этом примере мы сократили токен авторизации до ABCDEFG , но вместо него следует использовать полный токен (например, EUBBIacA ... 32JKOuGh , как указано выше).

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default"

Это вернет неформатированный фрагмент XML:

<?xml version='1.0' encoding='UTF-8'?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' xmlns:gml='http://www.opengis.net/gml' xmlns:georss='http://www.georss.org/georss' xmlns:photo='http://www.pheed.com/pheed/' xmlns:media='http://search.yahoo.com/mrss/' xmlns:batch='http://schemas.google.com/gdata/batch' xmlns:gphoto='http://schemas.google.com/photos/2007'><id>http://picasaweb.google.com/data/feed/base/user/brad.gushue</id><updated>2007-09-13T21:30:21.454Z</updated>...</entry></feed>

Существует несколько хороших инструментов для форматирования вывода, чтобы сделать его более удобным для восприятия, включая tidy . Проще всего использовать tidy — передать вывод команды curl в tidy, как показано ниже:

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/default" | tidy -xml -indent -quiet

В результате лента становится гораздо более читабельной, например, такой:

<?xml version='1.0' encoding='utf-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' 
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' 
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#' 
xmlns:gml='http://www.opengis.net/gml' 
xmlns:georss='http://www.georss.org/georss' 
xmlns:photo='http://www.pheed.com/pheed/' 
xmlns:media='http://search.yahoo.com/mrss/' 
xmlns:batch='http://schemas.google.com/gdata/batch' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>http://picasaweb.google.com/data/feed/api/user/brad.gushue</id>
  <updated>2007-09-13T21:47:07.337Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#user' />
  <title type='text'>brad.gushue</title>
  <subtitle type='text'></subtitle>
  <icon>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</icon>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue?start-index=1&max-results=1000' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <generator version='1.00' uri='http://picasaweb.google.com/'>
  Picasaweb</generator>
  <openSearch:totalResults>8</openSearch:totalResults>
  <openSearch:startIndex>1</openSearch:startIndex>
  <openSearch:itemsPerPage>1000</openSearch:itemsPerPage>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:thumbnail>
  http://lh6.google.com/brad.gushue/AAAAj9zigp4/AAAAAAAAAAA/RiMAlXV4MFI/s64-c/brad.gushue</gphoto:thumbnail>
  <entry>
    <id>
    http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593</id>
    <published>2007-05-23T04:55:52.000Z</published>
    <updated>2007-05-23T04:55:52.000Z</updated>
    <category scheme='http://schemas.google.com/g/2005#kind'
    term='http://schemas.google.com/photos/2007#album' />
    <title type='text'>Trip To Italy</title>
    <summary type='text'>This was the recent trip I took to
    Italy.</summary>
    <rights type='text'>public</rights>
    <link rel='http://schemas.google.com/g/2005#feed'
    type='application/atom+xml'
    href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='alternate' type='text/html'
    href='http://picasaweb.google.com/brad.gushue/TripToItalyV2' />
    <link rel='self' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593' />
    <link rel='edit' type='application/atom+xml'
    href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456' />
    <author>
      <name>Brad</name>
      <uri>http://picasaweb.google.com/brad.gushue</uri>
    </author>
    <gphoto:id>9810315389720904593</gphoto:id>
    <media:group>
    ...
    </media:group>
  </entry>
  <entry>
  ...
  </entry>

</feed>

Отдельные записи можно получить таким же образом, указав URL-адрес записи, а не URL-адрес канала.

Обновление записей

Записи в API данных Google обновляются путем выполнения HTTP PUT на URL-адрес редактирования с новой копией XML записи в теле запроса.

  1. Получите запись, используя значение URL atom:link/@rel='self'
  2. Обновите запись локально, чтобы внести необходимые изменения.
  3. PUT запись на сервер, используя значение URL atom:link/@rel='edit'

1. Получение записи

Запись можно получить, используя один из двух URL-адресов, выделенных жирным шрифтом в блоке ленты выше. Необходимый URL-адрес — это значение href для элемента link с атрибутом rel='self' .

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593"

2. Обновление записи локально

После извлечения записи её необходимо обновить с помощью локального текстового редактора или приложения, чтобы внести необходимые изменения. В приведённой выше команде для извлечения записи мы не передавали результаты в tidy , как в предыдущих примерах. Результатом является XML, представляющий те же данные, но с другим форматированием, чем версия, переданная в tidy . При ручном редактировании записи использование tidy часто может упростить работу с XML.

Примечание : Не забудьте включить все определения пространств имён XML, которые используются в качестве атрибутов элемента atom:entry при публикации новой записи. Отсутствие этих определений приведёт к исключениям при парсинге. Кроме того, tidy заменит пробелы между определениями пространств имён символами новой строки. Хотя это допустимый XML, сервисы Google Data в настоящее время его не принимают. Если вы используете tidy , обязательно добавьте дополнительные пробелы между этими атрибутами в элементе entry .

3. Обновление записи на сервере

Используя URL-адрес edit , необходимо PUT копию записи на сервис с помощью cURL. Необходимо добавить заголовок, указывающий тип контента, отправляемого на сервер. В следующем фрагменте кода предполагается, что файл с обновлённой записью сохранён в updated_entry.xml.

curl --silent --data-binary "@updated_entry.xml" --request PUT --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Создание записей

Записи в API Google Data создаются путём выполнения HTTP POST к URL-адресу записи с новой записью. atom:id назначается сервером, поэтому его не обязательно включать в новые записи. Самый простой способ создать новую запись — взять старую и изменить её. Следующий пример как раз это и делает.

  1. Получите запись шаблона, используя atom:link/@rel='self'
  2. Измените запись шаблона локально, чтобы удалить ненужную информацию и внести необходимые изменения.
  3. POST запись обратно на сервер методом POST, используя URL-адрес post фида. Он указан либо в полученном фиде в качестве значения href для элемента link с rel='http://schemas.google.com/g/2005#post' , либо в документации сервиса на сайте http://code.google.com .

1. Получить шаблон записи

Отдельную запись можно извлечь, используя значение href элемента link с rel='self' таким же образом, как запись была извлечена до ее обновления в приведенном выше примере.

curl --silent --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593" | tidy -xml -indent -quiet > template_entry.xml

Ответ после использования tidy будет выглядеть примерно так:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:exif='http://schemas.google.com/photos/exif/2007'
xmlns:geo='http://www.w3.org/2003/01/geo/wgs84_pos#'
xmlns:gml='http://www.opengis.net/gml'
xmlns:georss='http://www.georss.org/georss'
xmlns:photo='http://www.pheed.com/pheed/'
xmlns:media='http://search.yahoo.com/mrss/'
xmlns:batch='http://schemas.google.com/gdata/batch'
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <id>
  http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981</id>
  <published>2007-05-23T04:55:52.000Z</published>
  <updated>2007-05-23T04:55:52.000Z</updated>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Trip To Italy</title>
  <summary type='text'>This was the recent trip I took to
  Italy.</summary>
  <rights type='text'>public</rights>
  <link rel='http://schemas.google.com/g/2005#feed'
  type='application/atom+xml'
  href='http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='alternate' type='text/html'
  href='http://picasaweb.google.com/brad.gushue/TripToItaly' />
  <link rel='self' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981' />
  <link rel='edit' type='application/atom+xml'
  href='http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389741123981/1179896152905401' />
  <author>
    <name>Brad</name>
    <uri>http://picasaweb.google.com/brad.gushue</uri>
  </author>
  <gphoto:id>9810315389741123981</gphoto:id>
  <gphoto:name>TripToItaly</gphoto:name>
  <gphoto:location></gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:timestamp>1179896152000</gphoto:timestamp>
  <gphoto:numphotos>0</gphoto:numphotos>
  <gphoto:numphotosremaining>500</gphoto:numphotosremaining>
  <gphoto:bytesUsed>0</gphoto:bytesUsed>
  <gphoto:user>brad.gushue</gphoto:user>
  <gphoto:nickname>Brad</gphoto:nickname>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
  <gphoto:commentCount>0</gphoto:commentCount>
  <media:group>
    <media:title type='plain'>Trip To Italy</media:title>
    <media:description type='plain'>This was the recent trip I took
    to Italy.</media:description>
    <media:keywords></media:keywords>
    <media:content url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/TripToItaly.jpg'
    type='image/jpeg' medium='image' />
    <media:thumbnail url='http://lh5.google.com/brad.gushue/ADFUFKqeA5E/AAAAAAAAABc/V6Sga_Z03WU/s160-c/TripToItaly.jpg'
    height='160' width='160' />
    <media:credit>Brad</media:credit>
  </media:group>

</entry>

2. Измените запись шаблона.

Мы хотим создать альбом под названием «Кёрлинг в Канаде» с фотографиями с нашего недавнего матча по кёрлингу. Google Data позволяет удалять элементы Atom, значения для которых предоставляет сервер, поэтому для создания этого простого шаблона записи мы удалим atom:id , atom:published , atom:updated , atom:author и различные элементы atom:link из ленты. Это позволит нам получить урезанную запись шаблона. Затем запись нужно изменить, чтобы она соответствовала новому альбому, который мы создаём:

<entry xmlns='http://www.w3.org/2005/Atom' 
xmlns:gphoto='http://schemas.google.com/photos/2007'>
  <category scheme='http://schemas.google.com/g/2005#kind'
  term='http://schemas.google.com/photos/2007#album' />
  <title type='text'>Curling in Canada</title>
  <summary type='text'>Pictures of all my curling matches in Canada.</summary>
  <gphoto:location>Canada</gphoto:location>
  <gphoto:access>public</gphoto:access>
  <gphoto:commentingEnabled>true</gphoto:commentingEnabled>

</entry>

Примечание : Не забудьте включить все определения пространств имён XML, которые используются в качестве атрибутов элемента atom:entry при публикации новой записи. Отсутствие этих определений приведёт к исключениям при парсинге. Кроме того, tidy заменит пробелы между определениями пространств имён символами новой строки. Хотя это допустимый XML, сервисы Google Data в настоящее время его не принимают. Если вы используете tidy , обязательно добавьте дополнительные пробелы между этими атрибутами в элементе entry .

3. Размещение новой записи на сервере

Команда curl для публикации новой записи на сервере очень похожа на обновление существующей записи, за исключением того, что URL-адрес отличается:

curl --silent --request POST --data-binary "@template_entry.xml" --header "Content-Type: application/atom+xml" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue" | tidy -xml -indent -quiet

Если публикация прошла успешно, полученный XML-файл будет копией только что созданной записи. Эта запись будет содержать данные, сгенерированные сервером во время её создания, включая значения элементов atom:id , atom:published , atom:updated и atom:link . Полученные значения link можно использовать для редактирования или удаления записи, если за это время не будут внесены дополнительные изменения.

Удаление записей

Удаление записей очень похоже на обновление, за исключением того, что вместо HTTP-метода HTTP PUT метод HTTP DELETE , и отправка данных не требуется. Как и в случае с запросом на обновление, в качестве цели HTTP-запроса используется URL-адрес edit .

curl --silent --request DELETE --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/entry/api/user/brad.gushue/albumid/9810315389720904593/123456"

Загрузка медиа-объектов

Важной функцией API данных веб-альбомов Picasa и API данных списка документов является возможность загрузки двоичных объектов. cURL легко справляется с загрузкой двоичных данных и заголовка-слага. Однако API данных списка документов в настоящее время требует отправки XML вместе с двоичными данными в виде составного сообщения MIME. Формирование составного сообщения выходит за рамки данной статьи.

В примере ниже показано, как загрузить изображение с названием sweeping_the_rock.png в веб-альбом Picasa под названием «Sweeping the rock»:

curl --silent --request POST --data-binary "@sweeping_the_rock.png" --header "Slug: Sweeping the rock" --header "Content-Type: image/png" --header "Authorization: GoogleLogin auth=ABCDEFG" "http://picasaweb.google.com/data/feed/api/user/brad.gushue/albumid/5113621341847124417" | tidy -xml -indent -quiet

Другие инструменты командной строки

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

Популярные инструменты включают в себя:

  • Telnet и OpenSSL используются для создания сырых сокет-подключений (обычного текстового и SSL-подключений соответственно) к веб-серверам и могут использоваться для взаимодействия со службами Google Data. Обратите внимание, что не все службы Google Data поддерживают SSL. Вот как открыть соединения:
    • telnet picasaweb.google.com 80 (API данных веб-альбомов Picasa)
    • openssl s_client -connect www.google.com:443 (API данных Календаря Google и других служб на www.google.com)
    После установления соединения необходимо отправить необработанный HTTP-запрос. Этот запрос включает HTTP-команду, относительный путь, версию, все заголовки и тело запроса. Вот пример:
    POST /data/feed/api/user/brad.gushue HTTP/1.1
    Host: picasaweb.google.com
    Authorization: GoogleLogin auth=ABCDEFG
    Content-Length: 493
    
    <entry xmlns='http://www.w3.org/2005/Atom' 
    xmlns:gphoto='http://schemas.google.com/photos/2007'>
      <category scheme='http://schemas.google.com/g/2005#kind'
      term='http://schemas.google.com/photos/2007#album' />
      <title type='text'>Curling in Canada</title>
      <summary type='text'>Pictures of all my curling matches in Canada.</summary>
      <gphoto:location>Canada</gphoto:location>
      <gphoto:access>public</gphoto:access>
      <gphoto:commentingEnabled>true</gphoto:commentingEnabled>
    
    </entry>
    
    При отправке необработанных HTTP-данных имейте в виду, что операции POST и PUT потребуют вычисления значения заголовка Content-Length . Для вычисления этого значения можно использовать UNIX-утилиту wc . Поместите всё содержимое тела HTTP-запроса в текстовый файл, например, template_entry.xml (пример приведен выше), и выполните команду wc -c template_entry.xml . Отладка часто бывает затруднительной, если вы случайно используете неверное значение заголовка Content-Length .
  • wget обычно используется для загрузки данных с веб-сервера в локальный файл. Однако wget обладает множеством возможностей, позволяющих ему выполнять все типы запросов, необходимые для взаимодействия со службами Google Data. Вот пример использования wget для отправки новой записи альбома в Picasa Web Albums методом POST :
    wget --post-file template_entry.xml --header "Authorization: GoogleLogin auth=ABCDEFG" --header "Content-Type: application/atom+xml" "http://picasaweb.google.com/data/feed/api/user/brad.gushue"
    
  • xsltproc — это инструмент для применения XSL-преобразований ( XSLT ) к XML-документам. Его можно использовать для простого извлечения нужных фрагментов данных из XML-записи или фида, возвращаемых API Google Data, а также для создания новых или обновлённых записей.

Заключение

Как вы уже видели, cURL и ряд других инструментов командной строки можно использовать для лёгкого взаимодействия со службами Google Data с помощью необработанного XML и HTTP. Если у вас есть вопросы об использовании этих инструментов с вашим любимым API Google Data, присоединяйтесь к нам на форумах, посвящённых API.