如何为undetected_chromedriver(v3.5.5)的Get请求添加Token请求头?
在undetected_chromedriver v3.5.5中为GET请求添加Token请求头
你之前的代码无法生效,是因为options.add_argument()只能添加Chrome的启动命令行参数,而authorization并不是合法的启动参数,浏览器不会识别它来设置请求头。下面提供两种可行的解决方案:
方法一:通过Chrome DevTools Protocol(CDP)注入请求头
创建浏览器实例后,利用CDP的Network.setExtraHTTPHeaders命令,全局添加自定义请求头:
import undetected_chromedriver as uc def init_webdriver(headless=False, token=None): options = uc.ChromeOptions() user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0.0.0" options.add_argument(f"user-agent={user_agent}") driver = uc.Chrome(headless=headless, options=options) # 如果token存在,通过CDP设置全局请求头 if token: extra_headers = { "Authorization": f"Bearer {token}" # 根据实际Token格式调整,比如Token xxx } driver.execute_cdp_cmd("Network.setExtraHTTPHeaders", {"headers": extra_headers}) return driver
注意:如果你的Token格式不是Bearer,直接替换成对应格式即可,比如"Authorization": f"Token {token}"。
方法二:通过自定义Chrome扩展拦截并添加请求头
如果CDP方法在某些场景下失效(比如页面刷新后需要重新设置),可以用Chrome扩展实现持久化的请求头修改:
- 创建一个扩展文件夹,比如
header_modifier,里面新建两个文件:
manifest.json(扩展配置):
{ "manifest_version": 3, "name": "Header Modifier", "version": "1.0", "permissions": ["declarativeNetRequest", "activeTab"], "host_permissions": ["<all_urls>"], "background": { "service_worker": "background.js" } }
background.js(拦截请求并添加头):
chrome.declarativeNetRequest.updateDynamicRules({ addRules: [ { "id": 1, "priority": 1, "action": { "type": "modifyHeaders", "requestHeaders": [ { "header": "Authorization", "operation": "set", "value": "Bearer YOUR_TOKEN_HERE" // 这里后续会用代码动态替换 } ] }, "condition": { "urlFilter": "*", "resourceTypes": ["main_frame", "sub_frame", "xmlhttprequest", "script", "stylesheet"] } } ], removeRuleIds: [1] });
- 修改Python代码,动态替换扩展中的Token并加载扩展:
import undetected_chromedriver as uc import os import shutil def init_webdriver(headless=False, token=None): options = uc.ChromeOptions() user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/122.0.0.0" options.add_argument(f"user-agent={user_agent}") if token: # 复制扩展模板到临时目录 temp_ext_dir = "./temp_header_ext" if os.path.exists(temp_ext_dir): shutil.rmtree(temp_ext_dir) shutil.copytree("./header_modifier", temp_ext_dir) # 替换background.js中的Token bg_js_path = os.path.join(temp_ext_dir, "background.js") with open(bg_js_path, "r", encoding="utf-8") as f: content = f.read() content = content.replace("YOUR_TOKEN_HERE", token) with open(bg_js_path, "w", encoding="utf-8") as f: f.write(content) # 加载扩展 options.add_argument(f"--load-extension={os.path.abspath(temp_ext_dir)}") driver = uc.Chrome(headless=headless, options=options) return driver
这种方法的优势是请求头会自动应用到所有符合规则的请求中,无需每次页面跳转后重新设置。
内容的提问来源于stack exchange,提问作者Rafael Castillo
相关产品推荐
相关产品推荐

