<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>w2solo - 独立开发者社区</title>
    <link>http://beta.w2solo.com/</link>
    <description>w2solo - 独立开发者社区社区最新发帖.</description>
    <language>en-us</language>
    <item>
      <title>我的作品 AI YouTube Transcript：我把 YouTube transcript 搜索和导出这条小路径单独做成了一个页面</title>
      <description>&lt;p&gt;最近把一个很小但经常出现的需求单独做成了一个页面：AI YouTube Transcript。&lt;/p&gt;

&lt;p&gt;这个页面不是想做一个很大的视频 AI 工具集合，而是先把一条很具体的路径讲清楚：当我只需要从 YouTube 视频里找到一句话、确认时间点，并把 transcript 带到下一步时，能不能少一点来回切换。&lt;/p&gt;

&lt;p&gt;目前这页主要想把下面这条路径做顺：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;粘贴 YouTube 链接或视频 ID。&lt;/li&gt;
&lt;li&gt;选择可用语言。&lt;/li&gt;
&lt;li&gt;打开 transcript 文本。&lt;/li&gt;
&lt;li&gt;搜索需要确认的句子或关键词。&lt;/li&gt;
&lt;li&gt;通过时间戳回到视频里的对应位置。&lt;/li&gt;
&lt;li&gt;复制文本，或按后续用途导出 TXT、SRT、VTT。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;我自己遇到这个需求时，通常不是为了重新看完整个视频，而是想快速找到某个片段、确认上下文，再把文本放进笔记、字幕、剪辑或资料整理流程里。所以 TXT、SRT、VTT 在这里不是 “多几个导出按钮”，而是对应不同的后续用法。&lt;/p&gt;

&lt;p&gt;现在这版我刻意做得比较克制，只保留最核心的能力。因为一旦想 “顺手多做一点”，页面就很容易从一个好理解的小工具，变成一个什么都想管、但什么都不够清楚的入口。&lt;/p&gt;

&lt;p&gt;边界也写得很明确：只有源视频暴露了可用的 subtitle 或 caption track，页面才可能加载 transcript；如果没有可用 track，就没有内容可搜索或导出，文本质量也取决于原始字幕轨道。&lt;/p&gt;

&lt;p&gt;页面在这里：
&lt;a href="https://aiyoutubetranscript.com/" rel="nofollow" target="_blank"&gt;https://aiyoutubetranscript.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;想听听大家建议：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;这种小工具页面，第一屏应该先强调 “搜索和导出 transcript”，还是先解释来源和限制？&lt;/li&gt;
&lt;li&gt;如果你要把视频内容转成笔记、字幕或素材，TXT/SRT/VTT 这几个出口够不够用？&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="https://img.way2solo.com/photo/ethanjamescolez/248cbf08-6a5b-49e9-b085-7f008c1bc6e3.png?imageView2/2/w/1920/q/100" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>ethanjamescolez</author>
      <pubDate>Mon, 18 May 2026 01:14:47 +0800</pubDate>
      <link>http://beta.w2solo.com/topics/7349</link>
      <guid>http://beta.w2solo.com/topics/7349</guid>
    </item>
    <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>http://beta.w2solo.com/topics/7348</link>
      <guid>http://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>http://beta.w2solo.com/topics/7347</link>
      <guid>http://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>http://beta.w2solo.com/topics/7346</link>
      <guid>http://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>http://beta.w2solo.com/topics/7345</link>
      <guid>http://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>http://beta.w2solo.com/topics/7344</link>
      <guid>http://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>http://beta.w2solo.com/topics/7343</link>
      <guid>http://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>http://beta.w2solo.com/topics/7342</link>
      <guid>http://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>http://beta.w2solo.com/topics/7341</link>
      <guid>http://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>http://beta.w2solo.com/topics/7340</link>
      <guid>http://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>http://beta.w2solo.com/topics/7339</link>
      <guid>http://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>http://beta.w2solo.com/topics/7338</link>
      <guid>http://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>http://beta.w2solo.com/topics/7337</link>
      <guid>http://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>http://beta.w2solo.com/topics/7336</link>
      <guid>http://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>http://beta.w2solo.com/topics/7335</link>
      <guid>http://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>http://beta.w2solo.com/topics/7334</link>
      <guid>http://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>http://beta.w2solo.com/topics/7333</link>
      <guid>http://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>http://beta.w2solo.com/topics/7332</link>
      <guid>http://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>http://beta.w2solo.com/topics/7331</link>
      <guid>http://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>http://beta.w2solo.com/topics/7330</link>
      <guid>http://beta.w2solo.com/topics/7330</guid>
    </item>
  </channel>
</rss>
