You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用WebClient无法下载Google Drive文件的问题求助

问题分析与解决方案

核心原因

Google Drive针对uc?export=download链接的批量下载会触发临时配额限制,但浏览器访问时会自动处理跳转验证流程(比如加载确认页面、维持会话Cookie),而你的WebClient请求未处理这些环节,直接拿到了配额提示的HTML内容,而非实际CSV文件。

解决步骤

  • 添加Cookie容器:WebClient默认不维护会话Cookie,需手动添加CookieContainer模拟浏览器的会话状态。
  • 处理重定向与确认令牌:首次请求下载链接时,Google会返回包含confirm参数的重定向响应,需提取该参数构造新的下载URL。

修改后的VB.NET代码

Private Sub UpdateCatalog()
    Dim url As String = "https://drive.google.com/uc?export=download&id=1HDRnj41YBWpMioLPwAFiLlK4SK8NV72C"
    Dim cookieContainer As New System.Net.CookieContainer()

    ' 检查并创建存储目录
    If Not My.Computer.FileSystem.DirectoryExists(My.Settings.CatalogFolder) Then
        Try
            My.Computer.FileSystem.CreateDirectory(My.Settings.CatalogFolder)
        Catch Ex As Exception
            MsgBox("无法创建目录存储文件。" & vbCr & Ex.Message,, "目录创建错误")
            Exit Sub
        End Try
    End If

    ' 删除旧文件
    If My.Computer.FileSystem.FileExists(My.Settings.CatalogFile) Then
        My.Computer.FileSystem.DeleteFile(My.Settings.CatalogFile)
    End If

    ' 处理下载流程
    Try
        Using _WebClient As New System.Net.WebClient()
            ' 配置请求头部与Cookie容器
            _WebClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
            _WebClient.CookieContainer = cookieContainer

            ' 首次请求获取响应内容,提取确认令牌
            Dim responseBytes As Byte() = _WebClient.DownloadData(url)
            Dim responseText As String = System.Text.Encoding.UTF8.GetString(responseBytes)

            Dim confirmToken As String = Nothing
            Dim confirmStart As Integer = responseText.IndexOf("confirm=")
            If confirmStart > -1 Then
                confirmStart += 8 ' 跳过"confirm="字符串长度
                Dim confirmEnd As Integer = responseText.IndexOf("&", confirmStart)
                If confirmEnd = -1 Then confirmEnd = responseText.IndexOf("""", confirmStart)
                If confirmEnd > confirmStart Then
                    confirmToken = responseText.Substring(confirmStart, confirmEnd - confirmStart)
                End If
            End If

            ' 携带确认令牌发起最终下载请求
            If Not String.IsNullOrEmpty(confirmToken) Then
                Dim finalUrl As String = $"{url}&confirm={confirmToken}"
                _WebClient.DownloadFile(finalUrl, My.Settings.CatalogFile)
            Else
                ' 未触发配额限制时直接保存响应内容
                System.IO.File.WriteAllBytes(My.Settings.CatalogFile, responseBytes)
            End If
        End Using
    Catch ex As Exception
        MsgBox("下载失败:" & vbCr & ex.Message, "下载错误")
    End Try
End Sub

补充说明

  • Google Drive的验证机制可能动态变化,若后续再次出现问题,需检查响应内容中是否有新的验证参数或跳转逻辑。
  • 若文件为公开可下载状态,也可通过Google Drive共享设置生成稳定的直接下载链接,避免触发临时配额限制。

内容的提问来源于stack exchange,提问作者Wes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 02:30:33