Постоянная ссылка на миниатюры в API Google Диска

Я использую Google Drive API (PHP) для загрузки некоторых фотографий на свой диск. Когда файл загружается, в ответе возвращается объект Google_DriveFile для подтверждения успешной передачи. Он включает поле под названием thumbnailLink, доступное через геттер getThumbnailLink. Его содержимое может выглядеть так:

https://lh4.googleusercontent.com/dqVdU195R4_0ZtWxsJlhW1Fr2K30xa2hH3V1KV4UrTBl9QkhOSR0ZqN9HoB-TjEQv8SIJw=s220

До сегодняшнего дня я был уверен, что ссылка не изменится сама по себе с течением времени. Однако, когда я попытался отобразить миниатюру фотографии, которую у меня есть на моем Диске, используя кешированный адрес, который я храню в своей локальной базе данных, я получил ошибку 403 - вы можете увидеть ее по указанной ссылке. Я спросил API для текущей ссылки на миниатюру, и теперь он совершенно другой.

Это случилось со мной только один раз, но для нескольких файлов, то есть все файлы, которые у меня были на моем Диске, неожиданно получили новые миниатюрные ссылки.

Есть ли способ быстро получить эскиз документа (желательно, фотографию) с помощью некоторого постоянного значения или убедиться, что он не изменится? Идеальным решением было бы получить доступ к миниатюре по ссылке, которая включает документ id вместо некоторого хэша, который может измениться.

Ответ 1

попробуйте следующее: https://drive.google.com/thumbnail?authuser=0&sz=w320&id=[fileid] где: - "sz" - это размер, который можно использовать как "w" (ширина), так как "h" (высота) - [fileid] - это идентификатор файла. вы можете найти его в меню "Поделиться", щелкнув правой кнопкой мыши на диске Google ui

Ответ 2

Я просмотрел документацию API, как они предоставили:

Важно. Миниатюры недействительны при каждом изменении содержимого файла. При поставке эскизов важно загружать новые миниатюры каждый раз при изменении содержимого.

Согласно информации, это означает, что новый эскиз генерируется только тогда, когда содержимое файла изменено. Но в вашем случае это действительно переплетенная вещь, и содержимое не изменяется, но уменьшенное изображение изменено. Поскольку из документации нет возможности пакетного процесса, но доступен другой способ, т.е. Web Hook

В соответствии с Документацией имеется доступный веб-крючок, т.е. Files:Watch процесс, через который можно отслеживать изменения, внесенные в файл. Таким образом, это означает, что каждый раз содержимое изменяется, а затем запускается hook, и вы можете изменить кэш миниатюры изображений.

HTTP-запрос может быть отправлен для запроса просмотра изменений файлов.

POST https://www.googleapis.com/drive/v2/files/fileId/watch

Здесь fileID означает идентификатор, указанный после загрузки файла.

В теле запроса укажите данные со следующей структурой:

id     ==>  string  (A UUID or similar unique string that identifies 
            this channel.)

token# ==>  string  (An arbitrary string delivered to the target address with 
                    each notification delivered over this channel).

expiration# => long (Date and time of notification channel expiration, 
                     expressed as a Unix timestamp, in milliseconds.)

 type  ==> string  (The type of delivery mechanism used for this channel. 
                   The only option is web_hook.)

 address => string  (The address where notifications are delivered 
                     for this channel.)

 # Optional.

Если содержимое будет изменено, будет создано новое эскиз, и крючок уведомит ваш адрес, а через ваш адрес вы сможете получить новую информацию.

Ответ 3

Вот еще одно решение. Скажем, мы сохраняем только GDrive ID изображений или PDF (google generate thumbs для многих типов файлов).

мы можем отправить запрос на gDrive, чтобы получить действительную миниатюру, так как выглядит как превью, даже если нет изменений в файле.

В этом случае каждый эскиз внутри компонента Angular. Если вы используете что-то еще, вы можете создать массив ссылок и прокрутить его, чтобы создать правильные ссылки для большого пальца.

Вот код:

const thumb = () => {
            if (this.item.DriveId) {
            this.getThumb(this.item.DriveId, this.authToken)
                .then(response => {
                    console.log(`response from service ${response}`);
                    // Set thumbnail width size to 300px or any other width if needed
                    this.item.externalThumbnailId = response.slice(0, -3) + 300;
                })
                //here we can handle cases when API limit exceeded 10 req in a sec
                .catch(e => {
                    if(e.data.error.message == 'User Rate Limit Exceeded'){
                        console.log('Failed to load thumb. trying one more time');
                        setTimeout(thumb, 1000);
                    } else {
                        console.log(e);                        
                    }                       
                });
            }
            };

//call this function on component load. 
thumb();

Другим решением будет написать некоторый backend script, который обновляет превью в записях DB.