使用Doppio转换受密码保护HTML为PDF失败,求助Cookie认证方法
为什么authenticate参数无效?
你的目标站点是通过页面重定向到登录表单完成认证,而非HTTP基础认证(弹出浏览器自带的登录框),所以Doppio的authenticate参数不适用,必须用Cookie认证方式。
步骤1:找到目标站点的认证Cookie名称
- 打开浏览器,手动访问并登录你的目标站点(
https://example.com/admin/property) - 按下F12打开开发者工具,切换到
Application(Chrome)或存储(Firefox)标签 - 在左侧菜单找到
Cookies-> 你的站点域名(比如example.com) - 查看登录后新增的Cookie条目,通常名称类似:
session_id、auth_token、user_session、laravel_session(如果是Laravel框架)等,这些就是维持登录状态的关键Cookie。
步骤2:通过代码获取认证Cookie并传给Doppio API
你需要先模拟登录目标站点,拿到有效Cookie,再将Cookie注入Doppio的请求中:
// 1. 先模拟登录目标站点,获取认证Cookie $loginClient = new \GuzzleHttp\Client(['cookies' => true]); // 先获取登录页面的CSRF令牌(如果站点需要) $loginPageResponse = $loginClient->get('https://example.com/login'); $loginPageContent = (string)$loginPageResponse->getBody(); // 用正则匹配CSRF令牌,根据实际站点的表单字段调整 preg_match('/<input type="hidden" name="_token" value="(.*?)"/', $loginPageContent, $matches); $csrfToken = $matches[1] ?? ''; // 发送登录请求 $loginClient->post('https://example.com/login', [ 'form_params' => [ 'email' => 'user@domain.com', // 注意:实际站点的表单字段可能是username,需调整 'password' => 'password', '_token' => $csrfToken // 如果站点需要CSRF的话 ] ]); // 获取登录后的CookieJar $cookieJar = $loginClient->getConfig('cookies'); // 转换为Doppio需要的键值对格式 $cookies = []; foreach ($cookieJar as $cookie) { $cookies[$cookie->getName()] = $cookie->getValue(); } // 2. 调用Doppio API,传入Cookie $doppioClient = new \GuzzleHttp\Client(); $response = $doppioClient->post('https://api.doppio.sh/v1/render/pdf/sync', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer apikey', 'Content-Type' => 'application/json' ], 'json' => [ 'page' => [ "pdf" => [ "printBackground" => true ], "goto" => [ "url" => 'https://example.com/admin/property' ], "cookies" => $cookies // 注入认证Cookie ] ] ]); $responseBody = $response->getBody();
注意事项
- 登录请求的
form_params要和目标站点的登录表单字段完全匹配,比如有些站点用username而非email,需要查看登录页的HTML源码确认。 - 如果站点有验证码或其他风控机制,可能需要额外处理。
- Cookie可能有过期时间,建议每次请求Doppio前都重新获取一次有效Cookie。
内容的提问来源于stack exchange,提问作者Aayush Dahal
相关产品推荐
相关产品推荐

