Загрузите общедоступный файл с диска Google объемом более 100 Мб без OAuth Android - PullRequest
0 голосов
/ 01 марта 2019

В последнее время я читал ответ на такие вопросы из-за переполнения стека.Большая часть ответа заключалась в том, чтобы поместить открытый идентификатор файла в эту ссылку https://googledrive.com/host/ID, которая сейчас не поддерживается.

Даже если я попытаюсь установить https://docs.google.com/uc?export=download&id=ID, произойдет сбой для файлов, превышающих лимит сканирования (в основном для 100 МБ), кроме него.создает файл HTML.Это страница с предупреждением о сканировании Google.

При поиске решения или идеи я нашел ответ https://stackoverflow.com/a/32742700/10133501, в котором используется curl для первой загрузки и сохранения файлов cookie, затем получить ссылку со страницы HTML и начать загрузку.файл с куки.

Так как я не могу использовать curl в Android.Я думал о создании моего пути, как показано ниже.

   // I first download the html page from url and save it to /sdcard/insight/new.html

        String url = "http://www.drive.google.com/uc?export=download&id=1In9hgu0eN9ftaiLlPROj05rwJPTeGVFM";
        WebView mWebview = new WebView(this);

    mWebview.setWebViewClient(new WebViewClient() {
        @Override
        public void onPageFinished(WebView view, String url) {
            final String cookies = CookieManager.getInstance().getCookie(url);
            Log.e("Cookie", cookies);

            try {
                File root = android.os.Environment.getExternalStorageDirectory();
                File file = new File (root.getAbsolutePath() + "/Insight/new.html");

                BufferedReader r = new BufferedReader(new FileReader(file));
                StringBuilder total = new StringBuilder();
                String line;
                while((line = r.readLine()) != null) {
                    if (line.contains("uc-download-link"))
                    {
                        Log.e("Line","Contains uc-download-link");
                        Pattern pattern = Pattern.compile("\"/uc(.*?)confirm(.*?)\"");

                        Matcher matcher = pattern.matcher(line);
                        if (matcher.find())
                        {
                            String link = "https://drive.google.com" + matcher.group().replace("\"","").replace("&","&");
                            Log.e("Link",link);

                            // Start the download by passing cookies...
                            startDownload(link,Uri.fromFile(CommonClass.getFile("Insight/new.zip")),cookies);
                        } else Log.e("NotFound","Can't find the match");
                    }
                    else  Log.e("Line","No match");
                    total.append(line);
                }
                r.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
    mWebview.loadUrl(url);

Что касается файла размером более 100 МБ, создающего HTML-страницу.Я сначала загружаю страницу в мой internal storage/insight/new.html.Затем я создаю экземпляр webview и загружаю URL, чтобы я мог получить cookies из него.

Как только я его получу!Я анализирую html-страницу и извлекаю ссылку для скачивания с кодом подтверждения (см. Ответ выше, я просто выполнил шаги, которые он сделал с curl, вместо этого я использую регулярные выражения и прочее).Теперь у меня есть все, поэтому я создал функцию startdownload для загрузки файла, используя Download Manager, который передает cookies в заголовках как "Cookie" (код функции ниже).

public void startDownload(String url, Uri destir,String cookie) {
            Uri resource = Uri.parse(url);

    DownloadManager.Request request = new DownloadManager.Request(resource);
    request.addRequestHeader("Cookie", cookie);

    request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
    request.setAllowedOverRoaming(false);
    //show notification
    request.setVisibleInDownloadsUi(true);
    //set target directory
    request.setDestinationUri(destir);
    request.setTitle("Download");
    request.setDescription("What the heck is this!");
    DownloadManager downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);
    long id = downloadManager.enqueue(request);
    Log.e("download", "Start download, id = " + id);
}

Но он по-прежнему сохраняет загрузкуэта HTML-страница, даже после передачи файлов cookie.Я следовал точно так же, как и он, используя curl в приведенном выше ответе, но все еще не смог.

Я думаю, что проблема может быть связана с запросом Cookie.Файл cookie, запрашиваемый у CURL, немного отличается, см. Здесь https://pastebin.com/QxLU6kSu. В то время как моя строка cookie, сообщаемая из устройства регистрации Android, выглядит следующим образом

download_warning_13058876669334088843_1In9hgu0eN9ftaiLlPROj05rwJPTeGVFM qnTb;NID=162=UW_Hkn3eHdTldNeLwbPUcsY8P5zaFX6H5ePsHhPlUHO1Ahiy10yyoGT9I3zQeTcHYSplxUjdL0OLi6rhcgViC4WhYYayg4XRs5FSMGNfkIgFBkGmukDf4KJZ-AxSz77w2JvkC7WsuaMLJue9zl9wxAmKEotzRa75Y5kUHRXGkoM

В чем именно проблема.Почему он все еще не загружается?

Также

Я пытался использовать service account с для Google.drive.Api, но не получилось.Любой, у кого есть эта работа, также может решить мою проблему.Это код, который я использовал для этого https://pastebin.com/RGTwLsHp

Любая помощь по этой теме, очень признателен!Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...