<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>w2solo - 独立开发者社区</title>
    <link>https://beta.w2solo.com/</link>
    <description>w2solo - 独立开发者社区社区最新发帖.</description>
    <language>en-us</language>
    <item>
      <title>我让 AI 替我写 Git 提交信息，老板以为我每天工作 16 小时</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;公司要求提交信息必须规范：&lt;code&gt;feat: xxx&lt;/code&gt;、&lt;code&gt;fix: xxx&lt;/code&gt;、还要带 tapd 链接。我每次 git commit 都要憋五分钟，写出来的还是 “改了点东西”。后来我让 AI 替我写提交信息——diff 一丢进去，它自动生成规范格式，还帮我加上 “影响范围” 和 “为什么改”。老板看 Git 日志，说：“xxx 最近提交质量很高啊，你每天工作到几点？” 我：“正常六点下班。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;Git 提交信息这件事，说大不大，说小不小。小到你随便写个 “update”，不影响跑代码。大到代码回滚、发版生成 CHANGELOG、甚至背锅溯源时，一句清晰的 “fix: 修复订单金额计算溢出” 比 “改了一下” 值一万倍。&lt;/p&gt;

&lt;p&gt;但人都有惰性，尤其加班赶业务时，谁有空写小作文？AI 就不一样，它看 diff 快、理解上下文、还能按约定格式输出。今天我就教你用 AI 自动生成高质量的 commit message，顺便集成到 Git 钩子里，让你以后闭着眼敲 &lt;code&gt;git commit&lt;/code&gt; 就行。&lt;/p&gt;
&lt;h2 id="一、为什么你讨厌写 commit message？"&gt;一、为什么你讨厌写 commit message？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;没灵感&lt;/strong&gt;：改了好几个文件，不知怎么概括。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;规范记不住&lt;/strong&gt;：&lt;code&gt;feat&lt;/code&gt;/&lt;code&gt;fix&lt;/code&gt;/&lt;code&gt;docs&lt;/code&gt; 又要查表。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;懒&lt;/strong&gt;：反正也没人看，写个 “x” 交差。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;但规范化的 message 真的有用：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;自动生成 &lt;code&gt;CHANGELOG.md&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;git blame&lt;/code&gt; 时一眼看出某个改动的原因。&lt;/li&gt;
&lt;li&gt;同事 review PR 时不用猜你改了啥。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;既然人是懒的，就让 AI 当你的 “秘书”。&lt;/p&gt;
&lt;h2 id="二、AI 怎么写 commit message？"&gt;二、AI 怎么写 commit message？&lt;/h2&gt;
&lt;p&gt;核心思路：&lt;code&gt;git diff --staged&lt;/code&gt; 拿到本次变更的代码差异，丢给 AI，让它根据 Conventional Commits 规范生成消息。&lt;/p&gt;

&lt;p&gt;我给你写了一个脚本 &lt;code&gt;ai-commit&lt;/code&gt;（Python 版，你也可以用 Node）：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;subprocess&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"你的key"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取暂存区的 diff
&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_output&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"diff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"--staged"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"utf-8"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"没有暂存的变更，请先 git add"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;prompt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s"&gt;"""
请根据以下 Git diff，按照 Conventional Commits 规范生成一条提交信息。
格式：&amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;
其中 type 可选：feat, fix, docs, style, refactor, perf, test, chore
scope 可选（如组件名或模块名），subject 简短描述（不超过50字）。
如果变更涉及多个不相关改动，请拆成多条（用换行分隔）。
只输出提交信息，不要解释。

diff:
&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;diff&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;
"""&lt;/span&gt;

&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"gpt-4"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="s"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把这个脚本保存为 &lt;code&gt;ai-commit&lt;/code&gt;，放到 PATH 里。以后你只需要：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git add &lt;span class="nb"&gt;.&lt;/span&gt;
ai-commit   &lt;span class="c"&gt;# 它会打印出 AI 生成的 message&lt;/span&gt;
git commit &lt;span class="nt"&gt;-F&lt;/span&gt; &amp;lt;&lt;span class="o"&gt;(&lt;/span&gt;ai-commit&lt;span class="o"&gt;)&lt;/span&gt;   &lt;span class="c"&gt;# 直接使用&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或者再懒一点：用 &lt;code&gt;git commit -m "$(ai-commit)"&lt;/code&gt; 一行命令。&lt;/p&gt;
&lt;h2 id="三、集成到 Husky，每次 commit 自动调用"&gt;三、集成到 Husky，每次 commit 自动调用&lt;/h2&gt;
&lt;p&gt;你可以在 &lt;code&gt;.husky/prepare-commit-msg&lt;/code&gt; 里加入脚本，让 AI 自动填充编辑器：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="c"&gt;# 自动生成 commit message 并预填到编辑器&lt;/span&gt;
&lt;span class="nb"&gt;exec&lt;/span&gt; &amp;lt; /dev/tty
&lt;span class="nv"&gt;AI_MSG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;ai-commit&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$AI_MSG&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样你敲 &lt;code&gt;git commit&lt;/code&gt; 时，编辑框里已经有 AI 写好的草稿，你只需要检查一下，不满意就改，省得自己从头敲。&lt;/p&gt;
&lt;h2 id="四、真实案例：AI 写的 message 有多专业？"&gt;四、真实案例：AI 写的 message 有多专业？&lt;/h2&gt;
&lt;p&gt;某次我改了订单模块的一个 bug：之前只判断了 &lt;code&gt;user.discount&lt;/code&gt; 存在性，没判断类型，传了个字符串导致计算错误。AI 根据 diff 生成了：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix(order): 优惠金额类型错误导致计算异常

- 增加 discount 字段的类型校验，确保为 number
- 添加单元测试覆盖字符串场景
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还帮我分了一行 body 说明？其实 Conventional Commits 允许 body，但我的提示词没要求。&lt;strong&gt;厉害的是&lt;/strong&gt;，它居然知道这是 “类型错误” 和 “计算异常”，而且自动给定了 &lt;code&gt;fix(order)&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;另一个案例：我重构了一个函数，把 &lt;code&gt;if-else&lt;/code&gt; 改成了策略模式。AI 生成：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;refactor(payment): 用策略模式替换多层条件分支

提升可扩展性，便于新增支付渠道
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一看就是老手写的。&lt;/p&gt;
&lt;h2 id="五、进阶：结合 TAPD/Jira，自动关联任务"&gt;五、进阶：结合 TAPD/Jira，自动关联任务&lt;/h2&gt;
&lt;p&gt;很多公司要求 commit 里带任务 ID。你可以在提示词里加入当前分支名（分支名通常含任务号）：&lt;/p&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;branch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;subprocess&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;check_output&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s"&gt;"git"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"branch"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"--show-current"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# 假设分支名为 feature/TAPD-1234
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后把 “请从分支名提取任务 ID，加入提交信息” 写进 prompt。AI 会生成类似：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(order): 添加满减优惠券

TAPD-1234
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;连 hook 都不用改，全自动。&lt;/p&gt;
&lt;h2 id="六、局限性：AI 不是每次都完美"&gt;六、局限性：AI 不是每次都完美&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;巨大 diff&lt;/strong&gt;：超过上下文长度，AI 看不到全貌。可以只改最近几个文件，或者用 &lt;code&gt;git diff --cached --stat&lt;/code&gt; 先给 AI 看概览，再让它选择重点文件。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;多个无关改动&lt;/strong&gt;：AI 可能会合并成一条，而你应该拆成多条。这时候手动分两次 commit 就好。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;隐私&lt;/strong&gt;：代码 diff 会发给 OpenAI API，公司敏感项目慎用。可以本地跑开源模型（CodeLlama、DeepSeek Coder）替代。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七、效果：我的 Git 日志变“教科书”"&gt;七、效果：我的 Git 日志变 “教科书”&lt;/h2&gt;
&lt;p&gt;之前我的日志：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fix
update
修改
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;feat(user): 支持手机号登录
fix(cart): 修复商品数量为0时仍可结算的bug
perf(list): 虚拟滚动优化，长列表滚动帧率提升50%
docs(readme): 更新环境配置说明
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;老板进仓库看了一圈，专门在群里说：“xxx 的提交信息写得真规范，大家学习一下。” 我默默把 AI 脚本分享给了同事。现在全组都在用，老板还纳闷：怎么大家突然都变 “专业” 了？&lt;/p&gt;
&lt;h2 id="八、总结：把时间花在改 bug 上，不是写小作文"&gt;八、总结：把时间花在改 bug 上，不是写小作文&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI 写 commit message，省时、规范、专业。&lt;/li&gt;
&lt;li&gt;集成到 Git 钩子，无感使用。&lt;/li&gt;
&lt;li&gt;支持从 diff 推断 type、scope、甚至业务含义。&lt;/li&gt;
&lt;li&gt;敏感项目换本地模型。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;下一回你 &lt;code&gt;git commit&lt;/code&gt; 时，让 AI 替你写。你只需要 review 一下，不满意手动改两字。从此 Git 日志不再是 “xxx: 111”，而是真正的 “项目史书”。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;评论区聊聊：你见过最离谱的 commit message 是什么？&lt;/p&gt;</description>
      <author>193577746</author>
      <pubDate>Sun, 17 May 2026 12:36:40 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7348</link>
      <guid>https://beta.w2solo.com/topics/7348</guid>
    </item>
    <item>
      <title>+86 用户专属：一个不用折腾代理、不用交 smsfee 的 TG 登录方案</title>
      <description>&lt;p&gt;最近想上 TG 跟进几个技术频道，结果第一步就被卡住了——注册/登录。&lt;/p&gt;

&lt;p&gt;+86 手机号，官方客户端登录时弹出一个叫"smsfee"的提示，按指引交了费用，短信验证码却像石沉大海。试了三四次，换了不同时间段，依旧收不到。搜了下社区讨论，发现这不是个案，运营商层面的拦截让不少人在这条路上折返。&lt;/p&gt;

&lt;p&gt;正当准备放弃时，朋友推荐了一款基于官方 12.5.1 版本二次编译的客户端。抱着试试看的心态用了几天，记录如下。&lt;/p&gt;

&lt;p&gt;登录环节&lt;/p&gt;

&lt;p&gt;最大的变化是绕过了 smsfee 的拦路虎。按照内置引导操作，从输入手机号到成功登录，整个过程大约两分钟，验证码到达速度正常。对于被官方注册流程劝退的人来说，这个入口友好很多。&lt;/p&gt;

&lt;p&gt;语言环境&lt;/p&gt;

&lt;p&gt;开箱即用的中文支持。界面菜单、群组列表、频道内容均显示为中文，没有出现常见的编码乱码或翻译生硬的问题。日常浏览不需要在脑子里做中英文切换，阅读效率明显提升。&lt;/p&gt;

&lt;p&gt;网络连接&lt;/p&gt;

&lt;p&gt;内置了网络层的调优方案。启动后自动完成连接，不需要手动填写代理参数，也不用额外配置工具。测试期间在不同网络环境下（家庭宽带、移动数据、公共 WiFi）均能稳定连上，没有出现频繁断线或消息延迟的情况。（说人话就是不用再翻墙了，大家也都知道最近国内很严！）&lt;/p&gt;

&lt;p&gt;功能完整性&lt;/p&gt;

&lt;p&gt;核心功能与官方版保持同步：私聊、群组讨论、频道订阅、消息推送、多账号切换均可正常使用。后台驻留稳定性不错，消息提醒及时，没有出现漏收通知的情况。界面交互逻辑熟悉，老用户上手零门槛。&lt;/p&gt;

&lt;p&gt;适用人群画像&lt;/p&gt;

&lt;p&gt;被官方注册流程卡住、急需使用 TG 的 +86 用户&lt;/p&gt;

&lt;p&gt;不想在代理配置和网络调试上花费时间的普通使用者&lt;/p&gt;

&lt;p&gt;偏好中文环境、希望开箱即用的日常浏览者&lt;/p&gt;

&lt;p&gt;客观总结&lt;/p&gt;

&lt;p&gt;这款客户端本质上是官方代码的本地化编译版本，在保留核心功能的前提下，针对性解决了 +86 用户常见的注册障碍和网络连接问题。它不是一个"增强版"，更像是一个"无障碍通道"——让原本被门槛挡住的人能够顺利进入，专注于内容本身。&lt;/p&gt;

&lt;p&gt;如果你也卡在登录这一步，或者只是想要一个省心的中文 TG 环境，可以留意评论区获取方式，按需自取即可。
&lt;img src="https://img.way2solo.com/photo/huo/f0cea13d-2f26-4e37-afae-a4a607badb91.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/huo/bf3a28ef-2170-40b0-89e8-5e1a54412c6b.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/huo/b708bff0-b5db-49ae-b331-627081af7ae4.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>huo</author>
      <pubDate>Sun, 17 May 2026 10:08:26 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7347</link>
      <guid>https://beta.w2solo.com/topics/7347</guid>
    </item>
    <item>
      <title>Anthropic 内部数百个 Claude Code Skills，他们总结的这套方法值得看</title>
      <description>&lt;p&gt;大家好，我是 &lt;code&gt;Immerse&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;专注分享 &lt;code&gt;AI 玩法&lt;/code&gt;、&lt;code&gt;独立开发&lt;/code&gt;与&lt;code&gt;AI 出海&lt;/code&gt;的 AGI 实践者，更多干货欢迎关注公众号 &lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;#沉浸式AI&lt;/code&gt;&lt;/a&gt; 或访问 &lt;a href="https://yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;yaolifeng.com&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;个人 AI News 站更新啦：&lt;a href="https://news.yaolifeng.com" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;news.yaolifeng.com&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;Anthropic 工程师 Thariq 最近在 X 上发了一篇长文，说他们公司内部现在有上百个 Skills 在跑，整理了一批踩坑经验。&lt;/p&gt;

&lt;p&gt;大多数人第一次接触 Claude Code Skills，以为它就是个 Markdown 文件——写点提示词，丢进去，完事。&lt;/p&gt;

&lt;p&gt;实际上 Skills 是文件夹，不是文件。里面可以放脚本、资产、数据、配置，整个目录结构都是上下文工程的一部分。&lt;/p&gt;

&lt;p&gt;这篇文章整理他们的方法论：Skills 的分类体系、写好一个 Skill 的关键技巧，以及团队内部怎么分发和管理。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://raw.githubusercontent.com/yaolifeng0629/oss/main/images/20260329182932457.jpg"&gt;&lt;/p&gt;
&lt;h2 id="9 种类型"&gt;9 种类型&lt;/h2&gt;
&lt;p&gt;他们把内部所有 Skills 整理了一遍，大概在这几个方向上&lt;/p&gt;
&lt;h3 id="1. 库和 API 参考"&gt;1. 库和 API 参考&lt;/h3&gt;
&lt;p&gt;用来解释如何正确用某个库、CLI 或 SDK。不管是内部自己的库，还是 Claude 经常用错的外部库，都可以做成这类 Skill。&lt;/p&gt;

&lt;p&gt;这类 Skills 通常带一个 references/ 文件夹，里面包含一个参考代码片段和踩坑清单。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;billing-lib&lt;/code&gt; — 公司内部库，重点是边界情况和容易踩的坑&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;internal-platform-cli&lt;/code&gt; — 内部 CLI 工具的每个子命令，以及使用示例&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;frontend-design&lt;/code&gt; — 让 Claude 更好地理解你们的设计系统&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2. 产品验证"&gt;2. 产品验证&lt;/h3&gt;
&lt;p&gt;描述怎么测试或验证代码能不能正确运行。一般配合 Playwright、tmux 使用。&lt;/p&gt;

&lt;p&gt;Thariq 说得很直接：让一个工程师花一整周专门打磨验证 Skill，这个时间花得值&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;signup-flow-driver&lt;/code&gt; — 跑完整的注册流程（注册 → 邮件验证 → 引导），用 headless 浏览器，每步都有状态断言&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;checkout-verifier&lt;/code&gt; — 用 Stripe 测试卡驱动结账 UI，验证发票状态落地是否正确&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tmux-cli-driver&lt;/code&gt; — 交互式 CLI 测试，用于需要 TTY 的场景&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="3. 数据获取和分析"&gt;3. 数据获取和分析&lt;/h3&gt;
&lt;p&gt;连接你的数据和监控系统。这类 Skill 会带上权限凭证的数据获取库、dashboard ID，以及常见的一些操作指南。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;funnel-query&lt;/code&gt; — "注册 → 激活 → 付费"这条漏斗用哪些事件表 JOIN，canonical user_id 在哪张表&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cohort-compare&lt;/code&gt; — 对比两个用户群的留存或转化，标记统计显著的差异，链接到细分定义&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grafana&lt;/code&gt; — datasource UID、集群名称、问题到仪表盘的映射表&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="4. 业务流程和团队自动化"&gt;4. 业务流程和团队自动化&lt;/h3&gt;
&lt;p&gt;把重复的工作流自动化成一个命令。指令本身通常比较简单，但可能依赖其他 Skill 或 MCP。&lt;/p&gt;

&lt;p&gt;可以把历史执行结果存进日志文件是个好习惯，可以帮 Claude 做前后对比，而不是每次从头开始。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;standup-post&lt;/code&gt; — 汇总你的 ticket 系统、GitHub 动态和昨天的 Slack，生成只有增量变化的站会帖子&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create-ticket&lt;/code&gt; — 强制执行字段 schema（枚举值、必填字段），创建后自动触发后续流程（通知审核人、在 Slack 贴链接）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;weekly-recap&lt;/code&gt; — 合并的 PR + 关闭的 ticket + 部署记录，格式化成周报&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="5. 代码脚手架和模板"&gt;5. 代码脚手架和模板&lt;/h3&gt;
&lt;p&gt;为代码库里的某个功能生成框架代码。这类 Skill 特别适合那些有自然语言要求、纯代码覆盖不了的脚手架场景。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;new-workflow&lt;/code&gt; — 按你们的注解规范，生成新 service/workflow/handler 的脚手架&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;new-migration&lt;/code&gt; — 数据库迁移文件模板，附带常见坑&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;create-app&lt;/code&gt; — 新建内部应用，预置好你们的 auth、日志和部署配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="6. 代码质量和审查"&gt;6. 代码质量和审查&lt;/h3&gt;
&lt;p&gt;在团队内部执行代码质量标准，辅助代码审查。可以包含确定性脚本，也可以在 hooks 或 GitHub Actions 里自动触发。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;adversarial-review&lt;/code&gt; — 起一个新的 subagent 用全新视角批判代码，实现修复，迭代直到问题只剩鸡毛蒜皮&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;code-style&lt;/code&gt; — 强制执行代码风格，尤其是 Claude 默认不做的那些规范&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;testing-practices&lt;/code&gt; — 指导怎么写测试、测什么&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="7. CI/CD 和部署"&gt;7. CI/CD 和部署&lt;/h3&gt;
&lt;p&gt;帮助拉取、推送、部署代码，可能会引用其他 Skill 来收集数据。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;babysit-pr&lt;/code&gt; — 监控 PR → 重试不稳定的 CI → 解决合并冲突 → 开启自动合并&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;deploy-service&lt;/code&gt; — 构建 → 冒烟测试 → 灰度流量 + 错误率对比 → 自动回滚&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cherry-pick-prod&lt;/code&gt; — 隔离 worktree → cherry-pick → 解决冲突 → 附模板的 PR&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="8. Runbooks"&gt;8. Runbooks&lt;/h3&gt;
&lt;p&gt;接收一个问题症状（Slack 线程、告警、错误特征），它会执行多工具调查，输出结构化报告。&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;service-debugging&lt;/code&gt; — 把症状映射到工具和查询模式，针对流量最高的服务&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;oncall-runner&lt;/code&gt; — 拉取告警 → 检查常见嫌疑点 → 格式化调查结论&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;log-correlator&lt;/code&gt; — 给一个 request ID，从所有可能经过的系统里拉对应日志&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="9. 基础设施运维"&gt;9. 基础设施运维&lt;/h3&gt;
&lt;p&gt;执行日常维护和操作流程。破坏性操作放进 Skill 可以一层护栏，避免手滑导致不可逆的风险&lt;/p&gt;

&lt;p&gt;比如：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;orphans-cleanup&lt;/code&gt; — 找孤立的 pod/volume → 发 Slack → 等待期 → 用户确认 → 级联清理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dependency-management&lt;/code&gt; — 你们组织的依赖审批流程&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cost-investigation&lt;/code&gt; — "为什么存储/出流量账单突然涨了"，定位到具体 bucket 和查询模式&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="写好一个 Skill 的关键技巧"&gt;写好一个 Skill 的关键技巧&lt;/h2&gt;

&lt;h3 id="不要放很常识的东西"&gt;不要放很常识的东西&lt;/h3&gt;
&lt;p&gt;Claude 已经懂很多编码知识，有自己的默认判断。如果你写的 Skill 主要是常识，它没什么价值。要把精力放在那些会把 Claude 推出默认思维的信息上。&lt;/p&gt;

&lt;p&gt;Anthropic 内部的 &lt;code&gt;frontend-design&lt;/code&gt; Skill 是个好例子——一个工程师跟用户迭代，专门调教 Claude 的设计品味，让它避开 Inter 字体和紫色渐变这类 AI 审美。这类东西 Claude 默认是不知道的。&lt;/p&gt;
&lt;h3 id="Gotchas 部分信噪比最高"&gt;Gotchas 部分信噪比最高&lt;/h3&gt;
&lt;p&gt;一个 Skill 里信噪比最高的部分就是 Gotchas。这里记录 Claude 实际使用你的 Skill 时踩过的坑——不是你预测它会踩的，是真的踩了的。边用边更新，遇到新的 edge case 就补进去。&lt;/p&gt;
&lt;h3 id="Skill 是文件夹，不是 md 文件"&gt;Skill 是文件夹，不是 md 文件&lt;/h3&gt;
&lt;p&gt;把整个文件系统当成一种上下文工程和渐进式披露的手段。在 SKILL.md 里告诉 Claude 有哪些文件，它会在合适的时候去读。&lt;/p&gt;

&lt;p&gt;最简单的做法是把详细内容拆到其他 md 文件里。比如函数签名和用法示例单独放到 &lt;code&gt;references/api.md&lt;/code&gt;，Claude 需要的时候再去读，而不是一开始就全部加载进上下文。&lt;/p&gt;

&lt;p&gt;你还可以这样组织：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;assets/&lt;/code&gt; 放模板文件，Claude 要生成对应格式的输出时直接复制用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scripts/&lt;/code&gt; 放可以直接调用的工具脚本&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;references/&lt;/code&gt; 放参考代码片段和文档&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="给 Claude 信息，不要给 Claude 剧本"&gt;给 Claude 信息，不要给 Claude 剧本&lt;/h3&gt;
&lt;p&gt;因为 Skill 是高度复用的，过于具体的指令反而会出问题。给 Claude 它需要的信息，但给它适应当前情况的空间。不要把每一步都写死，把判断权留给 Claude。&lt;/p&gt;
&lt;h3 id="Setup 环节要想清楚"&gt;Setup 环节要想清楚&lt;/h3&gt;
&lt;p&gt;有些 Skill 需要用户提供上下文才能工作&lt;/p&gt;

&lt;p&gt;最常见模式：配置信息存在 Skill 目录下的 &lt;code&gt;config.json&lt;/code&gt; 里，如果配置不存在，Agent 去问用户。要给出结构化的多选题，可以在 Skill 里指示使用 &lt;code&gt;AskUserQuestion&lt;/code&gt; 工具。&lt;/p&gt;
&lt;h3 id="description 字段是给模型看的触发条件"&gt;description 字段是给模型看的触发条件&lt;/h3&gt;
&lt;p&gt;Claude Code 启动时会给每个 Skill 建一个带 description 的列表，扫这个列表来判断「有没有对应这个请求的 Skill」。所以 description 要写清楚触发时机，而不是 Skill 功能的摘要。&lt;/p&gt;
&lt;h3 id="Skills 可以有记忆"&gt;Skills 可以有记忆&lt;/h3&gt;
&lt;p&gt;Skill 里可以包含一种记忆，通过在 Skill 目录里存数据实现。从简单的 append-only 文本日志、JSON 文件，到复杂的 SQLite 数据库都可以。&lt;/p&gt;

&lt;p&gt;比如 &lt;code&gt;standup-post&lt;/code&gt; Skill 维护一个 &lt;code&gt;standups.log&lt;/code&gt;，记录每次写的内容，下次运行时 Claude 读自己的历史，知道哪些是新变化。&lt;/p&gt;

&lt;p&gt;注意：存在 Skill 目录里的数据升级时可能被删掉。持久数据应该存到 &lt;code&gt;${CLAUDE_PLUGIN_DATA}&lt;/code&gt;，这是每个插件独立的稳定存储路径。&lt;/p&gt;
&lt;h3 id="在 Skills 里放脚本"&gt;在 Skills 里放脚本&lt;/h3&gt;
&lt;p&gt;给 Claude 代码比给指令有效得多。有了脚本和库，Claude 就能把时间花在组合和决策上，而不是每次从头重建样板代码。&lt;/p&gt;

&lt;p&gt;比如数据科学类 Skill 里放一组从事件源取数的 helper 函数，Claude 就可以按需动态生成脚本来做进一步分析，而不是每次自己写逻辑。&lt;/p&gt;
&lt;h3 id="按需 Hooks"&gt;按需 Hooks&lt;/h3&gt;
&lt;p&gt;Skill 可以包含只在 Skill 被调用时激活的 hooks，持续到这个 session 结束。这适合那些场景特定、不想一直开着的强约束 hook。&lt;/p&gt;

&lt;p&gt;两个典型例子：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/careful&lt;/code&gt; — 通过 PreToolUse matcher 拦截 &lt;code&gt;rm -rf&lt;/code&gt;、&lt;code&gt;DROP TABLE&lt;/code&gt;、force-push、&lt;code&gt;kubectl delete&lt;/code&gt;。只在你知道自己要动 prod 的时候才需要，常开会让人崩溃&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/freeze&lt;/code&gt; — 拦截所有不在指定目录里的 Edit/Write。调试时很有用："我想加日志，但我总是顺手把别的东西改了"&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="怎么在团队里分发 Skills"&gt;怎么在团队里分发 Skills&lt;/h2&gt;
&lt;p&gt;分发方式取决于团队规模：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;小团队&lt;/strong&gt;：把 Skills 提交进代码仓库（&lt;code&gt;./.claude/skills&lt;/code&gt; 目录）。团队人不多、仓库也不多的情况下，这样最简单直接。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;大团队&lt;/strong&gt;：搭内部插件市场，按需安装。这是因为每个提交进仓库的 Skill 都会给模型的上下文增加一点点体积，规模大了之后就不可忽视了。内部市场让每个人自己决定装哪些。&lt;/p&gt;
&lt;h3 id="Skills 互相引用"&gt;Skills 互相引用&lt;/h3&gt;
&lt;p&gt;如果你有一个 Skill 要依赖另一个 Skill，直接在指令里引用另一个 Skill 的名字就行，Claude 会在它已安装的情况下调用它。这个依赖管理目前还没有原生的 Skill 系统支持，但这种方式能跑通。&lt;/p&gt;
&lt;h3 id="Skill 使用情况"&gt;Skill 使用情况&lt;/h3&gt;
&lt;p&gt;Anthropic 用 PreToolUse hook 记录公司内部的 Skill 使用情况。这样能看到哪些 Skill 频繁被用，哪些触发率低于预期——后者意味着 description 没写好，或者这个 Skill 根本没解决真实需求。&lt;/p&gt;

&lt;p&gt;发现 Skill 很少被触发，先检查 description 是不是清楚地描述了触发场景。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;大部分 Skill 在 Anthropic 内部也是从几行指令、一个 Gotcha 开始的，遇到新 edge case 就补进去，慢慢变好的。挑一件你每天重复干的事，写一个最简版，先跑通。&lt;/p&gt;</description>
      <author>Immerse</author>
      <pubDate>Sat, 16 May 2026 15:42:16 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7346</link>
      <guid>https://beta.w2solo.com/topics/7346</guid>
    </item>
    <item>
      <title>全自动产品开发，没有设计师也能自己设计产品。电商福音</title>
      <description>&lt;p&gt;这个网站  解决了想做新产品，但又不懂设计的难题，没有设计师公司的福音！&lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;这个网站其实很简单，就是为了帮那些有产品设计思维，但不会使用专业绘图软件的老板，产品经理，个人。解决产品开发的难题。
&lt;img src="https://img.way2solo.com/photo/yea032/237e61ac-ef45-4105-9af4-cac1cacc6f9c.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;每一个做产品卖产品的公司，包括一些小店，个人，都会有开发新品的想法，尤其是一些加工厂，电商公司；都会希望在每一个阶段上新品。有时候老板自己本人或者产品经理，可能也有自己的产品开发想法，但是自己又不懂怎么使用绘图软件，然而，身边又没有设计师；若专门去外面找一个设计师，成本高，还不一定能找到合适的。这个网站就是解决这个问题的。
&lt;img src="https://img.way2solo.com/photo/yea032/dbf845e0-1210-425b-ba04-c2a1da4d8f5b.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;人人都可以在上面开发自己的产品，它并不是换材质，迁移，换颜色那么简单，而是可以帮你创作出一个新的产品；虽然创作出来的图不一定能直接生产使用，但是能给你发散思维，让你的想法直观化，看得见，为你开发产品节约时间和脑力！&lt;/p&gt;

&lt;p&gt;而且网站当前还可以免费入驻设计师和供应商！当你生成的图需要专业人士调整时，就找网站内部的设计师调整；当你想打样，生成的时候，就找网站内部的供应商。也就是说，从灵感开发到落地，都包含在内了。
&lt;img src="https://img.way2solo.com/photo/yea032/fdf29097-1e0b-4f74-9fba-9a8e7e6a1289.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;本站用法很简单，只需要上传一张你想开发的对标产品图，如果你有自己想法，就把想法写在图片中；如果你想结合其他图的特征设计，就上传其他参考图；网站会自动思考，结合你所上传的所有参考图，用它自己的思维帮你创作出一个原创新品。全程不用设置，不用写提示词，会用鼠标就可以。
&lt;img src="https://img.way2solo.com/photo/yea032/55c8920e-d2c0-40b4-8c92-4d0f20db4f6b.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/yea032/b9df677f-b4e2-4908-a521-13d1d6c8a26c.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;你感觉这个网站怎样？能帮到你吗？ 网址：&lt;a href="https://www.takingai.cn/" rel="nofollow" target="_blank"&gt;https://www.takingai.cn/&lt;/a&gt;&lt;/p&gt;</description>
      <author>yea032</author>
      <pubDate>Sat, 16 May 2026 14:16:07 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7345</link>
      <guid>https://beta.w2solo.com/topics/7345</guid>
    </item>
    <item>
      <title>AI Rapper 说唱音乐生成器</title>
      <description>&lt;p&gt;写了个在线说唱音乐的项目，有兴趣的可以试试看  &lt;a href="https://rapper.im/" rel="nofollow" target="_blank"&gt;https://rapper.im/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;可以用来表达观点，或者 作为短视频背景声音啥的&lt;/p&gt;</description>
      <author>finekewei</author>
      <pubDate>Sat, 16 May 2026 13:35:26 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7344</link>
      <guid>https://beta.w2solo.com/topics/7344</guid>
    </item>
    <item>
      <title>这网站有点意思。只要一张对标产品图，就能设计出新的产品，还不用提示词。</title>
      <description>&lt;p&gt;这个网站  解决了想做新产品，但又不懂设计的难题，没有设计师公司的福音！&lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;img title=":grinning:" alt="😀" src="https://twemoji.ruby-china.com/2/svg/1f600.svg" class="twemoji"&gt; &lt;/p&gt;

&lt;p&gt;这个网站其实很简单，就是为了帮那些有产品设计思维，但不会使用专业绘图软件的老板，产品经理，个人。解决产品开发的难题。
&lt;img src="https://img.way2solo.com/photo/yea032/237e61ac-ef45-4105-9af4-cac1cacc6f9c.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;每一个做产品卖产品的公司，包括一些小店，个人，都会有开发新品的想法，尤其是一些加工厂，电商公司；都会希望在每一个阶段上新品。有时候老板自己本人或者产品经理，可能也有自己的产品开发想法，但是自己又不懂怎么使用绘图软件，然而，身边又没有设计师；若专门去外面找一个设计师，成本高，还不一定能找到合适的。这个网站就是解决这个问题的。
&lt;img src="https://img.way2solo.com/photo/yea032/dbf845e0-1210-425b-ba04-c2a1da4d8f5b.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;人人都可以在上面开发自己的产品，它并不是换材质，迁移，换颜色那么简单，而是可以帮你创作出一个新的产品；虽然创作出来的图不一定能直接生产使用，但是能给你发散思维，让你的想法直观化，看得见，为你开发产品节约时间和脑力！&lt;/p&gt;

&lt;p&gt;而且网站当前还可以免费入驻设计师和供应商！当你生成的图需要专业人士调整时，就找网站内部的设计师调整；当你想打样，生成的时候，就找网站内部的供应商。也就是说，从灵感开发到落地，都包含在内了。
&lt;img src="https://img.way2solo.com/photo/yea032/fdf29097-1e0b-4f74-9fba-9a8e7e6a1289.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;本站用法很简单，只需要上传一张你想开发的对标产品图，如果你有自己想法，就把想法写在图片中；如果你想结合其他图的特征设计，就上传其他参考图；网站会自动思考，结合你所上传的所有参考图，用它自己的思维帮你创作出一个原创新品。全程不用设置，不用写提示词，会用鼠标就可以。
&lt;img src="https://img.way2solo.com/photo/yea032/55c8920e-d2c0-40b4-8c92-4d0f20db4f6b.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/yea032/b9df677f-b4e2-4908-a521-13d1d6c8a26c.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;你感觉这个网站怎样？能帮到你吗？ 网址：&lt;a href="https://www.takingai.cn/" rel="nofollow" target="_blank"&gt;https://www.takingai.cn/&lt;/a&gt;&lt;/p&gt;</description>
      <author>yea032</author>
      <pubDate>Sat, 16 May 2026 11:24:06 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7343</link>
      <guid>https://beta.w2solo.com/topics/7343</guid>
    </item>
    <item>
      <title>一款简约，纯粹的 AI 工具导航站</title>
      <description>&lt;p&gt;这是一个专门收集和整理 AI 工具的网站。现在市面上的 AI 工具越来越多，ChatGPT、Midjourney、Stable Diffusion 这些名字你可能都听过，但真要找一个适合自己的工具，往往要翻半天。&lt;/p&gt;

&lt;p&gt;这个网站就是帮你解决这个问题的——它把各种 AI 工具按类别整理好，你打开网站就能看到，点一下就能用。&lt;/p&gt;

&lt;p&gt;网站首页按分类展示工具，比如 AI 写作、AI 绘画、AI 编程、AI 视频等等。每个分类下面列出对应的工具，有工具名称、简介和图标，一目了然。看到感兴趣的工具，点进去就能看到详细介绍，包括这个工具能干什么、有什么特色、适合什么场景、常见问题怎么解决。&lt;/p&gt;

&lt;p&gt;地址：&lt;a href="https://ai.fly63.com" rel="nofollow" target="_blank"&gt;https://ai.fly63.com&lt;/a&gt;&lt;/p&gt;</description>
      <author>fly63</author>
      <pubDate>Sat, 16 May 2026 11:21:25 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7342</link>
      <guid>https://beta.w2solo.com/topics/7342</guid>
    </item>
    <item>
      <title>Gemini cli 登录异常解法</title>
      <description>&lt;p&gt;事情是这样的。&lt;/p&gt;

&lt;p&gt;今天下午，有个项目要用到 Gemini CLI，我想着那就登一下吧，反正之前也用过。&lt;/p&gt;

&lt;p&gt;结果终端输完命令，点完授权，跳完浏览器，回到终端。&lt;/p&gt;

&lt;p&gt;就给我看这个。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://gitee.com/da-qiang-classmate/typora/raw/master/image/20260514173105947.webp" title="" alt="844"&gt;&lt;/p&gt;
&lt;h3 id="全网都在教你调代理"&gt;全网都在教你调代理&lt;/h3&gt;
&lt;p&gt;嗯？&lt;/p&gt;

&lt;p&gt;什么情况？&lt;/p&gt;

&lt;p&gt;我以为是网络波动，重试了两次，还是一样。&lt;/p&gt;

&lt;p&gt;于是我去搜了一下，好家伙，一搜才发现，这个问题已经爆了快一个月了。整个中文互联网搜 gemini cli 登不上，出来的帖子能翻十几页，从 CSDN 到知乎到 GitHub Issue，所有人都在骂。&lt;/p&gt;

&lt;p&gt;然后你猜所有人给出的解决方案是什么？&lt;/p&gt;

&lt;p&gt;清一色，检查代理。&lt;/p&gt;

&lt;p&gt;什么检查环境变量啊，什么给 PowerShell 单独设置 WinHTTP 代理啊，什么用 proxychains 啊，还有说要在环境变量里配置谷歌云项目 ID 的。&lt;/p&gt;

&lt;p&gt;我当时还真信了。&lt;/p&gt;

&lt;p&gt;于是我照着网上的教程，一步一步来。&lt;/p&gt;

&lt;p&gt;先在 PowerShell 里敲 &lt;code&gt;netsh winhttp show proxy&lt;/code&gt;，看看代理是不是生效。&lt;/p&gt;

&lt;p&gt;显示正常。&lt;/p&gt;

&lt;p&gt;不放心，又手动设了一遍 &lt;code&gt;netsh winhttp set proxy 127.0.0.1:7890&lt;/code&gt;。&lt;/p&gt;

&lt;p&gt;然后再去登。&lt;/p&gt;

&lt;p&gt;还是失败。&lt;/p&gt;

&lt;p&gt;我当时就有点懵了。&lt;/p&gt;

&lt;p&gt;我甚至把代理关了又开，开了又关，节点换了好几个，从香港换到新加坡换到日本，甚至试了美国原生家宽。&lt;/p&gt;

&lt;p&gt;没用，就是登不上。&lt;/p&gt;

&lt;p&gt;。。。&lt;/p&gt;
&lt;h3 id="真正的原因，被所有人忽略了"&gt;真正的原因，被所有人忽略了&lt;/h3&gt;
&lt;p&gt;这个时候我突然想起一件事。&lt;/p&gt;

&lt;p&gt;大概两周前，我发现 Google AI Studio 打不开了，浏览器里直接 403，当时以为是谷歌又封了什么区域，也没在意。&lt;/p&gt;

&lt;p&gt;这两件事会不会有什么联系？&lt;/p&gt;

&lt;p&gt;我于是去搜「Google AI Studio 403」，出来的结果让我一下子就反应过来了。&lt;/p&gt;

&lt;p&gt;原来，谷歌从上个月开始，悄悄给所有用户发了一封邮件，要求进行年龄验证。&lt;/p&gt;

&lt;p&gt;你没看错，年龄验证。&lt;/p&gt;

&lt;p&gt;因为之前注册谷歌账号的时候，那个年龄你随便填的，谷歌根本不会真的去验证。你说你 18 你就 18，你说你 80 你就 80。&lt;/p&gt;

&lt;p&gt;但现在不行了。&lt;/p&gt;

&lt;p&gt;谷歌说，不行，我现在要开始认真了。如果你不做年龄验证，那所有跟 AI 相关的服务，你就别想用了。&lt;/p&gt;

&lt;p&gt;包括 AI Studio，也包括 Gemini CLI。&lt;/p&gt;

&lt;p&gt;我靠。&lt;/p&gt;

&lt;p&gt;我突然想起来，那封邮件我确实收到过，当时扫了一眼标题，觉得又是谷歌什么乱七八糟的通知，直接就给删了。&lt;/p&gt;

&lt;p&gt;谁能想到，就这么个破事，能把我卡一下午？&lt;/p&gt;

&lt;p&gt;于是我赶紧去把年龄验证做了，链接放这里，你们遇到同样问题的也可以直接去。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://myaccount.google.com/age-verification" rel="nofollow" target="_blank"&gt;https://myaccount.google.com/age-verification&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://gitee.com/da-qiang-classmate/typora/raw/master/image/20260514203756290.webp" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;验证完，我先去打开 AI Studio，果然能进了。&lt;/p&gt;

&lt;p&gt;然后回到终端，再敲一遍 gemini 登录。&lt;/p&gt;

&lt;p&gt;授权，跳转，确认。&lt;/p&gt;

&lt;p&gt;成了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://gitee.com/da-qiang-classmate/typora/raw/master/image/20260514205006826.webp" title="" alt="842"&gt;&lt;/p&gt;
&lt;h3 id="写在最后"&gt;写在最后&lt;/h3&gt;
&lt;p&gt;我当时坐在屏幕前，真的就是一声叹息。&lt;/p&gt;

&lt;p&gt;你说这叫什么事啊。&lt;/p&gt;

&lt;p&gt;整整一个月，整个中文互联网所有人都在教你怎么调代理，所有人都在骂谷歌的反人类网络设置。&lt;/p&gt;

&lt;p&gt;结果真正的原因，是你没去填那个年龄验证。&lt;/p&gt;

&lt;p&gt;没有任何一篇文章提到这件事。&lt;/p&gt;

&lt;p&gt;所有人都在错误的方向上，互相抄来抄去，把一个根本不存在的问题，越描越复杂。&lt;/p&gt;

&lt;p&gt;最后甚至形成了一种集体幻觉，好像真的是代理的问题，好像真的只要你多换几个节点，多试几次，总能成功。&lt;/p&gt;

&lt;p&gt;我后来在想，为什么会这样？&lt;/p&gt;

&lt;p&gt;大概是因为，我们已经太习惯「谷歌的服务出问题，那肯定是代理的锅」这个条件反射了。以至于当真正的问题出在别的地方时，我们甚至连想都不会往那个方向去想。&lt;/p&gt;

&lt;p&gt;我们只会一遍又一遍地，在同一个错误的地方，用同一种错误的方法，试图得到一个正确的结果。&lt;/p&gt;

&lt;p&gt;这跟现在很多人用 AI 的状态，是不是也有点像？&lt;/p&gt;

&lt;p&gt;遇到问题，第一反应不是去想「这个问题的本质是什么」，而是去搜「别人是怎么解决的」，然后照着抄一遍。抄来抄去，所有人都在同一个坑里打转，就是没人愿意停下来，多问一句，真的是这样吗？&lt;/p&gt;

&lt;p&gt;哦对了，如果你现在去谷歌搜「gemini cli 登录不上」，排在前几的那几篇文章，还是在教你怎么设置代理。&lt;/p&gt;

&lt;p&gt;没有人更新。&lt;/p&gt;

&lt;p&gt;没有人发现真正的原因。&lt;/p&gt;

&lt;p&gt;所有人都还在那个坑里。&lt;/p&gt;

&lt;p&gt;信息差啊，朋友们。&lt;/p&gt;

&lt;p&gt;有时候，你跟正确答案之间的距离，不是你不够努力，也不是你技术不够好。&lt;/p&gt;

&lt;p&gt;就只是，没有人告诉你，真正的问题是什么。&lt;/p&gt;

&lt;p&gt;以上，既然看到这里了，如果觉得不错，随手点个赞、在看、转发三连吧，如果想第一时间收到推送，也可以给我个星标⭐～&lt;/p&gt;

&lt;p&gt;谢谢你看我的文章，我们，下次再见。&lt;/p&gt;

&lt;p&gt;公众号：大强同学&lt;/p&gt;</description>
      <author>sphinx30</author>
      <pubDate>Fri, 15 May 2026 23:05:25 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7341</link>
      <guid>https://beta.w2solo.com/topics/7341</guid>
    </item>
    <item>
      <title>我让 AI 当了 24 小时全年无休的 “毒舌考官”</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;公司开了个仓库，前端团队从 3 人扩到 12 人，我定规矩：所有 PR 至少 1 个 Review 才能合。好的，大家开始互相送 “LGTM ⭐” 了——一眼都没看，点完就跑。线上挂的时候谁也背锅，群消息全是 “不是我”。我一气之下拉了 AI 进来当永久 Code Reviewer，0 薪水 7x24 小时在线，什么混子、什么歪代码，全部兜住。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;PR 审查这件事，经历过的都懂：平时没人看，一出事全是 “我早说了”。你认真看了 500 行 diff 给出了 3 页修改意见，人家回复一个 “done”，你都不知道改没改对。&lt;/p&gt;

&lt;p&gt;Code Review 的最大矛盾是什么？&lt;strong&gt;要快，就水；要细，就慢&lt;/strong&gt;。AI 时代，你猜怎么着？这活儿最适合交给机器人。不需要情商，直接喷；不需要开会，秒回；不需要记住项目规范，每次都按最新标准来。&lt;/p&gt;

&lt;p&gt;今天我来实操：用 AI 在自己的 PR 里自动跑 Code Review，准确到几行代码，还能直接输出 “P0 严重”、“P1 重要”、“P2 建议” 的结构化报告。准备接受 AI 对你代码的无差别吐槽了吗？&lt;/p&gt;
&lt;h2 id="一、AI 当 reviewer 会“胡说八道”吗？"&gt;一、AI 当 reviewer 会 “胡说八道” 吗？&lt;/h2&gt;
&lt;p&gt;你先不用管它会胡说八道。你只要让它遵循的原则是 &lt;strong&gt;“如果这条建议可能不对，就闭嘴”&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;打个比方，你让人工 review：“这个 useEffect 漏了清理函数” → 这是对的。“你这里最好改用 useMemo” → 有时是对的，但也可能是在显摆。&lt;/p&gt;

&lt;p&gt;AI 也一样，你调校它的方式不是 “提示词”，而是&lt;strong&gt;给它喂规则&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;来看看我用了大半年的一套 AI Code Review 命令行工具能 “喷” 什么：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;security&lt;/strong&gt;：检测登录态是否在前端 localStorage 明文存密码、有没有 XSS 注入风险、SQL 注入隐患。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;performance&lt;/strong&gt;：看你有没有在 React 组件里直接写 &lt;code&gt;const style = { margin: 10 }&lt;/code&gt;（每次渲染新建对象）。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;accessibility&lt;/strong&gt;：img 缺 alt、button 缺类型、颜色对比度稀烂。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;code quality&lt;/strong&gt;：文件超过 500 行给你标黄、catch 了错误只 &lt;code&gt;console.log&lt;/code&gt;（等于没 catch）、变量名拼写错误。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这套逻辑用下来，我的体感：&lt;strong&gt;AI 发现问题的速度是人类的 20 倍以上，遗漏率比人类 reviewer 低得多，而且从不得罪人&lt;/strong&gt;——因为它不带 “你写得好烂” 的情绪，只有纯技术判断。&lt;/p&gt;
&lt;h2 id="二、一行命令立刻拥有"&gt;二、一行命令立刻拥有&lt;/h2&gt;
&lt;p&gt;我最近一直在用一个叫 &lt;strong&gt;ai-review-pipeline&lt;/strong&gt; 的工具，它的理念很好：“AI 审查 AI 写的代码”——现在是 AI 辅助编程时代了，写得快但容易藏 bug，我正好需要这种【7x24 小时兜底】&lt;/p&gt;

&lt;p&gt;这个工具的特点是用 AI 自动 review + 生成测试 + 自动修复。你就无脑给它一个文件或目录，它出来的是&lt;strong&gt;评分 + 问题清单 + 修复建议 + 测试用例&lt;/strong&gt;。&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx ai-review-pipeline &lt;span class="nt"&gt;--file&lt;/span&gt; src/ &lt;span class="nt"&gt;--full&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它的流程很清晰：先跑确定性规则检查（比如 ESLint 已有的问题一次性过滤掉，不让 AI 重复废话），然后 AI 带着你配置好的团队规范去读 diff，每发现一个问题就给等级、给修复建议、给代码示例。如果你加 &lt;code&gt;--fix&lt;/code&gt; 参数，它甚至会尝试&lt;strong&gt;自动修&lt;/strong&gt;然后重新 review。&lt;/p&gt;

&lt;p&gt;你说：“万一自动修复改错了逻辑呢？” 错不了，AI 只敢改那些确定性高的低质量代码（多余空格、未使用的变量、非空断言错误等）。&lt;strong&gt;业务逻辑？它先绕开，你合并之前自己把关。&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;而且支持绝大部分场景（后端 Java, Go, Python, Rust 也能喷）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;前端代码 review（React / Vue / TSX、CSS、a11y）&lt;/li&gt;
&lt;li&gt;backend-code-review（API 设计、数据库、并发安全）&lt;/li&gt;
&lt;li&gt;自动修复（默认只修格式、未使用的变量、确定的 lint 类问题，不敢动业务逻辑）&lt;/li&gt;
&lt;li&gt;Multi-LLM（OpenAI、Claude、DeepSeek、Gemini、Ollama 都能跑）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="三、调 AI 的“毒舌参数”，让它喷得更专业"&gt;三、调 AI 的 “毒舌参数”，让它喷得更专业&lt;/h2&gt;
&lt;p&gt;我用过 Grok、Claude 和 DeepSeek，相对用得最深的是 &lt;strong&gt;DeepSeek&lt;/strong&gt; 和 &lt;strong&gt;OpenAI&lt;/strong&gt;。调教参数也很简单：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 预设深度更狠一点，让它给你抓出 P0~P3 等级的分类&lt;/span&gt;
ai-review config &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;strictness&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;high
ai-review config &lt;span class="nb"&gt;set &lt;/span&gt;&lt;span class="nv"&gt;outputFormat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;structured
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;AI 的审查结果可以直接挂在 GitHub PR 里当 Comment，每条对应具体行数和问题等级。一旦 AI 给了 &lt;strong&gt;P0（严重）&lt;/strong&gt; ，CI 直接 block 合并，你必须解决。&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;注意：如果你的项目有特别明确的 “业务规范”，你可以写到 &lt;code&gt;.ai-pipeline.json&lt;/code&gt; 配置文件里，例如 &lt;code&gt;“禁止引入 moment.js”&lt;/code&gt;、&lt;code&gt;“禁止在循环中使用 await”&lt;/code&gt;，AI 会把这部分自动纳入审查范畴，跟内置规则并排跑。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="四、这套 AI Code Review 还解决了哪些痛点？"&gt;四、这套 AI Code Review 还解决了哪些痛点？&lt;/h2&gt;&lt;h3 id="1. 跨语言能力 + 敏感信息排查"&gt;1. 跨语言能力 + 敏感信息排查&lt;/h3&gt;
&lt;p&gt;检查出来的问题几乎横跨你代码库所有位置：泄漏的 API endpoint、调试信息意外留到生产、图片 dead link 甚至无障碍视觉回归。&lt;/p&gt;

&lt;p&gt;它有一个特殊技巧：&lt;strong&gt;让多个 LLM 并行审查、互相辩论&lt;/strong&gt;，然后一个 “法官 agent” 给出最终裁决。不同模型能逮到不同 bug，通过共识机制滤掉噪音。&lt;/p&gt;
&lt;h3 id="2. CI 门禁，上线之前最后一道防线"&gt;2. CI 门禁，上线之前最后一道防线&lt;/h3&gt;
&lt;p&gt;你可以把 &lt;code&gt;ai-review-pipeline&lt;/code&gt; 挂在 GitHub Actions 上，每次 PR 自动执行。如果评分低于阈值（比如 80 分），CI 直接标红，连人都不用到场干预。&lt;/p&gt;

&lt;p&gt;某互联网团队落地类似系统后，&lt;strong&gt;代码审查周期缩短了 65%，基础性缺陷拦截率提升了 82%&lt;/strong&gt;。这个数据就是 AI review 正面效果的最好说明。&lt;/p&gt;
&lt;h2 id="五、毒舌吐槽大会：AI 喷过的那些人类代码"&gt;五、毒舌吐槽大会：AI 喷过的那些人类代码&lt;/h2&gt;
&lt;p&gt;我随便举几个真实案例，括号里是 AI 原话（节选）：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;案例 1&lt;/strong&gt;：&lt;code&gt;setTimeout(() =&amp;gt; { ... }, 0)&lt;/code&gt; 用来模拟 “异步一下”。AI 喷：“用 setTimeout 0 是反模式，你应该用 Promise.resolve().then() 或者 queueMicrotask。——另外，你连错误处理都没有？”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;案例 2&lt;/strong&gt;：自己封装了一个 &lt;code&gt;request&lt;/code&gt; 函数，每个请求都 &lt;code&gt;console.log&lt;/code&gt; 全部响应体数据。AI 喷：“你在生产环境把整个 API 响应结构暴露到控制台，包含了敏感字段。P0 严重。建议只 log trace id。”&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;案例 3&lt;/strong&gt;：&lt;code&gt;&amp;lt;img src={userInput} /&amp;gt;&lt;/code&gt;。AI 喷：“你直接把用户输入当 src？明天你的网站就变成菠菜广告基地。用 DOMPurify 或者干脆用 background-image 托管。”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;这套 AI 让我晚上睡得踏实。自从它上线，我再也没有过 “线上又崩了，测试也没测出来” 的半夜来电。&lt;/p&gt;
&lt;h2 id="六、总结：AI 帮你 review 代码不是替代人，而是让你做更高价值的事"&gt;六、总结：AI 帮你 review 代码不是替代人，而是让你做更高价值的事&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;AI 擅长一致性检查、边界检测、安全底网，还能给出可落地的修复示例。人类 reviewer 只需要关注架构、业务语义、用户体验。&lt;/li&gt;
&lt;li&gt;成本几乎为零，你只需要提供几个免费 API（Ollama、Groq 或各家入门额度）+ 一条 &lt;code&gt;npx&lt;/code&gt; 命令。&lt;/li&gt;
&lt;li&gt;未来方向：不只是 review，还开始蔓延到&lt;strong&gt;自动修复 + 测试生成 + 知识沉淀&lt;/strong&gt;，AI 在 PR 里已经可以替你完成 80% 的 “找茬” 工作。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;我的建议：&lt;strong&gt;今天就拉一个这样的工具进你的私有仓库和团队&lt;/strong&gt;。领导不批预算？不用批，无门槛，立刻跑起来。等下次有人 PR 又是 “空代码 + 俩表情包” 来糊弄时，AI 会替你第一时间上去喷它：“你写的代码，想让我怎么 review？请自重点。”&lt;/p&gt;</description>
      <author>193577746</author>
      <pubDate>Fri, 15 May 2026 19:45:35 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7340</link>
      <guid>https://beta.w2solo.com/topics/7340</guid>
    </item>
    <item>
      <title>给 Shipstry 加了个外链提交追踪功能，解决独立开发者分散提交的痛点</title>
      <description>&lt;p&gt;做独立开发的朋友应该都有这个经历：产品上线后要往各种目录网站提交，Product Hunt 、Reddit 、GitHub Pages 、各种 AI 工具目录……&lt;/p&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;靠 Excel 或者 Notion 记，就是手工活多一点&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;所以我给自己的产品 Shipstry 做了个 Backlink Submissions 功能，专门解决这个问题。 主要功能：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Discover：内置 800+ 目录，按 DR（ Domain Rating ）排序，GitHub DR96 、Gravatar DR97 、Reddit DR95 这些都有&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Queue：看中哪个目录直接加队列，不用手动复制粘贴&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;状态追踪：Unstarted → Planned → Submitted → Live ，全流程标记&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;筛选：按 DR 、费用、dofollow/nofollow 、接受类型过滤&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;多产品管理：每个产品独立追踪，下拉切换&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;界面大概长这样（见截图），核心思路就是把散乱的外链提交变成一个可管理的 pipeline 。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/coryso/d2fdc516-7ea6-4c12-bbcf-f35211d3c996.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shipstry.com/backlinks" rel="nofollow" target="_blank" title=""&gt;shipstry.com/backlinks&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;有在做外链建设的朋友欢迎试试，也欢迎提建议 🙏&lt;/p&gt;</description>
      <author>coryso</author>
      <pubDate>Fri, 15 May 2026 18:08:34 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7339</link>
      <guid>https://beta.w2solo.com/topics/7339</guid>
    </item>
    <item>
      <title>只要一张对标产品图，就能设计出新的产品，无提示词。</title>
      <description>&lt;p&gt;这个网站     &lt;a href="https://www.takingai.cn/" rel="nofollow" target="_blank"&gt;https://www.takingai.cn/&lt;/a&gt;    解决了想做新产品，但又不懂设计的难题！&lt;/p&gt;

&lt;p&gt;这个网站的初衷其实很简单，就是为了帮那些有产品设计思维，但不会使用专业绘图软件的老板，产品经理，个人。解决产品开发的难题。&lt;img src="https://img.way2solo.com/photo/yea032/c510d792-8ac3-4bda-90af-5f9aa28d9e4f.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/yea032/a33580a9-26b2-4a93-b9a5-7dc0264a560e.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;每一个做产品卖产品的公司，包括一些小店，个人，都会有开发新品的想法，尤其是一些加工厂，电商公司；都会希望在每一个阶段上新品。有时候老板自己本人或者产品经理，可能也有自己的产品开发想法，但是自己又不懂怎么使用绘图软件，然而，身边又没有设计师；若专门去外面找一个设计师，成本高，还不一定能找到合适的。这个网站就是解决这个问题的。&lt;/p&gt;

&lt;p&gt;人人都可以在上面开发自己的产品，它并不是换材质，迁移，换颜色那么简单，而是可以帮你创作出一个新的产品；虽然创作出来的图不一定能直接生产使用，但是能给你发散思维，让你的想法直观化，看得见，为你开发产品节约时间和脑力！&lt;/p&gt;

&lt;p&gt;而且网站当前还可以免费入驻设计师和供应商！当你生成的图需要专业人士调整时，就找网站内部的设计师调整；当你想打样，生成的时候，就找网站内部的供应商。也就是说，从灵感开发到落地，都包含在内了。&lt;img src="https://img.way2solo.com/photo/yea032/988e5a42-1d3c-4b89-babb-51b84c066c0c.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;本站用法很简单，只需要上传一张你想开发的对标产品图，如果你有自己想法，就把想法写在图片中；如果你想结合其他图的特征设计，就上传其他参考图；网站会自动思考，结合你所上传的所有参考图，用它自己的思维帮你创作出一个原创新品。全程不用设置，不用写提示词，会用鼠标就可以。&lt;img src="https://img.way2solo.com/photo/yea032/8647c1e2-c23b-4ddb-bf59-fb4e17aa0672.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/yea032/cd51c98c-2cff-4c6e-a30c-ccf859286113.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/yea032/fd4f9a6e-7de0-42e0-b664-d438189d64a0.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/yea032/88639c5e-f75f-445e-87b6-307aea19fa34.jpg?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;你感觉这个网站怎样？能帮到你吗？&lt;/p&gt;</description>
      <author>yea032</author>
      <pubDate>Fri, 15 May 2026 15:53:25 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7338</link>
      <guid>https://beta.w2solo.com/topics/7338</guid>
    </item>
    <item>
      <title>最近 AI 图像生成变化太快，GPT Image 2 值得看看</title>
      <description>&lt;p&gt;最近明显感觉 AI 图像生成这个领域又开始加速了。前段时间大家还在对比 Midjourney、Nano Banana Pro、Firefly 这些工具，主要看画面质感、风格稳定性和创意表现。现在新的重点开始变成：谁能更好理解提示词、谁能更准确生成文字、谁更适合真实商业场景。&lt;/p&gt;

&lt;p&gt;我这几天也试了一些工具，感觉 GPT Image 2 这个方向挺有意思。相比单纯追求 “好看” 的图片，它更适合做一些实用型内容，比如海报、广告图、社媒配图、产品展示图、信息图这些。尤其是图片里的文字渲染，比以前很多 AI 图片工具稳定不少。&lt;/p&gt;

&lt;p&gt;现在 AI 图像工具已经不只是 “生成一张漂亮图片” 了，而是越来越接近真正的设计辅助工具。比如一个产品图、活动海报、Banner 草图，以前可能需要反复找素材、调版式，现在用提示词就能先快速生成几个方向，再慢慢优化。&lt;/p&gt;

&lt;p&gt;如果你最近也在关注 AI 图片生成，或者想找一个偏实用、偏商业创作的工具，可以试试这个：&lt;a href="https://gptimage2app.com/" rel="nofollow" target="_blank"&gt;https://gptimage2app.com/&lt;/a&gt;&lt;/p&gt;</description>
      <author>13025154939</author>
      <pubDate>Fri, 15 May 2026 13:14:51 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7337</link>
      <guid>https://beta.w2solo.com/topics/7337</guid>
    </item>
    <item>
      <title>不用梯子、不用接验证码，我发现了一个国内用户直接上 Telegram 的客户端</title>
      <description>&lt;p&gt;说实话，+86 手机号登录 Telegram 这件事，坑了我太多次。&lt;/p&gt;

&lt;p&gt;SMSfee 弹窗、验证码收不到、接了码还被风控、梯子不稳定断连...
每次想上 TG 查个资料，光登录就要折腾半小时。&lt;/p&gt;
&lt;h2 id="后来我大量尝试第三方，终于得到一款让我满意的!"&gt;后来我大量尝试第三方，终于得到一款让我满意的!&lt;/h2&gt;&lt;h2 id="这个客户端解决了什么"&gt;这个客户端解决了什么&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 不用翻墙，直连 Telegram&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;不是内置代理、不是修改 hosts、不是找节点。
网络层做了深度适配，安装完直接打开，消息收发、图片加载、频道浏览，全部正常。
（我知道你们最关心这个，直接说：不需要任何梯子工具。）&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. 不用跳转接码平台，成品号直登&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;内置了成品号购买入口，
一个已经验证过的号，输入账号密码直接登录。
跳过 SMSfee，跳过 +86 接码地狱，跳过"请稍后再试"的无限循环。
对于已经被封过号、换过多次手机号的老用户，这是目前最干净的方案。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 打开就是中文，和官方客户端功能完全一致&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;基于官方 12.5.1 源码编译，没有阉割任何功能。
私密聊天、群组、频道订阅、文件传输、消息撤回，全部原生保留。
界面默认简体中文，不需要手动导入翻译包。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="适合谁用"&gt;适合谁用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;被 SMSfee 卡过、验证码死活收不到的 +86 用户&lt;/li&gt;
&lt;li&gt;不想折腾梯子、不想每个月买节点的轻度用户&lt;/li&gt;
&lt;li&gt;需要稳定使用 Telegram 但不想在登录环节花时间的效率党&lt;/li&gt;
&lt;li&gt;之前用过各种第三方客户端，但要么要翻墙、要么功能残缺的&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;h2 id="实测数据"&gt;实测数据&lt;/h2&gt;
&lt;p&gt;我自己 + 内测群 30 多人，覆盖移动/联通/电信三网，近两周登录成功率 100%，消息收发延迟和官方客户端无明显差异。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="获取方式"&gt;获取方式&lt;/h2&gt;
&lt;p&gt;评论区自取&lt;/p&gt;

&lt;p&gt;有问题直接下面留言，我每天都在。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;最后说句实在的：
他的存在不是为了替代官方客户端，是解决一个具体场景的具体痛点。
如果你也被 登录 Telegram 折磨过，试试这个，不好用回来骂我。
&lt;img src="https://img.way2solo.com/photo/huo/8c6cdc4a-0320-4de3-96af-69276a3d50c3.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/huo/e759584f-7085-48b5-ab6e-17bd5f5edaef.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/huo/fcdf89d9-9786-4ae4-8d39-4d9eb68dca0f.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>huo</author>
      <pubDate>Fri, 15 May 2026 11:34:14 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7336</link>
      <guid>https://beta.w2solo.com/topics/7336</guid>
    </item>
    <item>
      <title>BeddyColor - 免费儿童涂色画打印下载</title>
      <description>&lt;p&gt;BeddyColor 是一个免费的儿童涂色画打印网站，提供数千张高质量涂色页。&lt;/p&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;网址：&lt;a href="https://beddycolor.com" rel="nofollow" target="_blank"&gt;https://beddycolor.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;欢迎大家体验，有任何建议欢迎反馈！&lt;/p&gt;</description>
      <author>jack-jack</author>
      <pubDate>Fri, 15 May 2026 10:02:32 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7335</link>
      <guid>https://beta.w2solo.com/topics/7335</guid>
    </item>
    <item>
      <title>Google 搜索 CLI：给 AI Agent 装上谷歌搜索能力</title>
      <description>&lt;p&gt;AI Agent 不能联网真的太蛋疼了。试了五六种搜索工具，没有一个让人省心——要么要配 API Key，要么要跑后台服务，要么结果一塌糊涂。&lt;/p&gt;

&lt;p&gt;直到发现 &lt;a href="https://github.com/aeroxy/gsearch-cli" rel="nofollow" target="_blank" title=""&gt;gsearch-cli&lt;/a&gt;。Rust 写的，单二进制，小得离谱，跑起来快得惊人。最妙的是它能直接复用 Gemini CLI 的 OAuth 认证，&lt;strong&gt;零配置，装完就能用&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;现在 Claude Code 终于有真正的谷歌搜索能力了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://gitee.com/da-qiang-classmate/typora/raw/master/image/20260514195541715.webp" title="" alt=""&gt;&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="安装"&gt;安装&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;方式一：有 Rust 环境&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;gsearch-cli
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方式二：macOS&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;aeroxy/tap/gsearch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;装完先登录一次：&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gsearch &lt;span class="nt"&gt;--login&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器打开授权页面，点一下确认就完事了。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="怎么用"&gt;怎么用&lt;/h2&gt;&lt;h3 id="1. 命令行直接用"&gt;1. 命令行直接用&lt;/h3&gt;&lt;pre class="highlight shell"&gt;&lt;code&gt;gsearch 新加坡天气
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不用加引号，空格直接搜。&lt;/p&gt;
&lt;h3 id="2. Claude Code 自然语言调用"&gt;2. Claude Code 自然语言调用&lt;/h3&gt;
&lt;p&gt;这才是终极形态——让 Agent 获得真正的联网能力。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;直接用项目自带的 Skill：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 从源码里复制，或者手动创建&lt;/span&gt;
&lt;span class="nb"&gt;cp &lt;/span&gt;gsearch-cli/skill/gsearch/SKILL.md ~/.claude/skills/gsearch/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作者已经写好了完整的 Skill，包含：&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;/ul&gt;

&lt;p&gt;&lt;strong&gt;配置完就能用！&lt;/strong&gt; 下次直接说：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;帮我搜一下 2026年5月有什么新的AI模型发布
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Claude Code 会自动识别并调用这个 Skill，不需要写复杂的 System Prompt。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="设计亮点"&gt;设计亮点&lt;/h2&gt;&lt;h3 id="1. 终端 Markdown 自动检测"&gt;1. 终端 Markdown 自动检测&lt;/h3&gt;
&lt;p&gt;这个细节特别用心：&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.is_terminal&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nn"&gt;termimad&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;print_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;formatted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c"&gt;// 终端输出 → 彩色渲染&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"{}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;formatted&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c"&gt;// 文件/管道 → 纯净 Markdown&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;直接运行 &lt;code&gt;gsearch xxx&lt;/code&gt; → 看到彩色、粗体、高亮的排版（给人看）&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;gsearch xxx &amp;gt; out.md&lt;/code&gt; → 文件里是纯净 Markdown，没有乱码字符（给程序用）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="2. 引用来源机制"&gt;2. 引用来源机制&lt;/h3&gt;
&lt;p&gt;搜索结果带 Gemini 的 grounding 数据，正文插入 &lt;code&gt;[1] [2]&lt;/code&gt; 标记，末尾自动列出 Sources 链接。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注意：不是每次都有 Sources&lt;/strong&gt;：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ 时效性新闻、技术文档、冷门事件 → 有完整引用&lt;/li&gt;
&lt;li&gt;⚠️ 最新财报、热点新闻 → 可能有注&lt;/li&gt;
&lt;li&gt;❌ 常识历史内容（如马斯克早年经历）→ Gemini 认为训练数据已有，不联网&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;h2 id="核心原理"&gt;核心原理&lt;/h2&gt;
&lt;p&gt;这个工具最巧妙的地方在于——&lt;strong&gt;它伪装成了官方的 Gemini CLI&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id="1. 认证复用"&gt;1. 认证复用&lt;/h3&gt;
&lt;p&gt;直接读 &lt;code&gt;~/.gemini/oauth_creds.json&lt;/code&gt;，用的是和 Google 官方 Gemini CLI &lt;strong&gt;完全相同&lt;/strong&gt;的 Client ID/Secret。如果你已经登录过 Gemini CLI，装完直接能用。&lt;/p&gt;
&lt;h3 id="2. 调用内部 API"&gt;2. 调用内部 API&lt;/h3&gt;
&lt;p&gt;不走公开的 Gemini API，用的是 &lt;strong&gt;Gemini CLI / Cloud Code 插件的内部端点&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cloudcode-pa.googleapis.com/v1internal:generateContent
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;User-Agent 也伪装成 &lt;code&gt;GeminiCLI/...&lt;/code&gt;，Google 根本分不清是 gsearch 还是官方客户端。&lt;/p&gt;
&lt;h3 id="3. 原生联网搜索"&gt;3. 原生联网搜索&lt;/h3&gt;
&lt;p&gt;调用 Gemini 时开启 &lt;code&gt;googleSearch&lt;/code&gt; 内置工具，用的是 Gemini 的 Grounded Search 原生能力，不是爬虫，比所有第三方搜索工具都稳。&lt;/p&gt;
&lt;h3 id="4. 自动维护"&gt;4. 自动维护&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Token 过期前 5 分钟自动刷新&lt;/li&gt;
&lt;li&gt;自动检测 &lt;code&gt;HTTPS_PROXY&lt;/code&gt;，忽略证书验证，公司内网也能跑&lt;/li&gt;
&lt;li&gt;不需要 API Key，不需要 Google Cloud 项目&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;
&lt;h2 id="源码结构"&gt;源码结构&lt;/h2&gt;
&lt;p&gt;总共就 4 个文件：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;main.rs&lt;/code&gt; - 主入口和命令行解析&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;auth.rs&lt;/code&gt; - OAuth 认证和 token 管理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;api.rs&lt;/code&gt; - Gemini 内部 API 调用&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;grounding.rs&lt;/code&gt; - 搜索结果格式化&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MIT 协议开源，随便改。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="最后说两句"&gt;最后说两句&lt;/h2&gt;
&lt;p&gt;不是什么惊天动地的大项目，但它把一个很小的问题解决得特别干净。没有花里胡哨的功能，没有复杂的配置，装完就能用。&lt;/p&gt;

&lt;p&gt;对于折腾 AI Agent 的人来说，这玩意儿就是刚需——你的 Agent 终于能真正"上网"了。&lt;/p&gt;</description>
      <author>sphinx30</author>
      <pubDate>Thu, 14 May 2026 23:00:50 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7334</link>
      <guid>https://beta.w2solo.com/topics/7334</guid>
    </item>
    <item>
      <title>有扣子（Coze）工作流大佬吗？这篇文章你一定要看！</title>
      <description>&lt;h2 id="一、扣子（Coze）是什么？能做什么？"&gt;一、扣子（Coze）是什么？能做什么？&lt;/h2&gt;
&lt;p&gt;扣子（Coze）是字节跳动推出的一款 AI Bot 开发平台，不需要用代码也能构建、调试和部署智能体（Bot）或工作流。你可以实现从基础对话到复杂任务自动化的全流程 AI 应用开发。以下是具体的操作场景和能力：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  零代码搭建智能体：通过可视化编排设定人设、配置插件和知识库，无需编程即可快速创建具有专业能力的对话机器人。&lt;/li&gt;
&lt;li&gt;  构建自动化工作流：使用拖拽方式设计任务链条，并可在代码节点中用 JavaScript 或 Python 编写自定义逻辑，实现复杂的自动化处理。&lt;/li&gt;
&lt;li&gt;  部署全能 AI 办公助手：让 AI 自主拆解长期任务（如写竞品报告）、一键生成 PPT 和海报、处理 Excel、将图文转为播客，甚至通过对话直接编程并部署网站。&lt;/li&gt;
&lt;li&gt;  调试与分发：在配置界面右侧，你可以随时与正在搭建的智能体对话，测试效果并即时调整。完成开发后，你可以将智能体一键发布到多个渠道，例如：小米应用商店（AI 智能体专区）、微信公众号、小程序、企业微信等。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;扣子本身主要处理对话逻辑和工作流编排，如果想要智能体具备真正的图像生成、图像识别或视频创作能力，就需要接入专业的视觉生成模型。GrsaiApi 官方提供了——“GrsaiApi——图像生成对话工具” 插件工具，可在扣子插件商店收藏使用。&lt;/p&gt;

&lt;p&gt;&lt;a href="https://grsai.ai/" rel="nofollow" target="_blank" title=""&gt;Grsai API&lt;/a&gt;（&lt;a href="https://link.zhihu.com/?target=https%3A//grsai.com/" rel="nofollow" target="_blank" title=""&gt;https://grsai.com&lt;/a&gt; com 需要魔法，没有 com 改 Ai 国内直连）作为国内 AI 大模型 API 源头供应商，提供图片、文本、视频模型生成接口，包括：gpt5.4、gpt5.5、gpt-image-2、Nano banana、Nano banana Pro、Nano banana2、Gemini....等模型，支持高并发、失败秒退。模型列表：&lt;a href="https://grsai.ai/zh/dashboard/models" rel="nofollow" target="_blank"&gt;https://grsai.ai/zh/dashboard/models&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-827cc8690a0b104174590b32b5fda81a_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;通过 GrsaiApi 提供的插件，你的 Bot 可以用最低的价格调用 Grsai API 内所有模型，包含语言、画图、视频。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-5cd77fae1b6c3ce4b501e08962f3b249_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h2 id="二、GrsaiApi扣子插件：GrsaiApi——图像生成对话工具"&gt;二、GrsaiApi 扣子插件：GrsaiApi——图像生成对话工具&lt;/h2&gt;
&lt;p&gt;在扣子中，只需要在插件商店搜索 “GrsaiApi——图像生成对话工具” 插件并收藏，即可使用 GrsaiApi 内置所有模型，有 6 个工具，分为旧版和新版，有什么区别该怎么选择请仔细看接下来的介绍。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-9bdd1409f3088ff701429310f05f6631_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="1.新旧版啥区别？"&gt;1.新旧版啥区别？&lt;/h3&gt;
&lt;p&gt;GrsaiAPI 的旧版文档（&lt;a href="https://grsai.ai/zh/dashboard/documents/gpt-image" rel="nofollow" target="_blank"&gt;https://grsai.ai/zh/dashboard/documents/gpt-image&lt;/a&gt;）中，不同厂商的模型拥有各自独立的接口，例如 GPT-image 模型使用/v1/draw/completions，而 Nano banana 模型则使用/v1/draw/nano-banana。由于接口不统一，调用不同模型需要编写不同的工具代码，导致用户在切换模型时无法快速完成。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Grsai_Old_NanoBa：支持 GrsaiApi 所有 Nanobanana 模型&lt;/li&gt;
&lt;li&gt;  Grsai_Old_image_2：支持 GrsaiApi 所有 Gpt-image-2 模型&lt;/li&gt;
&lt;li&gt;  Grsai_Old_Get_Results：支持上述两个模型的异步任务查询&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GrsaiAPI 新版文档（&lt;a href="https://qmy27nhsd9.apifox.cn/452392911e0" rel="nofollow" target="_blank" title=""&gt;nano-banana 接口 - Grsai API&lt;/a&gt;  &lt;a href="https://qmy27nhsd9.apifox.cn/452392911e0" rel="nofollow" target="_blank"&gt;https://qmy27nhsd9.apifox.cn/452392911e0&lt;/a&gt; ）采用了统一接口，只需调用 https://{base_url}/v1/api/generate 即可使用平台内除文本模型外的所有图片与视频生成模型。由于新旧文档模型参数不同，异步任务的查询仍需使用新版文档配套的工具。&lt;/p&gt;

&lt;p&gt;请注意：新旧版 “Get_Results” 异步查询工具不可混用！&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Grsai_New_All_image（推荐）：支持 GrsaiApi 所有画图/视频模型&lt;/li&gt;
&lt;li&gt;  Grsai_New_chat_image：open 格式支持 Grsai 内所有模型（文本、图片、视频模型；注意图片不支持分辨率选择）&lt;/li&gt;
&lt;li&gt;  Grsai_New_Get_Results：异步生成结果查询接口，仅支持使用 “Grsai_New_All_image” 工具并设置了 replyType:"async"参数生成的 id 查询&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-1dd77158e37d192f0153c5e8bc6625a9_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="2.创建apiKey"&gt;2.创建 apiKey&lt;/h3&gt;
&lt;p&gt;在 GrsaiApi 控制台：&lt;a href="https://grsai.com/zh/dashboard/api-keys" rel="nofollow" target="_blank"&gt;https://grsai.com/zh/dashboard/api-keys&lt;/a&gt;（com 需要魔法，没有改成 ai 即可访问）创建 ApiKey，复制使用。请勿泄漏你的 key 给其他人。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-b912b64bc64ac4fba06910b84d76e22f_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-9065cd18848b358b0cf5c31b93f4950c_720w.png?source=ccfced1aD" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;填入工具的 apiKey 参数中，注意不要外泄！&lt;/p&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-3357051708c4a5e8e1f398a97e6858f7_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="3.收到设置超时时间"&gt;3.收到设置超时时间&lt;/h3&gt;
&lt;p&gt;建议所有用户在使用的时候将工具异常处理的 “整体执行超时” 超时时间设置在 600s，以免任务还没有生成扣子就返回失败。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-a8d96c2c551b4dd608dc637171e70541_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="4.不同模型区别"&gt;4.不同模型区别&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;gemini-2.5-flash-image 对应：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  nano-banana：1-2k 清晰度&lt;/li&gt;
&lt;li&gt;  nano-banana-fast：1-2k 清晰度&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;gemini-3-pro-image-preview 对应：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  nano-banana-pro（推荐）：1-4k 清晰度高峰期稳定，偶有波动&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-cl（推荐）：4k 画质清晰，pro 备用渠道，稳定速度快&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-vt：高峰期不稳定，4k 画质清晰&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-vip：1-2k 清晰度，付费渠道，稳定但贵&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-4k-vip：4k 清晰度，付费渠道，稳定但贵&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;gemini-3.1-flash-image-preview 对应：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  nano-banana-2：1-4k 清晰度&lt;/li&gt;
&lt;li&gt;  nano-banana-2-cl：1-2k 清晰度&lt;/li&gt;
&lt;li&gt;  nano-banana-2-4k-cl：4k 清晰度&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Chatgpt image 2.0 对应：&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;  gpt-image-2：仅支持 1k 清晰度&lt;/li&gt;
&lt;li&gt;  gpt-image-2-vip：支持 1k/2k/4k 清晰度，支持选择质量&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;渠道不同导致模型版本较多，请按需选择。具体信息看 GrsaiAPi 模型列表：&lt;a href="https://link.zhihu.com/?target=https%3A//grsai.ai/dashboard/models" rel="nofollow" target="_blank" title=""&gt;https://grsai.ai/dashboard/mode&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="5. Grsai6 个扣子工具详细介绍"&gt;5. Grsai6 个扣子工具详细介绍&lt;/h3&gt;
&lt;p&gt;1.Grsai_Old_NanoBa&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-a8d96c2c551b4dd608dc637171e70541_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  工具介绍：旧文档接口工具，可使用 GrsaiApi 内所有 nano banana 画图模型&lt;/li&gt;
&lt;li&gt;  支持模型：&lt;/li&gt;
&lt;li&gt;  nano-banana-2&lt;/li&gt;
&lt;li&gt;  nano-banana-2-cl&lt;/li&gt;
&lt;li&gt;  nano-banana-2-4k-cl&lt;/li&gt;
&lt;li&gt;  nano-banana-pro&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-vt&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-cl&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-vip&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-4k-vip&lt;/li&gt;
&lt;li&gt;  nano-banana-fast&lt;/li&gt;
&lt;li&gt;  nano-banana&lt;/li&gt;
&lt;li&gt;  输入参数：&lt;/li&gt;
&lt;li&gt;  apiKey（必填，控制台复制秘钥 sk-xxx）&lt;/li&gt;
&lt;li&gt;  model（必填，模型名称）&lt;/li&gt;
&lt;li&gt;  prompt（必填，提示词）&lt;/li&gt;
&lt;li&gt;  urls（参考图，支持多图）&lt;/li&gt;
&lt;li&gt;  webhook（异步回调填 “-1” 会返回 id）&lt;/li&gt;
&lt;li&gt;  aspectRatio（尺寸）&lt;/li&gt;
&lt;li&gt;  imageSize（分辨率）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://pica.zhimg.com/80/v2-a0473c9e906edc3efbdf83d12d2f3e41_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;2.Grsai_Old_image_2&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-c3437b5dbe67a2b0bbf285651f045c27_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  工具介绍：旧文档接口工具，可使用 GrsaiApi 内所 gpt-image-2 画图模型&lt;/li&gt;
&lt;li&gt;  支持模型：gpt-image-2、gpt-image-2-vip&lt;/li&gt;
&lt;li&gt;  输入参数：&lt;/li&gt;
&lt;li&gt;  apiKey（必填，控制台复制秘钥 sk-xxx）&lt;/li&gt;
&lt;li&gt;  model（必填，模型名称）&lt;/li&gt;
&lt;li&gt;  prompt（必填，提示词）&lt;/li&gt;
&lt;li&gt;  urls（参考图，支持多图）&lt;/li&gt;
&lt;li&gt;  webhook（异步填 “-1” 会返回 id）&lt;/li&gt;
&lt;li&gt;  aspectRatio（尺寸/具体像素值，仅 gpt-image-2-vip 支持 2K、4K 像素值，例如 “2048x2048”）&lt;/li&gt;
&lt;li&gt;  quality（质量）&lt;/li&gt;
&lt;li&gt;  shutProgress（进度提醒）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://pica.zhimg.com/80/v2-73df30c84d0c58999fa101efdb3d063d_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="3.Grsai_Old_Get_Results"&gt;3.Grsai_Old_Get_Results&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-ef1298d6140f1cc6a30dbe23b7155e92_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  工具介绍：旧文档接口工具，异步任务结果查询（仅支持带有 “Old” 画图工具的异步任务）&lt;/li&gt;
&lt;li&gt;  支持工具：Grsai_Old_NanoBa、Grsai_Old_image_2&lt;/li&gt;
&lt;li&gt;  输入参数：&lt;/li&gt;
&lt;li&gt;  apiKey（必填，控制台复制秘钥 sk-xxx）&lt;/li&gt;
&lt;li&gt;  id（必填，任务 id）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;当你使用旧版画图工具提交异步任务后（webHook："-1"），用这个工具轮询获取生成结果。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-0c7be10557010847bf8e41007abcfc27_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="4.Grsai_New_All_image（推荐）"&gt;4.Grsai_New_All_image（推荐）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;  工具介绍：旧文档接口工具，可使用 GrsaiApi 内所 gpt-image-2 画图模型，支持同步/流式/异步三种返回模式。&lt;/li&gt;
&lt;li&gt;  支持模型：gpt-image-2、gpt-image-2-vip&lt;/li&gt;
&lt;li&gt;  输入参数：&lt;/li&gt;
&lt;li&gt;  apiKey（必填，控制台复制秘钥 sk-xxx）&lt;/li&gt;
&lt;li&gt;  model（必填，模型名称）&lt;/li&gt;
&lt;li&gt;  prompt（必填，提示词）&lt;/li&gt;
&lt;li&gt;  urls（参考图，支持多图）&lt;/li&gt;
&lt;li&gt;  replyType（回复类型，支持选择参数）&lt;/li&gt;
&lt;li&gt;  json：返回 json&lt;/li&gt;
&lt;li&gt;  stream：返回 stream&lt;/li&gt;
&lt;li&gt;  async：异步轮询，需要通过 “Grsai_New_Get_Results"查询结果”&lt;/li&gt;
&lt;li&gt;  aspectRatio（图像比例/具体像素值，具体像素值仅对 Gpt 模型生效，特别注意 gpt-image-2-vip 的 2K、4K 分辨率需要通过填入对应分辨率像素值，例如 “2048x2048”）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://pic1.zhimg.com/80/v2-ffa3d1a18f0f40acf260357113657fb5_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-2c8305e2597a65f6c2e529a71b9d286c_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="5.Grsai_New_chat_image"&gt;5.Grsai_New_chat_image&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://pica.zhimg.com/80/v2-588259946e505119a8921f314136136c_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  工具介绍：新接口文档工具，open 格式支持 Grsai 内所有模型（对话 + 生图 + 视频），通过 “imageurls” 参数可上传图片、视频、文件链接&lt;/li&gt;
&lt;li&gt;  支持模型：&lt;/li&gt;
&lt;li&gt;  Chatgpt image 2：&lt;/li&gt;
&lt;li&gt;  gpt-image-2&lt;/li&gt;
&lt;li&gt;  gpt-image-2-vip&lt;/li&gt;
&lt;li&gt;  香蕉 2：&lt;/li&gt;
&lt;li&gt;  nano-banana-2&lt;/li&gt;
&lt;li&gt;  nano-banana-2-cl&lt;/li&gt;
&lt;li&gt;  nano-banana-2-4k-cl&lt;/li&gt;
&lt;li&gt;  香蕉 pro：&lt;/li&gt;
&lt;li&gt;  nano-banana-pro&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-vt&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-cl&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-vip&lt;/li&gt;
&lt;li&gt;  nano-banana-pro-4k-vip&lt;/li&gt;
&lt;li&gt;  香蕉 1：&lt;/li&gt;
&lt;li&gt;  nano-banana-fast&lt;/li&gt;
&lt;li&gt;  nano-banana&lt;/li&gt;
&lt;li&gt;  语言模型：&lt;/li&gt;
&lt;li&gt;  gemini-3.1-pro&lt;/li&gt;
&lt;li&gt;  gemini-3-pro&lt;/li&gt;
&lt;li&gt;  gemini-2.5-pro&lt;/li&gt;
&lt;li&gt;  gpt-5.5&lt;/li&gt;
&lt;li&gt;  gpt-5.4&lt;/li&gt;
&lt;li&gt;  输入参数：&lt;/li&gt;
&lt;li&gt;  apiKey（必填，控制台复制秘钥 sk-xxx）&lt;/li&gt;
&lt;li&gt;  model（必填，模型名称）&lt;/li&gt;
&lt;li&gt;  messages（必填，提示词）&lt;/li&gt;
&lt;li&gt;  imageUrls（参考图，图片/视频/文件链接（支持多图））&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“messages” 需要填入 JSON 内容参考&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[
  {
    "role": "user",
    "comtent": [
      {
        "type": "text",
        "text": "组合成一张图片"
      }
    ]
  }
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-c147876d6834d5416ce690bc60b4dc95_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="6.Grsai_New_Get_Results"&gt;6.Grsai_New_Get_Results&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-3ef7b3229d76254777d54250135d71dc_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  类型：新接口异步结果查询工具，仅查询通过 “Grsai_New_All_image ” 并设置 replyType: "async" 生成的任务&lt;/li&gt;
&lt;li&gt;  支持工具：Grsai_New_All_image&lt;/li&gt;
&lt;li&gt;  输入参数：&lt;/li&gt;
&lt;li&gt;  apiKey（必填，控制台复制秘钥 sk-xxx）&lt;/li&gt;
&lt;li&gt;  id（必填，任务 id）&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-68d72c848ab49ac98d17d31f42d8a54e_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://picx.zhimg.com/80/v2-99a57e5c38c8ebdfb840f2dedc075b5f_720w.png?source=ccfced1a" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;通过使用「GrsaiApi——图像生成对话工具」插件，你扣子的智能体就能具备图像生成、识别和视频创作等视觉能力。&lt;/p&gt;</description>
      <author>ALLENREN</author>
      <pubDate>Thu, 14 May 2026 21:54:52 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7333</link>
      <guid>https://beta.w2solo.com/topics/7333</guid>
    </item>
    <item>
      <title>测试妹子让我写单测，我偷偷用 AI 一天干完一周的活</title>
      <description>&lt;blockquote&gt;
&lt;p&gt;公司要求单元测试覆盖率 80%，我看着那几千行的屎山组件，眼泪掉下来。手写？写到下个月。测试妹子天天在群里 @ 我：“帅哥，你的单测呢？” 我灵机一动，让 AI 帮我写。一天后，测试覆盖率 91%，0 bug，测试妹子发了条朋友圈：“某前端切图仔突然开窍了。” 我没敢告诉她，那是 GPT-5.5 的手笔。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="前言"&gt;前言&lt;/h2&gt;
&lt;p&gt;写单测这事，比写业务代码还痛苦。业务代码至少能跑，能看到按钮，能点。单测？Mock 一堆，断言一堆，跑起来全红，改到怀疑人生。尤其接手老项目，一个组件几百行，手动补测试？告辞。&lt;/p&gt;

&lt;p&gt;但我发现，&lt;strong&gt;AI 写单测的水平已经超过大部分初级工程师&lt;/strong&gt;。你只要给它组件代码，它能给你生成结构清晰的测试用例：渲染测试、交互测试、异步测试、边界测试，甚至能帮你 mock 掉依赖的 API。&lt;/p&gt;

&lt;p&gt;今天我就教你用 AI（Copilot / ChatGPT / Cursor）自动生成高质量 Jest + Testing Library 测试，把一周的活压缩到一天。测试妹子开心，我也能准时下班。&lt;/p&gt;
&lt;h2 id="一、为什么 AI 写单测比你手写强？"&gt;一、为什么 AI 写单测比你手写强？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;不嫌烦&lt;/strong&gt;：重复的渲染、快照、事件触发，AI 从不喊累。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;覆盖全&lt;/strong&gt;：它记得各种边界条件（空数组、null、undefined），你容易漏。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;速度快&lt;/strong&gt;：几秒钟生成几十个测试用例，你手打要半天。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;风格统一&lt;/strong&gt;：输出固定模板，代码规范。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;缺点&lt;/strong&gt;：生成的测试可能不够精准（比如断言了不重要的属性），需要你微调。但总比从零开始强。&lt;/p&gt;
&lt;h2 id="二、实战：用 Cursor + GPT-5.5 给 React 组件生成测试"&gt;二、实战：用 Cursor + GPT-5.5 给 React 组件生成测试&lt;/h2&gt;
&lt;p&gt;我们用一个实际的组件：&lt;code&gt;UserProfile&lt;/code&gt;，它接收 &lt;code&gt;userId&lt;/code&gt;，内部 fetch 用户数据，显示 loading、error、和用户信息。&lt;/p&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// UserProfile.jsx&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fetchUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setUser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;setError&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;finally&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;setLoading&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;loading&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;加载中...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;出错了：&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;无数据&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;email&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="步骤 1：打开 Cursor，选中组件代码，右键 -&amp;gt; “Generate Tests”"&gt;步骤 1：打开 Cursor，选中组件代码，右键 -&amp;gt; “Generate Tests”&lt;/h3&gt;
&lt;p&gt;或者在 ChatGPT 里粘贴代码，加上提示词：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;请为以下 React 组件生成 Jest + React Testing Library 的单元测试。需要覆盖：初始加载状态、成功获取数据后显示用户信息、请求失败时显示错误信息、loading 结束后的渲染。请 mock 掉 &lt;code&gt;fetchUser&lt;/code&gt; 这个 API。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="步骤 2：AI 生成的测试（稍加整理）"&gt;步骤 2：AI 生成的测试（稍加整理）&lt;/h3&gt;&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;waitFor&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@testing-library/react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./UserProfile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;fetchUser&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Mock API 模块&lt;/span&gt;
&lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="nx"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UserProfile&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;beforeEach&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;jest&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;clearAllMocks&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;显示 loading 状态&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mockImplementation&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{}));&lt;/span&gt; &lt;span class="c1"&gt;// 永不返回&lt;/span&gt;
    &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserProfile&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;加载中...&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;成功加载后显示用户信息&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mockUser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;张三&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zhangsan@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mockResolvedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mockUser&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserProfile&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;张三&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;zhangsan@example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;请求失败时显示错误信息&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;网络错误&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mockRejectedValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;UserProfile&lt;/span&gt; &lt;span class="na"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;);&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/出错了：网络错误/&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;看，连等待异步的 &lt;code&gt;waitFor&lt;/code&gt; 都帮你写好了。&lt;/strong&gt; 你只需要改一下错误信息的正则，或者加几个边界测试（比如 userId 为空）。&lt;/p&gt;
&lt;h2 id="三、进阶：让 AI 生成更全面的测试"&gt;三、进阶：让 AI 生成更全面的测试&lt;/h2&gt;
&lt;p&gt;你可以在提示词里详细要求：&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;除了基本测试，还需要测试：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;当 userId 变化时，会重新请求数据（之前的请求应被忽略或取消）&lt;/li&gt;
&lt;li&gt;组件卸载时，不应再调用 setState&lt;/li&gt;
&lt;li&gt;快照测试（可选）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;p&gt;AI 会给你生成类似：&lt;/p&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;userId 变化时重新获取数据&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mockUser1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;mockUser2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mockResolvedValueOnce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mockUser1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;rerender&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

  &lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mockResolvedValueOnce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mockUser2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;rerender&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;UserProfile&lt;/span&gt; &lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getByText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User2&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;toBeInTheDocument&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
  &lt;span class="nx"&gt;expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchUser&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toHaveBeenCalledTimes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;连 &lt;code&gt;rerender&lt;/code&gt; 都懂，你还想怎样？&lt;/p&gt;
&lt;h2 id="四、效率对比：手写 vs AI"&gt;四、效率对比：手写 vs AI&lt;/h2&gt;&lt;table class="table table-bordered table-striped"&gt;
&lt;tr&gt;
&lt;th&gt;步骤&lt;/th&gt;
&lt;th&gt;手写时间&lt;/th&gt;
&lt;th&gt;AI 时间&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写第一个测试（渲染 + loading）&lt;/td&gt;
&lt;td&gt;10min&lt;/td&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写成功场景 + mock&lt;/td&gt;
&lt;td&gt;15min&lt;/td&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写错误场景&lt;/td&gt;
&lt;td&gt;10min&lt;/td&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;写 userId 变化场景&lt;/td&gt;
&lt;td&gt;15min&lt;/td&gt;
&lt;td&gt;5s&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;调试断言&lt;/td&gt;
&lt;td&gt;20min&lt;/td&gt;
&lt;td&gt;5min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;总计&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;70min&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~6min&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;速度提升 10 倍以上。而且 AI 不会忘记清理 mock、不会漏掉 &lt;code&gt;waitFor&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="五、真实故事：我用 AI 补完了 2000 行老代码的单测"&gt;五、真实故事：我用 AI 补完了 2000 行老代码的单测&lt;/h2&gt;
&lt;p&gt;接手一个电商项目的购物车模块，几乎没测试。我写了脚本，把每个组件文件内容喂给 GPT-4（分批，用 API），让它输出测试代码。然后手动改几个断言，跑一遍。两个晚上，覆盖率从 12% 升到 86%。测试妹子在群里发了个烟花表情，我回了个狗头。&lt;/p&gt;
&lt;h2 id="六、注意事项（坑）"&gt;六、注意事项（坑）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;AI 生成的 mock 路径可能错&lt;/strong&gt;，比如 &lt;code&gt;jest.mock('./api')&lt;/code&gt; 如果你的 api 文件是 &lt;code&gt;services/api.js&lt;/code&gt;，需要手动改。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;异步测试里 &lt;code&gt;waitFor&lt;/code&gt; 的超时&lt;/strong&gt;，有些场景需要增加 timeout 配置。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;不要盲目相信&lt;/strong&gt;：AI 可能会生成冗余测试（比如测试 &lt;code&gt;div&lt;/code&gt; 的 className），需要你删除。&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;快照测试&lt;/strong&gt;：AI 喜欢生成 &lt;code&gt;toMatchSnapshot()&lt;/code&gt;，但快照容易 “假绿”，建议换成具体的断言。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="七、总结：AI 不是来取代你，是来帮你下班的"&gt;七、总结：AI 不是来取代你，是来帮你下班的&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用 AI 生成单测模板，再人工微调，效率翻 10 倍。&lt;/li&gt;
&lt;li&gt;适合重复性高、边界条件多的纯函数和 React 组件。&lt;/li&gt;
&lt;li&gt;业务逻辑复杂、需要特定上下文的，AI 可能不准，但至少给你搭好架子。&lt;/li&gt;
&lt;li&gt;以后测试妹子再催你，你可以说：“已经在写（让 AI 写）了。”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;最后送大家一句话&lt;/strong&gt;：AI 写单测，你喝咖啡。测试全绿，准点下班。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;评论区聊聊：你试过用 AI 写单测吗？有没有翻车？&lt;/p&gt;</description>
      <author>193577746</author>
      <pubDate>Thu, 14 May 2026 21:28:36 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7332</link>
      <guid>https://beta.w2solo.com/topics/7332</guid>
    </item>
    <item>
      <title>兴业银行卡，如何无限额度结算 Google，apple 海外美金收益？</title>
      <description>&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/jiehuiV-heyu960812/b955a3f2-fdc0-4d90-9de4-d5536d88fc13.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>jiehuiV-heyu960812</author>
      <pubDate>Thu, 14 May 2026 17:06:00 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7331</link>
      <guid>https://beta.w2solo.com/topics/7331</guid>
    </item>
    <item>
      <title>代练护航三角洲护航跑刀陪玩电竞代练代打小程序服务号系统，源码系统成品系统一次付费非租用</title>
      <description>&lt;p&gt;三角洲跑刀上分接单俱乐部下单代练护航系统（小程序 + 公众号 +APP）多端适配，是一套支持多类型用户、多领域应用且具备灵活支付功能的综合性代练管理系统。具体介绍如下：&lt;/p&gt;
&lt;h3 id="用户类型与下单权限"&gt;用户类型与下单权限&lt;/h3&gt;
&lt;p&gt;平台客户：通过访问主页注册，下单时可选择所有平台下的打手指定下单。&lt;/p&gt;

&lt;p&gt;工作室客户：通过工作室的二维码或链接注册，下单时只能选择该工作室下的打手，且只有工作室有管理订单的权限，平台客服无此权限。&lt;/p&gt;
&lt;h3 id="下单流程"&gt;下单流程&lt;/h3&gt;
&lt;p&gt;用户下单后，系统会分配打手，打手接单后需上传截图，最后由客服审核。&lt;/p&gt;

&lt;p&gt;退款规则：打手未接单前，用户可自主申请退款；打手接单后，用户需联系客服协商退款，客服同意后可操作主动退单。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/dkqqll/455e3aed-7d06-4e97-9a09-5f2df6e2f1bf.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/dkqqll/2638744b-d5fc-4dbc-838e-88b73891e017.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/dkqqll/5c0d3608-1133-4ae2-acde-d8387b1f6e0a.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="教程指南："&gt;教程指南：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;准备服务器：一般推荐 4 核 8G5M 的服务器，装 Centos 系统&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;备案域名：要企业认证且备案的域名才能使用&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="注意事项："&gt;注意事项：&lt;/h3&gt;
&lt;p&gt;服务器要安装环境，Nginx 或者 Apache 请选择 PHP7.3 数据库 mysql5.6&lt;/p&gt;

&lt;p&gt;要申请认证小程序，且备案；公众号也需要认证&lt;/p&gt;

&lt;p&gt;申请商户号，用于收款，申请各个接口等。&lt;/p&gt;

&lt;p&gt;游戏分类：后台添加设置游戏分类
&lt;img src="https://img.way2solo.com/photo/dkqqll/5cc58cc7-555e-4c5e-8696-9742d50c8c67.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/dkqqll/818cf3de-da8a-4688-af18-b19dbc1de7ac.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>dkqqll</author>
      <pubDate>Thu, 14 May 2026 15:36:21 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7330</link>
      <guid>https://beta.w2solo.com/topics/7330</guid>
    </item>
    <item>
      <title>点阵数显驱动 IC 数显驱动芯片 LED 控制器原厂 VK6932</title>
      <description>&lt;p&gt;一概述
VK6932 是一种数码管或点阵 LED 驱动控制专用芯片，内部 集成有 3 线串行接口、数据锁存器、LED 驱动等电路。SEG 脚接 LED 阳极，GRID 脚接 LED 阴极，可支持 8SEGx16GRID 的点阵 LED 显示面板。主要应用于 LED 显示屏驱动。采用 SOP32 的封装形式 Z113+133&lt;/p&gt;

&lt;p&gt;二 特点
• 工作电压 3.0-5.5V &lt;/p&gt;

&lt;p&gt;• 内置 RC 振荡器 &lt;/p&gt;

&lt;p&gt;• 8 个 SEG 脚，16 个 GRID 脚 &lt;/p&gt;

&lt;p&gt;• SEG 脚只能接 LED 阳极，GRID 脚只能接 LED 阴极&lt;/p&gt;

&lt;p&gt;• 3 线串行接口 &lt;/p&gt;

&lt;p&gt;• 8 级整体亮度可调 &lt;/p&gt;

&lt;p&gt;• 内置显示 RAM 为 8x16 位&lt;/p&gt;

&lt;p&gt;• 内置上电复位电路 &lt;/p&gt;

&lt;p&gt;• 封装 SOP32（21.00mm × 7.50mm PP=1.27mm)
三.&lt;/p&gt;

&lt;p&gt;• 小家电 &lt;/p&gt;

&lt;p&gt;• 电磁炉/微波炉 &lt;/p&gt;

&lt;p&gt;• 压力表   &lt;/p&gt;

&lt;p&gt;静态显示存储器（RAM）结构为 8×16 位，存储所显示的数据。RAM 的内容直接映射成 LED 驱动器的显示内容，显示地址为 0xC0-0xCF，共 16 个显示单元。如果要打开/关闭某个 LED，只需把对应的显示 RAM 位置 1 或者清 0，例如控制 SEG1 脚和 GRID1 脚驱动的 LED1 亮灭，只需把对应的显示 RAM（地址 0xC0）的 bit0 位置 1 或者清 0。应用中没有使用的 SEG 脚对应的 RAM 位清 0。VK1637    3.0～5.5V   驱动点阵：48    共阴驱动：6 段 8 位   共阳驱动：8 段 6 位        通讯接口：CLK/DIO 
静态电流/待机电流：--/--            按键：8*2   封装：SOP20/DIP20      &lt;/p&gt;

&lt;p&gt;VK1616    3.0～5.5V   驱动点阵：28    共阴驱动：7 段 4 位   共阳驱动：4 段 7 位        通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：---   封装：SOP16/DIP16       抗干扰能力强 &lt;/p&gt;

&lt;p&gt;VK1618    3.0～5.5V   驱动点阵：35/36/35/32    共阴驱动：5 段 7 位；6 段 6 位；7 段 5 位；8 段 4 位&lt;br&gt;
共阳驱动：7 段 5 位；6 段 6 位；5 段 7 位；4 段 8 位         通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：5*1   封装：SOP18/DIP18       抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1620B   3.0～5.5V   驱动点阵：48/45/40      共阴驱动：8 段 6 位；9 段 5 位；10 段 4 位&lt;br&gt;
共阳驱动：6 段 8 位；5 段 9 位；4 段 10 位                  通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：---   封装：SOP20             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1624    3.0～5.5V   驱动点阵：77/72/65/56   共阴驱动：11 段 7 位；12 段 6 位；13 段 5 位；14 段 4 位&lt;br&gt;
共阳驱动：7 段 11 位；6 段 12 位；5 段 13 位；4 段 14        通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：---   封装：SOP24/DIP24       抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1S68C   3.0～5.5V   驱动点阵：70/66/60/52   共阴驱动：10 段 7 位；11 段 6 位；12 段 5 位；13 段 4 位&lt;br&gt;
共阳驱动：7 段 10 位；6 段 11 位；5 段 12 位；4 段 13 位     通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：10*2  封装：SSOP24            抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1Q68D   3.0～5.5V   驱动点阵：70/66/60/52   共阴驱动：10 段 7 位；11 段 6 位；12 段 5 位；13 段 4 位&lt;br&gt;
共阳驱动：7 段 10 位；6 段 11 位；5 段 12 位；4 段 13 位     通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：10*2  封装：QFN24             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1668    3.0～5.5V   驱动点阵：70/66/60/52   共阴驱动：10 段 7 位；11 段 6 位；12 段 5 位；13 段 4 位&lt;br&gt;
共阳驱动：7 段 10 位；6 段 11 位；5 段 12 位；4 段 13 位     通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：10*2  封装：SOP24/SSOP24      抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1628    3.0～5.5V   驱动点阵：70/66/60/52   共阴驱动：10 段 7 位；11 段 6 位；12 段 5 位；13 段 4 位&lt;br&gt;
共阳驱动：7 段 10 位；6 段 11 位；5 段 12 位；4 段 13 位     通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜1mA/--         按键：10*2  封装：SOP28             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1S38A   3.0～5.5V   驱动点阵：64     共阴驱动：8 段 8 位    共阳驱动：8 段 8 位   通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜5mA/--         按键：8*3   封装：SSOP24            抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1638    3.0～5.5V   驱动点阵：80     共阴驱动：10 段 8 位    共阳驱动：8 段 10 位   通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜5mA/--         按键：8*3   封装：SOP28             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1629    3.0～5.5V  驱动点阵：128  共阴驱动：16 段 8 位   共阳驱动：8 段 16 位   通讯接口：CLK/STB/DIN/DOUT
静态电流/待机电流：＜5mA/--  按键：8*4   封装：LQFP44(QFP44 正方形)； 抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1629A   3.0～5.5V   驱动点阵：128     共阴驱动：16 段 8 位    共阳驱动：8 段 16 位   通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜5mA/--         按键：---   封装：SOP32             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1629B   3.0～5.5V   驱动点阵：112     共阴驱动：14 段 8 位    共阳驱动：8 段 14 位   通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜5mA/--         按键：8*2   封装：SOP32             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1629C   3.0～5.5V   驱动点阵：120     共阴驱动：15 段 8 位    共阳驱动：8 段 15 位   通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜5mA/--         按键：8*1   封装：SOP32             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK1629D   3.0～5.5V   驱动点阵：96      共阴驱动：12 段 8 位    共阳驱动：8 段 12 位   通讯接口：CLK/STB/DIO 
静态电流/待机电流：＜5mA/--         按键：8*4   封装：SOP32             抗干扰能力强&lt;/p&gt;

&lt;p&gt;VK6932    3.0～5.5V   驱动点阵：128     共阴驱动：8 段 16 位    共阳驱动：16 段 8 位   通讯接口：CLK/STB/DIN 
静态电流/待机电流：＜0.1mA/--       按键：---   封装：SOP32             抗干扰能力强&lt;/p&gt;

&lt;p&gt;(永嘉微电/VINKA 原厂-FAE 技术支持，主营 LCD 驱动 IC； LED 驱动 IC； 触摸 IC； LDO 稳压 IC； 水位检测 IC)&lt;/p&gt;

&lt;p&gt;LED 驱动、LED 屏驱动、数显驱动 IC、LED 芯片、LED 驱动器、数码管显示驱动、LED 显示驱动、LED 数显驱动原厂、LED 数显驱动芯片、LED 驱动 IC、点阵 LED 显示驱动、LED 屏驱动 IC、数显驱动芯片、数码管芯片、数码管驱动、数显屏驱动、数显 IC、数显芯片、数显驱动、LED 数显 IC、数显驱动原厂、LED 屏驱动芯片、LED 数显驱动 IC、LED 数显驱动 IC、LED 驱动电路、数显 LED 屏驱动、LED 数显屏驱动、LED 显示屏驱动、LED 数码管驱动、数显 LED 驱动、LED 数显驱动、数码管显示 IC、数码管显示芯片、数码管驱动芯片、LED 显示驱动芯片、显示数码管驱动、LED 控制电路、数显 LED 驱动芯片、数显 LED 驱动 IC、LED 驱动芯片、数码管显示屏驱动、数码管驱动原厂、LED 驱动厂家、LED 驱动原厂、LED 数码驱动、LED 数码屏驱动、LED 数显芯片、数码管驱动 IC、显示 LED 驱动、数码管 LED 驱动、LED 显示 IC、点阵数显驱动、点阵数码管驱动、点阵 LED 驱动、点阵数显驱动芯片、点阵数显驱动 IC、点阵 LED 驱动芯片、点阵 LED 驱动 IC、LED 数显原厂、点阵数码管显示芯片、数码管驱动厂家、数显 LED 原厂 
&lt;img src="https://img.way2solo.com/photo/18124687938/706ff8b7-2f58-476e-b4fc-5a87401af98a.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/18124687938/1bfaf557-050e-4338-920e-5f9cc4524bea.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/18124687938/f6e48e73-96a6-4618-8a7a-cfe5491f5fb8.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;
&lt;img src="https://img.way2solo.com/photo/18124687938/ef3ef7af-6c7f-40d9-854c-4ac7de350210.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>18124687938</author>
      <pubDate>Thu, 14 May 2026 14:55:43 +0800</pubDate>
      <link>https://beta.w2solo.com/topics/7329</link>
      <guid>https://beta.w2solo.com/topics/7329</guid>
    </item>
  </channel>
</rss>
