如何为本地Excel添加Cookie以访问WordPress受保护的远程Excel文件
问题背景
你的WordPress站点uploads文件夹下的excel-r.xlsx通过.htaccess限制仅允许携带wordpress_logged_in系列Cookie的登录用户访问,配置规则如下:
<IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP_COOKIE} !.*wordpress_logged_in.*$ [NC] RewriteCond %{REQUEST_URI} ^(.*?/?)wp-content/uploads/.* [NC] RewriteRule . http://%{HTTP_HOST}%1/wp-login.php?redirect_to=%{REQUEST_URI} [L,QSA] </IfModule>
同时你在functions.php中添加了login_cookie用于绕过防火墙机器人检测,但本地excel-d.xlsx的VBA代码尝试连接excel-r时,始终无法通过权限验证,现有VB代码不适用当前场景。
核心解决思路
要通过权限验证,VBA请求必须携带WordPress登录状态的wordpress_logged_in_xxxx Cookie(该Cookie名称带动态哈希后缀,需从已登录的浏览器中获取),可选携带login_cookie(如果防火墙强制验证)。
具体操作步骤
1. 获取有效Cookie值
- 打开浏览器登录你的WordPress后台
- 按F12打开开发者工具,切换到
Application标签页 - 在左侧
Cookies下找到你的站点域名,复制wordpress_logged_in_xxxx的Name和Value,同时复制login_cookie的Name和Value(如果需要)
2. VBA中正确携带Cookie的代码示例
放弃你找到的ASP.NET风格Cookie代码,改用VBA的MSXML2.XMLHTTP对象发送带Cookie的请求,或者在打开远程文件时注入Cookie头。以下是两种常用场景的代码:
场景1:通过HTTP请求获取远程Excel并写入数据
Sub WriteToProtectedExcel() Dim xmlHttp As Object Dim tempPath As String Dim wbRemote As Workbook ' 初始化XMLHTTP对象 Set xmlHttp = CreateObject("MSXML2.XMLHTTP") ' 替换为你的excel-r的完整URL Dim targetUrl As String targetUrl = "https://your-domain.com/wp-content/uploads/excel-r.xlsx" ' 替换为你从浏览器复制的Cookie字符串,格式:"CookieName1=Value1; CookieName2=Value2" Dim cookieStr As String cookieStr = "wordpress_logged_in_xxxx=your-cookie-value; login_cookie=10DIGITCOOKIECODEHERE" ' 发送GET请求,携带Cookie xmlHttp.Open "GET", targetUrl, False xmlHttp.setRequestHeader "Cookie", cookieStr xmlHttp.send ' 将返回的Excel文件保存到本地临时路径 tempPath = Environ("TEMP") & "\temp_excel_r.xlsx" Open tempPath For Binary As #1 Put #1, , xmlHttp.responseBody Close #1 ' 打开临时文件并写入数据 Set wbRemote = Workbooks.Open(tempPath) ' 示例:写入A1单元格 wbRemote.Sheets(1).Range("A1").Value = "测试数据" ' 保存并关闭临时文件,再上传回服务器(如果需要) wbRemote.Save wbRemote.Close False ' 可选:上传修改后的文件回服务器(需要额外处理PUT请求) ' 这里省略上传代码,如需可补充PUT请求逻辑 Kill tempPath Set xmlHttp = Nothing Set wbRemote = Nothing End Sub
场景2:直接打开远程Excel(需服务器支持WebDAV)
如果你的服务器支持WebDAV,可直接通过Workbooks.Open并设置HTTP头:
Sub OpenProtectedExcelDirectly() Dim wbRemote As Workbook Dim targetUrl As String targetUrl = "https://your-domain.com/wp-content/uploads/excel-r.xlsx" ' 替换为你的Cookie字符串 Dim cookieStr As String cookieStr = "wordpress_logged_in_xxxx=your-cookie-value; login_cookie=10DIGITCOOKIECODEHERE" ' 创建HTTP头对象 Dim headers As Object Set headers = CreateObject("WinHttp.WinHttpRequest.5.1") headers.Open "GET", targetUrl, False headers.setRequestHeader "Cookie", cookieStr headers.send ' 提取会话信息,用于打开文件 Set wbRemote = Workbooks.Open(targetUrl, , , , , , , , , , headers.getAllResponseHeaders) ' 写入数据示例 wbRemote.Sheets(1).Range("A1").Value = "直接写入的测试数据" wbRemote.Save wbRemote.Close False Set headers = Nothing Set wbRemote = Nothing End Sub
注意事项
wordpress_logged_inCookie有有效期,过期后需要重新从浏览器获取- 确保VBA代码中的域名、Cookie值和文件路径完全匹配
- 如果服务器有额外的WAF验证,可能需要同时携带
login_cookie - 若使用WebDAV方式,需确认服务器已启用WebDAV模块
内容的提问来源于stack exchange,提问作者dmstr00
相关产品推荐
相关产品推荐

