<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Information on 森林游乐场</title>
        <link>/categories/information/</link>
        <description>Recent content in Information on 森林游乐场</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <copyright>新喀鸦006</copyright>
        <lastBuildDate>Thu, 26 Mar 2026 13:02:25 +0800</lastBuildDate><atom:link href="/categories/information/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>摸鱼小记|更换Claude code提示音（Win)</title>
        <link>/p/%E6%91%B8%E9%B1%BC%E5%B0%8F%E8%AE%B0%E6%9B%B4%E6%8D%A2claude-code%E6%8F%90%E7%A4%BA%E9%9F%B3win/</link>
        <pubDate>Thu, 26 Mar 2026 13:02:25 +0800</pubDate>
        
        <guid>/p/%E6%91%B8%E9%B1%BC%E5%B0%8F%E8%AE%B0%E6%9B%B4%E6%8D%A2claude-code%E6%8F%90%E7%A4%BA%E9%9F%B3win/</guid>
        <description>&lt;h3 id=&#34;你的-claude-code-提示音是什么httpsblogdouchispaceclaude-notif-soundutm_sourcerssgsctab0&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.douchi.space/claude-notif-sound/?utm_source=rss#gsc.tab=0&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;你的 Claude code 提示音是什么?
    &lt;span style=&#34;white-space: nowrap;&#34;&gt;&lt;svg width=&#34;.7em&#34; height=&#34;.7em&#34; viewBox=&#34;0 0 21 21&#34;
            xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
            &lt;path d=&#34;m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z&#34; fill=&#34;currentColor&#34; /&gt;
            &lt;path d=&#34;M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z&#34;
                fill=&#34;currentColor&#34; /&gt;
        &lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;div class=&#34;callout&#34; data-callout-type=&#34;quote&#34; role=&#34;note&#34; aria-label=&#34;Quote callout&#34;&gt;
  &lt;div class=&#34;callout-title&#34;&gt;
    &lt;div class=&#34;callout-icon&#34; aria-hidden=&#34;true&#34;&gt;&lt;/div&gt;
    &lt;div class=&#34;callout-title-text&#34;&gt;Quote&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;callout-content&#34;&gt;
    &lt;p&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;p&gt;有个提示音让 coding agent 在背景里工作，任务结束、需要人类注意、批准和 review 的时候播放音效，能让人更放心地去摸鱼。&lt;/p&gt;
&lt;p&gt;看到了&lt;a class=&#34;link&#34; href=&#34;https://alexop.dev/posts/how-i-added-sound-effects-to-claude-code-with-hooks/?utm_source=blog.douchi.space&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;这篇教程
    &lt;span style=&#34;white-space: nowrap;&#34;&gt;&lt;svg width=&#34;.7em&#34; height=&#34;.7em&#34; viewBox=&#34;0 0 21 21&#34;
            xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
            &lt;path d=&#34;m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z&#34; fill=&#34;currentColor&#34; /&gt;
            &lt;path d=&#34;M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z&#34;
                fill=&#34;currentColor&#34; /&gt;
        &lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;里用的是 &lt;code&gt;「帝国时代」&lt;/code&gt;，甚合我意。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;既然刷到了，且刚好最近开始用 CC，立马也打算换一个。&lt;/p&gt;
&lt;p&gt;先下载几个喜欢的音频（.mp3）&lt;/p&gt;
&lt;p&gt;接着在 &lt;code&gt;C:\Users\你的用户名\.claude&lt;/code&gt; 中创建 &lt;code&gt;sounds&lt;/code&gt; 文件夹，将音频文件并放入
在该路径下新建 &lt;code&gt;play_sound.ps1&lt;/code&gt; ，并粘贴下面的代码&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;param([string]$SoundPath)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Add-Type -AssemblyName presentationCore
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$player = New-Object System.Windows.Media.MediaPlayer
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$player.Open($SoundPath)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$player.Play()
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Start-Sleep -Seconds 3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;最后在 Claude Code 配置文件 &lt;code&gt;C:\Users\你的用户名\.claude\settings.json&lt;/code&gt; 下追加（这个部分让 G 老师改了好几遍，涉及一些转义的错误）&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;43
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;hooks&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;SessionStart&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;matcher&amp;#34;: &amp;#34;startup|clear&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;hooks&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;command&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;command&amp;#34;: &amp;#34;powershell.exe -NoProfile -WindowStyle Hidden -Command \&amp;#34;Start-Process powershell.exe -WindowStyle Hidden -ArgumentList &amp;#39;-NoProfile -STA -ExecutionPolicy Bypass -File C:/Users/用户名/.claude/play_sound.ps1 C:/Users/23947/.claude/sounds/drum.mp3&amp;#39;\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;UserPromptSubmit&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;hooks&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;command&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;command&amp;#34;: &amp;#34;powershell.exe -NoProfile -WindowStyle Hidden -Command \&amp;#34;Start-Process powershell.exe -WindowStyle Hidden -ArgumentList &amp;#39;-NoProfile -STA -ExecutionPolicy Bypass -File C:/Users/23947/.claude/play_sound.ps1 C:/Users/用户名/.claude/sounds/horn.mp3&amp;#39;\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;Stop&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;hooks&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;command&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;command&amp;#34;: &amp;#34;powershell.exe -NoProfile -WindowStyle Hidden -Command \&amp;#34;Start-Process powershell.exe -WindowStyle Hidden -ArgumentList &amp;#39;-NoProfile -STA -ExecutionPolicy Bypass -File C:/Users/23947/.claude/play_sound.ps1 C:/Users/用户名/.claude/sounds/relic.mp3&amp;#39;\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;PreCompact&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &amp;#34;hooks&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;type&amp;#34;: &amp;#34;command&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &amp;#34;command&amp;#34;: &amp;#34;powershell.exe -NoProfile -WindowStyle Hidden -Command \&amp;#34;Start-Process powershell.exe -WindowStyle Hidden -ArgumentList &amp;#39;-NoProfile -STA -ExecutionPolicy Bypass -File C:/Users/用户名/.claude/play_sound.ps1 C:/Users/23947/.claude/sounds/workshop.mp3&amp;#39;\&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;          }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    ]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;blockquote&gt;
  &lt;p&gt;路径中的 &lt;code&gt;用户名&lt;/code&gt; 替换为实际的 Windows 登录用户名。
音频文件名替换为对应文件。&lt;/p&gt;

&lt;/blockquote&gt;</description>
        </item>
        <item>
        <title>摸鱼小记|API 抓包的初步尝试</title>
        <link>/p/%E6%91%B8%E9%B1%BC%E5%B0%8F%E8%AE%B0api-%E6%8A%93%E5%8C%85%E7%9A%84%E5%88%9D%E6%AD%A5%E5%B0%9D%E8%AF%95/</link>
        <pubDate>Mon, 23 Mar 2026 13:30:11 +0800</pubDate>
        
        <guid>/p/%E6%91%B8%E9%B1%BC%E5%B0%8F%E8%AE%B0api-%E6%8A%93%E5%8C%85%E7%9A%84%E5%88%9D%E6%AD%A5%E5%B0%9D%E8%AF%95/</guid>
        <description>&lt;h2 id=&#34;api-抓包--接口分析的初步尝试&#34;&gt;API 抓包 / 接口分析的初步尝试
&lt;/h2&gt;&lt;p&gt;主要在 ai 的辅助下进行。&lt;/p&gt;
&lt;h3 id=&#34;网站是如何工作的-&#34;&gt;网站是如何工作的 ？
&lt;/h3&gt;&lt;p&gt;想象一个餐厅的场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;顾客 = 浏览器&lt;/li&gt;
&lt;li&gt;服务员 = 前端页面（我看到的界面）&lt;/li&gt;
&lt;li&gt;厨房 = 后端服务器（真正存数据的地方）&lt;/li&gt;
&lt;li&gt;菜单上的菜 = 数据&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;假设现在我们点击按钮/翻页（点菜）→ 浏览器会向服务器发 API 请求（服务员通知厨房）→ 服务器返回数据（厨房做好菜端出来）→ 前端渲染页面（服务员摆盘给你看）&lt;/p&gt;
&lt;p&gt;因此可以发现在网页上看到的文字或图像，并不是&amp;quot;刻在网页上的&amp;quot;，而是页面实时去服务器要的。这个&amp;quot;要&amp;quot;的过程，就叫做 &lt;strong&gt;API 请求&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API 请求的格式&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;收件人：/api/study/lexicon/v1/list     ← 接口地址
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;发送方式：POST                          ← POST = 附带内容发送
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;信的内容：{ c_id: 438343, pagesize: 9999 }  ← 要什么
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;用户在浏览器里能看到服务器返回的数据&lt;/strong&gt;——这就是 F12 开发者工具的作用。打开 Network（网络）标签，就能看到页面在偷偷发了哪些请求、收到了什么数据。&lt;/p&gt;
&lt;h3 id=&#34;为什么不能直接发请求签名机制&#34;&gt;为什么不能直接发请求？——签名机制
&lt;/h3&gt;&lt;p&gt;你可能会想：既然知道地址和参数，我直接发请求不就行了？于是一个问题来了：&lt;strong&gt;厨房怎么知道信息是真人发送的，而步是有人冒充的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一种解决方案是：在每封信上盖一个防伪印章，叫做 &lt;code&gt;sign&lt;/code&gt;（签名）。&lt;/p&gt;
&lt;p&gt;这个印章的制作方式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;把信的所有内容 → 按字母顺序排好 → 用一个&amp;#34;秘密配方&amp;#34;加密 → 生成一串数字
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&amp;ldquo;秘密配方&amp;quot;就是 &lt;code&gt;idictation_2024&lt;/code&gt; 这个密钥。&lt;/p&gt;
&lt;h3 id=&#34;简单脚本做了什么-&#34;&gt;简单脚本做了什么 ？
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;① 补字段&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;原始请求：{ c_id: 438343 }
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;补完后变成：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  c_id: 438343,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  api_key: &amp;#34;%2Fapi%2Fstudy...&amp;#34;,   ← 接口地址编码后
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  timestamp: 1748000000,           ← 当前时间戳
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  nonce: &amp;#34;a3f9k2m8xz&amp;#34;,            ← 随机字符串（防重放攻击）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;② 生成 sign&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;把上面所有字段 → 按 key 字母顺序排列 → 拼成一行字符串
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 用 HMAC-SHA256 算法 + 密钥&amp;#34;idictation_2024&amp;#34;加密
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 得到一串 hex 字符串 → 这就是 sign
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;③ 发出去拿数据&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;把补好字段+sign 的完整请求体 → POST 发到服务器
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 服务器验证 sign 合法 → 返回数据
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;→ 脚本取出 json.values 里的内容
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;换一本词书怎么办-&#34;&gt;换一本词书怎么办 ？
&lt;/h3&gt;&lt;p&gt;只需要找到一个参数：** &lt;code&gt;g_id&lt;/code&gt; **
方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;登录后打开你想要的那本词书&lt;/li&gt;
&lt;li&gt;按 F12 → 切到 &lt;strong&gt;Network&lt;/strong&gt; 标签&lt;/li&gt;
&lt;li&gt;在词书页面点击任意章节或刷新&lt;/li&gt;
&lt;li&gt;在 Network 里找到发往 &lt;code&gt;/api/study/lexicon/&lt;/code&gt; 的请求&lt;/li&gt;
&lt;li&gt;点进去看请求内容，找 &lt;code&gt;g_id&lt;/code&gt; 的值
然后把脚本里的 &lt;code&gt;115172&lt;/code&gt; 换成你找到的数字就行。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;实战&#34;&gt;实战
&lt;/h3&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;步骤&lt;/th&gt;
          &lt;th&gt;做什么&lt;/th&gt;
          &lt;th&gt;工具&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;找到数据从哪个接口来&lt;/td&gt;
          &lt;td&gt;F12 → Network&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;看请求参数有哪些字段&lt;/td&gt;
          &lt;td&gt;Network →目标请求的载荷（Payload）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;判断有没有签名字段（sign/token 等）&lt;/td&gt;
          &lt;td&gt;同上&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;如果有签名，找签名逻辑&lt;/td&gt;
          &lt;td&gt;F 12 → Sources → 搜索密钥关键词&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;复现签名 + 发请求&lt;/td&gt;
          &lt;td&gt;Console 写脚本&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;第一步：先制造一个请求
Network 标签只记录&lt;strong&gt;你操作时发生的请求&lt;/strong&gt;，所以要先有动作才有东西看。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开 &lt;code&gt;https://www.idictation.cn&lt;/code&gt; 并登录&lt;/li&gt;
&lt;li&gt;按 F12 打开开发者工具&lt;/li&gt;
&lt;li&gt;点击顶部的 &lt;strong&gt;Network&lt;/strong&gt; 标签&lt;/li&gt;
&lt;li&gt;然后在网页上&lt;strong&gt;点击任意一个词书或章节&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第二步：筛选请求
Network 面板顶部有一排过滤按钮，找到 &lt;strong&gt;Fetch/XHR&lt;/strong&gt; 。只看&amp;quot;页面偷偷发出去拿数据的请求&amp;rdquo;，过滤掉图片、CSS 等干扰项。&lt;/p&gt;
&lt;p&gt;第三步：找到目标请求
过滤后，左边会出现一个列表。找名字里包含 &lt;code&gt;list&lt;/code&gt; 或 &lt;code&gt;chapter&lt;/code&gt; 的条目，打开它。&lt;/p&gt;
&lt;p&gt;第四步：找 Payload
点击请求后，右边会出现几个子标签：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Headers&lt;/strong&gt;（表头）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Payload&lt;/strong&gt;（载荷）← 这个&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Preview / Response&lt;/strong&gt;（返回的数据）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第五步：判断有没有 sign/token 字段&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;{g_id: 115172, api_key: &amp;#34;%2Fapi%2Fstudy%2Flexicon%2Fv2%2Fchapter%2Flist&amp;#34;, timestamp: 1774249435,…}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;api_key: &amp;#34;%2Fapi%2Fstudy%2Flexicon%2Fv2%2Fchapter%2Flist&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;g_id: 115172
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nonce: &amp;#34;614fjqnlce&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sign: &amp;#34;21fbabe524875399c8a547a19b2a1517970c1d66f5078269cac14f1c57324be8&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;timestamp: 1774249435
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第六步：找签名逻辑
在 Network 里把过滤从 &lt;code&gt;Fetch/XHR&lt;/code&gt; 改成  &lt;code&gt;JS&lt;/code&gt; 。接下来会看到几个 &lt;code&gt;.js&lt;/code&gt; 文件，找名字最大的那个（通常叫 &lt;code&gt;index-xxxxxxxx.js&lt;/code&gt;）。点进去，切到 &lt;strong&gt;Response&lt;/strong&gt; 标签，能看到一堆压缩的代码&lt;/p&gt;
&lt;p&gt;点顶部 &lt;strong&gt;&amp;ldquo;源代码/来源&amp;rdquo;&lt;/strong&gt;（Sources）标签，用 &lt;code&gt;Ctrl + Shift + F&lt;/code&gt;（全局搜索）， &lt;code&gt;secret&lt;/code&gt; 或 &lt;code&gt;sign&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;结果会很多，但你要找的是&lt;strong&gt;赋值语句&lt;/strong&gt;，也就是长这样的：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;e.data.sign = ...
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xxx.sign = ...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;找到赋值的地方，往上看几行，就能看到 sign 是怎么算出来的，密钥自然就露出来了。&lt;/p&gt;
&lt;h3 id=&#34;我是如何使用-ai-的httpswwwinstapapercomread1993545231&#34;&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.instapaper.com/read/1993545231&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;我是如何使用 AI 的
    &lt;span style=&#34;white-space: nowrap;&#34;&gt;&lt;svg width=&#34;.7em&#34; height=&#34;.7em&#34; viewBox=&#34;0 0 21 21&#34;
            xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
            &lt;path d=&#34;m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z&#34; fill=&#34;currentColor&#34; /&gt;
            &lt;path d=&#34;M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z&#34;
                fill=&#34;currentColor&#34; /&gt;
        &lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;
&lt;/h3&gt;&lt;div class=&#34;callout&#34; data-callout-type=&#34;quote&#34; role=&#34;note&#34; aria-label=&#34;Quote callout&#34;&gt;
  &lt;div class=&#34;callout-title&#34;&gt;
    &lt;div class=&#34;callout-icon&#34; aria-hidden=&#34;true&#34;&gt;&lt;/div&gt;
    &lt;div class=&#34;callout-title-text&#34;&gt;原文摘录&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;callout-content&#34;&gt;
    &lt;p&gt;&lt;p&gt;当开始一个新的功能开发/需求时，我会首先定位到这个需求是基于哪个仓库开发，并同时打开 Claude Code 与 Codex 进行初始化，形成各个 Agent 对项目代码仓库的基础的文档沉淀。&lt;/p&gt;
&lt;p&gt;如果是需要协同多个仓库开发的场景，可以定义一个外部的例如 &lt;code&gt;feat-xxx/&lt;/code&gt; 文件夹，并将相关的 git repo 都置于这个文件夹目录下，并进行初始化，后续 agent 都会在这个项目目录下执行，要注意的是，需要将每一个 repo 都切换到对应 feat 分支进行开发，以免后续代码版本管理混乱。接着向 codex 描述清楚相应的需求，让 codex 总结成详细的 feature 描述，并根据实际需求让 codex 进行调整，如果需求相对清晰简单，可以直接让 codex 执行即可。&lt;/p&gt;
&lt;p&gt;如果牵扯到代码复杂度较高，可以采用 Claude Code 的&lt;a class=&#34;link&#34; href=&#34;https://github.com/coleam00/context-engineering-intro/tree/main/.claude/commands&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;自定义命令
    &lt;span style=&#34;white-space: nowrap;&#34;&gt;&lt;svg width=&#34;.7em&#34; height=&#34;.7em&#34; viewBox=&#34;0 0 21 21&#34;
            xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
            &lt;path d=&#34;m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z&#34; fill=&#34;currentColor&#34; /&gt;
            &lt;path d=&#34;M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z&#34;
                fill=&#34;currentColor&#34; /&gt;
        &lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;，生成较为详细的 &lt;a class=&#34;link&#34; href=&#34;https://github.com/coleam00/context-engineering-intro/tree/main/PRPs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;PRPs/
    &lt;span style=&#34;white-space: nowrap;&#34;&gt;&lt;svg width=&#34;.7em&#34; height=&#34;.7em&#34; viewBox=&#34;0 0 21 21&#34;
            xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
            &lt;path d=&#34;m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z&#34; fill=&#34;currentColor&#34; /&gt;
            &lt;path d=&#34;M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z&#34;
                fill=&#34;currentColor&#34; /&gt;
        &lt;/svg&gt;&lt;/span&gt;&lt;/a&gt; 文档，主要流程为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 Claude Code 中执行 &lt;code&gt;/generate-prp&lt;/code&gt; 命令，在命令之后输入 codex 生成的 feature 描述&lt;/li&gt;
&lt;li&gt;Claude Code 命令会根据模板和提供的功能需求生成一份详尽的需求文档，会在 &lt;code&gt;PRPs/feat-xxx.md&lt;/code&gt; 中，可以继续在对话中进行修改调整，需求完成后， 调用 &lt;code&gt;/clear&lt;/code&gt; 命令来清理当前上下文&lt;/li&gt;
&lt;li&gt;通过 Claude Code 执行 &lt;code&gt;/execute-prp PRPs/feat-xxx.md&lt;/code&gt; 命令来完成需求，时间相对比较长，如因网络等问题中断，可以重复执行命令（进度与 TODO 会在文档中标注）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PRP 大体框架如下：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;# Product Requirements Document (PRD)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## Objective
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Clearly defined, measurable feature goals]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## Technical Constraints
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Non-negotiable technical decisions]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Architectural principles that must be followed]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## Quality Standards
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Performance benchmarks]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Maintainability requirements]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Test coverage criteria]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## Integration Requirements
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [External dependencies inventory]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Interface specifications]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;## Deliverables Definition
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Code organization patterns]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- [Documentation requirements]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;callout&#34; data-callout-type=&#34;note&#34; role=&#34;note&#34; aria-label=&#34;Note callout&#34;&gt;
  &lt;div class=&#34;callout-title&#34;&gt;
    &lt;div class=&#34;callout-icon&#34; aria-hidden=&#34;true&#34;&gt;&lt;/div&gt;
    &lt;div class=&#34;callout-title-text&#34;&gt;思考&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class=&#34;callout-content&#34;&gt;
    &lt;p&gt;没有实际开发经验就没有这种自上而下的经验模式&lt;/p&gt;

  &lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        <item>
        <title>摸鱼小记|让 Claude/Codex 接管浏览器？</title>
        <link>/p/%E6%91%B8%E9%B1%BC%E5%B0%8F%E8%AE%B0%E8%AE%A9-claude/codex-%E6%8E%A5%E7%AE%A1%E6%B5%8F%E8%A7%88%E5%99%A8/</link>
        <pubDate>Thu, 19 Mar 2026 14:19:50 +0800</pubDate>
        
        <guid>/p/%E6%91%B8%E9%B1%BC%E5%B0%8F%E8%AE%B0%E8%AE%A9-claude/codex-%E6%8E%A5%E7%AE%A1%E6%B5%8F%E8%A7%88%E5%99%A8/</guid>
        <description>&lt;h2 id=&#34;让-claudecodex-接管浏览器&#34;&gt;让 Claude/Codex 接管浏览器？
&lt;/h2&gt;&lt;blockquote&gt;
  &lt;p&gt;Google Chrome 团队刚发布了一个官方工具，能让 Claude/Codex 直接接管你正在用的浏览器。&lt;/p&gt;
&lt;p&gt;Notion 同步飞书、整理 GitHub star、查 Analytics 数据、删 Twitter 帖子……这些操作在你眼前的真实浏览器窗口里实时发生。&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;现在你日常 80% 的浏览器重复操作，其实都可以扔给 AI 了。&lt;/p&gt;

&lt;/blockquote&gt;&lt;p&gt;水群时看到一个工具。Gooogle官方说明应该是&lt;a class=&#34;link&#34; href=&#34;https://developer.chrome.com/blog/chrome-devtools-mcp-debug-your-browser-session?hl=zh-cn&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34; &gt;这个
    &lt;span style=&#34;white-space: nowrap;&#34;&gt;&lt;svg width=&#34;.7em&#34; height=&#34;.7em&#34; viewBox=&#34;0 0 21 21&#34;
            xmlns=&#34;http://www.w3.org/2000/svg&#34;&gt;
            &lt;path d=&#34;m13 3l3.293 3.293l-7 7l1.414 1.414l7-7L21 11V3z&#34; fill=&#34;currentColor&#34; /&gt;
            &lt;path d=&#34;M19 19H5V5h7l-2-2H5c-1.103 0-2 .897-2 2v14c0 1.103.897 2 2 2h14c1.103 0 2-.897 2-2v-5l-2-2v7z&#34;
                fill=&#34;currentColor&#34; /&gt;
        &lt;/svg&gt;&lt;/span&gt;&lt;/a&gt;，最新发布时间2025-12-16。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Chrome 地址栏输入：&lt;code&gt;chrome://inspect/ #remote -debugging&lt;/code&gt;。勾选 Allow remote debugging。&lt;/li&gt;
&lt;li&gt;添加 &lt;code&gt;chrome-devtools&lt;/code&gt; 工具到 Claude Code/Codex&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Claude Code&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;claude&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chrome&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;devtools&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;npx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chrome&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;devtools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;autoConnect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Codex&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;codex&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;add&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chrome&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;devtools&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;--&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;npx&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chrome&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;devtools&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mcp&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;latest&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;重启 Claude Code/Codex，下达指令。
第一次使用可以用下面的命令测试。浏览器会有一个弹窗提醒。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Check the performance of https://developers.chrome.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;open the google clander,and sum the total time for each activity in the last week.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;提示词有一些不足，实际上我提前打开了 google 日历，并不需要它自己打开。实测效果是它自己打开的并没有我的登录信息，最后还是用我打开的页面执行了后续操作。
&lt;figure class=&#34;post-image&#34; style=&#34;--post-image-width: 620px;&#34;&gt;
  &lt;a class=&#34;post-image-link&#34; href=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191424345.png&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;
    &lt;img src=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191424345.png&#34;
      
      
      
      loading=&#34;lazy&#34;
      alt=&#34;image.png&#34;
      &gt;
  &lt;/a&gt;
  
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;可以发现本人的记录很混乱，有些活动项重合了。
&lt;figure class=&#34;post-image&#34; style=&#34;--post-image-width: 620px;&#34;&gt;
  &lt;a class=&#34;post-image-link&#34; href=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191436192.png&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;
    &lt;img src=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191436192.png&#34;
      
      
      
      loading=&#34;lazy&#34;
      alt=&#34;image.png&#34;
      &gt;
  &lt;/a&gt;
  
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;于是我让 CC 帮我去除一些无关项，合并同类项，并且让它给我生成一个 md 表格。到这一步为止还挺顺利。&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;post-image&#34; style=&#34;--post-image-width: 620px;&#34;&gt;
  &lt;a class=&#34;post-image-link&#34; href=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191445743.png&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;
    &lt;img src=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191445743.png&#34;
      
      
      
      loading=&#34;lazy&#34;
      alt=&#34;image.png&#34;
      &gt;
  &lt;/a&gt;
  
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;进一步地，我想试试 CC 对网页的实际操作能力，于是我让它在我的日历中将合并项的名字修改。可以看到 CC 在调用各种工具，click、take_snapshot、 press_key、fill、evaluate_script。但最后并没有成功执行任务。&lt;/p&gt;
&lt;p&gt;&lt;figure class=&#34;post-image&#34; style=&#34;--post-image-width: 620px;&#34;&gt;
  &lt;a class=&#34;post-image-link&#34; href=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191446627.png&#34; target=&#34;_blank&#34; rel=&#34;noopener noreferrer&#34;&gt;
    &lt;img src=&#34;https://cdn.jsdelivr.net/gh/yohakuo/CDN/img/202603191446627.png&#34;
      
      
      
      loading=&#34;lazy&#34;
      alt=&#34;image.png&#34;
      &gt;
  &lt;/a&gt;
  
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;和 C 老师交流了一下，它给出的结论是：Google Calendar 的前端框架阻止了直接修改 DOM 的方式生效（）。解决方法是需要用模拟真实键盘输入来替代直接赋值。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我有一个未完成的 Google Calendar 重命名任务。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;目标：在 Google Calendar 的 **2026年3月9日至15日** 这周，把以下事件名称改掉（课程类事件不动）：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- `钩针` → `毛线`（共2个）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- `棒针` → `毛线`（共1个）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- `工位` → `工作`（共2个）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- `小吃街觅食` → `生活`（共1个）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- `吃饭` → `生活`（共1个）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;之前的尝试用 `element.value = &amp;#39;新名字&amp;#39;` 直接修改 DOM 失败了，因为 Google Calendar 是 React 应用，框架内部状态没有更新，保存时仍提交旧值。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请用浏览器自动化的方式完成这个任务。对每个事件：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;1. 打开该事件的编辑页面
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;2. 用**模拟真实键盘输入**的方式修改标题（全选后用 `keyboard.type()` 或等效方式逐字符输入），而不是直接赋值给 input.value
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;3. 点击 Save 保存
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;4. 回到周视图确认事件名称已更新，再处理下一个
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;用到的工具&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;list_pages
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;select_page
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;navigate_page
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;resize_page
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;take_snapshot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;click
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;press_key
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;type_text
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;evaluate_script
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wait_for
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;改三个活动就花了几分钟，token 也花的很快。是太夸张了。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
