首页 > 解决方案 > 浏览到页面后发送 HTTP 请求作为 Web Crawling 的单独请求(Angular 站点)

问题描述

我的公司最近升级到新版本的 iManage(文件归档系统),它不再有暴露给 VBA 的库。由于公司政策,我可以运行 VBA,但无法创建 VSTO/.NET 插件。

我正在尝试修复一个插件工具,该工具对文件夹/子文件夹中的所有项目进行清点。

我目前正在探索的解决方案是导航到新 Web 门户中的文件夹,然后从那里清点。我可能可以进行经典的网络爬虫并单击浏览器中的链接,但这会很慢而且很丑陋。由于它是一个 Angular 应用程序,我认为我应该能够触发 REST 请求并解析响应,而无需等待页面加载。

我遇到了 InvalidToken 返回失败的问题。

{
  "error": {
    "code": "InvalidToken",
    "message": "X-Auth-Token is invalid or missing"
  }
}

当前的解决方案是在 Excel VBA 的用户窗体中创建一个 WebBrowser 对象。此用户表单导航到我们的 iManage 门户。然后我可以浏览该站点并单击一个按钮来启动请求。

Private Sub CommandButton1_Click()
    Debug.Print WebBrowser1.Busy
    
    Dim Doc As HTMLDocument
    Set Doc = WebBrowser1.Document
    Debug.Print Doc.cookie

    Dim Request As New WinHttpRequest
    Request.Open "GET", Url:="https://imanage.xxxx.com/work/web/api/v2/customers/1/libraries/CLIENT-JOB/tabs/CLIENT-JOB!9975487/children?limit=500&offset=0&total=true", ASync:=False
    Request.setRequestHeader "Content-Type", "application/json"
    Request.setRequestHeader "Accept-Encoding", "gzip, deflate, br"
    Request.setRequestHeader "Accept-Language", "en-GB,en-US;q=0.9,en;q=0.8"
    Request.setRequestHeader "Connection", "keep-alive"
    Request.setRequestHeader "Host", Doc.Location.host
    Request.setRequestHeader "Referer", Doc.Location.href
    'Request.setRequestHeader "Cookie", WebBrowser1.Document.cookie
    Request.setRequestHeader "Set-Cookie", WebBrowser1.Document.cookie
    Request.setRequestHeader "X-XSRF-TOKEN", Split(Split(WebBrowser1.Document.cookie, ";")(2), "=")(1)
    Request.send

    Dim Result As String
    Result = Request.responseText
    Debug.Print Result
    
End Sub

Private Sub UserForm_Initialize()
     WebBrowser1.Navigate2 "https://imanage.XXXXX.com/work/web/r/custom2/recent-custom2?exclude_emails=true&scope=Admin,AdminArchive,Client-Job,JobArchive&p=1"
End Sub

我觉得这是在复制我在 Chrome 中看到的请求调用。
Chrome 请求详细信息

我认为问题的很大一部分是我在 WebBrowser 中看到的 HTMLDocument 从来没有列出我在 Chrome 中看到的所有相同的 cookie。

VBA 中的对象

在此处输入图像描述

标签: angularvbaweb-crawlerwinhttprequestimanage

解决方案


在最后一个屏幕截图中标记为“HttpOnly”的 Cookie 无法使用document.cookie

https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies

JavaScript Document.cookie API 无法访问具有 HttpOnly 属性的 cookie;它只发送到服务器。例如,保持服务器端会话的 cookie 不需要对 JavaScript 可用,并且应该具有 HttpOnly 属性。这种预防措施有助于缓解跨站点脚本 (XSS) 攻击。

也许您可以尝试:从 Internet Explorer 中检索所有 cookie


推荐阅读