2015-05-27 12 views
8
Verbindungs ​​

ive für eine Weile jetzt Zend Gdata wurden verwendet und heute im einen Fehler vonzend gdata und Google-Tabelle nicht

Notice: Undefined offset: ClientLogin.php on line 150 

über php bekommen, dies für eine Weile wurde jetzt zu arbeiten, und heute ohne Änderung alles, was es aufgehört hat zu arbeiten, ich rate einige veraltete Service im Auftrag von Google mit der Zend Gdata vielleicht die Zend_Gdata_ClientLogin::getHttpClient() Methode oder etwas, kann jemand bestätigen oder mir mit diesem Problem helfen. der Code im ist eine Verbindung wie folgt verwendet:

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

i den zend gdata mit den Google-Tabellen auf diese Linie

auch die Fehlerpunkten speziell bin mit

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

wie ich schon sagte, Ich habe das schon eine Weile benutzt und nichts hat sich an meinem Ende geändert.

Antwort

0

Am Ende endende ich mit so etwas (sehr rohen Code bisher, aber genug für diejenigen, die nach Lösung suchen. Sie brauchen PHP Google Tabellenkalkulation Client https://github.com/asimlqt/php-google-spreadsheet-client). Das ist winziges Beispiel für das Einfügen Zeile zu meiner Tabelle (sorry über meinen Code, aber sho Flügel nur Arbeitsbeispiel) Dank für Bram Brambring besseren Weg zulassungs zeigt - answer 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 = '[email protected]om'; 
     $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 :) 

    } 
} 

Und in Haupt Modell Ich verwende:

$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 dank Bram Brambring für sein Token Lösung, scheint einfacher als meine. Ich arbeite jetzt wie ein Zauberer, ich hoffe, er wird Token normal auffrischen. DANKE KUMPEL!

+0

Maxim Fedan, wenn Sie meine andere Frage bitte besuchen können [Link] http : //stackoverflow.com/questions/30532607/copyfile-function-google-api-php Wenn Sie mir dabei helfen können bitte – nonaxanon

+0

nicht wirklich mit Google Drive API gearbeitet und nie kopiert/erstellt/entfernt :(Entschuldigung –

-2

Ich habe auch PHP-Skripte mit Zend für Google Spreadsheets. Sie laufen seit Jahren super, haben aber heute mittags ohne Grund zu arbeiten aufgehört. Was hat sich auf der Seite von Google geändert und wie kann es leicht behoben werden?

0

als gut mit dieser Frage stecken, so scheint wie Client Googles schließlich

Important: Do not use ClientLogin for new applications. Instead, use the more secure OAuth authentication protocol. ClientLogin is a deprecated authentication protocol and is being turned down on April 20, 2015. At that time, ClientLogin requests will no longer be answered. If you have existing applications that use ClientLogin, we encourage you to migrate to OAuth. The ClientLogin support in this library will be removed in the next major release.

entfernt war, meine Tabellen mit OAuth nun versuchen, Remake, das die Lösung sein kann: Cuz nicht mehr Ruf entfernt, wird Link posten in commens

bearbeiten; einige Probleme mit magnetikonline, so werde diese Lösung versuchen: entfernt cuz nicht mehr Ruf, wird Link in Kommentare

edit2;/'Diese Lösung ist viel besser, ich muss jetzt gehen, aber ich habe ein wenig Erfolg mit dieser Bibliothek, es funktioniert viel besser, soweit ich sehe und bieten mehr Funktionalität, versuchen Sie es.

Für Ihr Problem mit Token, versuchen Sie https://github.com/asimlqt/php-google-oauth. Dieser Weg funktioniert auch für mich und es ist viel einfacher, ich habe Array mit meiner Token-Information erhalten (wenn du diesen Token mit der zweiten Bibliothek ausprobieren willst, wird dein Token Array sein, während du nur $ accessToken ['access_token'] Teil brauchst, um $ serviceRequest = new DefaultServiceRequest ($ accessToken) machen;

ein weiteres großes Tutorial gefunden: http://konstantinshkut.com/blog/2014/11/01/how_to_get_data_from_google_spreadsheet_in_yii_php_application (das ist für die zweite Lösung, asimlqt/php-google-Tabelle-Client), Schritt 6 viel hilft zu verstehen, wie meine Datei muss

+0

Verwendung: exchangecodefortokens.php -c Autorisierung CODE ich fest, denke, Sie können einige Hinweise teilen? – nonaxanon

+0

Ihr Code wie 4/z7xfjN3RI3dNTy38cfMzu4zF9pJNrJxCk2m-55LA.cqdvdLrNQ335uyeEpmwI # suchen muß, es gab mir Fehler, bis ich versuchte nur vor Punktteil zu verwenden, also in meinem Fall 4/z7xfjN3RI3dNTy38cfMzu4zF9pJNrJxCk2m-55LA (php exchangecodefortorkens.php -c 4/z7xfjN3RI3dNTy38cfMzu4zF9pJNrJxCk2m -55LA) –

+0

ok aber wie führe ich diesen PHP-Austausch ... das ist, was ich keine Ahnung habe – nonaxanon

4

Ich verwende ClientLogin für eine Server-zu-Server-Anwendung.

benötigt, um heute schnell auf oAuth2 umzusteigen. Ich fusionierte einige Beispiele, die ich das Berechtigungszeichen unter Verwendung eines ‚Dienstkonto‘

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; 
} 

ich die Entwickler E-Mail nicht die App E-Mail, die gleiche E-Mail hinzugefügt werden müssen

an der Tabelle als Benutzer zu verwenden, erhalten benötigt gefunden

das generierte Token kann dann mit php-google-Tabelle-Client

$accessToken = get_token(); 

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

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

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

könnten Sie erklären Wie Sie die "abc.p12" -Datei erstellt haben? Als ich das Dienstkonto erstellt habe, wurde stattdessen eine .json-Datei heruntergeladen. Auch, welche Abhängigkeitsdateien für Ihre get_token() -Funktion benötigt werden? Danke! – Concept211

+1

Die .p12-Datei wird in generiert Ihre API-Konsole, gehen Sie zu Google Typ API-Konsole, in der Regel zuerst Link, mit dem Konto für den Dienst anmelden, und erstellen Client-ID, Dienstkonto, wird es automatisch herunterladen eine Datei mit der Erweiterung .p12 nicht den Dateinamen ändern ,,, der Dateiname ist super lang – nonaxanon

-3

das Clientlogin veraltet verwendet werden, es funktioniert wieder! Es war so eine Überraschung am Vorabend der Konferenz Google I/O? Ich musste eine selbstgemachte Lösung schreiben. Third-Party-Bibliotheken waren im Grunde unbrauchbar, Ich schrieb über 10 Methoden, ich denke, es ist besser als die Alternativen, die zu komplex und umständlich sind. (Sie können von mir kaufen)) Noch nicht bereit, github)