Прямое скачивание с Google Диска с помощью Google API для езды

Мое настольное приложение, написанное на Java, пытается скачать файлы с Google Диска. Как я выяснил, это можно реализовать с помощью файла'ы webContentLink (он's Для возможность скачивать файлы без авторизации пользователя).

Итак, ниже код работает с мелкими файлами:

String webContentLink = aFile.getWebContentLink();
InputStream in = new URL(webContentLink).openStream();

Но это вовсе't работа на больших файлах, т. к. в этом случае файл может'т быть загружены непосредственно через webContentLink без подтверждения пользователя с вирусом Гугл сканирования предупреждение. Пример: ссылка веб-контента.

Итак, мой вопрос: Как получить содержимое открытого файла с Google Диска без разрешения пользователя?

Решение

Обновление 8 декабря 2015 года По данным поддержка Google с использованием

googledrive.com/host/ID

способ будет отключена на 31 августа, 2016.


Я просто столкнулся с этим вопросом.

В фокус обработать вашу папку Google Диск и как веб-хостинга.

1-ое обновление за апрель 2015,

Google Диск был изменен и там'ы простой способ получить прямую ссылку на свой диск. Я оставил мои предыдущие ответы ниже Для справки, но здесь'ы обновленный ответ.

  1. Создание общих папок на Google Диске.<БР><БР>
  2. Поделитесь этой езды публично. <БР><БР> <БР><БР>
  3. Сделать папку UUID из адресной строки, Когда вы'вновь в эту папку<БР><БР>
  4. Положим, что UUID в этот URL<БР><БР> https://googledrive.com/host/<папку девайс>/
  5. Добавить имя файла, где расположен ваш файл.<БР><БР> https://googledrive.com/host/<папку девайс и gt;/<имя файла>

<дель>который предназначен функции в Google</дел> <БР> новый Google Диск Ссылка.

Все, что вам нужно сделать, это просто получить хоста ссылки на общедоступные папки диска. Чтобы сделать это, вы можете загрузить простой файл HTML и просмотр в Google Диск, чтобы найти Ваш URL-адрес узла.

Вот несколько шагов:

  1. Создать папку на Google Диске.<БР><БР>
  2. Поделитесь этой езды публично. <БР><БР> <БР><БР>
  3. Загрузить простой файл HTML. Добавьте любые дополнительные файлы (вложенные папки ОК) <БР><БР> <БР><БР>
  4. Открытые и "Предварительный просмотр" в HTML-файл в Google Диск <БР><БР> <БР><БР>
  5. Получить URL-адрес для этой папки <БР><БР> <БР><БР>
  6. Создать прямую ссылку со своего базового URL-адрес папки <БР><БР> <БР><БР>
  7. Этот URL-адрес должен допускать прямой загрузки больших файлов.<БР><БР>

[править]

Забыл добавить. Если вы используете вложенные папки, чтобы организовать ваши файлы, вы просто использовать имя папки, как можно было бы ожидать в иерархии URL-адрес.

https://googledrive.com/host/<общедоступные папки строку ID>/картинок/мой образ.ПНГ


Чего я хочу

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

В конце концов, мне нужна прямая ссылка на сам файл.

Проблемы с Google Диска

Если вы установите разрешения для файлов, которые должны быть общедоступными и создавать/генерировать прямую ссылку открыть с помощью чего-то вроде инструмента gdocs2direct или просто создав ссылку сами:

https://docs.google.com/uc?export=download&идентификатор=<ваш файл ИД>

Вы получите печенье на основе кода подтверждения и приглашения "в Google не удалось просканировать этот файл" Подскажите, что выиграл't работа для таких вещей, как девятое или файл Vagrantfile конфиги.

Код, который он генерирует простой код, который добавляет вам запрос переменной ...&ампер;подтвердить=### в строке, но это's в конкретного пользователя, так что's не как вы можете копировать/вставить этот запрос переменной для других.

Но если вы используете выше и"хостинг" и способ, вы можете обойти это приглашение.

Я надеюсь, что помогает!

Комментарии (17)

Если перед вами стоит "Эта файл не может быть проверен на вирусы и" страницы интермеццо, скачать не так просто.

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

Здесь'ы Баш вариант процесса загрузки с помощью curl:

curl -c /tmp/cookies "https://drive.google.com/uc?export=download&id=DOCUMENT_ID" > /tmp/intermezzo.html
curl -L -b /tmp/cookies "https://drive.google.com$(cat /tmp/intermezzo.html | grep -Po 'uc-download-link" [^>]* href="\K[^"]*' | sed 's/\&/\&/g')" > FINAL_DOWNLOADED_FILENAME

Примечания:

  • эта процедура, вероятно, перестать работать после некоторые изменения Google
  • команда grep использует синтаксис Perl () И К\в "оператор" и что означает "не включать ничего, предшествующих в соответствием результата. Я не'т знаю, какая версия грэп ввели эти варианты, но древний или не Ubuntu версий, вероятно, Дон'т у его
  • решение на Java будет более или менее то же самое, просто взять библиотекой по протоколу HTTPS, который может обрабатывать файлы cookie, и какой хороший текст-библиотеки синтаксического анализа
Комментарии (4)

Я знаю, это старый вопрос, но я не мог найти решение этой проблемы после того, как некоторые исследования, так что я поделиться тем, что работал для меня.

Я написал этот код на C# для одного из моих проектов. Он может обойти вирусов предупреждения программно. Код, вероятно, может быть преобразована в Java.

using System;
using System.IO;
using System.Net;

public static class FileDownloader
{
    private const string GOOGLE_DRIVE_DOMAIN = "drive.google.com";
    private const string GOOGLE_DRIVE_DOMAIN2 = "https://drive.google.com";

    // Normal example: FileDownloader.DownloadFileFromURLToPath( "http://example.com/file/download/link", @"C:\file.txt" );
    // Drive example: FileDownloader.DownloadFileFromURLToPath( "http://drive.google.com/file/d/FILEID/view?usp=sharing", @"C:\file.txt" );
    public static FileInfo DownloadFileFromURLToPath( string url, string path )
    {
        if( url.StartsWith( GOOGLE_DRIVE_DOMAIN ) || url.StartsWith( GOOGLE_DRIVE_DOMAIN2 ) )
            return DownloadGoogleDriveFileFromURLToPath( url, path );
        else
            return DownloadFileFromURLToPath( url, path, null );
    }

    private static FileInfo DownloadFileFromURLToPath( string url, string path, WebClient webClient )
    {
        try
        {
            if( webClient == null )
            {
                using( webClient = new WebClient() )
                {
                    webClient.DownloadFile( url, path );
                    return new FileInfo( path );
                }
            }
            else
            {
                webClient.DownloadFile( url, path );
                return new FileInfo( path );
            }
        }
        catch( WebException )
        {
            return null;
        }
    }

    // Downloading large files from Google Drive prompts a warning screen and
    // requires manual confirmation. Consider that case and try to confirm the download automatically
    // if warning prompt occurs
    private static FileInfo DownloadGoogleDriveFileFromURLToPath( string url, string path )
    {
        // You can comment the statement below if the provided url is guaranteed to be in the following format:
        // https://drive.google.com/uc?id=FILEID&export=download
        url = GetGoogleDriveDownloadLinkFromUrl( url );

        using( CookieAwareWebClient webClient = new CookieAwareWebClient() )
        {
            FileInfo downloadedFile;

            // Sometimes Drive returns an NID cookie instead of a download_warning cookie at first attempt,
            // but works in the second attempt
            for( int i = 0; i < 2; i++ )
            {
                downloadedFile = DownloadFileFromURLToPath( url, path, webClient );
                if( downloadedFile == null )
                    return null;

                // Confirmation page is around 50KB, shouldn't be larger than 60KB
                if( downloadedFile.Length > 60000 )
                    return downloadedFile;

                // Downloaded file might be the confirmation page, check it
                string content;
                using( var reader = downloadedFile.OpenText() )
                {
                    // Confirmation page starts with , which can be preceeded by a newline
                    char[] header = new char[20];
                    int readCount = reader.ReadBlock( header, 0, 20 );
                    if( readCount < 20 || !( new string( header ).Contains( "" ) ) )
                        return downloadedFile;

                    content = reader.ReadToEnd();
                }

                int linkIndex = content.LastIndexOf( "href=\"/uc?" );
                if( linkIndex < 0 )
                    return downloadedFile;

                linkIndex += 6;
                int linkEnd = content.IndexOf( '"', linkIndex );
                if( linkEnd < 0 )
                    return downloadedFile;

                url = "https://drive.google.com" + content.Substring( linkIndex, linkEnd - linkIndex ).Replace( "&", "&" );
            }

            downloadedFile = DownloadFileFromURLToPath( url, path, webClient );

            return downloadedFile;
        }
    }

    // Handles 3 kinds of links (they can be preceeded by https://):
    // - drive.google.com/open?id=FILEID
    // - drive.google.com/file/d/FILEID/view?usp=sharing
    // - drive.google.com/uc?id=FILEID&export=download
    public static string GetGoogleDriveDownloadLinkFromUrl( string url )
    {
        int index = url.IndexOf( "id=" );
        int closingIndex;
        if( index > 0 )
        {
            index += 3;
            closingIndex = url.IndexOf( '&', index );
            if( closingIndex < 0 )
                closingIndex = url.Length;
        }
        else
        {
            index = url.IndexOf( "file/d/" );
            if( index < 0 ) // url is not in any of the supported forms
                return string.Empty;

            index += 7;

            closingIndex = url.IndexOf( '/', index );
            if( closingIndex < 0 )
            {
                closingIndex = url.IndexOf( '?', index );
                if( closingIndex < 0 )
                    closingIndex = url.Length;
            }
        }

        return string.Format( "https://drive.google.com/uc?id={0}&export=download", url.Substring( index, closingIndex - index ) );
    }
}

// Web client used for Google Drive
public class CookieAwareWebClient : WebClient
{
    private class CookieContainer
    {
        Dictionary _cookies;

        public string this[Uri url]
        {
            get
            {
                string cookie;
                if( _cookies.TryGetValue( url.Host, out cookie ) )
                    return cookie;

                return null;
            }
            set
            {
                _cookies[url.Host] = value;
            }
        }

        public CookieContainer()
        {
            _cookies = new Dictionary();
        }
    }

    private CookieContainer cookies;

    public CookieAwareWebClient() : base()
    {
        cookies = new CookieContainer();
    }

    protected override WebRequest GetWebRequest( Uri address )
    {
        WebRequest request = base.GetWebRequest( address );

        if( request is HttpWebRequest )
        {
            string cookie = cookies[address];
            if( cookie != null )
                ( (HttpWebRequest) request ).Headers.Set( "cookie", cookie );
        }

        return request;
    }

    protected override WebResponse GetWebResponse( WebRequest request, IAsyncResult result )
    {
        WebResponse response = base.GetWebResponse( request, result );

        string[] cookies = response.Headers.GetValues( "Set-Cookie" );
        if( cookies != null && cookies.Length > 0 )
        {
            string cookie = "";
            foreach( string c in cookies )
                cookie += c;

            this.cookies[response.ResponseUri] = cookie;
        }

        return response;
    }

    protected override WebResponse GetWebResponse( WebRequest request )
    {
        WebResponse response = base.GetWebResponse( request );

        string[] cookies = response.Headers.GetValues( "Set-Cookie" );
        if( cookies != null && cookies.Length > 0 )
        {
            string cookie = "";
            foreach( string c in cookies )
                cookie += c;

            this.cookies[response.ResponseUri] = cookie;
        }

        return response;
    }
}
Комментарии (1)

Это, кажется, снова обновлены по состоянию на 19 мая 2015 года:

Как я получил его на работу:

Как в jmbertucci's недавно обновил ответ, сделать публичную папку для всех. Это немного сложнее, чем раньше, нужно нажать кнопку Дополнительно, чтобы изменить папку, чтобы "На - в интернете&.и"

Найти папку заряжаться как и раньше-просто заходите в папку и найти свой UUID в адресной строке:

https://drive.google.com/drive/folders/

Потом голову

https://googledrive.com/host/

Она перенаправит вас на страницах типа индекса с гигантским поддомен, но вы должны быть в состоянии видеть файлы в папке. Затем вы можете щелкнуть правой кнопкой Сохранить ссылку на файл, который вы хотите (я заметил, что этот прямой ссылке также имеет большой поддомен для googledrive.com). Работал большой для меня сс wget`.

Это похоже на работу с другим' общие папки.

например,

https://drive.google.com/folderview?id=0B7l10Bj_LprhQnpSRkpGMGV2eE0&УСП=обмен

карты

https://googledrive.com/host/0B7l10Bj_LprhQnpSRkpGMGV2eE0

И правой кнопкой мыши можете сохранить прямой ссылке на любой из этих файлов.

Комментарии (2)

#Вариант 1: Скачать файл с малым размером.

  • Вы можете использовать URL-адрес в формате https://drive.google.com/uc?export=download&ИД=столбцом file_id, а затем InputStream в файл могут быть получены непосредственно.

#Вариант 2: Скачать файл с большим размером.

  • Вы застряли в стене страницы оповещения проверка на вирусы вернулись. Путем парсинга HTML DOM-элемент, я пытался сделать ссылку с кодом подтверждения при кнопку "загрузить в любом случае", а не'т работу. Его может потребоваться cookie или сессии информация. введите сюда описание изображения

Решение:

  • Наконец я нашел решение для двух вышеупомянутых случаях. Просто нужно положить httpConnection.setDoOutput(true), то в шаге связь в виде JSON.

)]}&#39; { &и"отчуждения" и:"по SCAN_CLEAN" и, на "downloadUrl" и:"и http:www...", "с именем" и:"и exam_list_json.тхт" и "Ну scanResult-то": на"ОК" и "Ну sizeBytes-то":2392}

Затем, вы можете использовать любой парсер JSON для чтения downloadUrl, именем и sizeBytes.

  • Вы можете обратиться следовать фрагмент, надеюсь, это поможет.

частная потока gConnect(строка remoteFile) бросает IOException{ URL-адрес URL-адрес = новый URL-адрес(remoteFile); URLConnection связи = URL-адрес.содержащие вредоносные элементы(); если(подключение оператора instanceof HttpURLConnection){ HttpURLConnection httpConnection = (HttpURLConnection) связи; связи.setAllowUserInteraction(ложь); httpConnection.setInstanceFollowRedirects(истина); httpConnection.setRequestProperty("от пользователя-агента и", "в браузере Mozilla/4.0 (совместимый; MSIE 6.0; Windows 2000 с)" - а); httpConnection.setDoOutput(true); в httpConnection.setRequestMethod (на"сделать" - а); httpConnection.подключиться();

инт reqCode = httpConnection.getResponseCode();

если(reqCode == HttpURLConnection.HTTP_OK){ InputStream является = httpConnection.getInputStream(); Карта<строку, список<строка>> карта = httpConnection.getHeaderFields(); Список<строка> значения = карте.получить("По материалам-типа„); если(значение != значение null &&усилителя; !значения.свойств isEmpty()){ Тип String = значения.получить(0);

если(тип.содержит("в текст/HTML с")){ Строку cookie = httpConnection.getHeaderField("в набор-Печенье" - а); Строку Temp = константы.getPath(mContext, константы.PATH_TEMP) + " в/темп.HTML-код" - а; если(saveGHtmlFile(это в temp)){ Строку с href = getRealUrl(темп); если(с href != значение null){ возвращение parseUrl(с href, печенье); } }

} остальное, если(тип.содержит (и"Приложение/JSON", у)){ Строку Temp = константы.getPath(mContext, константы.PATH_TEMP) + " в/темп.тхт и"; если(saveGJsonFile(это в temp)){ Данные FileDataSet = JsonReaderHelper.readFileDataset(новый файл(в папке Temp)); если(данные.getPath() != значение null){ возвращение parseUrl(данные.getPath()); } } } } возврат; } } возвращать значение null; }

И

   public static FileDataSet readFileDataset(File file) throws IOException{
        FileInputStream is = new FileInputStream(file);
        JsonReader reader = new JsonReader(new InputStreamReader(is, "UTF-8"));

        reader.beginObject();
        FileDataSet rs = new FileDataSet();
        while(reader.hasNext()){
            String name = reader.nextName();
            if(name.equals("downloadUrl")){
                rs.setPath(reader.nextString());
            } else if(name.equals("fileName")){
                rs.setName(reader.nextString());
            } else if(name.equals("sizeBytes")){
                rs.setSize(reader.nextLong());
            } else {
                reader.skipValue();
            }
        }
        reader.endObject();
        return rs;

    }
Комментарии (0)

https://github.com/google/skicka

Я использовал этот инструмент командной строки для загрузки файлов с Google Диска. Просто следуйте инструкциям в разделе Приступая к работе, и вы должны скачать файлы с Google Диска в минутах.

Комментарии (0)

С помощью учетной записи службы могут работать на вас.

Комментарии (0)

Если вы просто хотите, чтобы программно (как oppossed, чтобы дать пользователю ссылку для открытия в браузере) скачать файл через Google Диск API, я хотел бы предложить, используя downloadUrl файл вместо webContentLink, как описано здесь: https://developers.google.com/drive/web/manage-downloads

Комментарии (0)

Я хотел бы рассмотреть скачивание по ссылке, обдирая странице вы получите ссылку для подтверждения, а затем загрузить эту.

Если вы посмотрите на "загрузить в любом случае и" URL-адрес это параметр запроса дополнительного подтверждения с, казалось бы, случайно сгенерированный токен. Поскольку она'ы случайные...и вы, вероятно, Дон'т хотите, чтобы выяснить, как создать его самостоятельно, соскоб может быть самый простой способ, ничего не зная о том, как работает сайт.

Вы, возможно, потребуется рассмотреть различные сценарии.

Комментарии (1)

https://drive.google.com/uc?export=download&ИД=столбцом file_id заменить столбцом file_id с идентификатора файла.

если вы Don'т знаю, были это идентификатор, файл-проверьте эту статью ссылка на статью

Комментарии (1)

Я просто создать код JavaScript так, чтобы он автоматически захватить ссылке и скачать и закрыть вкладку с помощью вы.

// ==UserScript==
// @name         Bypass Google drive virus scan
// @namespace    SmartManoj
// @version      0.1
// @description  Quickly get the download link
// @author       SmartManoj
// @match        https://drive.google.com/uc?id=*&export=download*
// @grant        none
// ==/UserScript==

    function sleep(ms) {
      return new Promise(resolve => setTimeout(resolve, ms));
    }

    async function demo() {
        await sleep(5000);
        window.close();
    }

    (function() {
        location.replace(document.getElementById("uc-download-link").href);
        demo();
    })();

Так же вы можете получить HTML-код URL и скачать в Java.

Комментарии (0)