You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何解决MS-Access VBA下载SurveyMonkey文件时的认证错误?

嘿,Norbert,我刚好踩过SurveyMonkey文件下载的这个坑!你遇到的认证问题其实很好理解:浏览器能打开那个文件链接,是因为它存着你登录后的会话Cookie,但VBA发起的HTTP请求是完全独立的,没带这些认证信息,所以被SurveyMonkey拦下来了。下面给你两种靠谱的解决办法,优先推荐第一种:

方案一:使用SurveyMonkey官方API认证(稳定可靠,长期可用)

SurveyMonkey的所有资源访问都需要OAuth2认证,直接用API的方式下载是官方支持的,不会因为会话过期突然失效。

第一步:获取OAuth2 Access Token

  1. 登录SurveyMonkey开发者平台,创建一个新应用
  2. 给应用申请必要的权限:至少要勾选responses_read(读取答卷)和files_read(读取文件)
  3. 生成你的Access Token(有效期通常30天,到期可以刷新)

第二步:VBA代码实现下载

先确保你的Access VBA项目引用了Microsoft XML, v6.0(点击工具→引用,勾选这个选项),然后用下面的代码:

Sub DownloadSurveyMonkeyFile_WithAPIToken()
    Dim xmlHttp As MSXML2.XMLHTTP60
    Dim fileStream As ADODB.Stream
    Dim fileUrl As String
    Dim savePath As String
    Dim accessToken As String
    
    ' 替换成你的信息
    accessToken = "YOUR_SURVEYMONKEY_ACCESS_TOKEN"
    fileUrl = "THE_FILE_URL_YOU_GOT_FROM_SURVEYMONKEY"
    savePath = "C:\Your\Save\Path\filename.ext" ' 比如C:\Downloads\survey_file.pdf
    
    Set xmlHttp = New MSXML2.XMLHTTP60
    Set fileStream = New ADODB.Stream
    
    On Error GoTo Cleanup
    
    ' 初始化请求
    xmlHttp.Open "GET", fileUrl, False
    ' 添加认证头
    xmlHttp.setRequestHeader "Authorization", "Bearer " & accessToken
    ' 模拟浏览器的User-Agent,避免被拦截
    xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    
    ' 发送请求
    xmlHttp.send
    
    ' 检查请求是否成功
    If xmlHttp.Status = 200 Then
        ' 设置流参数
        fileStream.Type = adTypeBinary
        fileStream.Open
        fileStream.Write xmlHttp.responseBody
        fileStream.SaveToFile savePath, adSaveCreateOverWrite
        MsgBox "文件下载成功!保存到:" & savePath
    Else
        MsgBox "下载失败,状态码:" & xmlHttp.Status & vbCrLf & "错误信息:" & xmlHttp.responseText
    End If
    
Cleanup:
    ' 释放资源
    Set xmlHttp = Nothing
    Set fileStream = Nothing
End Sub
方案二:复用浏览器会话Cookie(临时应急,不推荐长期用)

如果暂时不想折腾API认证,可以直接复用浏览器的登录Cookie,但Cookie会过期(一般几个小时或几天),过期后就得重新获取,适合临时测试。

第一步:从浏览器获取Cookie

  1. 打开Chrome/Firefox,登录SurveyMonkey,确保能正常打开那个文件链接
  2. 按F12打开开发者工具,切换到「Application」(Chrome)或「Storage」(Firefox)标签
  3. 找到「Cookies」→ 对应的SurveyMonkey域名(比如www.surveymonkey.com
  4. 复制关键Cookie的值:主要是sm_sessionsm_auth(如果有的话)

第二步:VBA代码添加Cookie头

同样要引用Microsoft XML, v6.0Microsoft ActiveX Data Objects x.x Library,代码如下:

Sub DownloadSurveyMonkeyFile_WithCookie()
    Dim xmlHttp As MSXML2.XMLHTTP60
    Dim fileStream As ADODB.Stream
    Dim fileUrl As String
    Dim savePath As String
    Dim cookieStr As String
    
    ' 替换成你的信息
    cookieStr = "sm_session=YOUR_SESSION_COOKIE_VALUE; sm_auth=YOUR_AUTH_COOKIE_VALUE"
    fileUrl = "THE_FILE_URL_YOU_GOT_FROM_SURVEYMONKEY"
    savePath = "C:\Your\Save\Path\filename.ext"
    
    Set xmlHttp = New MSXML2.XMLHTTP60
    Set fileStream = New ADODB.Stream
    
    On Error GoTo Cleanup
    
    xmlHttp.Open "GET", fileUrl, False
    ' 添加Cookie头
    xmlHttp.setRequestHeader "Cookie", cookieStr
    ' 模拟浏览器User-Agent
    xmlHttp.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36"
    
    xmlHttp.send
    
    If xmlHttp.Status = 200 Then
        fileStream.Type = adTypeBinary
        fileStream.Open
        fileStream.Write xmlHttp.responseBody
        fileStream.SaveToFile savePath, adSaveCreateOverWrite
        MsgBox "文件下载成功!"
    Else
        MsgBox "下载失败,状态码:" & xmlHttp.Status & vbCrLf & "响应:" & xmlHttp.responseText
    End If
    
Cleanup:
    Set xmlHttp = Nothing
    Set fileStream = Nothing
End Sub

注意事项:

  • 如果遇到401错误,先检查你的Access Token是否有效,或者Cookie是否过期
  • 大文件下载时,建议用异步请求(把xmlHttp.Open的第三个参数设为True),避免Access假死
  • 优先用方案一,因为官方API的认证方式更稳定,不会因为Cookie过期频繁出问题

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

火山引擎 最新活动