004.chromium编译进阶-启动时传入cookies

一、目标:

  • 实现传入参数--set-cookies='[{"domain":"https://baidu.com","name":"AAAA","value":"111"},{"domain":"https://baidu.com","name":"BBB","value":"222"}]',实现浏览器启动时,默认带上这2个cookie

阅读此篇博客前,请确保你已经可以完整的编译出自己的chromium了。
入门插眼:https://blog.csdn.net/w1101662433/article/details/137949705
官方编译文档:https://github.com/chromium/chromium/blob/main/docs/windows_build_instructions.md

二、为何要传参传入cookies

  • 已知自动化工具selenium,puppeteer等都有启动时携带初始cookie功能,所以这部分用户可以忽略。
  • 已知chromium的cookie存储位置是user-data-dir/Default/Network/Cookies。这个文件没有后缀,但实际是个sqlite库文件,可以使用sqlite打开。
  • 但是在源码里写sql还是有点麻烦,不如直接用调用源码中已有的函数,拿来调用即可。

三、修改chromium源码

  • 打开 /content/browser/storage_partition_impl.cc
1.引用:
#include <iostream>
#include "base/json/json_reader.h"   
#include "net/cookies/canonical_cookie.h"
2.找到:
network::mojom::CookieManager*
StoragePartitionImpl::GetCookieManagerForBrowserProcess() {DCHECK(initialized_);// Create the CookieManager as needed.if (!cookie_manager_for_browser_process_ ||!cookie_manager_for_browser_process_.is_connected()) {// Reset `cookie_manager_for_browser_process_` before binding it again.cookie_manager_for_browser_process_.reset();GetNetworkContext()->GetCookieManager(cookie_manager_for_browser_process_.BindNewPipeAndPassReceiver());}return cookie_manager_for_browser_process_.get();
}
3.替换为:
network::mojom::CookieManager*
StoragePartitionImpl::GetCookieManagerForBrowserProcess() {DCHECK(initialized_);// Create the CookieManager as needed.if (!cookie_manager_for_browser_process_ ||!cookie_manager_for_browser_process_.is_connected()) {// Reset `cookie_manager_for_browser_process_` before binding it again.cookie_manager_for_browser_process_.reset();GetNetworkContext()->GetCookieManager(cookie_manager_for_browser_process_.BindNewPipeAndPassReceiver());}// 开始追加 ===========================================// 传参:--set-cookies='[{"domain":"https://baidu.com","name":"AAAA","value":"111"},{"domain":"https://baidu.com","name":"BBB","value":"222"}]'base::CommandLine* base_command_line = base::CommandLine::ForCurrentProcess();std::string json_str = base_command_line->GetSwitchValueASCII("set-cookies"); auto parsed_json = base::JSONReader::Read(json_str);if (parsed_json && parsed_json->is_list()){for (const auto& item : parsed_json->GetList()) {if (!item.is_dict()) continue;network::mojom::CookieManager* cookie_manager = cookie_manager_for_browser_process_.get();const auto& dict = item.GetDict();const std::string* domain = dict.FindString("domain");const std::string* name = dict.FindString("name");const std::string* value = dict.FindString("value");//GURL url("https://baidu.com/");GURL url(*domain);std::string cookie_line = *name + "=" + *value + ";domain=" + url.host();std::cerr <<  "set-cookie: " << cookie_line << std::endl;//std::string cookie_line = std::string("BBBBB=222222222;domain=") + url.host();auto cookie = net::CanonicalCookie::Create(url, cookie_line, base::Time::Now(), absl::nullopt /* server_time */,std::nullopt, net::CookieSourceType::kOther,/*status=*/nullptr);cookie_manager->SetCanonicalCookie(*cookie, url, net::CookieOptions::MakeAllInclusive(),base::BindOnce([](net::CookieAccessResult result) {// 可在此添加日志或错误处理}));}}// 结束追加 ===========================================return cookie_manager_for_browser_process_.get();
}

注意:此处为chromium137版本,其他版本略有不同,需要自行理解。

四、检测:

  • cmd执行:
./chrome.exe https://www.baidu.com/ --user-data-dir=e:/1111/223111 --set-cookies='[{"domain":"https://baidu.com","name":"AAAA","value":"111"},{"domain":"https://baidu.com","name":"BBB","value":"222"}]'

在这里插入图片描述

可以看到,cookie写入成功了。

五、感想

  • 最近工作比较忙,可以用来更新博客的时间越来越少了,大家就不要太关注了。哈哈,随缘。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/85969.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/85969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据库复习】

数据库复习题 一、填空题1&#xff0e;数据库系统一般由&#xff08;数据库&#xff09;、应用系统、&#xff08;数据库管理系统&#xff09;、&#xff08;数据库管理员&#xff09;和用户构成。2&#xff0e;数据模型通常由&#xff08;数据结构&#xff09;、&#xff08;数…

微信小程序:选择页面单选实现(多页面均可选择)

一、效果展示 1、主页面 展示了两个选择行 2、选择页面 根据传递的参数决定员工展示的数据,并且单选,可将数据传递给主页面 二、主页面实现 1、视图层 写入了采购员和库管员的行选择信息 <view class="item flex flex-between"><view class="i…

使用docker-compose搭建redis-cluster集群

前言 如果你也因为centos的gcc版本落后导致redis编译安装不通过而烦恼&#xff0c;大可以试一试用docker去搭建redis集群。本文以单节点搭建redis-cluster三主三从为例。 ip&#xff1a;192.168.0.10redis信息&#xff1a; 客户端连接端口&#xff1a;7001 -7006集群间通信端…

【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程

【LLaMA-Factory 实战系列】二、WebUI 篇 - Qwen2.5-VL 多模态模型 LoRA 微调保姆级教程 1. 引言1.1 为什么选择 Qwen2.5-VL-3B-Instruct&#xff1f;1.2 环境要求 2. 环境搭建2.1 安装 LLaMA-Factory2.2 验证安装 3. 数据集准备与配置3.1 数据集结构3.2 数据格式3.3 数据集声明…

风险矩阵与灰色综合评价

一、风险矩阵&#xff08;Risk Matrix&#xff09; 1. 定义与原理 定义&#xff1a;风险矩阵是一种通过二维网格&#xff08;可能性 vs. 后果严重程度&#xff09;可视化展示风险等级的工具&#xff0c;用于优先级排序和决策支持。核心要素&#xff1a; 横轴&#xff08;X轴&…

谷歌浏览器电脑版官方下载- Google Chrome官方网页版入口

谷歌浏览器&#xff08;Google Chrome&#xff09;是一款由谷歌公司开发的免费网页浏览器&#xff0c;自2008年首次发布以来&#xff0c;迅速成为全球最受欢迎的浏览器之一。它以简洁的界面设计、快速的浏览速度和强大的安全性能而闻名。谷歌浏览器支持多种操作系统&#xff0c…

垂直电商供应链平台:重构产业生态,驱动数字化增长

垂直电商供应链平台&#xff1a;重构产业生态&#xff0c;驱动数字化增长 在电商行业竞争日益激烈的当下&#xff0c;垂直电商供应链平台凭借对细分领域的深度聚焦与数字化能力&#xff0c;成为产业升级的关键引擎。本文围绕垂直电商供应链平台的架构、价值及生态构建展开&…

VSCode 插件 Remote - SSH:开启高效远程开发之旅

在当今的软件开发领域&#xff0c;远程开发已经成为了一种越来越流行的工作方式。无论是分布式团队协作&#xff0c;还是需要在不同环境中进行开发&#xff0c;远程开发都能为开发者带来极大的便利。而 VSCode 的 Remote - SSH 插件&#xff0c;就是一款能够帮助开发者实现高效…

亚矩阵云手机+Whatnot:直播电商的自动化增长引擎

在直播电商蓬勃发展的今天&#xff0c;Whatnot作为北美领先的收藏品和潮流商品拍卖平台&#xff0c;吸引了大量卖家和收藏爱好者。然而&#xff0c;高效运营多个账号、管理直播场次、优化出价策略等挑战&#xff0c;让许多商家难以规模化经营。​​亚矩阵云手机​​与​​Whatn…

关于vue.mixin与vue.use的用法分析

背景。源码不会读&#xff0c;不清楚的问大模型。特别是对平常开发太会用到的情形。 vue.mixin。是将每一个页面注入mixin的内容。会对页面中注入$uStore而不是方便获取状态信息。 vue.use。按装的插件。用于封装完整的功能&#xff0c;如UI库&#xff0c;路由拦截器等&…

MySQL 8.x配置MGR高可用+ProxySQL读写分离(二):ProxySQL配置MySQL代理及读写分离

#作者&#xff1a;stackofumbrella 文章目录 ProxySQL简介ProxySQL架构ProxySQL的安装与配置在不同层次间移动配置 ProxySQL简介 ProxySQL是基于MySQL的一款开源的中间件的产品&#xff0c;是一个灵活的MySQL代理层&#xff0c;可以实现读写分离&#xff0c;支持Query路由功能…

基于 Python Flask 的 B/S 架构项目的软件设计思路

文章目录 基于 Python Flask 的 B/S 架构项目的软件设计思路1. 引言2. B/S架构概述2.1 什么是B/S架构2.2 B/S架构的组成层次2.3 B/S vs C/S架构对比2.4 现代B/S架构的发展趋势 3. Flask在B/S架构中的定位3.1 Flask作为B/S架构的后端框架3.2 Flask的架构优势3.3 Flask在不同B/S架…

AntV F2入门教程

以下教程将系统地介绍 AntV F2&#xff08;移动端可视化引擎&#xff09;的核心 组件 API&#xff0c;包含安装与引入、画布与图表、数据映射、几何标记、坐标轴、图例、提示、标注和滚动条等&#xff0c;每个 API 都附带完整示例代码&#xff0c;帮助你快速掌握 F2 用法。 一…

退休时医疗保险补缴的基数影响什么

退休时医疗保险的补缴基数主要影响补缴金额、医保个人账户划入待遇、终身医保待遇的享受条件等关键方面。以下是具体分析&#xff1a; 1. 影响补缴金额的多少 补缴基数通常以退休时上年度全省/市职工月平均工资或本人退休前缴费基数为基准&#xff08;各地政策不同&#xff09…

conda导出环境文件requirements.txt

conda导出的几种方式 方式一&#xff1a;使用pip freeze&#xff08;推荐&#xff09; 如果你主要使用 pip 安装包&#xff0c;且环境中的包都兼容 PyPI&#xff0c;可以直接用 pip 导出&#xff1a; conda activate your_env_name # 激活环境&#xff08;若未激活&#xf…

华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践

华为云 FlexusDeepSeek 征文&#xff5c;增值税发票智能提取小工具&#xff1a;基于大模型的自动化信息解析实践 前言背景 企业财务处理中&#xff0c;增值税发票信息手动提取存在效率低、易出错等痛点&#xff0c;华为云 Flexus 弹性算力联合 DeepSeek 大模型&#xff0c;通过…

亚马逊选品 家具或艺术?指纹技术重构两者

58%毛利&#xff01;生物识别首饰盒代理 奢侈品零售的隐藏金矿&#xff1a;安防产品的毛利是普通家居的3倍&#xff01; 核心数据 零售价 4,900 | 代理价 1,990 → 毛利58% 零库存风险&#xff1a;90天寄售周期 72小时售罄&#xff1a;贝弗利山庄快闪店卖出47台 首批10家特权…

面试150 加油站

思路 此题&#xff0c;我们从贪心算法的角度进行思考。通过计算净消耗&#xff0c;如果总的净消耗小于0&#xff0c;说明无论如何都不能环路行驶一周。我们通过定义一个start起点&#xff0c;通过遍历数组计算净消耗&#xff0c;如果净消耗小于0&#xff0c;重新置0&#xff0…

2025年渗透测试面试题总结-渗透测试工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 渗透测试工程师 1. 自我介绍 2. 印象深刻的渗透案例&#xff1a;电商平台供应链攻击 3. 渗透测试标准化流…

Vulkan 学习笔记15—Mipmap 与多重采样

一、Mipmap 生成总结 一、Mipmap 基础概念 定义&#xff1a;Mipmap 是图像预先计算的缩小版本&#xff0c;每个层级宽高为前一层的一半&#xff0c;用作细节级别&#xff08;LOD&#xff09;。作用&#xff1a; 远离相机的对象使用较小层级采样&#xff0c;提升渲染速度。避免…