我最近正在阅读来自堆栈溢出的此类问题的响应。大部分答案是将公共文件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
有关此主题的任何帮助,非常感谢!谢谢!