@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
  • Вопрос задан
  • 142 просмотра
Пригласить эксперта
Ответы на вопрос 1
Так у вас походу версия где нужно через веб выдавать разрешения к действиям от лица аккаунта. Я делал через сервисный аккаунт гугла с равнозначными доступами что и у основного аккаунта (правда для таблиц, но суть такая же)
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
22 апр. 2024, в 16:15
18000 руб./за проект
23 апр. 2024, в 16:55
10000 руб./за проект