0

Привет и извините за мой плохой английский. Я добавляю на сайт OAuth 2.0 с клиентом google api php и благодарит Карла за instructions , как получить доступ к листам с клиентом google api php. Мой код: index.php:Проверка или получение доступа к листу с помощью токена (или идентификатора пользователя) для содержимого содержимого экспорта. Google api php client libary

<?php 
define('ROOT',$_SERVER['DOCUMENT_ROOT']); 
require_once ROOT.'/lib/google-api-php-client/vendor/autoload.php'; 
include_once ROOT.'/lib/google-api-php-client/examples/templates/base.php'; 

$client = new Google_Client(); 

putenv("GOOGLE_APPLICATION_CREDENTIALS=service-account-credentials.json"); 
if ($credentials_file = checkServiceAccountCredentialsFile()) { 
    // set the location manually 
    $client->setAuthConfig($credentials_file); 
} elseif (getenv('GOOGLE_APPLICATION_CREDENTIALS')) { 
    // use the application default credentials 
    $client->useApplicationDefaultCredentials(); 
} else { 
    echo missingServiceAccountDetailsWarning(); 
    exit; 
} 
$client->setApplicationName(APPLICATION_NAME); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setAuthConfigFile('client_secrets.json'); 
$client->setScopes(['https://www.googleapis.com/auth/drive','https://spreadsheets.google.com/feeds']); 

if (isset($_SESSION['access_token']) && $_SESSION['access_token']) 
{ 
    $fileId = 'FILE_ID_HERE'; 
    $tokenArray = $client->fetchAccessTokenWithAssertion(); 
    $accessToken = $tokenArray["access_token"]; 
    $service = new Google_Service_Drive($client); 
    $results = $service->files->get($fileId); 
    $url = "https://spreadsheets.google.com/feeds/list/$fileId/od6/private/full"; 
    $method = 'GET'; 
    $headers = ["Authorization" => "Bearer {$accessToken}", "GData-Version" => "3.0"]; 
    $httpClient = new GuzzleHttp\Client(['headers' => $headers]); 
    $resp = $httpClient->request($method, $url); 
    $body = $resp->getBody()->getContents(); 
    $code = $resp->getStatusCode(); 
    $reason = $resp->getReasonPhrase(); 
    echo "$code : $reason\n\n"; 
    echo "$body\n"; 
} 
else 
{ 
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'; 
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 
} 

oauth2callback.php:

<?php 
define('ROOT',$_SERVER['DOCUMENT_ROOT']); 
require_once ROOT.'/lib/google-api-php-client/vendor/autoload.php'; 
session_start(); 

$client = new Google_Client(); 
$client->setApplicationName(APPLICATION_NAME); 
$client->setClientId(CLIENT_ID); 
$client->setClientSecret(CLIENT_SECRET); 
$client->setAuthConfigFile('client_secrets.json'); 
$client->setRedirectUri('http://' . $_SERVER['HTTP_HOST'] . '/oauth2callback.php'); 
$client->addScope(Google_Service_Drive::DRIVE_METADATA_READONLY); 

if (!isset($_GET['code'])) { 
    $auth_url = $client->createAuthUrl(); 
    header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL)); 
} else { 
    $client->authenticate($_GET['code']); 
    $_SESSION['access_token'] = $client->getAccessToken(); 
    $redirect_uri = 'http://' . $_SERVER['HTTP_HOST'] . '/'; 
    header('Location: ' . filter_var($redirect_uri, FILTER_SANITIZE_URL)); 
} 

Если я вхожу:

$ FILEID = 'FILE_ID_HERE'; // ПРАВИЛО для листа в Google Docs таблицы: доступ только с приглашением

Затем я получаю сообщение об ошибке: Неустранимая ошибка: исключить исключение «Google_Service_Exception» с message "{" error ": {" errors ": [{" domain ":" global "," reason ":" notFound "," message ":" Файл не найден: [FILE_ID_HERE]. "," locationType ":" параметр "," location ":" fileId "}] .....

Но, я зарегистрировался (аккаунт Google) с пользователем, который пригласил его для просмотра этого документа!

И если я вхожу:

$ FILEID = 'FILE_ID_HERE'; /// ПРАВИЛО для листа в Google Docs таблицы: доступ для всех, у кого есть ссылка

Все в порядке, и я получаю: 200 : OK все данные документа

Вопрос. Как получить доступ к листу, если я зарегистрировался (учетная запись Google) с пользователем, который пригласил его для просмотра этого документа. Что я делаю неправильно? Где я ошибаюсь? И не очень важно. Экспорт в csv

ответ

0

DriveFiles может использоваться совместно, поэтому проверка токена доступа пользователя не требуется.

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

Предоставленное сообщение об ошибке указывает, что File was not found, это может быть связано либо с тем, что у пользователя нет доступа к файлу, либо он не существует (неправильный идентификатор файла). Он предложил, чтобы пользователь поговорил с владельцем файла, чтобы получить разрешения для файла.

И наконец, если у вас уже есть доступ к файлу, вы можете download them. Существует три способа его реализации. Но если вы хотите, чтобы он был экспортирован как файл .csv, вы можете использовать метод export и указав тип MIME (text/csv).

РНР фрагмент кода в документации, как например:

$fileId = '1ZdR3L3qP4Bkq8noWLJHSr_iBau0DNT4Kli4SxNc2YEo'; 
$content = $driveService->files->export($fileId, 'application/pdf', array('alt' => 'media')); 

Обратите внимание, что эта text/csv будет работать только для листов. Другие типы MIME для экспорта можно увидеть в документации.

 Смежные вопросы

  • Нет связанных вопросов^_^