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

如何将Selenium登录凭证传递给PDFKit?授权失败问题求助

解决Selenium登录后PDFKit无法获取凭证的问题

这个坑我之前踩过!本质原因是Selenium控制的Chrome实例和PDFKit调用的渲染引擎(不管是wkhtmltopdf还是独立Chrome进程)是完全分离的,它们的会话Cookie、登录状态不共享,所以PDFKit访问页面时自然会触发“未授权”。给你三个实用的解决方案,按推荐程度排序:

方法1:直接用Selenium调用Chrome原生打印生成PDF(最推荐)

Chrome本身就支持把页面导出为PDF,Selenium可以通过Chrome DevTools协议直接调用这个功能,完全复用当前登录会话,不需要额外处理Cookie,样式也和浏览器里看到的一模一样。

代码示例:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import base64

chrome_path = r"C:\chrome\chromedriver.exe"
chrome_options = Options()
driver = webdriver.Chrome(chrome_path, options=chrome_options)

# 先完成登录流程
driver.get("https://test.test.com/login")
# 这里添加你的登录代码,比如输入用户名密码、点击登录按钮
# driver.find_element(By.ID, "username").send_keys("your-username")
# driver.find_element(By.ID, "password").send_keys("your-password")
# driver.find_element(By.ID, "login-btn").click()

# 导航到需要生成PDF的目标页面
driver.get("https://test.test.com/your-target-page")
time.sleep(2)  # 等待页面完全加载(根据实际情况调整)

# 调用Chrome的打印PDF功能
pdf_config = {
    "printBackground": True,  # 打印背景色/图片,避免文字缺失样式
    "landscape": False,
    "paperWidth": 8.27,  # A4纸宽度(英寸)
    "paperHeight": 11.69, # A4纸高度(英寸)
    "marginTop": 0.4,
    "marginBottom": 0.4,
    "marginLeft": 0.4,
    "marginRight": 0.4
}
pdf_data = driver.execute_cdp_cmd("Page.printToPDF", pdf_config)

# 把base64编码的PDF数据保存为文件
with open("output.pdf", "wb") as f:
    f.write(base64.b64decode(pdf_data['data']))

# 关闭浏览器
driver.quit()

方法2:导出Selenium的Cookie传给PDFKit

如果一定要用PDFKit,可以把Selenium登录后的Cookie导出,转换成PDFKit能识别的格式,在请求时带上这些Cookie,模拟登录状态。

代码示例:

from selenium import webdriver
import pdfkit
from selenium.webdriver.chrome.options import Options
import time
from selenium.webdriver.common.by import By

chrome_path = r"C:\chrome\chromedriver.exe"
driver = webdriver.Chrome(chrome_path)

# 完成登录流程
driver.get("https://test.test.com/login")
# 你的登录操作...

# 登录成功后,获取所有Cookie
cookies = driver.get_cookies()
# 把Cookie转换成HTTP请求头格式:"name1=value1; name2=value2"
cookie_string = "; ".join([f"{cookie['name']}={cookie['value']}" for cookie in cookies])
# 获取当前浏览器的User-Agent,避免被网站识别为不同客户端
user_agent = driver.execute_script("return navigator.userAgent;")

# 配置PDFKit选项
pdf_options = {
    'cookie': cookie_string,
    'user-agent': user_agent,
    'print-media-type': None,  # 确保用打印样式渲染
    'enable-local-file-access': None
}

# 生成PDF
pdfkit.from_url("https://test.test.com/your-target-page", "output.pdf", options=pdf_options)

driver.quit()

注意:部分网站的Cookie带有HttpOnly标记,Selenium虽然能获取这类Cookie,但PDFKit是否能正确传递可能要看渲染引擎的支持,不过大部分场景下这个方法是有效的。

方法3:共享Chrome用户数据目录(不推荐,易出冲突)

Chrome的用户数据目录会保存会话、Cookie等信息,你可以让Selenium和PDFKit使用同一个用户数据目录,实现状态共享。但要注意Chrome不允许两个进程同时使用同一个用户数据目录,所以必须先关闭Selenium的浏览器实例,再调用PDFKit。

代码示例:

from selenium import webdriver
import pdfkit
from selenium.webdriver.chrome.options import Options

chrome_path = r"C:\chrome\chromedriver.exe"
# 指定自定义用户数据目录
profile_path = r"C:\chrome_custom_profile"

# 1. 用Selenium登录并保存会话到用户目录
chrome_options = Options()
chrome_options.add_argument(f"user-data-dir={profile_path}")
driver = webdriver.Chrome(chrome_path, options=chrome_options)
driver.get("https://test.test.com/login")
# 你的登录操作...
driver.quit()  # 必须关闭浏览器,释放用户目录

# 2. 用PDFKit调用同一个用户目录的Chrome生成PDF
pdf_config = pdfkit.configuration(wkhtmltopdf=r'C:\path\to\wkhtmltopdf.exe')  # 若用wkhtmltopdf需指定路径,或直接用Chrome
pdf_options = {
    'user-data-dir': profile_path,
    'enable-local-file-access': None
}
pdfkit.from_url("https://test.test.com/your-target-page", "output.pdf", options=pdf_options, configuration=pdf_config)

这个方法容易出现进程冲突,比如Chrome没完全关闭导致PDFKit无法读取用户目录,所以优先级不如前两个。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:34:50