@easyscripter

Как получить содержимое Google Docs При помощи exportLinks?

Доброго времени суток. есть такая задача: нужно конвертировать документ Google (Docs,Sheets, Slides) в Office формат и закинуть на гугл диск обратно. Столкнулся с проблемой, что при получении содержимого файла через exportLinks для файлов, которые не расшарены я получаю верстку страницы авторизации вместо содержимого файла, а для остальных все ок. file export в данном случае не помощник, т.к есть файлы больше 10МБ. Хотел бы узнать, как можно получить содержимое файла, а не верстку страницы авторизации.

Код Google Controller:
public function getExportUrl($file)
    {
        $exportURL = '';
        switch ($file->getMimeType()) {
            case self::FILE_TYPE_SPREADSHEET:
                $exportURL = "https://docs.google.com/spreadsheets/d/".$file['id']."/export?format=xlsx";
                break;

            case self::FILE_TYPE_DOCUMENT:
                $exportURL = "https://docs.google.com/document/d/".$file['id']."/export?format=docx";
                break;

            case self::FILE_TYPE_PRESENTATION:
                $exportURL = "https://docs.google.com/presentation/d/".$file['id']."/export/pptx";
                break;
            default:
                $exportURL = '';
                break;
        }
        return $exportURL;
    }

    public function getExportMymeType($file)
    {
        $exportFormat = '';
        switch ($file->getMimeType()) {
            case self::FILE_TYPE_SPREADSHEET:
                $exportFormat = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
                break;

            case self::FILE_TYPE_DOCUMENT:
                $exportFormat = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
                break;

            case self::FILE_TYPE_PRESENTATION:
                $exportFormat = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
                break;
            default:
                $exportFormat = '';
                break;
        }
        return $exportFormat;
    }

    public function convertGoogleDoc($file, $exportFolderId)
    {
        try {
            $exporting_file = new \Google_Service_Drive_DriveFile();
            $exporting_file->setName($file['name']);
            $exporting_file->setParents([$exportFolderId]);
            $exporting_file->setProperties(
                ["modifiedTimeOfOriginalFile" => date('Y-m-d H:i:s', strtotime($file['modifiedTime']))]
            );
            $content = null;
            $exporting_file->setMimeType($this->getExportMymeType($file));
            $content = file_get_contents($this->getExportUrl($file));

            $exported_file = $this->drive->files->create($exporting_file, array(
                'data' => $content,
                'uploadType' => 'multipart',
                'fields' => 'id, name, modifiedTime, iconLink, webViewLink, parents, fileExtension, mimeType, size, webContentLink, properties',
            ));
            return $exported_file;
        } catch (Exception $e) {
            print "An error occurred: " . $e->getMessage();
        }
    }


Код Google.php
class Google
{
    public function client()
    {
        $client = new \Google_Client();
        $client->setClientId(env('GOOGLE_CLIENT_ID'));
        $client->setClientSecret(env('GOOGLE_CLIENT_SECRET'));
        $client->setRedirectUri('postmessage');
        $client->setScopes(array("https://www.googleapis.com/auth/drive"));
        $client->setApprovalPrompt(env('GOOGLE_APPROVAL_PROMPT'));
        $client->setAccessType(env('GOOGLE_ACCESS_TYPE'));
        return $client;
    }


    public function drive($client)
    {
        $drive = new \Google_Service_Drive($client);
        return $drive;
    }
}

Что получаю:
60a3b1601ac85390954365.png
  • Вопрос задан
  • 162 просмотра
Пригласить эксперта
Ответы на вопрос 1
Так у вас походу версия где нужно через веб выдавать разрешения к действиям от лица аккаунта. Я делал через сервисный аккаунт гугла с равнозначными доступами что и у основного аккаунта (правда для таблиц, но суть такая же)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы