API списка документов Google - как опубликовать документ

Я совершенно не понимаю, как можно программно опубликовать документ Google (в частности, электронную таблицу).

Я прочитал Руководство по протоколу API списка документов Google и обнаружил следующее:

http://code.google.com/apis/documents/docs/3.0/developers_guide_protocol.html#GettingRevisions

Следующий раздел статьи начинается с «Публикация документов путем публикации одной ревизии», и именно здесь я нашел этот пример:

PUT /feeds/default/private/full/resource_id/revisions/revision_number
GData-Version: 3.0
Authorization: <your authorization header here>
Content-Length: 722
Content-Type: application/atom+xml

<entry xmlns="http://www.w3.org/2005/Atom" xmlns:gd='http://schemas.google.com/g/2005'
       xmlns:docs="http://schemas.google.com/docs/2007" gd:etag="W/"DkIBR3st7ImA9WxNbF0o."">
  <id>https://docs.google.com/feeds/id/resource_id/revisions/1</id>
  <updated>2009-08-17T04:22:10.440Z</updated>
  <app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-06T03:25:07.799Z</app:edited>
  <title>Revision 1</title>
  <content type="text/html" src="https://docs.google.com/feeds/download/documents/Export?docId=doc_id&amp;revision=1"/>
  <link rel="alternate" type="text/html"
      href="https://docs.google.com/Doc?id=doc_id&amp;revision=1"/>
  <link rel="self" type="application/atom+xml"
      href="https://docs.google.com/feeds/default/private/full/resource_id/revisions/1"/>
  <author>
    <name>user</name>
    <email>[email protected]</email>
  </author>
  <docs:publish value="true"/>
  <docs:publishAuto value="false"/>
</entry>

Я получаю каналы списка документов и рабочие листы CRUDing, но я не могу заставить публикацию работать, и я не понимаю, как она должна работать. Моя основная настройка для установления соединения с моим фидом и подготовки данных для PUT выглядит следующим образом:

<?php
set_include_path($_SERVER['DOCUMENT_ROOT'].'/library/');

require_once 'Zend/Loader/Autoloader.php';
$autoloader = Zend_Loader_Autoloader::getInstance();
$autoloader->setFallbackAutoloader(true);


$theId = 'my-worksheet-id';

$user = "my-gmail-account-name";
$pass = "my-gmail-account-password";
$service = Zend_Gdata_Docs::AUTH_SERVICE_NAME;
$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);

$service = new Zend_Gdata($client);


$xml = "<entry  xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google.com/g/2005'
        xmlns:docs='http://schemas.google.com/docs/2007' gd:etag='W/\"DkIBR3st7ImA9WxNbF0o.\"'>

        <id>https://docs.google.com/feeds/id/spreadsheet:$theId/revisions/1</id>
        <updated>2009-08-17T04:22:10.440Z</updated>
        <app:edited xmlns:app='http://www.w3.org/2007/app'>2009-08-06T03:25:07.799Z</app:edited>
        <title>Revision 1</title>
        <content type='text/html' src='https://docs.google.com/feeds/download/documents/Export?docId=$theId&amp;revision=1'/>
        <link rel='alternate' type='text/html'
            href='https://docs.google.com/Doc?id=$theId&amp;revision=1'/>
        <link rel='self' type='application/atom+xml'
            href='https://docs.google.com/feeds/default/private/full/spreadsheet:$theId/revisions/1'/>
        <author>
            <name>$user</name>
            <email>$user</email>
        </author>
        <docs:publish value='true'/>
        <docs:publishAuto value='false'/>
      </entry>";

$putURL = "http://docs.google.com/feeds/default/private/full/spreadsheet:".$theId."/revisions/0";
$data = $service->put($xml, $putURL);
?>

Что приводит к

Fatal error: Uncaught exception 'Zend_Gdata_App_HttpException' with message 'Expected response code 200, got 400 Invalid request URI

Кто-нибудь может мне помочь? Кто-нибудь успешно опубликовал документ Google программно?


person Matty B    schedule 18.04.2011    source источник


Ответы (4)


Предполагая, что документ уже создан и имеет идентификатор документа XXXX.

Что вам нужно сделать, так это отправить запрос «PUT» с определенными заголовками и XML (запись, описывающая ваш документ) в качестве тела по определенному URL-адресу.

Поскольку вы не меняете какое-либо содержимое документа (только метаданные), ваш целевой URL будет выглядеть так ...

https://docs.google.com/feeds/default/private/full/XXXX/revisions/0

Первое, что вам нужно сделать, это пройти аутентификацию в соответствующей службе Google.

$client = Zend_Gdata_ClientLogin::getHttpClient(GDOC_LOGIN, GDOC_PASS,'writely');

Используйте возвращенный объект, чтобы получить токен авторизации.

$auth_token = $client->getClientLoginToken();

В Zend / Gdata / App.php есть вспомогательная функция для выполнения запроса PUT. Подготовьте параметры для этого метода вот так ...

$method = "PUT";
$url ="https://docs.google.com/feeds/default/private/full/XXXX/revisions/0";
$headers['GData-Version'] = '3.0';
$headers['If-Match'] = '*';
$headers['Authorization'] = "GoogleLogin auth = $auth_token";
$headers['Content-Length'] = '380';
$headers['Content-Type'] = 'application/atom+xml';
$body = <<<XML
<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:docs="http://schemas.google.com/docs/2007"
    xmlns:gd="http://schemas.google.com/g/2005">
  <category scheme="http://schemas.google.com/g/2005#kind"
      term="http://schemas.google.com/docs/2007#spreadsheet"/>
    <docs:publish value="true"/>
    <docs:publishAuto value="true"/>
</entry>
XML;
$contentType = "application/atom+xml";
$remainingRedirects = 99;

Затем вызовите вспомогательную функцию ...

$app = new Zend_Gdata_App();
$app->performHttpRequest($method, $url, $headers, $body, $contentType, $remainingRedirects);

Удачи! Позвольте мне знать, если это помогает!

person damon    schedule 21.07.2011
comment
Спасибо! Это помогло мне пройти 99% пути. Я получаю ошибку идентификатора документа, но документ публикуется. - person Matty B; 22.07.2011

Хорошо ... с чего мне начать?

Во-первых, ваш URL неверен. (идентификатор ресурса, который вы используете, предназначен для JSON / XML, а не для URL )

у вас есть

$putURL = "http://docs.google.com/feeds/default/private/full/spreadsheet:".$theId."/revisions/0";

и ты должен иметь

$putURL = "http://docs.google.com/feeds/default/private/full/$theId/revisions/0";

(вы можете опустить. для конкатенации, если вы используете "в качестве разделителей")

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

  1. Ваш заголовок авторизации отсутствует.
  2. В вашем XML вы используете ревизию 1, но в вашем URL-адресе есть ревизия / 0
  3. значение написано вручную, и я почти уверен, что вы не пытаетесь опубликовать файл двухлетней давности. То же самое для и
  4. ДОЛЖЕН СООТВЕТСТВОВАТЬ полученному тегу etag, иначе вы не сможете выполнить какой-либо запрос PUT.

Теперь вы можете изменить эти значения вручную, назначая переменные, но я думаю, что лучше использовать структурированный возвращаемый объект Zend GData.

В любом слючае:

  1. Получите в Google документ, который хотите опубликовать.
  2. Найдите правильную запись (в данном случае запись с идентификатором https://docs.google.com/feeds/id/spreadsheet: $ theId / revisions / 1)
  3. изменить документы: опубликовать свойство значения на "истину"
  4. отправить запрос на размещение с измененной записью

это должно работать

person Tivie    schedule 21.06.2011
comment
Спасибо за ваш ответ. Не могли бы вы уточнить и привести пример этой работы? Я получаю сообщение об ошибке недопустимого URI запроса. - person Matty B; 01.07.2011

Я сам новичок в Zend_Gdata, но успешно загрузил в Документы Google.

Я не знаю, это то, что вам нужно, но вот мой код:

$client = Zend_Gdata_ClientLogin::getHttpClient(
    '[email protected]', 
    'MyPassword', 
    Zend_Gdata_Docs::AUTH_SERVICE_NAME
);
$gdClient = new Zend_Gdata_Docs($client);

 $newDocumentEntry = $gdClient->uploadFile(
    $file, 
    null, 
    null, 
    Zend_Gdata_Docs::DOCUMENTS_LIST_FEED_URI
);

Надеюсь, это поможет,

Гарри

person Garry    schedule 20.04.2011
comment
Он хочет опубликовать существующий документ Google, а не загружать новый. ^^ - person Tivie; 21.06.2011

Google сообщает, что введенные данные неверны, и отвечает кодом 400.

попробуйте разместить этот код

<?xml version='1.0' encoding='UTF-8'?>

до

<entry  xmlns='http://www.w3.org/2005/Atom'...
person gorodezkiy    schedule 06.05.2011