日习一技 - 2025年6月
type: channel
link: https://i-study-everyday.online/2025/06/
description: 每天学一点新技术，新框架，新工具，新名词。关于编程语言，数据库，数据结构，算法，机器学习，云计算。
items: 学习 Claude Code 的工具使用
items: 学习 Claude Code 的命令行操作
items: 学习 Claude Code 的基本技巧
items: 让 Claude Code 接入其他大模型
items: 实践 Claude Code 的日常使用场景
items: Claude Code 介绍：一款运行在终端里的智能编程助手
items: 使用 Patchright 绕过浏览器机器人检测
items: 详解 Browser Use 的浏览器配置
items: 使用 Browser Use 连接你的浏览器
items: 详解 Browser Use 的 Agent 用法（四）

学习 Claude Code 的工具使用
type: item
date: 2025-06-30T00:24:00+00:00
description: 在前面的学习中我们已经接触了不少 Claude Code 的工具，比如使用 List 工具列出文件列表，使用 Read 和 Write 工具对文件进行读写，使用 Bash 工具调用 git add 或 git commit 等命令。Claude Code 内置了不少工具，但是由于 Claude Code 并没有开源，除了官方文档，我们并没有太多工具相关的资料可参考。因此我使用 Wireshark 对 Claude Code 的请求抓包分析，看到了它内置的提示词以及 tools 参数：从上图可以看到，Claude Code 内置了 16 个工具，这些工具大致可以分为下面几类：分类分类描述示例工具命令执行允许在 Shell 会话中执行 Bash 命令Bash文件查找用于快速查找并匹配文件LS、Glob 和 Grep文件读写用于读取或写入文件，允许进行文件编辑和内容替换Read、Write、Edit 和 MultiEditNotebook 读写用于读取和编辑 Jupyter Notebook（也就是 .ipynb 文件）NotebookRead 和 NotebookEditWeb 检索用于检索和分析 Web 内容的工具WebFetch 和 WebSearch复杂任务处理通过子智能体或任务清单来执行复杂任务Task、TodoWrite、TodoRead 和 exit_plan_mode今天就来仔细学习一下这些工具。Bash 执行命令Claude Code 是一款基于终端的 AI 编程助手，它继承了你的 Shell 环境，可以调用常用的 Unix 命令。比如调用 du 查看文件夹大小：调用 zip 压缩文件夹：甚至可以使用你安装的任何命令行工具，比如我们之前学过 PDFMathTranslate 这款开源的 PDF 文档翻译工具，让 Claude Code 来试试：当然，默认情况下 Claude Code 并不知道这些命令，可以通过在 CLAUDE.md 中记录常用的命令，告诉 Claude 可以使用哪些命令以及每个命令的用法：你可以使用下面这些 Bash 命令： * pdf2zh - 一款免费开源的 PDF 文档翻译工具，支持多种语言和翻译服务，最大的特色是翻译后保持排版不变。 基本用法，默认将英文 PDF 文件翻译成中文：`pdf2zh example.pdf` 指定源和目标语言：`pdf2zh example.pdf -li en -lo ja` 查看命令文档：`pdf2zh --help`Bash 命令几乎可以实现任何功能，但是不同的 Bash 命令参数迥异，有些命令的参数还特别复杂，为了防止大模型生成命令时误入歧途，Claude Code 内置了一些工具来替代常见的 Unix 命令。从抓包请求里可以看到 Bash 工具的描述，其中有几个点比较有意思：含空格的路径必须用双引号包裹严禁使用 find 和 grep 搜索命令，改用 Grep / Glob / Task 工具避免使用 cat / head / tail / ls 等读取工具，改用 Read / LS 工具如果你仍然要运行 grep，请停止，必须优先使用预装的 rg 来替代，所有 Claude Code 用户都已预安装此工具尽量使用绝对路径，避免使用 cd，除非用户明确要求这样做的好处是，大模型通过 function call 生成结构化的命令，比直接生成长长的命令行要可控的多。LS 列出文件和目录从 Bash 的工具描述中可以看到，Claude Code 使用内置的 LS 工具替代 ls 命令：内置 LS 的好处是它可以递归遍历子目录，如上图所示（使用 Ctrl + R 可以展开详情）。Glob 根据文件名查找文件另一个内置的 Glob 工具用于替代 find 命令，可以基于模式匹配来查找文件：它有点类似下面这个 find 命令：$ find . -type f -name "*global*"但比 find 命令强的地方在于它支持 Glob 模式匹配，比如 **/*.js 或 src/**/*.ts 这样。尽管在 Bash 的工具描述里特别提到 严禁使用 find 命令，但是我验证下来发现，如果内置的工具不足以完成用户的任务，Claude Code 还是会使用这些被限制的命令：Grep 搜索文件内容另外，从 Bash 的工具描述中我们还得知，Claude Code 预装了一个叫 rg 的工具用于替代 grep 命令，这个 rg 全名叫 ripgrep，是一个现代的命令行搜索工具，相对于 grep 来说搜索效率更高。可以在 Claude Code 的安装目录下找到它：@anthropic-ai/claude-code/vendor/ripgrepripgrep 使用 …

学习 Claude Code 的命令行操作
type: item
date: 2025-06-27T09:38:00+00:00
description: 我们昨天学习了 Claude Code 的一些实用技巧，包括提问的艺术、图像的处理，文件和网址的处理、扩展思考模式等，还介绍了几个会话管理的小命令，Claude Code 还有不少实用的命令和参数，我们今天来盘点下。使用 claude --help 查看 Claude Code 支持的所有命令和参数：非交互模式参数 -p 或 --print 可以让 Claude Code 直接打印响应，不进入交互模式，这对于脚本编写和自动化特别有用。比如下面的例子让 Claude Code 充当一个代码检查工具：$ claude -p "你是一个代码检查工具，请检查主分支的更改，并报告任何与拼写错误相关的问题。报告分两行：第一行是文件名和行号，第二行描述问题。不要返回任何其他文本。"非交互模式可以让我们很方便地将 Claude Code 无缝地集成到构建脚本或 CI/CD 工作流中。假如你在开发 Node.js 项目，可以将这个命令添加到 package.json 文件：{ ... "scripts": { ... "lint:claude": "claude -p '你是一个代码检查工具...'" } }然后运行 npm run lint:claude 来对提交的代码进行检查：除了代码检查，你可以自定义提示词实现更多其他功能。为了防止非交互模式下 Claude Code 陷入死循环，可以使用 --max-turns 参数限制对话的轮数：$ claude -p --max-turns 3 "query"非交互模式还可以让我们使用管道将 Claude Code 集成到现有的 Shell 脚本中，与其他 Unix 工具结合使用以实现强大的工作流程：$ cat build-error.txt | claude -p '详细解释这个构建错误并分析可能的出错原因' > output.txt默认 Claude Code 的输出为纯文本方式，可以考虑使用 —output-format 参数进行结构化输出：$ cat package.json | claude -p '找出这个文件中可能存在的问题' --output-format=json > output.json这种输出结构方便我们以编程方式解析 Claude 的响应，输出内容包含状态、结果、耗时、使用的 tokens 等元数据，如下：{ "type": "result", "subtype": "success", "is_error": false, "duration_ms": 14340, "duration_api_ms": 17037, "num_turns": 3, "result": "这个 package.json 文件有以下问题：...", "session_id": "ecb8aaf4-4fbe-44c1-a27a-c88f5d85f817", "total_cost_usd": 0.06880885, "usage": { "input_tokens": 9, "cache_creation_input_tokens": 15601, "cache_read_input_tokens": 14445, "output_tokens": 289, "server_tool_use": { "web_search_requests": 0 }, "service_tier": "standard" } }Claude Code 支持 JSON 和流式 JSON 两种结构化输出格式，当使用流式 JSON 时，Claude Code 会实时输出一系列的 JSON 对象，而不是一个 JSON 对象。可以根据需要来选择不同的输出格式：对于只需要 Claude 响应的简单集成，使用 --output-format=text当你需要完整的对话日志时，使用 --output-format=json当你需要每个对话轮次的实时输出时，使用 --output-format=stream-json我们除了可以控制输出格式，也可以使用 --input-format 参数指定输入格式，Claude Code 支持两种输入格式：对于简单集成，使用 --input-format=text当你需要实时流式输入时，使用 --input-format=stream-json调试模式参数 -d 或 --debug 用于开启调试模式：$ claude --debug调试模式右下角会显示 “Debug mode” 的标记，在交互过程中会打印出 Claude Code 中 DEBUG 级别的日志：参数 --verbose 用于开启详细模式，或者叫做冗余模式：$ claude --verbose详细模式下会显示出工具的完整调用结…

学习 Claude Code 的基本技巧
type: item
date: 2025-06-26T09:35:00+00:00
description: 昨天我们折腾了一下 LiteLLM 网关，成功让 Claude Code 接入了其他大模型。这下好了，直接用 OpenRouter 的免费 DeepSeek 模型，再也不用担心 API 费用把钱包掏空了，可以放心大胆地体验 Claude Code 的各种功能。前面我们已经学习了 Claude Code 的安装和基本用法，今天咱们继续深入挖掘一些实用的小技巧，让这个工具用起来更顺手。提问的艺术用 Claude Code 就像跟人聊天一样，你说话越清楚，它就越能帮到你。下面是几个建议：第一，指令越具体越好，比如当你的页面出 BUG 时，不要这样问：> 修复这个 BUG这样问才对：> 修复登录页面的 BUG，用户输错密码后看到的是空白页面而不是错误提示第一种问法就像对着服务员喊"给我来个菜"，第二种才是正常人的沟通方式。第二，大任务拆成小步骤，复杂的需求别一股脑全说出来，要学会拆解：> 1. 给用户资料页面加个新的 API 接口 > 2. 添加必填字段的验证逻辑 > 3. 写几个测试用例验证功能分步解决可以让 Claude Code 更了解用户的意图。第三，让 Claude Code 先摸清状况，别上来就让它动手改代码，先让它了解一下你的项目：> 帮我分析一下这个数据库的表结构 > 这个数据库查询异常是怎么回事？使用扩展思考模式以往的大语言模型，要么擅长快速响应，要么擅长深度推理，很难兼顾两者，比如 DeepSeek 的 V3 和 R1。Claude Sonnet 3.7 号称是业界首个 混合推理（Hybrid Reasoning） 模型，同时支持 标准模式 与 扩展思考模式：标准模式：对于一些事实性问题或简单指令，能迅速给出答案，快速回复用户；扩展思考模式（Extended Thinking）：模型会在回答之前进行自我反思，进行更深入的思考，并给出更全面、更准确的答案；所有在 Claude Sonnet 3.7 之后发布的 Opus 和 Sonnet 模型都支持这两种模式。当我们面对下面这些复杂的任务时可以尝试使用扩展思考：规划复杂的架构更改调试复杂问题为新功能创建实现计划理解复杂的代码库评估不同方法之间的权衡Claude 官方出了一份关于扩展思考的高级策略和技巧指南，推荐阅读：https://docs.anthropic.com/zh-CN/docs/build-with-claude/prompt-engineering/extended-thinking-tips我们在 Claude Code 中对话时，默认使用的是标准模式；如果要处理上面那些复杂的问题时，可以在指令中加上 “think” 或 “think harder” 等触发扩展思考模式：> 我需要实现 OAuth2 认证，深入思考最佳方法 > 思考下，这种方法可能存在哪些潜在的安全漏洞？ > 更深入地思考我们应该处理的边缘情况我试了下，无论是英文 “think” 还是中文 “思考” 都可以触发扩展思考模式，而且可以使用类似 “think more”、“think a lot”、“think harder” 或 “think longer” 这样的强化短语触发更深层的思考。Claude 的思考模式可以通过 budget_tokens 参数控制令牌预算，我猜测不同的提问方式会导致这个参数的值不同，更深层的思考消耗更多的思考令牌，感兴趣的朋友可以验证一下。我这里还是拿数独项目为例，让它给我提一些 SEO 优化的建议：和 DeepSeek R1 一样，Claude 的思考过程对用户也是可见的。在上图中，Claude 以斜体灰色文本显示了其思考过程，你可以看到它是如何一步步分析问题、得出结论的。Claude Code 对我的代码经过一番分析，最终输出如下：经过思考后的输出要更详细。处理图像Claude 系列模型具有视觉能力，可以理解和分析图像。当我们遇到有些问题用文本描述不清或过于繁琐时，可以给 Claude 提供图像，效果会更好，比如错误截图、UI 设计或图表等，图像比文本包含更多的上下文信息。我们可以通过下面几种方法向 Claude Code 对话中添加图像：将图像拖放到 Claude Code 窗口中复制图像并使用 ctrl+v 粘贴到命令行中（不要使用 cmd+v）提供图像路径，例如：“分析图像: /path/to/your/image.png”可以在对话中一次性添加多个图像。下面是使用图像的一些常用场景：让 Claude 分析图像> 这张图片显示了什么？ > 描述截图中的用户界面元素 > 这张图中是否有任何问题元素？使用图像提供上下文> 这是错误的截图，分析是什么原因引起的？ > 这是我们当前的数据库模式，为了实现新增的功能，我们应该如何修改它？从视觉内容获取代码建议…

让 Claude Code 接入其他大模型
type: item
date: 2025-06-25T09:32:00+00:00
description: 尽管 Claude Code 非常好用，但它的费用还是太贵了，之前为了体验，在 Anthropic Console 充了 5 美刀，只用了几天，就所剩无几了：如果能让 Claude Code 使用其他较便宜的大模型（比如 OpenAI 或 DeepSeek 等）或本地大模型（如 Ollama 或 LM Studio 等）来处理编程任务，那就太好了，我们今天就来学习下如何让 Claude Code 接入其他模型。接入 Claude 云提供商Claude Code 默认使用 Anthropic 的 Claude 模型，但是还有一些其他的供应商也提供 Claude 模型，比如 Amazon Bedrock 和 Google Vertex AI，Claude Code 也支持接入这些模型。要使用这些第三方供应商的模型，首先需要按照供应商的要求，配置好对应的 AWS 凭证 或 GCP 凭据，然后通过环境变量告诉 Claude Code 使用供应商模型。设置以下环境变量以启用 Bedrock 模型：export CLAUDE_CODE_USE_BEDROCK=1 export AWS_REGION=us-east-1设置以下环境变量以启用 Vertex AI 模型：export CLAUDE_CODE_USE_VERTEX=1 export CLOUD_ML_REGION=us-east5 export ANTHROPIC_VERTEX_PROJECT_ID=YOUR-PROJECT-ID另外，不同供应商对模型的命名也不同，因此 Claude Code 还提供了两个环境变量来配置使用的模型。比如使用推理配置文件 ID 来配置 Bedrock 模型:export ANTHROPIC_MODEL='us.anthropic.claude-opus-4-20250514-v1:0' export ANTHROPIC_SMALL_FAST_MODEL='us.anthropic.claude-3-5-haiku-20241022-v1:0'这里要配置两个模型，ANTHROPIC_MODEL 为主要模型，用于复杂的编程任务；ANTHROPIC_SMALL_FAST_MODEL 为小型快速模型，用于简单的辅助任务；Claude Code 会根据情况自动切换。配置企业代理有很多企业对网络有特定要求，比如需要通过特定的代理来路由所有进出企业的流量，以实现安全、合规和监控目的。Claude Code 支持标准的 HTTP/HTTPS 代理配置：export HTTPS_PROXY=https://proxy.example.com:8080 export HTTP_PROXY=http://proxy.example.com:8080Claude Code 不支持 SOCKS 代理。如果代理需要基本身份验证，可以在代理 URL 中包含凭据：export HTTPS_PROXY=http://username:password@proxy.example.com:8080如果代理使用了自定义的 SSL 证书，还需要设置正确的证书路径：export SSL_CERT_FILE=/path/to/certificate-bundle.crt export NODE_EXTRA_CA_CERTS=/path/to/certificate-bundle.crt另外要注意的是，Claude Code 在运行过程中需要访问下面这些 URL 地址：api.anthropic.com - Claude API 端点statsig.anthropic.com - 遥测和指标sentry.io - 错误报告确保这些 URL 在代理配置和防火墙规则中被列入白名单。配置 LLM 网关还有很多企业对大模型的访问是集中管控的，以实现使用跟踪或预算控制等，为满足这一类企业的需求，Claude Code 支持配置 LLM 网关。通过 LLM 网关，企业可以做到：集中身份验证 - 对大模型的 API 密钥进行集中管理使用跟踪 - 监控团队和项目的使用情况成本控制 - 实施预算和速率限制审计日志 - 跟踪所有模型交互以确保合规性模型路由 - 无需更改代码即可在提供商之间切换通过 ANTHROPIC_BASE_URL 配置 LLM 网关：export ANTHROPIC_BASE_URL=https://litellm-server:4000/anthropic这里的 /anthropic 地址是 LiteLLM 网关透传的 Anthropic 接口，本质上还是调用 api.anthropic.com 接口，因此，在启动 LiteLLM 时需要配置 Anthropic 的 API KEY：exp…

实践 Claude Code 的日常使用场景
type: item
date: 2025-06-24T09:30:00+00:00
description: 昨天我们学习了 Claude Code 的安装和基本使用，通过自然语言命令完成项目分析到文件提交等任务。但 Claude Code 的能力远不止于此，它还可以帮助我们完成更多复杂的开发任务，比如代码重构、自动化测试、项目架构分析、版本控制管理等，我们今天就来进一步探索这些使用场景和高级功能，看下 Claude Code 对这些任务的表现。新项目快速理解Claude Code 最突出的特点之一是其强大的代码库理解能力。它能够在几秒钟内分析整个项目的结构，理解模块间的依赖关系，识别代码的架构模式，并回答关于代码逻辑和架构的复杂问题。假设你刚加入一个新项目，需要快速了解它的结构，可以试试下面这些命令：> 这个项目是做什么的？ > 给我概述下这个项目 > 这个项目使用了哪些技术？ > 这个项目的主入口在哪里？ > 解释下这个项目的目录结构或者你也可以了解项目的特定功能：> 项目是如何处理用户认证的？ > 查找和用户认证相关的文件 > 讲解从前端到数据库的整个登录过程在面对新项目代码时，掌握一些提问的技巧也很重要，比如先从广泛的问题开始问起，然后缩小到特定领域；还可以询问项目使用了哪些特定术语，使用了哪些编码约定；这些信息都能很好的让 Claude Code 了解这个项目。下面还是拿数独项目作为示例，让 Claude Code 讲解下数独生成是如何实现的：可以看到 Claude Code 详细讲解了数独生成的算法，并准确地定位到了具体的代码位置。和 Cursor 等 AI 代码编辑器不同的是，我们不需要手动添加上下文，Claude Code 会根据需要自动查询并读取相关的文件。添加和修改代码基于对代码库的深度理解，Claude Code 能够进行跨文件的智能编辑，它能同时修改多个相关文件，并保持代码的一致性和最佳实践。常见的使用场景包括添加新功能和特性、问题诊断和修复、对代码进行重构或性能优化等：> 使用 JWT 实现用户认证功能 > 解决这个编译报错问题 > 这里用户可以提交空表单，修复下这个 BUG > 找到代码中使用的过期 API 并重构 > 使用 SQLAlchemy 重构数据库层代码 > 分析这里的代码逻辑是否存在性能问题，提出优化建议在向 Claude Code 描述错误时，可以带上详细的错误堆栈、重现错误的任何步骤和命令、以及这个错误是偶现还是必现等信息，Claude 会尝试分析这些错误信息，找到问题源头并修复。另外，Claude Code 可以自动编写和运行测试，并从测试结果中识别和修复问题：> 为计算器模块编写单元测试 > 找出 NotificationsService 中所有测试未覆盖的方法 > 为重构后的代码运行测试 > 修复这些失败的单元测试现在我们来让 Claude Code 做一些实际的编程工作，尝试让它给我的数独项目加个小功能，我希望用户在进入首页时，自动生成一道数独题：这里可以看到一个有趣的现象，Claude Code 首先生成了一个 Todo 列表，然后开始编写代码，结束编码后再将 Todo 列表更新为已完成。尽管这里只有一步，但是也让我们略窥到 Claude Code 的实现思路，这种方式可以让 Claude Code 解决比较复杂的多步任务。另外，Claude Code 在编辑文件时会以 diff 的形式显示出修改点，让用户确认，只有得到用户批准后才会真正执行。默认每次修改都会请求确认，如果嫌麻烦，可以为会话启用 ”全部接受” 模式。实现效果如下：生成文档和注释程序员最怕写文档和注释，而 Claude Code 最擅长干这事：> 更新 README 文档，添加安装步骤 > 为 auth.js 文件中的所有函数加上 JSDoc 注释比如我们接着上面的例子，让 Claude Code 将增加的功能更新到 README 文件中：Git 集成和代码审查Claude Code 与 Git 深度集成，使得我们可以用对话的方式来执行 Git 操作，比如智能提交、创建分支、解决冲突等：> 提交刚刚的所有修改 > 提交 README.md 文件 > 创建一个新分支 feature/quickstart > 用刚刚的修改创建一个 PR > 解决合并冲突Claude Code 在提交代码时会很智能的分析提交的内容，自动生成提交消息：可以看到 Claude Code 先用 git status 检查变动的文件有哪些，然后使用 git diff 对比文件的修改点，这样它就知道了我们都改了什么内容；接着 Claude Code 执行 git log --oneline -5 命令，快速浏览最近的 5 次提交历史，这一步让它对项目最新的变化有个了解，我猜也是为了生成和历史更一致的提交消息；再然后 git add 和 git co…

Claude Code 介绍：一款运行在终端里的智能编程助手
type: item
date: 2025-06-23T09:23:00+00:00
description: 今年 2 月份，Anthropic 公司发布 Claude 3.7 Sonnet 混合推理模型，在编码和前端开发方面表现非常出色，一时之间成为所有 AI 代码编辑器的首推模型；同时，他们还推出了一款新的命令行工具 —— Claude Code ，这是一个智能编程助手，和 Cursor、 Windsurf 等传统 IDE 不同的是，它直接运行在你的终端中，能够深度理解你的代码库，并通过自然语言命令帮助开发者更高效地完成编程任务。不过当时还只是预览版，并没有对所有用户开放，因此反响也不大。到了 今年 5 月份，Anthropic 发布了 Claude 4，其编码能力相对于 3.7 又有了很大的提升；与此同时，Claude Code 也正式 GA ，搭配 Claude 4 出色的编码能力，它的性能得以显著提升；它在处理大型代码库、复杂编程任务中的表现超越了 Cursor、 Windsurf 等一众顶尖的 AI 代码编辑器，惊艳了整个程序员社区。这款基于 Claude 4 模型的智能编程助手，以其独特的终端集成方式和强大的代码库理解能力，正在重新定义开发者的编程体验。核心特点Claude Code 是一个 代理式编程（Agentic Coding） 工具，它具备以下核心特点：终端集成：通过终端作为通用入口，Claude Code 能直接在开发者熟悉的工作环境中执行任务，无需学习新工具或更换 IDE ，降低了使用门槛；代码库理解：能够快速分析和理解整个项目的代码结构和逻辑关系，尤其适用于大型复杂代码库；自然语言交互：得益于 Claude 4 强大的指令理解和任务执行能力，用户通过简单的自然语言命令就可以执行复杂的编程任务；开发工具集成：与现有的开发环境完美配合，兼容各种命令行工具，支持文件编辑、Git 操作等，与终端、IDE、GitHub Actions 等现有工具和平台无缝集成；安装步骤Claude Code 的安装非常简单，首先我们需要安装 Node.js，确保你的 Node.js 版本在 18 以上，然后运行：$ npm install -g @anthropic-ai/claude-code接着导航到你的项目目录：$ cd /path/to/your/project启动 Claude Code：$ claude第一次运行 Claude Code 会弹出一个框让你选择文本样式：这是为了更好的适配你的终端显示，选择一个看起来最舒服的样式即可。接下来要登录你的 Claude 账号：Claude Code 提供了两种登录选项。第一种是使用 Claude 账号，也就是用于访问 Claude 的网页版、移动端或桌面版聊天界面的那个账号，使用 Claude.ai 进行登录，你的账号至少是 Pro 或 Max 订阅：Pro 订阅每月 17 美刀，Max 订阅每月 100 美刀，使用这种登录方式的好处是 按月收费，费用比较固定。第二种是使用 Anthropic Console 账号，需要通过 console.anthropic.com 登录，Anthropic Console 面向开发者，用于访问 Anthropic 的 API 服务，用户可以通过编程的方式调用 Claude 的能力，将 Claude 集成到自己的应用程序中。在这个平台上，用户可以管理 API 密钥、查看使用情况、计费信息等：使用这种登录方式的好处是 按调用量收费，比较灵活，用多少付多少。如果你只是想对 Claude Code 尝尝鲜，建议使用 Anthropic Console 账号，如果你是长期使用，则建议使用 Claude Pro 订阅。初次使用登录成功后，看到如下界面：此时就可以使用 Claude Code 了，直接在 REPL 交互式会话中使用自然语言向 Claude Code 发出指令即可。初次使用时，建议先让 Claude Code 分析一下你的项目：> 总结下这个项目我这里使用了一个数独项目进行测试，这个项目是我用大模型为家里的小朋友开发的一款小游戏，比较简单，可以随机生成数独和自动解决数独：可以看到 Claude Code 使用了 Read 和 List 两个工具，自动读取了 README.md 和 package.json 文件内容，并列出了当前目录下的文件列表，可以按下 ctrl+r 展开工具调用的详情。通过这些信息 Claude Code 很好的完成了总结任务。接着运行 /init 命令：> /initClaude Code 会继续读取几个关键文件，并开始使用 Write 工具写入 CLAUDE.md 文件：Claude Code 在执行一些关键操作时会让用户确认，只有得到用许可后，命令才会真正执行：选择 Yes 生成 CLAUDE.md 文件。CLAUD…

使用 Patchright 绕过浏览器机器人检测
type: item
date: 2025-06-20T07:34:00+00:00
description: 我们知道，Browser Use 默认采用 Playwright 作为浏览器操作的基础工具。Playwright 原本是由微软开源推出的一款浏览器自动化测试工具，其设计初衷是方便开发人员进行跨浏览器测试。然而，由于其功能强大且使用简便，它逐渐被广泛应用于网络爬虫领域，这也引发了一些问题。许多网站为了保护自身信息安全，采取了封禁措施，试图阻止 Playwright 的访问。浏览器自动化在运行过程中表现出的行为往往与普通用户操作有显著差异，这些差异使得具有反爬措施和网络应用防火墙（WAF）的网站能够有效识别和对抗 Playwright 驱动的爬虫行为。这也就导致了我们在使用 Browser Use 的时候，无法在一些网站上执行操作，大大限制了 Browser Use 的功能，如何绕过这些安全措施成为了 Browser Use 用户需要解决的问题。道高一尺，魔高一丈，有反爬，就有反反爬。在使用 Playwright 的时候，也有一些方法绕过反爬机制，我们今天学习的 Patchright 就是基于 Playwright 改造的另一款浏览器自动化工具，它通过巧妙地模拟真实用户行为，使得浏览器操作可以绕过机器人检测。Patchright 初体验我们先通过一个真实场景体验下 Patchright 的效果。Fingerprint.com 是一家专注于设备识别和反欺诈解决方案的企业，他们提供的浏览器机器人检测功能，通过 Smart Signal 技术实时检测自动化工具、搜索引擎爬虫等威胁，帮助网站保护自身免受机器人攻击。可以点击下面的链接，进入产品页面体验该功能：https://fingerprint.com/products/bot-detection/接下来我们使用 Playwright 和 Patchright 分别打开上面的产品页面，对比下两者有何不同。使用 Playwright 打开该页面：import asyncio from playwright.async_api import async_playwright async def main(): async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() await page.goto("https://fingerprint.com/products/bot-detection/") input() await browser.close() asyncio.run(main())可以看到 Fingerprint.com 成功检测出我们是机器人，并且标识出我们是通过自动化工具访问的：接下来我们换成 Patchright 打开该页面：import asyncio from patchright.async_api import async_playwright async def main(): async with async_playwright() as p: browser = await p.chromium.launch(headless=False) page = await browser.new_page() await page.goto("https://fingerprint.com/products/bot-detection/") input() await browser.close() asyncio.run(main())Patchright 的使用和 Playwright 完全兼容，我们只需将上面的 playwright.async_api 换成了 patchright.async_api 即可。可以看到 Fingerprint.com 这次没有检测出来，我们成功绕过了它的机器人检测功能：在 Browser Use 中使用 Patchright我们昨天学习了 Browser Use 中关于浏览器的很多配置参数，包括会话相关参数和浏览器配置参数，通过 BrowserSession 传入，以调试模式启动并操作浏览器。在会话相关的参数中有一个 playwright 参数，表示 Playwright 或 Patchright API 客户端句柄，一般通过 await async_playwright().start() 得到，我们可以通过这个参数让 Browser Use 连接并复用已有的 Playwright 或 Patchright 浏览器实例：from playwright.async_api import async_playwright async def main(…

详解 Browser Use 的浏览器配置
type: item
date: 2025-06-19T07:33:00+00:00
description: 昨天我们学习了 Browser Use 启动或连接浏览器的几种方法，包括 executable_path、Playwright 对象、Browser Server、CDP 和 PID 等，这些方法有一个共同点，都是通过 BrowserSession 类来设置参数，而这个类也是 Browser Use 配置和操作浏览器的核心。BrowserSession 的配置参数非常繁杂，不过可以将其大致分为两类，一类是 会话相关参数（Session-Specific Parameters），包括浏览器连接参数和活动的 Playwright 对象实例，BrowserSession 通过这些参数连接浏览器并跟踪其活动；另一类是 浏览器配置模版（Browser Profile），包括 Browser Use 特有的参数和 Playwright 相关的参数，这类参数的特点是静态的，可以通过 BrowserProfile 存储，方便 BrowserSession 复用。我们今天就对照官方文档，对这些参数做个盘点。会话相关参数会话相关参数，包括浏览器连接参数和 Playwright 对象实例，这些参数和活动的会话相关，无法存储在 BrowserProfile(...) 模板中。浏览器连接参数这些参数分别对应不同的连接到现有浏览器的方式，在昨天的文章中我们已经详细学过这些内容：参数名默认值参数说明wss_urlNone连接到 Playwright 协议的浏览器服务器地址cdp_urlNone通过 CDP 协议连接到开启调试模式的 Chrome 浏览器browser_pidNone根据 PID 连接到本地运行的浏览器进程Playwright 对象实例我们知道，Browser、BrowserContext 和 Page 都是 Playwright 内置的对象，一般通过 (await async_playwright().start()) 或 (await async_patchright().start()) 以调试模式启动浏览器子进程，然后通过 CDP 将命令传递给浏览器。我们可以将这些对象传递给 BrowserSession，让 Browser Use 连接并复用已有的浏览器实例：参数名默认值参数说明playwrightNone可选的 Playwright 或 Patchright API 客户端句柄browserNone可选的 Playwright Browser 对象browser_contextNone可选的 Playwright BrowserContext 对象pageNone也可以写成 agent_current_page，表示智能体专注的前台页面human_current_pageNone人类专注的前台页面，不必手动设置initializedFalse将 BrowserSession 标记为已初始化，跳过启动和连接（不推荐）浏览器配置模版browser_profile: BrowserProfile = BrowserProfile()BrowserSession 可以接受一个可选的 browser_profile 参数，它是一个配置模板，可以包含一些配置默认值，用法如下：browser_profile = BrowserProfile( executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', user_data_dir='~/.config/browseruse/profiles/default', ) browser_session = BrowserSession( browser_profile=browser_profile )所有 BrowserProfile 中的参数都可以直接传给 BrowserSession，下面的写法和上面的代码没有区别：browser_session = BrowserSession( executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', user_data_dir='~/.config/browseruse/profiles/default', )如果某个参数同时传给 BrowserProfile 和 BrowserSession，BrowserSession 中的参数值会覆盖 BrowserProfile 中的默认值。尽管 BrowserProfile 是可选的，将参数传给 BrowserProfile 或者 BrowserSession 都可以，但使用 BrowserProfile 提供了一…

使用 Browser Use 连接你的浏览器
type: item
date: 2025-06-18T07:31:00+00:00
description: 浏览器是我们日常生活和工作中不可或缺的重要工具，Browser Use 的本质就是模拟人类对浏览器进行各种操作以完成用户任务。在之前的示例中，默认使用的是 Playwright 内置的 Chromium 浏览器，Browser Use 还支持多种启动或连接其他浏览器的方法，我们今天来学习这方面的内容。通过 executable_path 启动本地浏览器在之前介绍 Agent 配置时，我们曾学过 BrowserSession 参数的概念，它是 Browser Use 配置浏览器的核心类，它有一个 executable_path 参数，可以指定用户电脑上已安装的浏览器路径。当我们设置 executable_path 参数时，Browser Use 就会启动该浏览器，而不使用 Playwright 内置的浏览器：from browser_use import Agent, BrowserSession browser_session = BrowserSession( executable_path='/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', # executable_path='C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe', # executable_path='/usr/bin/google-chrome', user_data_dir='~/.config/browseruse/profiles/default', ) agent = Agent( task="Your task here", llm=llm, browser_session=browser_session, )上面的代码使用的是用户已安装的 Chrome 浏览器，注意不同的操作系统下安装路径也不同。Browser Use 只支持基于 Chromium 内核的浏览器，比如 Brave、Patchright、Rebrowser、Microsoft Edge 等，暂时不支持 Firefox 或 Safari 浏览器。自定义 Chrome 启动参数鉴于安全原因，从 v136 开始，Chrome 不再支持使用默认的配置文件来驱动浏览器，所以无法复用你已有的浏览器配置，如登录凭据，收藏夹，扩展程序等。Browser Use 为此创建了一个新的专用配置文件，位于 ~/.config/browseruse/profiles/default，可以在启动 Chrome 浏览器时，将配置文件设置成这个（注意使用全路径）：$ cd /Applications/Google\ Chrome.app/Contents/MacOS $ ./Google\ Chrome --user-data-dir=/Users/aneasystone/.config/browseruse/profiles/default在 macOS 上，还有一种更简单的方式启动应用：# 以应用名称启动 $ open -a <应用名称> --args <参数> # 以应用路径启动 $ open <应用路径> --args <参数>比如：$ open -a "Google Chrome" --args \ --user-data-dir=/Users/aneasystone/.config/browseruse/profiles/default或：$ open "/Applications/Google Chrome.app" --args \ --user-data-dir=/Users/aneasystone/.config/browseruse/profiles/default需要注意的是，启动之前最好先退出所有的 Chrome 实例，不然参数可能无效。通过这种方式打开浏览器后，所有的用户数据会持久化到 Browser Use 的专用配置文件中，所以当我们再次用 Browser Use 启动浏览器时，就可以访问这些用户数据，包括且不限于下面这些：所有已登录的会话和 Cookies如果启用了自动填充，则可访问保存的密码浏览器历史记录和书签扩展程序及其数据所以务必检查分配给智能体的任务，确保符合你的安全要求！对于任何敏感数据，请使用 Agent(sensitive_data=...)，并使用 BrowserSession(allowed_domains=...) 限制浏览器访问。使用现有的 Playwright 对象连接浏览器我们之前学习过 Browser、BrowserContext 和 Page 参数的概念，这三个都是 Playwright 内置的类：Bro…

详解 Browser Use 的 Agent 用法（四）
type: item
date: 2025-06-17T07:30:00+00:00
description: 经过这几天的学习，总算把 Browser Use Agent 所有的配置参数都搞清楚了，我们今天先对这些参数做一个总结回顾，然后继续来研究下 agent.run() 方法，学习它的基本用法和生命周期钩子等概念。配置参数回顾下面这张表格概括了 Agent 所有的配置参数，以及它的默认值和功能说明，可以帮助大家快速理解和回顾之前学习的内容：参数名默认值参数说明task必填表示智能体需要完成的任务，通常为自然语言描述。llm必填使用的大语言模型实例。支持 DeepSeek、GPT-4 等。pageNonePlaywright 的 Page 对象，用于让智能体直接使用预初始化的网页。browserNonePlaywright 的 Browser 对象，用于指定浏览器实例。browser_contextNonePlaywright 的 BrowserContext 对象，用于设置独立的浏览器上下文。browser_profileNoneBrowser Use 内置的配置类，包括浏览器启动参数、连接参数和默认的视图信息。browser_sessionNoneBrowser Use 内置的会话类，表示活跃的浏览器会话（实例化后的浏览器进程）。controllerController()自定义工具管理类，可以通过装饰器 @controller.action 注册工具。升华智能体功能。contextNone任意用户自定义的上下文对象，例如数据库连接、文件句柄或运行时配置，仅透传给自定义工具。override_system_messageNone重写系统提示词的内容，用于替换默认的任务规划和工具调用提示词。extend_system_messageNone在默认提示词后追加内容，用于增强提示词，而不是完全替换。建议优先使用。max_actions_per_step10一次最多执行多少个大模型生成的动作，控制任务中模型生成动作的数目。message_contextNone附加的任务上下文描述，用于让模型更好地理解任务或场景。max_input_tokens128000最大支持输入 token 数，模型的上下文窗口大小（如 DeepSeek V3 为 64K，GPT-4 为 128K）。tool_calling_method'auto'控制工具调用方式，可选 function_calling、json_mode、raw、tools、auto。use_visionTrue是否开启视觉能力，表示是否将网页截图作为消息的一部分。禁用能降低 token 消耗。planner_llmNone用于规划任务的大语言模型实例，可以是一个比主模型更小或更便宜的模型。use_vision_for_plannerFalse是否为规划模型开启视觉能力，如果开启，会传递网页截图给模型。planner_interval1控制每隔多少步规划一次任务，默认是每步都规划。is_planner_reasoningFalse是否通过 HumanMessage 而不是 SystemMessage 传递规划提示词，适配不支持 SystemMessage 的推理模型。extend_planner_system_messageNone向默认规划提示词后附加额外内容，用于定制化任务分解的逻辑。page_extraction_llmNone用于页面内容提取的大语言模型实例，如果未配置，默认使用主模型。initial_actionsNone初始化时执行的固定动作（如打开某个页面），无需调用大模型，能节省 token。save_conversation_pathNone保存会话记录的目录路径，包含每一步的 Prompt 和模型响应结果，便于调试和分析。save_conversation_path_encoding'utf-8'会话记录文件的编码格式，默认为 UTF-8。include_attributestitle, type, name, role 等保留关键网页元素的部分属性，用于节省 token（默认值包括 title, type 等带有语义信息的属性）。validate_outputFalse完成任务时开启输出校验，确保任务的最终结果准确信息。max_failures3遇到异常时的最大重试次数，可处理浏览器异常关闭、token 超限及接口限流等问题。retry_delay10接口限流错误时延迟的时间（单位：秒），然后重试。generate_gifFalse运行结束后生成操作过程的 GIF 动画，包含任务、每一步目标和截屏记录。save_playwright_script_pathNone保存 Playwright 脚本的路径，用于重放操作过程（最新版本已移除，但派生了 Workflow Use …