You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用cURL/XHR提取带WordPress Cookie的嵌入式PDF失败求助

问题:cURL下载需登录的嵌入式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: &quot;Google Chrome&quot;;v=&quot;129&quot;, &quot;Not=A?Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;129&quot;' \
  -H 'sec-ch-ua-mobile: ?1' \
  -H 'sec-ch-ua-platform: &quot;Android&quot;' \
  -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&amp;log=REDACTEDUSERNAME&amp;pwd=REDACTEDPWORD&amp;wp-submit=Log+In&amp;redirect_to='

下载PDF的命令

curl 'https://fddexchange.com/?title=Dogtopia%20Complete%20FDD%20April%2015%202024&amp;index=1&amp;pdfID=86513&amp;pdfemb-serveurl=https%3A%2F%2Ffddexchange.com%2Fwp-content%2Fuploads%2Fsecurepdfs%2F2024%2F05%2FDogtopia-Complete-FDD-April-15-2024.pdf&amp;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&amp;index=1&amp;pdfID=86513&amp;pdfemb-serveurl=https%3A%2F%2Ffddexchange.com%2Fwp-content%2Fuploads%2Fsecurepdfs%2F2024%2F05%2FDogtopia-Complete-FDD-April-15-2024.pdf' \
  -H 'sec-ch-ua: &quot;Google Chrome&quot;;v=&quot;129&quot;, &quot;Not=A?Brand&quot;;v=&quot;8&quot;, &quot;Chromium&quot;;v=&quot;129&quot;' \
  -H 'sec-ch-ua-mobile: ?1' \
  -H 'sec-ch-ua-platform: &quot;Android&quot;' \
  -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' 

请问我哪里操作出错了?


回答

你的操作主要存在以下几个问题:

  1. 登录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='
    
  2. PDF请求缺少关键参数或会话验证
    你复制的XHR请求是PDF嵌入插件的中转请求,而非直接的PDF文件请求。这类请求通常会验证pdfemb-nonce(一次性令牌),而该令牌是绑定会话和页面的,你直接复用复制的令牌可能已失效。
    正确做法:

    • 先发送GET请求到PDF所在页面,用-b login_cookie.txt携带会话Cookie,同时保存页面返回的新nonce令牌(可通过grep或正则提取)
    • 用提取到的有效nonce令牌构造中转请求,或者直接从页面源码中提取真实的PDF文件URL(如果有权限的话),再用Cookie直接下载
  3. 请求头冗余且可能干扰验证
    复制的cURL命令包含大量浏览器专属的请求头(如sec-ch-ua系列、priority),部分站点会验证这些头的一致性,或因头信息过多导致请求被拦截。建议精简请求头,只保留必要的user-agent、referer、accept等。

最后,下载PDF时确保添加--output filename.pdf参数,避免二进制内容输出到终端导致文件损坏。


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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:32:02