在没有OAuth Android的情况下下载大于100mb的公共Google驱动器文件

时间:2019-03-01 13:16:28

标签: android google-drive-api

我最近正在阅读来自堆栈溢出的此类问题的响应。大部分答案是将公共文件ID放入此链接https://googledrive.com/host/ID中,该链接现已终止。

即使我尝试使用https://docs.google.com/uc?export=download&id=ID,它也会创建超出HTML范围的文件,但超出其扫描限制(大多数为100MB)的文件将失败。这是Google扫描警告页面。

在寻找某种解决方案或想法时,我找到了此答案https://stackoverflow.com/a/32742700/10133501,该答案使用curl首先下载并保存cookie,然后从HTML页面获取链接并开始下载包含cookie的文件。

由于我无法在Android中使用curl。我想到了如下创建自己的方式。

   // 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);

对于大于100mb的文件,将创建一个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);
}

但是,即使传递了cookie,它仍然继续下载该html页面。我完全按照他在上面的答案中使用curl的方式进行操作,但仍然失败。

我认为问题可能与Cookie请求有关。 CURL请求的Cookie有所不同,请参见https://pastebin.com/QxLU6kSu。虽然我从android logger记录的cookie字符串看起来像这样

download_warning_13058876669334088843_1In9hgu0eN9ftaiLlPROj05rwJPTeGVFM qnTb;NID=162=UW_Hkn3eHdTldNeLwbPUcsY8P5zaFX6H5ePsHhPlUHO1Ahiy10yyoGT9I3zQeTcHYSplxUjdL0OLi6rhcgViC4WhYYayg4XRs5FSMGNfkIgFBkGmukDf4KJZ-AxSz77w2JvkC7WsuaMLJue9zl9wxAmKEotzRa75Y5kUHRXGkoM

到底是什么问题。为什么还不能下载?

我尝试将service account用于Google.drive.Api,但失败了。任何有这项工作的人都可以解决我的问题。这是我使用的代码https://pastebin.com/RGTwLsHp

有关此主题的任何帮助,非常感谢!谢谢!

0 个答案:

没有答案