Я уже некоторое время использую Zend Gdata, и сегодня я получаю ошибку
Notice: Undefined offset: ClientLogin.php on line 150
через php, это работает какое-то время, и сегодня, не меняя ничего, что оно перестало работать, я предполагаю, что некоторые устаревшие услуги от имени google с zend gdata могут быть Zend_Gdata_ClientLogin::getHttpClient( )
или что-то еще, может ли кто-нибудь подтвердить или помогите мне в этом вопросе. код im, используемый для подключения, выглядит следующим образом:
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);
как я уже сказал, я использовал это какое-то время, и на моем конце ничего не изменилось
В конце концов, я заканчиваю что-то вроде этого (очень грубый код до сих пор, но достаточно для тех, кто ищет решения). Вам нужен php google-файл электронной таблицы https://github.com/asimlqt/php-google-spreadsheet- клиент ). Это крошечный пример вставки одной строки в мою таблицу (извините за мой код, но показывая только рабочий пример) Спасибо, что bram brambring показывает лучший способ авторизации – ответ by bram brambring
<?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, благодаря bram brambring для его маркерного решения, кажется более простым, чем мой. Сейчас, как шарм, я надеюсь, что его способ будет обновлять токен в обычном режиме. СПАСИБО, ЧУВАК!
Я использую ClientLogin для серверного приложения.
сегодня нужно было перейти на oAuth2. Я объединил некоторые примеры, которые я нашел, чтобы получить токен авторизации, используя «учетную запись службы»,
function get_token() { $client_email = '0-1.apps.googleusercontent.com'; $client_email = '0-1@developer.gserviceaccount.com'; $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-таблицей-клиентом
$accessToken = get_token(); $serviceRequest = new DefaultServiceRequest($accessToken); ServiceRequestFactory::setInstance($serviceRequest); $spreadsheetService = new Google\Spreadsheet\SpreadsheetService(); $spreadsheetFeed = $spreadsheetService->getSpreadsheets(); $spreadsheet = $spreadsheetFeed->getByTitle('Hello World');
Также застрял в этом вопросе, похоже, что ClientLogin Google был удален
Важно: не используйте ClientLogin для новых приложений. Вместо этого используйте более безопасный протокол аутентификации OAuth. ClientLogin является устаревшим протоколом проверки подлинности и отключается 20 апреля 2015 года. В то время запросы CustomerLogin больше не будут отвечать. Если у вас есть существующие приложения, использующие ClientLogin, мы рекомендуем вам перейти на OAuth. Поддержка ClientLogin в этой библиотеке будет удалена в следующей крупной версии.
Теперь, чтобы попробовать переделать мои таблицы с помощью OAuth, это может быть решение: удалено cus no more reputation, выведет ссылку на кометы
редактировать; имея некоторые проблемы с magnetikonline, так попробуем это решение: удалить cuz не более репутацию, опубликует ссылку на комментарии
edit2; / '\ это решение намного лучше, я должен идти сейчас, но у меня есть некоторый успех в этой библиотеке, он работает намного лучше, насколько я вижу, и предоставляет больше возможностей, попробуйте.
Для устранения проблемы с токеном попробуйте https://github.com/asimlqt/php-google-oauth . Этот способ работал и для меня, и для меня намного проще, я обнаружил массив с моей токенной информацией (если вы попробуете этот токен со второй библиотекой, маркер ur станет массивом, а вам нужно только $ 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-клиент), шаг 6 помогает понять, как мой файл должен смотреть.
У меня также были скрипты php с использованием Zend для Google Spreadsheets. Они отлично справлялись в течение многих лет, но перестали работать сегодня в полдень без причины. Что изменилось на стороне Google и как легко ее исправить?
Это устарело ClientLogin, оно работает снова! Это был такой сюрприз в канун конференции Google I / O? Мне пришлось написать самодельное решение. Сторонние библиотеки были в основном непригодными для использования, я написал около 10 методов, я думаю, что это лучше, чем альтернативы, которые слишком сложны и громоздки. Вы можете купить у меня)) Еще не готовы надеть github)