浏览页面后发送 HTTP 请求作为 Web 爬网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 Request Details

我认为问题的很大一部分是我可以在 Webbrowser 中看到的 HTMLDocumnet 从未列出我在 Chrome 中可以看到的所有相同的 cookie。

Object in VBA

enter image description here

感谢您所做的一切,我目前正在做一些 Angular 培训,但不幸的是,这有点超出了范围。

解决方法

在最后一个屏幕截图中标记为“HttpOnly”的 Cookie 无法使用 UPDATE * ... SET foo = 'bar',test = 'hello',...

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

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

也许你可以试试:Retrieve ALL cookies from Internet Explorer