使用cURL/XHR提取带WordPress Cookie的嵌入式PDF失败求助
我尝试用cURL提取某WordPress网站中需用户名/密码登录(依赖Cookie验证)的嵌入式PDF,目标PDF在该网站的Dogtopia 2024 FDD页面,登录入口为网站的登录页面。
我参考了相关登录验证和PDF下载的教程,但下载到的PDF始终损坏,具体操作流程如下:
- 获取登录cURL命令:打开登录页及开发者工具Network面板,输入账号密码登录后,复制登录POST请求的cURL命令
- 保存会话Cookie:移除命令中的
-H 'Cookie: <somestuff>'参数,添加-c login_cookie.txt后执行,生成的login_cookie.txt包含"fakesessid"及大量FALSE/TRUE内容,疑似无效 - 获取PDF的cURL命令:打开PDF所在页面,复制对应XHR请求的cURL命令,移除Cookie头,添加
-b login_cookie.txt和--output filename.pdf后执行,下载的PDF无法正常打开
以下是我使用的具体命令(已隐去密码):
保存登录Cookie的命令
curl -c login_cookie.txt 'https://fddexchange.com/wp-login.php' \ -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ -H 'accept-language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7' \ -H 'cache-control: max-age=0' \ -H 'content-type: application/x-www-form-urlencoded' \ -H 'origin: https://fddexchange.com' \ -H 'priority: u=0, i' \ -H 'referer: https://fddexchange.com/login-2/' \ -H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' \ -H 'sec-ch-ua-mobile: ?1' \ -H 'sec-ch-ua-platform: "Android"' \ -H 'sec-fetch-dest: document' \ -H 'sec-fetch-mode: navigate' \ -H 'sec-fetch-site: same-origin' \ -H 'sec-fetch-user: ?1' \ -H 'upgrade-insecure-requests: 1' \ -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36' \ --data-raw 'pmpro_login_form_used=1&log=REDACTEDUSERNAME&pwd=REDACTEDPWORD&wp-submit=Log+In&redirect_to='
下载PDF的命令
curl 'https://fddexchange.com/?title=Dogtopia%20Complete%20FDD%20April%2015%202024&index=1&pdfID=86513&pdfemb-serveurl=https%3A%2F%2Ffddexchange.com%2Fwp-content%2Fuploads%2Fsecurepdfs%2F2024%2F05%2FDogtopia-Complete-FDD-April-15-2024.pdf&pdfemb-nonce=baee332b39' \ -H 'accept: */*' \ -H 'accept-language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7' \ -H 'priority: u=1, i' \ -H 'referer: https://fddexchange.com/?title=Dogtopia%20Complete%20FDD%20April%2015%202024&index=1&pdfID=86513&pdfemb-serveurl=https%3A%2F%2Ffddexchange.com%2Fwp-content%2Fuploads%2Fsecurepdfs%2F2024%2F05%2FDogtopia-Complete-FDD-April-15-2024.pdf' \ -H 'sec-ch-ua: "Google Chrome";v="129", "Not=A?Brand";v="8", "Chromium";v="129"' \ -H 'sec-ch-ua-mobile: ?1' \ -H 'sec-ch-ua-platform: "Android"' \ -H 'sec-fetch-dest: empty' \ -H 'sec-fetch-mode: cors' \ -H 'sec-fetch-site: same-origin' \ -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36'
请问我哪里操作出错了?
你的操作主要存在以下几个问题:
登录Cookie保存不完整
WordPress(尤其是配合PMPro插件的站点)登录时会先返回初始会话Cookie,再在登录验证后更新会话状态。你直接复制登录POST请求的cURL命令并移除原有Cookie,跳过了获取初始会话的步骤,导致生成的login_cookie.txt仅包含无效的临时会话标识(fakesessid)。
正确做法:先发送GET请求到登录页面,保存初始Cookie,再用该Cookie发送登录POST请求,同时用-c保存更新后的会话Cookie:# 先获取初始登录页面Cookie curl -c login_cookie.txt 'https://fddexchange.com/login-2/' \ -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36' # 再发送登录请求,更新Cookie curl -c login_cookie.txt -b login_cookie.txt 'https://fddexchange.com/wp-login.php' \ -H 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7' \ -H 'accept-language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7' \ -H 'cache-control: max-age=0' \ -H 'content-type: application/x-www-form-urlencoded' \ -H 'origin: https://fddexchange.com' \ -H 'referer: https://fddexchange.com/login-2/' \ -H 'user-agent: Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Mobile Safari/537.36' \ --data-raw 'pmpro_login_form_used=1&log=REDACTEDUSERNAME&pwd=REDACTEDPWORD&wp-submit=Log+In&redirect_to='PDF请求缺少关键参数或会话验证
你复制的XHR请求是PDF嵌入插件的中转请求,而非直接的PDF文件请求。这类请求通常会验证pdfemb-nonce(一次性令牌),而该令牌是绑定会话和页面的,你直接复用复制的令牌可能已失效。
正确做法:- 先发送GET请求到PDF所在页面,用
-b login_cookie.txt携带会话Cookie,同时保存页面返回的新nonce令牌(可通过grep或正则提取) - 用提取到的有效nonce令牌构造中转请求,或者直接从页面源码中提取真实的PDF文件URL(如果有权限的话),再用Cookie直接下载
- 先发送GET请求到PDF所在页面,用
请求头冗余且可能干扰验证
复制的cURL命令包含大量浏览器专属的请求头(如sec-ch-ua系列、priority),部分站点会验证这些头的一致性,或因头信息过多导致请求被拦截。建议精简请求头,只保留必要的user-agent、referer、accept等。
最后,下载PDF时确保添加--output filename.pdf参数,避免二进制内容输出到终端导致文件损坏。
内容的提问来源于stack exchange,提问作者dataviolet

