Zend GDATA и Google таблицы не соединяются

Я уже некоторое время использую Zend Gdata, и сегодня я получаю сообщение об ошибке

Notice: Undefined offset: ClientLogin.php on line 150

через php, это работает некоторое время, и сегодня, не меняя ничего, перестало работать, я предполагаю, что какой-то устаревший сервис от имени google с zend gdata может быть Zend_Gdata_ClientLogin::getHttpClient( ) метод или что-то, может любой подтвердить или помочь мне в этом вопросе. код, который я использую для подключения, выглядит следующим образом:

    require_once('Zend/Loader.php');
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Docs');
Zend_Loader::loadClass('Zend_Gdata_Spreadsheets');
require_once 'Zend/Gdata.php';
require_once 'Zend/Gdata/AuthSub.php';
require_once 'Zend/Gdata/Spreadsheets.php';
require_once 'Zend/Gdata/Spreadsheets/DocumentQuery.php';
require_once 'Zend/Gdata/Spreadsheets/ListQuery.php';
require_once 'Zend/Loader.php';


$sourceUser = "myemail";
$sourcePass = "mysuperawesomepassword";
$service = Zend_Gdata_Spreadsheets::AUTH_SERVICE_NAME;
$sourceClient = Zend_Gdata_ClientLogin::getHttpClient($sourceUser, $sourcePass, $service);
$connection = new Zend_Gdata_Spreadsheets($sourceClient);

я использую Zend Gdata с таблицами Google

также ошибка указывает именно на эту строку

$sourceClient = Zend_Gdata_ClientLogin::getHttpClient($sourceUser, $sourcePass, $service);

как я уже говорил, я использовал это некоторое время, и ничего не изменилось с моей стороны

8

Решение

В конце я заканчиваю чем-то вроде этого (пока что очень сырой код, но достаточно для тех, кто ищет решение. Вам нужен php google клиент таблиц из https://github.com/asimlqt/php-google-spreadsheet-client). Это крошечный пример вставки одной строки в мою таблицу (извините за мой код, но показывает только рабочий пример)
Спасибо за Брэма Брамбринга, показывающего лучший способ авторизации — ответ Брам Брамбринг

<?php
/*
* Google Spreadsheet class to work with google spreadsheets obviously ;D [using OAuth 2.0, as Zend Gdata is not anymore working]
*/

require_once('/Google/Spreadsheet/ServiceRequestInterface.php');
require_once('/Google/Spreadsheet/DefaultServiceRequest.php');
require_once('/Google/Spreadsheet/ServiceRequestFactory.php');
require_once('/Google/Spreadsheet/Spreadsheet.php');
require_once('/Google/Spreadsheet/SpreadsheetFeed.php');
require_once('/Google/Spreadsheet/SpreadsheetService.php');
require_once('/Google/Spreadsheet/Exception.php');
require_once('/Google/Spreadsheet/UnauthorizedException.php');
require_once('/Google/Spreadsheet/Spreadsheet.php');
require_once('/Google/Spreadsheet/Util.php');
require_once('/Google/Spreadsheet/Worksheet.php');
require_once('/Google/Spreadsheet/WorksheetFeed.php');
require_once('/Google/Spreadsheet/ListFeed.php');
require_once('/Google/Spreadsheet/ListEntry.php');
require_once('/Google/Spreadsheet/CellFeed.php');
require_once('/Google/Spreadsheet/CellEntry.php');
require_once('/Google/Config.php');
require_once('/Google/Client.php');
require_once('/Google/Auth/Abstract.php');
require_once('/Google/Auth/OAuth2.php');
require_once('/Google/Http/Request.php');
require_once('/Google/Utils.php');
require_once('/Google/IO/Abstract.php');
require_once('/Google/IO/Curl.php');
require_once('/Google/Http/CacheParser.php');
require_once('/Google/Logger/Abstract.php');
require_once('/Google/Logger/Null.php');
require_once('/Google/Exception.php');
require_once('/Google/Auth/Exception.php');
require_once('/Google/Auth/AssertionCredentials.php');
require_once('/Google/Cache/Abstract.php');
require_once('/Google/Cache/File.php');
require_once('/Google/Signer/Abstract.php');
require_once('/Google/Signer/P12.php');

use Google\Spreadsheet\DefaultServiceRequest;
use Google\Spreadsheet\ServiceRequestFactory;

class Google_Spreadsheet
{
private $default = array(
'worksheetCols' => 12,
'worksheetRows' => 25
);

private $spreadsheetKey;
private $spreadsheetName;
private $worksheetName;
private $spreadsheetFeed;

public $initialized = true;

public function __construct($spreadsheetKey, $worksheetName, $spreadsheetName = '')
{
$this->spreadsheetKey = $spreadsheetKey;
$this->worksheetName = $worksheetName;
$this->spreadsheetName = $spreadsheetName;

$this->initialized = $this->initialize();
return true;
}

private function getToken() {
$client_email = '318977712937456456454656563tcfjblgoi@developer.gserviceaccount.com';
$private_key = file_get_contents('API Project-f10e456456b60.p12');
$scopes = array('https://spreadsheets.google.com/feeds');
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key,
'notasecret',                                 // Default P12 password
'http://oauth.net/grant_type/jwt/1.0/bearer' // Default grant type
);

$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}

$tokenData = json_decode($client->getAccessToken());
return $tokenData->access_token;
}

public function initialize(/*$reInitialized = false*/)
{
// load OAuth2 token data - exit if false
$tokenData = $this->getToken();
$serviceRequest = new DefaultServiceRequest($tokenData);
ServiceRequestFactory::setInstance($serviceRequest);
$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
try {
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();
} catch (\Google\Spreadsheet\UnauthorizedException $e) {
Google_Spreadsheet::warnAdmin($e->getMessage());
return false;
}

$this->spreadsheetFeed = $spreadsheetFeed;
return true;
}

public function insertRow($rowData, $default_fields = array()) {
$spreadsheetFeed = $this->spreadsheetFeed;
$spreadsheet = $this->spreadsheetKey ? $spreadsheetFeed->getByKey($this->spreadsheetKey) : $spreadsheetFeed->getByTitle($this->spreadsheetName);
if(!$spreadsheet && !empty($this->spreadsheetName)) {
$spreadsheet = $spreadsheetFeed->getByTitle($this->spreadsheetName);
}

if(!$spreadsheet) {
Google_Spreadsheet::warnAdmin('No spreadsheet', serialize($rowData));
return false;
}

$worksheetFeed = $spreadsheet->getWorksheets();
$worksheet = $worksheetFeed->getByTitle($this->worksheetName);

if(!$worksheet) {
//create worksheet if not exist
$worksheet = $spreadsheet->addWorksheet($this->worksheetName, $this->default['worksheetRows'], $this->default['worksheetCols']);

$cellFeed = $worksheet->getCellFeed();
for( $i= 1 ; $i <= $this->default['worksheetCols']; $i++ ) {
if(isset($default_fields[$i])) {
$cellFeed->editCell(1, $i, $default_fields[$i]);
}
else {
$cellFeed->editCell(1, $i, "head");
}

$cellFeed->editCell(2,$i,"content");
}
}

if(!$worksheet) {
Google_Spreadsheet::warnAdmin('No worksheet', serialize($rowData));
return false;
}

$listFeed = $worksheet->getListFeed();

$data = array();
foreach ($listFeed->getEntries() as $entry) {
$values = $entry->getValues();
$data[] = $values;
break; //only first row needed, as we need keys
}

$keys = array();
if(!count($data)) {
Google_Spreadsheet::warnAdmin('No data', serialize($rowData));
return false;
}

foreach ($data[0] as $key => $value) {
$keys[] = $key;
}

$newRow = array();
$count = 0;
foreach($keys as $key) {
if(isset($rowData[$count])) {
$newRow["$key"] = $rowData[$count];
}
else {
$newRow["$key"] = '';
}

$count++;
}

$listFeed->insert($newRow);
return true;
}


static function warnAdmin($reason = '', $content = '') {
//temporal function to warn myself about all the stuff happening wrong :)

}
}

И в основной модели я использую:

$spreadsheet = new Google_Spreadsheet("spreadsheet name or ID", $worksheetname, "My spreadsheet name");

if(!$spreadsheet->initialized) {
Google_Spreadsheet::warnAdmin('cannot initialize spreadsheet', serialize($rowValues));
}


if(!$spreadsheet->initialized || !$spreadsheet->insertRow($rowValues, $this->default_fields)) {
Google_Spreadsheet::warnAdmin('failed to insert row ');
}

@ Edit, благодаря Брэму Брэмбрингу за его решение для токенов, кажется проще, чем мой. Работая как шарм сейчас, я надеюсь, что его способ освежит токен нормально. СПАСИБО, ЧУВАК!

0

Другие решения

Я использую ClientLogin для межсерверного приложения.

сегодня нужно было в спешке переключиться на oAuth2. Я объединил несколько примеров, чтобы найти токен авторизации, используя «Сервисную учетную запись»

function get_token() {
$client_email = '0-1.apps.googleusercontent.com';
$client_email = '[email protected]';
$private_key = file_get_contents('abc.p12');
$scopes = array('https://spreadsheets.google.com/feeds');
$credentials = new Google_Auth_AssertionCredentials(
$client_email,
$scopes,
$private_key,
'notasecret',                                 // Default P12 password
'http://oauth.net/grant_type/jwt/1.0/bearer' // Default grant type
);

$client = new Google_Client();
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion();
}
$tokenData = json_decode($client->getAccessToken());
return $tokenData->access_token;
}

Мне нужно было использовать электронную почту разработчика, а не электронную почту приложения, такую ​​же электронную почту необходимо добавить как пользователь в электронную таблицу

сгенерированный токен затем можно использовать с php-google-spreadsheet-client

$accessToken = get_token();

$serviceRequest = new DefaultServiceRequest($accessToken);
ServiceRequestFactory::setInstance($serviceRequest);

$spreadsheetService = new Google\Spreadsheet\SpreadsheetService();
$spreadsheetFeed = $spreadsheetService->getSpreadsheets();

$spreadsheet = $spreadsheetFeed->getByTitle('Hello World');
4

Застрял в этой проблеме, похоже, что Google ClientLogin был окончательно удален

Важно: не используйте ClientLogin для новых приложений. Вместо этого используйте
более безопасный протокол аутентификации OAuth. ClientLogin является
устарел протокол аутентификации и в апреле отказывается
20, 2015. В это время запросы ClientLogin больше не будут
ответил. Если у вас есть приложения, которые используют ClientLogin, мы
рекомендуем вам перейти на OAuth. Поддержка ClientLogin в этом
библиотека будет удалена в следующем основном выпуске.

Попробую переделать мои таблицы с OAuth сейчас, это может быть решением: удалено, потому что репутации больше нет, опубликует ссылку в комментариях

редактировать; возникли проблемы с magnetikonline, так что попробуем это решение: убрал, потому что репутации больше нет, опубликую ссылку в комментариях

edit2; / ‘\ Это решение намного лучше, я должен идти сейчас, но у меня есть некоторый успех с этой библиотекой, она работает намного лучше, насколько я вижу, и предоставляет больше функциональности, попробуйте.

Если у вас проблема с токеном, попробуйте https://github.com/asimlqt/php-google-oauth . Этот способ также сработал для меня, и он намного проще, я получил массив с моей информацией о токене (если вы попробуете этот токен со второй библиотекой, ваш токен будет массивом, в то время как вам нужна только часть $ accessToken [‘access_token’], чтобы make $ serviceRequest = new DefaultServiceRequest ($ accessToken);

Еще один большой урок, который я нашел: http://konstantinshkut.com/blog/2014/11/01/how_to_get_data_from_google_spreadsheet_in_yii_php_application (это второе решение, asimlqt / php-google-spreadsheet-client), шаг 6 очень помогает понять, как должен выглядеть мой файл.

0

У меня также были php-скрипты, использующие Zend для Google Spreadsheets. Они работали отлично в течение многих лет, но прекратили работать сегодня в полдень без всякой причины. Что изменилось на стороне Google и как это легко исправить?

-2

Это осуждается ClientLogin, он снова работает!
Это был такой сюрприз накануне конференции Google I / O?
Я должен был написать собственное решение. Сторонние библиотеки были в основном непригодны,
Я написал около 10 методов, я думаю, что это лучше, чем альтернативы, которые являются слишком сложными и громоздкими. Вы можете купить у меня))
Пока не готов поставить на github)

-3
По вопросам рекламы [email protected]