<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Posts on Rain Blog</title>
    <link>https://djd1226.github.io/posts/</link>
    <description>Recent content in Posts on Rain Blog</description>
    <image>
      <title>Rain Blog</title>
      <url>https://djd1226.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://djd1226.github.io/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.157.0</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 13 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://djd1226.github.io/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Ollama API 使用指南</title>
      <link>https://djd1226.github.io/posts/2026-04-13/</link>
      <pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-04-13/</guid>
      <description>&lt;h2 id=&#34;-服务信息&#34;&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;strong&gt;服务地址&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;http://192.168.6.9:11434&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;API 基础路径&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;http://192.168.6.9:11434/v1&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;已安装模型&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;qwen2.5:0.5b&lt;/code&gt; (397 MB)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;API Key&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ollama&lt;/code&gt;（或任意字符串，Ollama 不验证）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-openai-兼容接口&#34;&gt;🔌 OpenAI 兼容接口&lt;/h2&gt;
&lt;p&gt;Ollama 提供与 OpenAI API 完全兼容的接口，可直接使用支持 OpenAI 的客户端和工具。&lt;/p&gt;
&lt;h3 id=&#34;可用端点&#34;&gt;可用端点&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;端点&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GET /v1/models&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;列出可用模型&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;POST /v1/chat/completions&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;聊天完成（推荐）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;POST /v1/completions&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;文本补全&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;POST /v1/embeddings&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;嵌入向量&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-api-调用示例&#34;&gt;🚀 API 调用示例&lt;/h2&gt;
&lt;h3 id=&#34;1-curl-命令行&#34;&gt;1. curl 命令行&lt;/h3&gt;
&lt;h4 id=&#34;列出模型&#34;&gt;列出模型&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl http://192.168.6.9:11434/v1/models
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;聊天请求&#34;&gt;聊天请求&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl http://192.168.6.9:11434/v1/chat/completions &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;model&amp;#34;: &amp;#34;qwen2.5:0.5b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;messages&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;      {&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;你好，请介绍一下自己&amp;#34;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    ],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;temperature&amp;#34;: 0.7,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;max_tokens&amp;#34;: 512
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;  }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;流式响应&#34;&gt;流式响应&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl http://192.168.6.9:11434/v1/chat/completions &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &lt;span class=&#34;s2&#34;&gt;&amp;#34;Content-Type: application/json&amp;#34;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;model&amp;#34;: &amp;#34;qwen2.5:0.5b&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;messages&amp;#34;: [{&amp;#34;role&amp;#34;: &amp;#34;user&amp;#34;, &amp;#34;content&amp;#34;: &amp;#34;你好&amp;#34;}],
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;    &amp;#34;stream&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s1&#34;&gt;  }&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;2-python-openai-sdk&#34;&gt;2. Python (OpenAI SDK)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;openai&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建客户端&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;base_url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://192.168.6.9:11434/v1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ollama&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# 任意值即可&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 聊天请求&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;completions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;qwen2.5:0.5b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;system&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;你是一个有帮助的助手&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;你好，请介绍一下自己&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;temperature&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mf&#34;&gt;0.7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;max_tokens&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;流式响应-1&#34;&gt;流式响应&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;openai&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;OpenAI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;base_url&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;http://192.168.6.9:11434/v1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;api_key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ollama&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chat&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;completions&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;qwen2.5:0.5b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;你好&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;stream&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chunk&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chunk&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chunk&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delta&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;flush&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;安装依赖&#34;&gt;安装依赖&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install openai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;3-javascripttypescript-nodejs&#34;&gt;3. JavaScript/TypeScript (Node.js)&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;OpenAI&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;openai&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;OpenAI&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;baseURL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;http://192.168.6.9:11434/v1&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;apiKey&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ollama&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kr&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;client&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;chat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;completions&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;create&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;qwen2.5:0.5b&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;messages&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;role&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;你好&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;temperature&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.7&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;max_tokens&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;512&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;choices&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;].&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;content&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;安装依赖-1&#34;&gt;安装依赖&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install openai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;4-http-请求参数说明&#34;&gt;4. HTTP 请求参数说明&lt;/h3&gt;
&lt;h4 id=&#34;请求体参数&#34;&gt;请求体参数&lt;/h4&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;参数&lt;/th&gt;
          &lt;th&gt;类型&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
          &lt;th&gt;默认值&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;model&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;string&lt;/td&gt;
          &lt;td&gt;模型名称&lt;/td&gt;
          &lt;td&gt;必填&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;messages&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;array&lt;/td&gt;
          &lt;td&gt;消息列表&lt;/td&gt;
          &lt;td&gt;必填&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;temperature&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;float&lt;/td&gt;
          &lt;td&gt;温度 (0-2)&lt;/td&gt;
          &lt;td&gt;0.7&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;max_tokens&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;int&lt;/td&gt;
          &lt;td&gt;最大输出 token 数&lt;/td&gt;
          &lt;td&gt;无限制&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;stream&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;boolean&lt;/td&gt;
          &lt;td&gt;是否流式输出&lt;/td&gt;
          &lt;td&gt;false&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;top_p&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;float&lt;/td&gt;
          &lt;td&gt;核采样阈值&lt;/td&gt;
          &lt;td&gt;0.9&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;frequency_penalty&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;float&lt;/td&gt;
          &lt;td&gt;频率惩罚&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;presence_penalty&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;float&lt;/td&gt;
          &lt;td&gt;存在惩罚&lt;/td&gt;
          &lt;td&gt;0&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&#34;消息格式&#34;&gt;消息格式&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;role&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user&amp;#34;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;assistant&amp;#34;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;system&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;content&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;消息内容&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;-常用客户端配置&#34;&gt;📱 常用客户端配置&lt;/h2&gt;
&lt;h3 id=&#34;chatgpt-next-web--lobechat--cherry-studio&#34;&gt;ChatGPT-Next-Web / LobeChat / Cherry Studio&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;配置项&lt;/th&gt;
          &lt;th&gt;值&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;API 接口地址&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;http://192.168.6.9:11434/v1&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;API Key&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ollama&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;模型名称&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;qwen2.5:0.5b&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;open-webui&#34;&gt;Open WebUI&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -d -p 3000:8080 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -e &lt;span class=&#34;nv&#34;&gt;OLLAMA_BASE_URL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http://192.168.6.9:11434 &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --add-host&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;host.docker.internal:host-gateway &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --name open-webui &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --restart always &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  openwebui/open-webui:main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;-服务管理命令&#34;&gt;🔧 服务管理命令&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看服务状态&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status ollama
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 重启服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart ollama
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo journalctl -u ollama -f
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 停止服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl stop ollama
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 启动服务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl start ollama
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;-ollama-命令行工具&#34;&gt;📦 Ollama 命令行工具&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 列出已安装模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 运行模型（交互式）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama run qwen2.5:0.5b
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 拉取新模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama pull qwen2.5:1.5b
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 删除模型&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama rm qwen2.5:0.5b
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看模型详情&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ollama show qwen2.5:0.5b
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;-配置文件位置&#34;&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;code&gt;/etc/systemd/system/ollama.service.d/override.conf&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Ollama 服务配置&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/usr/share/ollama/.ollama/models/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;模型存储目录&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;当前服务环境变量&#34;&gt;当前服务环境变量&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OLLAMA_HOST=0.0.0.0:11434
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HTTP_PROXY=http://127.0.0.1:20171
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;HTTPS_PROXY=http://127.0.0.1:20171
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;NO_PROXY=127.0.0.1,localhost,::1,...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;-安全建议&#34;&gt;🔐 安全建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;局域网访问&lt;/strong&gt;：当前配置允许局域网内所有设备访问&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防火墙设置&lt;/strong&gt;：如需限制访问，可配置防火墙规则
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo ufw allow from 192.168.6.0/24 to any port &lt;span class=&#34;m&#34;&gt;11434&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生产环境&lt;/strong&gt;：建议使用反向代理（如 Nginx）添加认证和 HTTPS&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;-性能说明&#34;&gt;📊 性能说明&lt;/h2&gt;
&lt;p&gt;由于运行在 ARM64 Cortex-A53 设备上：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hugo → WordPress 自动同步方案总结</title>
      <link>https://djd1226.github.io/posts/2026-04-12/</link>
      <pubDate>Sun, 12 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-04-12/</guid>
      <description>&lt;h2 id=&#34;一目标&#34;&gt;一、目标&lt;/h2&gt;
&lt;p&gt;每次运行 Hugo 博客脚本发布新文章时，&lt;strong&gt;自动将该文章同步到 WordPress&lt;/strong&gt; 作为备份。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二整体流程&#34;&gt;二、整体流程&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;note.txt → 生成 MD 文件 → 复制到 Hugo content/posts
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                              ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    Hugo 生成静态网站 (public / public2 / public3)
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                              ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    Git push 到 GitHub / Git FTP 上传
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                              ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                    WordPress 自动同步（新增模块）
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;三核心原理&#34;&gt;三、核心原理&lt;/h2&gt;
&lt;h3 id=&#34;1-同步入口&#34;&gt;1. 同步入口&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;all_fpt_ok.py&lt;/code&gt; 脚本末尾追加 WordPress 同步模块，每次运行 Hugo 发布脚本时&lt;strong&gt;自动触发&lt;/strong&gt;，无需额外操作。&lt;/p&gt;
&lt;h3 id=&#34;2-文件定位&#34;&gt;2. 文件定位&lt;/h3&gt;
&lt;p&gt;每次只同步&lt;strong&gt;今天生成的一篇文章&lt;/strong&gt;（&lt;code&gt;YYYY-MM-DD.md&lt;/code&gt;），通过当前日期匹配文件名。&lt;/p&gt;
&lt;h3 id=&#34;3-解析-frontmatter&#34;&gt;3. 解析 Frontmatter&lt;/h3&gt;
&lt;p&gt;读取 MD 文件开头的 frontmatter，提取：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;字段&lt;/th&gt;
          &lt;th&gt;示例&lt;/th&gt;
          &lt;th&gt;用途&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;&amp;quot;Debian 系统精簡&amp;quot;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;WordPress 文章标题&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;2025-12-12&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;WordPress 文章发布日期&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;4-markdown--html&#34;&gt;4. Markdown → HTML&lt;/h3&gt;
&lt;p&gt;使用 Python 的 &lt;code&gt;markdown&lt;/code&gt; 库将 MD 正文转为 HTML，支持：&lt;/p&gt;</description>
    </item>
    <item>
      <title>Python/PHP 服务适配sv66容器</title>
      <link>https://djd1226.github.io/posts/2026-04-02/</link>
      <pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-04-02/</guid>
      <description>&lt;h2 id=&#34;1-方案目标&#34;&gt;1. 方案目标&lt;/h2&gt;
&lt;p&gt;在 &lt;code&gt;sv66&lt;/code&gt;（无 root、共享容器环境）上部署轻量 Python/PHP 服务，并通过 Cloudflare 反向代理/CDN 对外提供稳定访问。&lt;/p&gt;
&lt;p&gt;核心链路：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;用户 -&amp;gt; Cloudflare(反向代理/CDN/WAF) -&amp;gt; cloudflared 隧道 -&amp;gt; 127.0.0.1:本地服务端口&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;该方案不依赖公网高位端口直连，通常比直接开放端口更稳定。&lt;/p&gt;
&lt;h2 id=&#34;2-架构与端口规划&#34;&gt;2. 架构与端口规划&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api.yourdomain.com&lt;/code&gt; -&amp;gt; Python 服务 &lt;code&gt;127.0.0.1:18080&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;php.yourdomain.com&lt;/code&gt; -&amp;gt; PHP 服务 &lt;code&gt;127.0.0.1:18081&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloudflared&lt;/code&gt; 以普通用户方式常驻运行（无需 root）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-部署-python-轻服务示例&#34;&gt;3. 部署 Python 轻服务（示例）&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p ~/apps/py-api
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &amp;gt; ~/apps/py-api/server.py &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;&amp;#39;PY&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;#!/usr/bin/env python3
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;# 简单健康检查接口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;from http.server import BaseHTTPRequestHandler, HTTPServer
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;class H(BaseHTTPRequestHandler):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;    def do_GET(self):
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;        if self.path == &amp;#34;/health&amp;#34;:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            body = b&amp;#39;{&amp;#34;ok&amp;#34;:true,&amp;#34;service&amp;#34;:&amp;#34;py-api&amp;#34;}&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.send_response(200)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.send_header(&amp;#34;Content-Type&amp;#34;, &amp;#34;application/json&amp;#34;)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.send_header(&amp;#34;Content-Length&amp;#34;, str(len(body)))
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.end_headers()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.wfile.write(body)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;        else:
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.send_response(404)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;            self.end_headers()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;HTTPServer((&amp;#34;127.0.0.1&amp;#34;, 18080), H).serve_forever()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;PY&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nohup python3 ~/apps/py-api/server.py &amp;gt; ~/apps/py-api/run.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -sS http://127.0.0.1:18080/health
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;4-部署-php-轻服务示例&#34;&gt;4. 部署 PHP 轻服务（示例）&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p ~/apps/php-web/public
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat &amp;gt; ~/apps/php-web/public/index.php &lt;span class=&#34;s&#34;&gt;&amp;lt;&amp;lt;&amp;#39;PHP&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;&amp;lt;?php
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;header(&amp;#39;Content-Type: application/json; charset=utf-8&amp;#39;);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;echo json_encode([&amp;#39;ok&amp;#39;=&amp;gt;true,&amp;#39;service&amp;#39;=&amp;gt;&amp;#39;php-web&amp;#39;]);
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s&#34;&gt;PHP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nohup php -S 127.0.0.1:18081 -t ~/apps/php-web/public &amp;gt; ~/apps/php-web/run.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -sS http://127.0.0.1:18081/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;5-接入-cloudflare-tunnel推荐&#34;&gt;5. 接入 Cloudflare Tunnel（推荐）&lt;/h2&gt;
&lt;h3 id=&#34;方式a最快&#34;&gt;方式A（最快）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;在 Cloudflare Zero Trust 后台创建 Tunnel，获取 &lt;code&gt;token&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;sv66&lt;/code&gt; 下载并运行 &lt;code&gt;cloudflared&lt;/code&gt;（用户态）：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p ~/bin ~/cloudflared
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; ~/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x cloudflared
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nohup ~/bin/cloudflared tunnel --no-autoupdate run --token &lt;span class=&#34;s1&#34;&gt;&amp;#39;你的TOKEN&amp;#39;&lt;/span&gt; &amp;gt; ~/cloudflared/run.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;在 Cloudflare 后台给 Tunnel 绑定 Hostname：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;api.yourdomain.com&lt;/code&gt; -&amp;gt; &lt;code&gt;http://127.0.0.1:18080&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;php.yourdomain.com&lt;/code&gt; -&amp;gt; &lt;code&gt;http://127.0.0.1:18081&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;6-保活已验证-sv66-的-crontab-可用&#34;&gt;6. 保活（已验证 sv66 的 crontab 可用）&lt;/h2&gt;
&lt;p&gt;编辑 crontab：&lt;/p&gt;</description>
    </item>
    <item>
      <title>supabase 免费版</title>
      <link>https://djd1226.github.io/posts/2026-03-30/</link>
      <pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-03-30/</guid>
      <description>&lt;p&gt;官方规则： Supabase 免费版通常在 1 周（7 天） 没有任何活动后会将项目设为“暂停（Paused）”。
Supabase 的保活机制监测的是 API 活跃度。只要你的脚本向数据库发送了请求，并且数据库返回了响应（即便只是返回一个空数组或一行数据），系统就会判定你的项目处于“活跃”状态。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-supabase-url-项目地址&#34;&gt;1. Supabase URL (项目地址)&lt;/h3&gt;
&lt;p&gt;这是最基础的。API Key 是钥匙，URL 就是&lt;strong&gt;门牌号&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;位置：&lt;/strong&gt; 就在 API Key 页面上方，或者 Settings -&amp;gt; API -&amp;gt; Project URL。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样子：&lt;/strong&gt; &lt;code&gt;https://xxxxxx.supabase.co&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-对应的-sdk翻译官&#34;&gt;2. 对应的 SDK（“翻译官”）&lt;/h3&gt;
&lt;p&gt;你不能直接用嘴跟数据库说话，得用它的语言。Supabase 官方提供了非常好用的库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如果你用 Python：&lt;/strong&gt; 需要安装 &lt;code&gt;supabase&lt;/code&gt; 库。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pip install supabase&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;如果你用 Node.js (Vercel/Armbian)：&lt;/strong&gt; 需要安装 &lt;code&gt;@supabase/supabase-js&lt;/code&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;npm install @supabase/supabase-js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-表名和字段名-table--columns&#34;&gt;3. 表名和字段名 (Table &amp;amp; Columns)&lt;/h3&gt;
&lt;p&gt;你需要知道你要操作哪张表，以及表里有哪些“格子”（列）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比如你的保活脚本操作的是 &lt;code&gt;keep_alive&lt;/code&gt; 表。&lt;/li&gt;
&lt;li&gt;如果你要存用户，你得知道字段是叫 &lt;code&gt;username&lt;/code&gt; 还是 &lt;code&gt;user_name&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;4-rls-策略-row-level-security--最容易踩坑的地方&#34;&gt;4. RLS 策略 (Row Level Security) —— &lt;strong&gt;最容易踩坑的地方&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;这是 Supabase 的“保安”。即便你拿到了 &lt;code&gt;anon&lt;/code&gt; 钥匙，如果没有配置 RLS，你的脚本&lt;strong&gt;依然读不到数据&lt;/strong&gt;（返回空数组或报错）。&lt;/p&gt;</description>
    </item>
    <item>
      <title>SSH_skills高级运维技能</title>
      <link>https://djd1226.github.io/posts/2026-03-27/</link>
      <pubDate>Fri, 27 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-03-27/</guid>
      <description>&lt;p&gt;这份 &lt;code&gt;SKILL.md&lt;/code&gt; 整体结构非常清晰，核心原则抓得很准。但正如你所提到的，你的主机环境跨度很大，尤其是 &lt;strong&gt;Termux&lt;/strong&gt; 与标准的 &lt;strong&gt;Ubuntu/Debian/Armbian&lt;/strong&gt; 在底层架构上有巨大的差异（比如文件系统路径、包管理器、服务管理工具以及权限模型）。&lt;/p&gt;
&lt;p&gt;如果不在执行前强制确认环境，AI 极容易在 Termux 里执行 &lt;code&gt;systemctl&lt;/code&gt; 或试图向 &lt;code&gt;/etc/&lt;/code&gt; 写文件，从而导致不断报错。&lt;/p&gt;
&lt;p&gt;我为你优化了这份配置，重点强化了&lt;strong&gt;环境侦测机制&lt;/strong&gt;和&lt;strong&gt;差异化处理逻辑&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;优化后的-skillmd&#34;&gt;优化后的 SKILL.md&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-markdown&#34; data-lang=&#34;markdown&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;name: sys-admin
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;description: 专门用于本地 Shell 操作或通过 SSH 连接远程主机，执行系统配置、应用安装部署和系统错误排查的高级运维技能。能够智能识别并适配 Termux, Ubuntu, Debian, Armbian 等不同宿主环境。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;disable-model-invocation: true
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;argument-hint: &amp;#34;[操作指令或目标主机及任务]&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;你现在是一位资深的 Linux 运维工程师、DevOps 专家和安全研究员。你的任务是通过本地 Shell 或 SSH 连接，帮我安全、高效地完成系统配置、应用部署或故障排查任务。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;当前用户输入的具体任务和参数是：$ARGUMENTS
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;gu&#34;&gt;### 🎯 核心执行原则与工作流：
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**环境侦测与适配 (Environment Profiling)**&lt;/span&gt;：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **首要动作**：在执行任何安装、配置或排错前，**必须先执行侦测命令**（如 &lt;span class=&#34;sb&#34;&gt;`uname -a`&lt;/span&gt;, &lt;span class=&#34;sb&#34;&gt;`cat /etc/os-release`&lt;/span&gt;, 检查 &lt;span class=&#34;sb&#34;&gt;`$PREFIX`&lt;/span&gt; 环境变量等），以明确当前主机的操作系统（Termux / Ubuntu / Debian / Armbian）及 CPU 架构（x86_64 / aarch64 等）。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **严格遵循环境差异**：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **Termux 环境**：绝对禁止使用 &lt;span class=&#34;sb&#34;&gt;`systemctl`&lt;/span&gt; 或默认向 &lt;span class=&#34;sb&#34;&gt;`/etc/`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`/var/`&lt;/span&gt; 写入。必须使用 &lt;span class=&#34;sb&#34;&gt;`pkg`&lt;/span&gt; 管理软件，使用 &lt;span class=&#34;sb&#34;&gt;`termux-services`&lt;/span&gt; (sv) 管理服务。所有绝对路径必须基于 &lt;span class=&#34;sb&#34;&gt;`$PREFIX`&lt;/span&gt;（即 &lt;span class=&#34;sb&#34;&gt;`/data/data/com.termux/files/usr/`&lt;/span&gt;）。注意默认运行在非 root 权限下。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **Ubuntu/Debian 环境**：标准 Linux 逻辑，使用 &lt;span class=&#34;sb&#34;&gt;`apt`&lt;/span&gt; 管理包，使用 &lt;span class=&#34;sb&#34;&gt;`systemd`&lt;/span&gt; (&lt;span class=&#34;sb&#34;&gt;`systemctl`&lt;/span&gt;, &lt;span class=&#34;sb&#34;&gt;`journalctl`&lt;/span&gt;) 管理服务与日志。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **Armbian 环境**：基本同 Debian/Ubuntu，但涉及底层硬件（如网卡、存储、GPIO）或 Docker 镜像拉取时，必须特别注意 ARM 架构的兼容性问题。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **连接确认**：如果是远程操作，请先构造安全的 SSH 命令。如果用户未提供用户名或 IP，请先询问。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**渐进式部署与配置 (Step-by-Step)**&lt;/span&gt;：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 对于复杂的安装部署（如配置反向代理、部署容器、搭建数据库等），**严禁一次性生成并执行超长脚本**。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 必须将任务拆解为逻辑清晰的单个步骤（例如：1. 检查依赖 -&amp;gt; 2. 下载安装 -&amp;gt; 3. 修改配置 -&amp;gt; 4. 启动服务 -&amp;gt; 5. 验证状态），每一步执行后都要读取终端返回结果，确认无误后再进行下一步。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;3.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**智能错误排查 (Root-cause-tracing)**&lt;/span&gt;：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 如果在执行命令、编译代码或启动服务时遇到错误，**不要要求我手动去查日志**，你需要主动去调取日志。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; **注意日志获取的环境差异**：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 标准 Linux：使用 &lt;span class=&#34;sb&#34;&gt;`journalctl -xe`&lt;/span&gt;、&lt;span class=&#34;sb&#34;&gt;`tail -n 50 /var/log/syslog`&lt;/span&gt; 或 &lt;span class=&#34;sb&#34;&gt;`/var/log/messages`&lt;/span&gt;。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;     &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; Termux：通常没有全局的 syslog 或 journalctl，必须直接查看对应应用的专属日志文件，或尝试在前台运行服务以捕获 stdout/stderr 报错。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 追踪并分析导致错误的根本原因，然后提出修复方案并帮我执行。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;4.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**安全与防御性操作 (Safety First)**&lt;/span&gt;：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 在修改核心配置文件（如 &lt;span class=&#34;sb&#34;&gt;`fstab`&lt;/span&gt;, &lt;span class=&#34;sb&#34;&gt;`sshd_config`&lt;/span&gt;, &lt;span class=&#34;sb&#34;&gt;`nginx.conf`&lt;/span&gt; 等）之前，**必须先使用 &lt;span class=&#34;sb&#34;&gt;`cp`&lt;/span&gt; 命令备份原文件**。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 遇到具有破坏性的高危操作（如 &lt;span class=&#34;sb&#34;&gt;`rm -rf`&lt;/span&gt; 关键目录、清空数据库、重启生产级核心服务、重置网络/防火墙规则等），在执行前必须向我清晰地说明该操作的后果，并等待我的明确授权确认。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;5.&lt;/span&gt; &lt;span class=&#34;gs&#34;&gt;**透明沟通**&lt;/span&gt;：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 每次执行命令前，简短告知我你打算执行什么命令以及目的。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;k&#34;&gt;-&lt;/span&gt; 如果遇到环境特定的疑难杂症（例如某个库在当前 ARM 架构下无法编译），及时向我同步阻碍点及备选方案。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;请基于以上原则，开始评估并执行 &lt;span class=&#34;sb&#34;&gt;`$ARGUMENTS`&lt;/span&gt; 指定的任务。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;主要改进点说明&#34;&gt;主要改进点说明：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;强制的“首要动作”&lt;/strong&gt;：要求 AI 在接手任务后，第一步永远是运行 &lt;code&gt;cat /etc/os-release&lt;/code&gt; 和查 &lt;code&gt;$PREFIX&lt;/code&gt;，用客观命令返回的结果来决定后续策略，而不是靠猜。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;明确 Termux 的特殊性&lt;/strong&gt;：明确指出了 Termux 没有 &lt;code&gt;systemd&lt;/code&gt;，路径不同，且默认非 root。这能极大地减少 AI 在手机/平板终端上犯低级错误（比如疯狂尝试 &lt;code&gt;sudo apt install&lt;/code&gt; 或 &lt;code&gt;systemctl start&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区分 ARM 架构&lt;/strong&gt;：针对 Armbian，提醒 AI 在拉取镜像（比如 Docker 镜像）或编译软件时，主动注意 &lt;code&gt;aarch64/arm64&lt;/code&gt; 兼容性。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志排错的差异化&lt;/strong&gt;：特别强调了 Termux 环境下找日志的方式与常规 Linux 不同，避免 AI 卡在“找不到 &lt;code&gt;journalctl&lt;/code&gt; 命令”的死循环里。&lt;/li&gt;
&lt;/ol&gt;</description>
    </item>
    <item>
      <title>大模型标准计费解读</title>
      <link>https://djd1226.github.io/posts/2026-03-23/</link>
      <pubDate>Mon, 23 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-03-23/</guid>
      <description>&lt;p&gt;这类计费被称为“按量计费”（Pay-as-you-go），即&lt;strong&gt;按使用量付费，没有月租&lt;/strong&gt;。为了让你直观理解，我们可以把 Token 类比成“字数”（通常 1M Tokens 约为 75 万个英文单词或 50 万个汉字）。&lt;/p&gt;
&lt;p&gt;以下是四个维度的详细解读：&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;1-基础计费输入与补全&#34;&gt;1. 基础计费：输入与补全&lt;/h3&gt;
&lt;p&gt;这是最核心的部分，每次对话都会产生这两项费用。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;输入价格 ($0.80 / 1M Tokens)：&lt;/strong&gt;
指的是你发送给 AI 的指令、背景资料或之前的对话历史。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;例子：&lt;/em&gt; 你发送了一个 1 万 Tokens 的长文档，费用就是 $0.008。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补全价格 ($4.00 / 1M Tokens)：&lt;/strong&gt;
指的是 AI 回复给你的内容。由于生成内容需要消耗更多算力，所以&lt;strong&gt;回复的价格是输入的 5 倍&lt;/strong&gt;。
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;例子：&lt;/em&gt; AI 回复了 5000 个 Tokens，费用就是 $0.02。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-高级功能提示词缓存-prompt-caching&#34;&gt;2. 高级功能：提示词缓存 (Prompt Caching)&lt;/h3&gt;
&lt;p&gt;这是为了降低成本、提高速度推出的功能。如果你经常发送重复的大段背景资料（如代码库、法律条文），这个功能非常省钱。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;缓存创建价格 ($1.00 / 1M Tokens)：&lt;/strong&gt;
当你&lt;strong&gt;第一次&lt;/strong&gt;把一段长文本存入缓存时，价格会比普通输入贵 25%（从 $0.8 变为 $1.0）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;缓存读取价格 ($0.08 / 1M Tokens)：&lt;/strong&gt;
当你&lt;strong&gt;第二次及以后&lt;/strong&gt;使用这段已缓存的内容时，价格会骤降。
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;划算在哪里？&lt;/strong&gt; 读取缓存的价格仅为普通输入的 &lt;strong&gt;1/10&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;3-场景模拟计算&#34;&gt;3. 场景模拟计算&lt;/h3&gt;
&lt;p&gt;假设你正在开发一个 AI 助手，系统内置了 &lt;strong&gt;2 万 Tokens&lt;/strong&gt; 的背景知识库。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Claude Code Router (CCR)路由配置指南</title>
      <link>https://djd1226.github.io/posts/2026-03-17/</link>
      <pubDate>Tue, 17 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-03-17/</guid>
      <description>&lt;p&gt;你可以把 CCR 想象成一个**“智能包工头”**。当你在终端里使用 &lt;code&gt;ccr code&lt;/code&gt; 敲代码时，官方的 Claude Code 程序会在后台发出各种不同类型的请求。CCR 会拦截这些请求，并根据你 &lt;code&gt;Router&lt;/code&gt; 里的规则，自动把任务分配给最合适的模型。&lt;/p&gt;
&lt;p&gt;具体来说，这些路由规则是这样在实际中发挥作用的：&lt;/p&gt;
&lt;h3 id=&#34;1-default默认路由&#34;&gt;1. &lt;code&gt;default&lt;/code&gt;（默认路由）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如何触发：&lt;/strong&gt; 当你在终端里正常提问，比如输入“帮我写一个测试函数”或“解释一下这段代码”时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 这是你最常感知的常规对话，CCR 会把你的直接指令发送给配置的默认主力模型（如你的 &lt;code&gt;gpt-5.2-codex&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-background后台路由&#34;&gt;2. &lt;code&gt;background&lt;/code&gt;（后台路由）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如何触发：&lt;/strong&gt; &lt;strong&gt;全自动触发，你无需干预。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; Claude Code 在运行中，经常会在后台偷偷做一些“杂活”。比如：你刚打开项目时它会悄悄扫描目录结构、你需要修改长文件时它会先在后台总结一下文件大纲、或者帮你自动生成 Git 提交信息。这些任务不需要极高的智商，但需要速度快、成本低。CCR 识别到这些后台请求时，就会自动使用 &lt;code&gt;background&lt;/code&gt; 指定的模型去悄悄处理。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;3-think深度思考路由&#34;&gt;3. &lt;code&gt;think&lt;/code&gt;（深度思考路由）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如何触发：&lt;/strong&gt; 通常是在你面临极其复杂的架构设计、难以排查的 Bug 时，通过特定的命令（比如在交互界面输入 &lt;code&gt;/think&lt;/code&gt; 相关的指令，或者启动时带上特定参数）触发。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 当系统判定当前任务需要极其严密的逻辑推理时，CCR 会把这个请求单独剥离出来，发送给专门擅长推理的模型（比如 DeepSeek-R1 或开启了 thinking 模式的 Claude 3.7）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;4-longcontext长上下文路由&#34;&gt;4. &lt;code&gt;longContext&lt;/code&gt;（长上下文路由）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如何触发：&lt;/strong&gt; &lt;strong&gt;根据你的对话长度自动触发。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 你的配置里有一个 &lt;code&gt;longContextThreshold: 60000&lt;/code&gt;。当你们的对话越来越长，或者你让 AI 一次性读取了好几个巨大的代码文件，导致上下文的词汇量（Token）超过了 60,000 时，CCR 会立刻判定：“内容太多了，默认模型可能处理不了或者会丢失记忆！” 然后它会自动、无缝地切换到你指定的 &lt;code&gt;longContext&lt;/code&gt; 模型来接管对话。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;5-websearch联网搜索路由&#34;&gt;5. &lt;code&gt;webSearch&lt;/code&gt;（联网搜索路由）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;如何触发：&lt;/strong&gt; 全自动。当你问的问题需要最新的互联网知识（比如“查一下最新的 React 官方文档关于某个 API 的用法”），Claude Code 决定调用联网搜索工具时。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 这个搜索的动作会被路由到你指定的模型去执行。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;#34;Router&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;default&amp;#34;: &amp;#34;openrouter-channel,anthropic/claude-3.5-sonnet&amp;#34;,  // 默认日常敲代码的主力模型
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;background&amp;#34;: &amp;#34;official-anthropic,claude-3-5-haiku-20241022&amp;#34;, // 后台轻量级任务（如总结、快速分析）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;think&amp;#34;: &amp;#34;openrouter-channel,deepseek/deepseek-r1&amp;#34;,           // 专门处理复杂思考 (thinking) 模式
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;longContext&amp;#34;: &amp;#34;my-custom-proxy,gemini-2.5-pro&amp;#34;               // 遇到超长上下文（如大文件读取）时自动切换
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;总结一下：&lt;/strong&gt;
在实际使用中，你的操作方式没有任何改变，依然是和 AI 正常聊天下指令。&lt;code&gt;Router&lt;/code&gt; 配置的意义在于帮你&lt;strong&gt;省钱和提效&lt;/strong&gt;——它把简单的杂活分给便宜快速的模型，把核心代码交给主力模型，遇到超大文件自动换能支持长文本的模型。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在 Termux 中使用 `pure-ftpd` 搭建FTP</title>
      <link>https://djd1226.github.io/posts/2026-03-04/</link>
      <pubDate>Wed, 04 Mar 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-03-04/</guid>
      <description>&lt;h2 id=&#34;如何在-termux-中使用-pure-ftpd-搭建一个安全的-ftp-服务&#34;&gt;如何在 Termux 中使用 &lt;code&gt;pure-ftpd&lt;/code&gt; 搭建一个安全的 FTP 服务。&lt;/h2&gt;
&lt;h3 id=&#34;1-安装-pure-ftpd&#34;&gt;1. 安装 &lt;code&gt;pure-ftpd&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;在 Termux 中使用 &lt;code&gt;pkg install&lt;/code&gt; 命令安装 &lt;code&gt;pure-ftpd&lt;/code&gt;。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pkg install pure-ftpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-创建-ftp-用户并设置密码&#34;&gt;2. 创建 FTP 用户并设置密码&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;pure-pw&lt;/code&gt; 命令创建一个新的 FTP 用户。以下是命令的含义：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pure-pw useradd tianya -u &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; -g &lt;span class=&#34;m&#34;&gt;1001&lt;/span&gt; -d /sdcard/Download
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;pure-pw useradd tianya&lt;/code&gt;：添加用户名为 &lt;code&gt;tianya&lt;/code&gt; 的 FTP 用户。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-u 1001 -g 1001&lt;/code&gt;：指定此用户的 UID 和 GID。通常，Termux 中默认用户的 UID 和 GID 是 &lt;code&gt;1001&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-d /sdcard/Download&lt;/code&gt;：设置该用户的主目录为 &lt;code&gt;/sdcard/Download&lt;/code&gt;，即该用户登录 FTP 后只能访问这个目录。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;执行后系统会提示输入密码&lt;/strong&gt;。输入你希望为 &lt;code&gt;djd1226&lt;/code&gt; 用户设置的 FTP 密码，并确认密码。&lt;/p&gt;
&lt;h3 id=&#34;3-生成-pure-ftpd-用户数据库&#34;&gt;3. 生成 &lt;code&gt;pure-ftpd&lt;/code&gt; 用户数据库&lt;/h3&gt;
&lt;p&gt;每次添加或更新用户后，都需要使用以下命令更新数据库：&lt;/p&gt;</description>
    </item>
    <item>
      <title>在 Debian 服务器上部署 `frps`（服务端）</title>
      <link>https://djd1226.github.io/posts/2026-02-01/</link>
      <pubDate>Sun, 01 Feb 2026 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2026-02-01/</guid>
      <description>&lt;hr&gt;
&lt;h3 id=&#34;第一步检查系统架构&#34;&gt;第一步：检查系统架构&lt;/h3&gt;
&lt;p&gt;首先，确认你 Debian 服务器的 CPU 架构，以便下载正确的版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;arch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;如果显示 &lt;code&gt;x86_64&lt;/code&gt;，下载 &lt;strong&gt;amd64&lt;/strong&gt; 版本。&lt;/li&gt;
&lt;li&gt;如果显示 &lt;code&gt;aarch64&lt;/code&gt;，下载 &lt;strong&gt;arm64&lt;/strong&gt; 版本。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&#34;第二步下载并解压-frp&#34;&gt;第二步：下载并解压 frp&lt;/h3&gt;
&lt;p&gt;访问 &lt;a href=&#34;https://github.com/fatedier/frp/releases&#34;&gt;frp GitHub Releases&lt;/a&gt; 获取最新版本。以下以 &lt;code&gt;v0.54.0&lt;/code&gt; 版本为例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 创建文件夹并进入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p /root/frp &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /root/frp
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 下载压缩包 (请根据架构替换文件名)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;wget https://github.com/fatedier/frp/releases/download/v0.54.0/frp_0.54.0_linux_amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 解压&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tar -zxvf frp_0.54.0_linux_amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入解压后的目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; frp_0.54.0_linux_amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h3 id=&#34;第三步配置-frps&#34;&gt;第三步：配置 frps&lt;/h3&gt;
&lt;p&gt;在解压出的文件夹中，你会看到 &lt;code&gt;frps&lt;/code&gt;（程序文件）和 &lt;code&gt;frps.toml&lt;/code&gt;（配置文件）。&lt;/p&gt;
&lt;p&gt;编辑配置文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nano frps.toml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;输入以下基础配置（请根据注释修改）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-toml&#34; data-lang=&#34;toml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;bindPort&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7000&lt;/span&gt;          &lt;span class=&#34;c&#34;&gt;# 服务端监听端口，用于接收来自客户端的连接&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 鉴权配置（强烈建议设置，防止被他人非法使用）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;auth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;method&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;token&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;auth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;token&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;你的强密码&amp;#34;&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# 客户端连接时必须提供此密码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 可选：仪表盘界面（可以通过网页查看穿透状态）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;webServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;addr&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;      &lt;span class=&#34;c&#34;&gt;# 修改为 0.0.0.0，允许外网访问&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;webServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;port&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;7500&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;webServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;admin&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;webServer&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;password&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;你的后台管理密码&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;按下 &lt;code&gt;Ctrl + O&lt;/code&gt; 保存，&lt;code&gt;Ctrl + X&lt;/code&gt; 退出。&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Debian 系统精簡</title>
      <link>https://djd1226.github.io/posts/2025-12-12/</link>
      <pubDate>Fri, 12 Dec 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-12-12/</guid>
      <description>&lt;p&gt;这两个目录是 Debian 系统中常见的大户，进一步清理可以重点针对它们。&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id=&#34;1-usr-目录清理建议&#34;&gt;1. &lt;code&gt;/usr&lt;/code&gt; 目录清理建议&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;/usr&lt;/code&gt; 主要存放系统程序和共享资源，通常包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/usr/share/doc&lt;/code&gt;：软件说明文档&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/share/man&lt;/code&gt;：手册页&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/share/locale&lt;/code&gt;：多语言本地化文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/share/fonts&lt;/code&gt;：字体文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/lib&lt;/code&gt;：库文件和程序文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/bin&lt;/code&gt;、&lt;code&gt;/usr/sbin&lt;/code&gt;：可执行文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;清理重点&#34;&gt;清理重点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;删除说明文档和手册页&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf /usr/share/doc/*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf /usr/share/man/*
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rm -rf /usr/share/info/*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;删除不需要的语言文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;如果只需要简体中文（zh_CN）和英文（en），可以删除其他语言的本地化文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find /usr/share/locale -mindepth &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; -maxdepth &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; ! -name &lt;span class=&#34;s2&#34;&gt;&amp;#34;zh_CN&amp;#34;&lt;/span&gt; ! -name &lt;span class=&#34;s2&#34;&gt;&amp;#34;en&amp;#34;&lt;/span&gt; -exec rm -rf &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; +
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;字体清理&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;同之前脚本，保留简体中文和英文字体，删除其他字体。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;检查大文件&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;你可以用如下命令列出 &lt;code&gt;/usr&lt;/code&gt; 下大于 10MB 的文件，确认是否有可删文件：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;find /usr -type f -size +10M -exec ls -lh &lt;span class=&#34;o&#34;&gt;{}&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1 id=&#34;2-var-目录清理建议&#34;&gt;2. &lt;code&gt;/var&lt;/code&gt; 目录清理建议&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;/var&lt;/code&gt; 目录通常包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/var/cache&lt;/code&gt;：缓存文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/log&lt;/code&gt;：日志文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/lib&lt;/code&gt;：应用程序数据&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/var/tmp&lt;/code&gt;：临时文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;清理重点-1&#34;&gt;清理重点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;清理 apt 缓存&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>提升PR剪辑效率的二十二个必备技巧</title>
      <link>https://djd1226.github.io/posts/2025-08-24/</link>
      <pubDate>Sun, 24 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-08-24/</guid>
      <description>&lt;p&gt;在之前的文章中，已经向大家介绍了PR的小技巧，许多小伙伴直呼需要更多这样的干货，pr软件是自带很多小工具，可以为制作提升很高的效率。这些小工具如果能全部掌握，就相当于十八般兵器，随便拿出来一两个，都能让剪辑工作如虎添翼。如果不能全部掌握，随便几个小技巧也能让你感叹软件的流畅。&lt;/p&gt;
&lt;h1 id=&#34;技巧一快速波纹剪辑shiftwq&#34;&gt;&lt;strong&gt;技巧一：快速波纹剪辑（Shift+W/Q）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;许多小伙伴，在剪辑素材时，通常会通过C剃刀工具将要剪辑的内容给剪切开，或者使用Ctrl+K来切割素材，然后使用D选中素材并删除，这样会比较麻烦，其实直接按下Q或者W就可以使用波纹剪辑效果自动剪辑素材并且与之前的素材相连。如果你想相应延长一段素材至空白区域，只需要按下Shift+Q或者W即可。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/png/799872/1581513230440-e2493184-d67e-4135-a429-2bc418d28e97.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧二快速设置工作区io-&#34;&gt;&lt;strong&gt;技巧二：快速设置工作区（I/O ）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;如果你想从素材中删除或者抽取某一素材的中间部分时，你可以通过I和O键选择工作区，随后使用（；）来删除工作区内的片段，如果你想抽取这个片段，只需要按下引号键（‘’）就可以完成。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230456-ac56a44e-50c0-49cf-a0a7-df800a9f1698.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧三快捷导入素材&#34;&gt;&lt;strong&gt;技巧三：快捷导入素材&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;通常我们导入素材，是双击项目窗口，选中相应素材点击打开进行导入，如果导入的素材很多，都在同一个文件夹内，是无法双击导入进去的，可以将素材文件夹直接拖入项目窗口，导入之后也是你自己分好类的文件夹，这样就可以完成，比单独一个个拖拽效率要高不少。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/png/799872/1581513230413-00ad7eb1-8f99-4aee-9f4b-c5b1a0d74411.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧四快速替换素材&#34;&gt;&lt;strong&gt;技巧四：快速替换素材&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当我们剪辑时发现想将时间轨道上的某一段素材替换成另一段素材时，很多小伙伴的做法是先删除这段素材，然后再将另一段素材拖入被删除素材的位置，极为麻烦，快捷的方式：选择要替换的素材，直接将素材拖入窗口，这样就完成了替换。同样插入、覆盖等功能也可以快速实现。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230434-c332dc65-9f4c-4719-a70b-7c0f8c12e8be.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧五批量添加转场&#34;&gt;&lt;strong&gt;技巧五：批量添加转场&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;很多时候我们都需要为多个素材添加转场，使用鼠标挨个添加的话，效率会非常低下，直接选中所有的你需要添加转场的素材，快捷键：Shift+D可以快速为你加上音频和视频的转场，如果单独为视频添加转场，快捷键：Ctrl+D，如果你想为音频添加转场，&lt;/p&gt;
&lt;p&gt;快捷键：Ctrl+Shift+D。如果你想修改转场的类型，你可以进入到效果面板，选择你需要设置为默认的转场，右键，点击设置为默认，接下来你按下快捷键就能迅速添加这个转场。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230942-e87ef31c-a32d-4c95-9c0a-472083462b9a.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧六自动选中素材&#34;&gt;&lt;strong&gt;技巧六：自动选中素材&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;很多情况下在我们拖动时间线的时候，需要点击一下素材才可以选中，很麻烦，点击“序列”窗口，选择点击跟随播放指示器，可以直接实现指针拖到那个素材就自动选择该素材，大大提升剪辑效率。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230913-8d8ca50e-a222-4f1b-8116-e71125e47950.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧七平行时间轴&#34;&gt;&lt;strong&gt;技巧七：平行时间轴&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;做剪辑会有不同的序列，根据内容不同会分为主序列与子序列，主序列一般就是我们最终的输出序列，点击子序列将其拖入主序列下方，得到两个平行的时间轴，下方子序列可以为上方的主序列提供素材，素材可以直接从下方序列中拖入主序列。子序列可以不止一个，根据自己的需要进行设置。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230819-054f803d-1e6e-4e04-bce8-49ad188051e0.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧八素材间互换位置altctrl拖动&#34;&gt;&lt;strong&gt;技巧八：素材间互换位置（Alt+ctrl+拖动）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当你要把两段素材互换位置的时候，按住Ctrl+alt+鼠标左键拖动素材可以快速调换素材位置并且自动对正。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/png/799872/1581513231041-0f2297ad-4964-433c-8008-01d9d1e41043.png&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧九快速预览l&#34;&gt;&lt;strong&gt;技巧九：快速预览（L）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;如果我们使用空格来预览素材，那么速度很慢。序列窗口按“L键”可以快速预览，多按几次L我们视频播放的速度会更加的快，按一次“空格键”我们视频播放会停止，再按一次“空格键”视频的播放速度会回归正常。在素材很多的情况下可以这样预览。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230953-371973c6-5393-435a-99f0-dab3ca1bf4f0.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十标记素材标识帧&#34;&gt;&lt;strong&gt;技巧十：标记素材（标识帧）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;使用标识帧设置关键的画面，方便在素材库里面查找，素材窗口拖动素材时间轴预览，选择合适位置后右键设置标识帧（方便区分素材）&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230434-ee886ff9-0c6c-4803-9d43-394f5e492b7a.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十一在轨道上复制素材alt拖动&#34;&gt;&lt;strong&gt;技巧十一：在轨道上复制素材（Alt+拖动）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当你想要在时间轨道上复制素材的时候，如果一个一个的复制，感觉好慢呀，许多人使用ctrl+c对素材进行复制，但是在拖动的时候可能会把原有的素材覆盖，其实只要按住Alt+拖动，就可以快速复制。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230485-786aea4a-7327-4ac4-9e64-662924313303.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十二一次性剪切全部轨道shiftc&#34;&gt;&lt;strong&gt;技巧十二：一次性剪切全部轨道（shift+c）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当你使用了多个轨道的时候，需要进行裁切的时候，一般只能一次裁切一个素材，这个时候只要按住Shift+c键就可以对视频与音频上的所有轨道进行裁切。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230950-f6f1b72a-e80b-4437-803a-fb86d852094c.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十三从素材库中插入素材英文键&#34;&gt;&lt;strong&gt;技巧十三：从素材库中插入素材（英文“，”键）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当你已经剪辑完一段素材的时候，如果想在其中某个位置插入另一段素材，只要把时间标尺放在要插入的位置，选中素材按，然后在英文输入法下按“，”键，这样就可以快速插入轨道。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230586-37beb213-c053-4928-b875-c206d351ce97.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十四快速全选右侧素材a键&#34;&gt;&lt;strong&gt;技巧十四：快速全选右侧素材（A键）&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;这个可以快速选择一大段素材，不用鼠标先把素材缩小再全选，直接一键搞定。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513230599-cf8bbaf2-432e-4416-bc7c-cb1b58273549.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十五批量调色&#34;&gt;&lt;strong&gt;技巧十五：批量调色&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;可以在素材窗口右键新建“调整图层”，将调整图层放在素材上面，只对调整图层调色。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/gif/799872/1581513231026-0c2b1e0d-792c-422e-8e95-4dfdf9b9867f.gif&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十六匹配帧&#34;&gt;&lt;strong&gt;技巧十六：匹配帧&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;如果你经常想在素材箱里找到对应时间线上的素材但是却不知道怎么做，那么F键就会是你的救星，只需要按下F键，你就能够在素材监视器上找到对应的帧，这样可以有效的帮助你进行素材的替换或者修改。如果你想从素材监视器上找到时间线上对应的帧，只需要按下Shift+R就可以实现。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230804-3e9d88e4-62cb-4dc2-9c42-e46e277a4ad7.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十七时间轴放大&#34;&gt;&lt;strong&gt;技巧十七，时间轴放大&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;通常我们使用+/-号缩放时间轴，但是你也可以使用反斜杠来进行快速缩放，只需要按一下你就可以缩放到整个序列的长度，再按一下就可以回到之前的状态，相对效率会比加减号高很多。你也可以按下Ctrl+反斜杠来隐藏顶部的项目信息，对于屏幕较小的朋友这一点会很有用。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230478-97389677-e16e-433d-9729-1678b9fd91db.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十八移动剪辑&#34;&gt;&lt;strong&gt;技巧十八：移动剪辑&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;通常我们都需要鼠标移动剪辑，但是当你按下D选中对应素材以后其实你是可以按住Alt和上下左右键移动素材位置的，需要注意的是需要激活相应的轨道才能够进行移动，如果你想用更快的速度移动素材，那你可以按住Alt+Shift+方向键来快速拖动素材&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230483-df67370e-626c-4d46-ac62-cde2b579824c.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧十九抽取与删除&#34;&gt;&lt;strong&gt;技巧十九：抽取与删除&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当你想删除或者抽取一段素材的中间部分时，你可以通过i和o键设定工作区，随后使用分号键来删除工作区内的片段，如果你想抽取这个片段，只需要按下引号键就可以轻松实现。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230503-d6af9342-dd57-4baa-98e5-aec9c064dd08.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧二十轨道扩展&#34;&gt;&lt;strong&gt;技巧二十：轨道扩展&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;如果视频轨道太窄，通常你会需要使用鼠标滚轮放大相应的轨道，但是这样会花费不少时间，所以你可以选择使用Ctrl+加减号来缩放单个轨道的宽度，如果你想一次性扩展或者缩小所有轨道，那你可以使用Shift+加减号。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230896-fefdfa88-a2d4-4721-8769-5ddccdcf3d33.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧二十一迅速切换窗口&#34;&gt;&lt;strong&gt;技巧二十一：迅速切换窗口&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;当你选中一个窗口的时候，你就没法操控另一个窗口，传统的切换方法是使用鼠标点击，但是很少有人知道通过按住Shift+123你可以自由切换你所需要前往的窗口，这个可以大大提升你的工作效率，例如你可以迅速切换到素材监视器，设定出入点后将素材插入到时间线上来进行进一步的处理，这是我最经常使用的快捷键。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://cdn.nlark.com/yuque/0/2020/jpeg/799872/1581513230633-870834d5-924e-423d-8829-2077030c8ad3.jpeg&#34;&gt;&lt;/p&gt;
&lt;h1 id=&#34;技巧二十二快速选择输出范围&#34;&gt;&lt;strong&gt;技巧二十二：快速选择输出范围&lt;/strong&gt;&lt;/h1&gt;
&lt;p&gt;剪辑完成后，需要选择整体的输出范围，这个时候，常规的做法是用鼠标拖动入点和出点，以确定范围，但经常容易漏帧。&lt;/p&gt;
&lt;p&gt;快捷的方法是英文输入法下，点击键盘的“/” 反斜杠，和问号是同一个键。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Armbian 环境下安装并配置 Crawl4</title>
      <link>https://djd1226.github.io/posts/2025-07-221/</link>
      <pubDate>Tue, 22 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-221/</guid>
      <description>&lt;h4 id=&#34;-前言为什么-armbian-与众不同&#34;&gt;### 前言：为什么 Armbian 与众不同？&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;Crawl4AI&lt;/code&gt; 是一个强大的网页抓取工具，但它依赖的底层浏览器自动化库 Playwright 官方主要提供为普通电脑/服务器（x86_64 架构）编译的浏览器。我们的 Armbian 系统运行在 &lt;strong&gt;ARM 架构&lt;/strong&gt;上，因此无法使用官方的自动安装程序。本指南的核心就是绕过这个限制，手动配置，让 &lt;code&gt;Crawl4AI&lt;/code&gt; 在 Armbian 上完美运行。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&#34;-第一步系统环境准备-安装系统版浏览器&#34;&gt;### 第一步：系统环境准备 (安装系统版浏览器)&lt;/h4&gt;
&lt;p&gt;我们不使用 &lt;code&gt;Crawl4AI&lt;/code&gt; 自带的安装脚本，而是直接从 Armbian 的软件库中安装已经为 ARM 架构编译好的 Chromium 浏览器。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;更新软件列表并安装 Chromium&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt-get install -y chromium-browser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;获取浏览器路径:&lt;/p&gt;
&lt;p&gt;安装完成后，运行以下命令找到它的可执行文件路径，并复制这个路径以备后用。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which chromium-browser
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(通常路径为 &lt;code&gt;/usr/bin/chromium-browser&lt;/code&gt;)&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h4 id=&#34;-第二步安装-python-包并初始化环境&#34;&gt;### 第二步：安装 Python 包并初始化环境&lt;/h4&gt;
&lt;p&gt;接下来，我们安装 &lt;code&gt;Crawl4AI&lt;/code&gt; 的 Python 包，并进行一个关键的环境初始化步骤。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用 pip 安装 Crawl4AI&lt;/strong&gt;:&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install crawl4ai
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;初始化 Playwright 环境 (但不下载浏览器):&lt;/p&gt;</description>
    </item>
    <item>
      <title>rclone挂载谷歌网盘</title>
      <link>https://djd1226.github.io/posts/2025-07-22/</link>
      <pubDate>Tue, 22 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-22/</guid>
      <description>&lt;hr&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;运行 Rclone 官方安装脚本：&lt;/strong&gt; 这个脚本会自动检测您的系统架构并下载安装最新稳定版的 Rclone。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl https://rclone.org/install.sh | sudo bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;验证安装：&lt;/strong&gt; 运行以下命令查看版本号，如果成功显示版本信息，则表示安装成功。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rclone version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试配置:&lt;/strong&gt; 运行以下命令，如果能列出您 Google Drive 根目录的文件和文件夹，说明配置成功！&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rclone lsd gdrive:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(注意：&lt;code&gt;gdrive:&lt;/code&gt; 冒号不能少，&lt;code&gt;gdrive&lt;/code&gt; 是您之前给远程连接起的名字)。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3 id=&#34;第二阶段挂载-google-drive&#34;&gt;&lt;strong&gt;第二阶段：挂载 Google Drive&lt;/strong&gt;&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建挂载点:&lt;/strong&gt; 在您的主目录下创建一个文件夹，用来作为挂载点。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir -p ~/gdrive
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;执行挂载命令:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;rclone mount gdrive: ~/gdrive --daemon
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;rclone mount&lt;/code&gt;: 挂载命令。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;gdrive:&lt;/code&gt;: 您配置的远程名称。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;~/gdrive&lt;/code&gt;: 本地挂载点目录。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;--daemon&lt;/code&gt;: 让 rclone 在后台运行，这样您关闭 SSH 连接后挂载依然有效。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;验证挂载:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;df -h&lt;/code&gt; 命令，您应该能看到一个类型为 &lt;code&gt;fuse.rclone&lt;/code&gt; 的新文件系统。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用 &lt;code&gt;ls -l ~/gdrive&lt;/code&gt; 命令，您应该能看到您 Google Drive 里的文件。&lt;/p&gt;</description>
    </item>
    <item>
      <title>vaultwarden直接deb文件安装</title>
      <link>https://djd1226.github.io/posts/2025-07-201/</link>
      <pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-201/</guid>
      <description>&lt;p&gt;vaultwarden&lt;code&gt;.deb&lt;/code&gt; 包&lt;strong&gt;只包含了后端程序&lt;/strong&gt;，它需要另一个独立的包来提供前端界面。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;-解决方案-&#34;&gt;## 解决方案 🛠️&lt;/h3&gt;
&lt;p&gt;最直接的解决方法就是&lt;strong&gt;安装缺失的前端包&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id=&#34;方案一安装缺失的前端包-推荐&#34;&gt;&lt;strong&gt;方案一：安装缺失的前端包 (推荐)&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;您需要回到最初下载 &lt;code&gt;.deb&lt;/code&gt; 包的那个页面，找到并下载 &lt;code&gt;vaultwarden-webvault&lt;/code&gt; 这个包。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;下载前端包
&lt;a href=&#34;https://github.com/dani-garcia/vaultwarden/wiki/Third-party-packages&#34;&gt;第三方软件包&lt;/a&gt;
&lt;a href=&#34;https://build.opensuse.org/package/show/home:Masgalor:Vaultwarden/vaultwarden&#34;&gt;后端包&lt;/a&gt;
&lt;a href=&#34;https://build.opensuse.org/package/show/home:Masgalor:Vaultwarden/vaultwarden-webvault&#34;&gt;前端包&lt;/a&gt;
登陆：rain1226:ofen
在您下载 vaultwarden_1.34.1-1+1.1_amd64_ubuntu22.deb 的地方，应该还有一个类似下面这样命名的文件：&lt;/p&gt;
&lt;p&gt;vaultwarden-webvault_2024.5.0_all.deb&lt;/p&gt;
&lt;p&gt;(版本号 2024.5.0 可能会不同，架构通常是 all 因为它只包含网页文件)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装前端包&lt;/p&gt;
&lt;p&gt;使用 dpkg 命令安装它。这个包通常没有复杂的依赖。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo dpkg -i vaultwarden-webvault_xxxx_all.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(请将 &lt;code&gt;xxxx&lt;/code&gt; 替换为您下载的实际文件名)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;重启 Vaultwarden 服务&lt;/p&gt;
&lt;p&gt;安装好前端文件后，它们就会出现在后端程序期望的位置。现在只需重启服务即可。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl restart vaultwarden
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;再次检查状态&lt;/p&gt;
&lt;p&gt;等待几秒钟，然后再次检查服务状态，这次应该就是 active (running) 了。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo systemctl status vaultwarden
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;vaultwarden-的配置通常在&#34;&gt;Vaultwarden 的配置通常在&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;/etc/vaultwarden.cfg&lt;/code&gt;（取决于打包方式）。&lt;/p&gt;
&lt;p&gt;打开这个文件，找到并修改
&lt;code&gt;SIGNUPS_ALLOWED=true 为 SIGNUPS_ALLOWED=false&lt;/code&gt;，然后重启服务
&lt;code&gt;sudo systemctl restart vaultwarden&lt;/code&gt;。&lt;/p&gt;</description>
    </item>
    <item>
      <title>编译Rust之Stump电子书库</title>
      <link>https://djd1226.github.io/posts/2025-07-20/</link>
      <pubDate>Sun, 20 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-20/</guid>
      <description>&lt;p&gt;这就是编译和部署中最经典的困境：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译时&lt;/strong&gt;：我们需要一个&lt;strong&gt;新环境&lt;/strong&gt;（Debian 12），因为它有程序源码需要的、新的开发工具和库（比如 &lt;code&gt;libglib-2.0 &amp;gt;= 2.70&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;运行时&lt;/strong&gt;：我们需要产物能在一个&lt;strong&gt;旧环境&lt;/strong&gt;（Debian 11）上运行，因为它只有旧版的系统基础库（&lt;code&gt;glibc&lt;/code&gt;）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;幸运的是，Rust 语言的工具链非常强大，它提供了一个完美的解决方案来解决这个悖论。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;最终解决方案静态编译-static-compilation-using-musl&#34;&gt;&lt;strong&gt;最终解决方案：静态编译 (Static Compilation using MUSL)&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;我们的最终目标是生成一个&lt;strong&gt;不依赖任何系统库&lt;/strong&gt;的、完全独立的“绿色”程序。这样它就不再关心你的 VPS 是 Debian 11、12 还是其他什么系统了。&lt;/p&gt;
&lt;p&gt;这个技术叫做“静态编译”，我们将使用一个名为 &lt;code&gt;MUSL&lt;/code&gt; 的C语言基础库来替代主流的 &lt;code&gt;GLIBC&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;GLIBC (动态链接)&lt;/strong&gt;：程序运行时，需要去“借用”操作系统的基础库。操作系统版本不对，就借不到，程序报错。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;MUSL (静态链接)&lt;/strong&gt;：在编译的最后一步，把所有需要的基础库功能，像“干粮”一样，全部打包进最终的程序文件里。程序运行时自给自足，完全不依赖外部系统。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这完美地契合了你最初“&lt;strong&gt;单文件，占用资源较少，不需要安装依赖&lt;/strong&gt;”的设想。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;终极操作指南编译一个真正的静态程序&#34;&gt;&lt;strong&gt;终极操作指南：编译一个真正的静态程序&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;我们将继续使用 Debian 12 作为我们的编译环境（因为它有我们需要的新版开发工具），但我们会告诉编译器，我们的最终目标是生成一个基于 MUSL 的静态程序。&lt;/p&gt;
&lt;h4 id=&#34;第一步彻底清理旧环境&#34;&gt;&lt;strong&gt;第一步：彻底清理旧环境&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;和上次一样，我们先删除旧的 &lt;code&gt;stump-builder&lt;/code&gt; 容器，确保从一个干净的状态开始。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;如果你还在容器里，请 &lt;code&gt;exit&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在你&lt;strong&gt;本地电脑的终端&lt;/strong&gt;运行：&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker stop stump-builder
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker rm stump-builder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&#34;第二步启动-debian-12-编译容器&#34;&gt;&lt;strong&gt;第二步：启动 Debian 12 编译容器&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;这一步和上次完全一样，我们仍然需要 Debian 12 的新环境来满足&lt;strong&gt;编译时&lt;/strong&gt;的依赖。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run -it \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --name stump-builder \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -v &amp;#34;$(pwd)&amp;#34;:/build \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --env &amp;#34;HTTP_PROXY=http://172.17.0.1:7890&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  --env &amp;#34;HTTPS_PROXY=http://172.17.0.1:7890&amp;#34; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  debian:12-slim \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  /bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;第三步在-debian-12-容器内执行全新的编译步骤&#34;&gt;&lt;strong&gt;第三步：在 Debian 12 容器内执行全新的编译步骤&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;进入容器后，请一步步执行以下命令。注意，依赖包和编译命令都发生了变化。&lt;/p&gt;</description>
    </item>
    <item>
      <title>CSS选择器详解</title>
      <link>https://djd1226.github.io/posts/2025-07-14/</link>
      <pubDate>Mon, 14 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-14/</guid>
      <description>&lt;p&gt;首先，一个核心概念要明确：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSS选择器是一套独立的“语言”，它本身与Python或JavaScript无关。&lt;/strong&gt; 无论你在哪里使用它，语法规则都是完全一样的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在Python的BeautifulSoup里，你把选择器字符串传给 &lt;code&gt;soup.select(&#39;...&#39;)&lt;/code&gt; 函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在JavaScript里，你把&lt;strong&gt;同样&lt;/strong&gt;的字符串传给 &lt;code&gt;document.querySelectorAll(&#39;...&#39;)&lt;/code&gt; 函数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在CSS样式表里，你直接使用它来定义样式。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以，学会了怎么写选择器，你就等于掌握了一项在所有这些技术中通用的技能。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;javascript中如何使用css选择器&#34;&gt;JavaScript中如何使用CSS选择器&lt;/h3&gt;
&lt;p&gt;在JS脚本（尤其是在浏览器控制台里调试时），你主要会用到这两个函数：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;document.querySelector(&#39;你的选择器&#39;)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&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;code&gt;null&lt;/code&gt;。当你确定只有一个目标时，用它很方便。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;document.querySelectorAll(&#39;你的选择器&#39;)&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;作用&lt;/strong&gt;：返回匹配到的 &lt;strong&gt;所有&lt;/strong&gt; 元素，以一个列表（&lt;code&gt;NodeList&lt;/code&gt;）的形式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特点&lt;/strong&gt;：这是我们爬虫和调试时最常用的！它和Python里的 &lt;code&gt;soup.select()&lt;/code&gt; 功能几乎完全一样。如果找不到，返回一个空列表。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;这是你在将选择器放入Python代码前，进行测试的最佳方式！&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;css选择器参数写法速查宝典&#34;&gt;CSS选择器参数写法“速查宝典”&lt;/h3&gt;
&lt;p&gt;下面，我为你整理了一份从入门到精通的CSS选择器写法“秘笈”，并结合 &lt;code&gt;docs.crawl4ai.com&lt;/code&gt; 的例子来说明。&lt;/p&gt;
&lt;h4 id=&#34;1-基础选择器-the-basics&#34;&gt;1. 基础选择器 (The Basics)&lt;/h4&gt;
&lt;p&gt;类型&lt;/p&gt;
&lt;p&gt;语法&lt;/p&gt;
&lt;p&gt;例子 (针对crawl4ai)&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;code&gt;tag&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;h1&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;选取所有 &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt; 标签。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;类名&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.classname&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;.terminal-mkdocs-side-nav-item&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;选取所有 &lt;code&gt;class&lt;/code&gt; 属性包含这个类名的元素。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ID&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#idname&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;#Introduction&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;选取 &lt;code&gt;id&lt;/code&gt; 属性等于 &lt;code&gt;Introduction&lt;/code&gt; 的元素（ID在页面中应唯一）。&lt;/p&gt;
&lt;h4 id=&#34;2-组合选择器-relationships&#34;&gt;2. 组合选择器 (Relationships)&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;&lt;code&gt;A B&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>n8n使用code节点清洗数据</title>
      <link>https://djd1226.github.io/posts/2025-07-13/</link>
      <pubDate>Sun, 13 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-13/</guid>
      <description>&lt;p&gt;&lt;strong&gt;crawl4ai真实数据结构&lt;/strong&gt;，&lt;code&gt;raw_markdown&lt;/code&gt; 的正确路径是：&lt;/p&gt;
&lt;p&gt;&lt;code&gt;item.json.results[0].markdown_v2.raw_markdown&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;我们来分解一下这个正确的路径：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;item&lt;/code&gt;：这是 n8n 传给 Code 节点的单个数据项，它的顶层就有一个叫 &lt;code&gt;&amp;quot;json&amp;quot;&lt;/code&gt; 的对象。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.json&lt;/code&gt;：进入这个 &lt;code&gt;&amp;quot;json&amp;quot;&lt;/code&gt; 对象。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.results&lt;/code&gt;：在 &lt;code&gt;&amp;quot;json&amp;quot;&lt;/code&gt; 对象内部，找到 &lt;code&gt;&amp;quot;results&amp;quot;&lt;/code&gt; 字段，它是一个数组 &lt;code&gt;[ ... ]&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;[0]&lt;/code&gt;：从这个数组中，取出第一个元素（因为编号从0开始）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.markdown_v2&lt;/code&gt;：在这个元素对象中，找到 &lt;code&gt;&amp;quot;markdown_v2&amp;quot;&lt;/code&gt; 字段。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;.raw_markdown&lt;/code&gt;：最后，从 &lt;code&gt;&amp;quot;markdown_v2&amp;quot;&lt;/code&gt; 对象中，取出我们最终需要的 &lt;code&gt;&amp;quot;raw_markdown&amp;quot;&lt;/code&gt; 文本。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;你之前的尝试都非常接近，只是因为 &lt;code&gt;crawl4ai&lt;/code&gt; 的输出实际上被包裹在了另一层 &lt;code&gt;json&lt;/code&gt; 对象里，这是我们之前无法预料到的。你通过 &lt;code&gt;console.log&lt;/code&gt; 把它找了出来，这正是最专业的调试方法！&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;最终的-n8n-code-节点代码&#34;&gt;最终的 n8n Code 节点代码&lt;/h3&gt;
&lt;p&gt;现在，请将你的 Code 节点代码&lt;strong&gt;完整替换&lt;/strong&gt;为下面这个&lt;strong&gt;最终正确版本&lt;/strong&gt;。它使用了正确的路径，并且依然保持了“健壮性”，可以防止因为未来可能的抓取失败而导致工作流崩溃。&lt;/p&gt;
&lt;p&gt;JavaScript&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;获取上一个节点传入的所有数据项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;items&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;input&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;all&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;遍历每一个数据项进行处理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;of&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;使用我们最终确定的正确路径来安全地访问数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;n&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;results&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;markdown_v2&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_markdown&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;最终清理流程&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;【关键新增步骤】将字符串&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;n&amp;#34;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;替换为真正的换行符&lt;/span&gt; \&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;这是解决你看到&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;`&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;`&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;而不换行的核心&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replaceAll&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\\&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;n&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;2.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;定义一个更全面的“垃圾内容”关键词黑名单&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;junkKeywords&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s1&#34;&gt;&amp;#39;分类&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;图像来源&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;图像加注文字&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;补充报导：BBC国际部&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s1&#34;&gt;&amp;#39;Article Information&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Author,&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Role,&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;热读&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;End of 热读&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;s1&#34;&gt;&amp;#39;更多相关内容&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;热门内容&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;特别推荐&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;BBC值得信赖的原因&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;© 2025 BBC&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;];&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;3.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;先用更强的正则表达式，移除所有图片和链接的&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Markdown&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;标记&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;!&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;\&lt;span class=&#34;p&#34;&gt;[[&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;\&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;\&lt;span class=&#34;p&#34;&gt;([&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;S&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;?&lt;/span&gt;\&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;4.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;【核心改进】按行处理，用更严格的规则过滤&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cleanedLines&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;lines&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;map&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;去除每行首尾的空格&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;filter&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;规则&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;过滤掉空行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;length&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;规则&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;b&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;过滤掉无意义的符号行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;*&amp;#39;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;===&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;###&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;规则&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;过滤掉类似&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;1. 1&amp;#34;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;或&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;10. 10&amp;#34;&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;这样的错误行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/^&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;\&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+$/.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;规则&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;过滤掉看起来像单独日期的行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/^&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;年&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;月&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;日&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$/.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/^&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;+&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;s小时前&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$/.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;规则&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;如果行内包含任何一个黑名单关键词，就过滤掉它&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;junkKeywords&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;some&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keyword&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;line&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;includes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keyword&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;bp&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;保留所有“干净”的行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;5.&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;将干净的行重新组合，并整理段落格式&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;let&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cleanedText&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cleanedLines&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;join&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;cleanedText&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cleanedText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;replace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;\&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,}&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\n\n&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;清理流程结束&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;---&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cleaned_markdown&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;cleanedText&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trim&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cleaned_markdown&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;处理失败：未能在指定的路径中找到内容。&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;//&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;返回被修改后的数据项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;items&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>正确的Python Code Crawl4ai节点脚本</title>
      <link>https://djd1226.github.io/posts/2025-07-11/</link>
      <pubDate>Fri, 11 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-11/</guid>
      <description>&lt;h3 id=&#34;正确的-python-code-___crawl4ai-节点脚本&#34;&gt;正确的 Python Code ___Crawl4ai 节点脚本&lt;/h3&gt;
&lt;p&gt;这次的方案不再依赖任何需要从外部安装的第三方库，而是完全使用了 n8n 的 Python (Pyodide) 环境内置的、专门为此设计的工具。它绕开了所有关于操作系统权限和模块缺失的限制。&lt;/p&gt;
&lt;p&gt;请将 Code 节点中的代码&lt;strong&gt;完整替换&lt;/strong&gt;为以下内容：&lt;/p&gt;
&lt;p&gt;Python&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 这是在 Pyodide 环境中进行网络请求的正确方法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 1. 导入 Pyodide 内置的 http 模块&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pyodide&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 2. 定义 API 请求所需的所有参数&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;api_url&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://name-crawl4ai.hf.space/crawl_sync&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;api_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;Your token&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;target_urls&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;https://example.com/&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 3. 构建请求头 (Headers) 和请求体 (Payload)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;accept&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;Authorization&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Bearer {api_token}&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s1&#34;&gt;&amp;#39;Content-Type&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;application/json&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;urls&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;target_urls&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 4. 使用 pyodide.http.pyfetch 发送请求&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 这是一个异步函数, 所以我们必须在它前面加上 await&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;正在使用 Pyodide 内置的 pyfetch 发送 API 请求...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pyodide&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;http&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pyfetch&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;api_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;method&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;POST&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# pyfetch 的 body 参数需要一个字符串, 所以我们用 json.dumps 转换&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;body&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dumps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 5. 检查响应是否成功&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ok&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;c1&#34;&gt;# 异步获取错误文本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;error_text&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP 错误! 状态码: {response.status}, 详情: {error_text}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;API 请求成功，已获取数据。&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 6. 异步获取并解析 JSON 数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# 7. 按照 n8n 的格式要求返回数据&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Exception&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;请求失败: {e}&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;raise&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;关键改动解读&#34;&gt;关键改动解读&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;import pyodide.http&lt;/code&gt;: 我们导入的是 Pyodide 环境特有的模块。&lt;/p&gt;</description>
    </item>
    <item>
      <title>HF部署的Crawl4AI  API 端点用途详解</title>
      <link>https://djd1226.github.io/posts/2025-07-08/</link>
      <pubDate>Tue, 08 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-08/</guid>
      <description>&lt;p&gt;我们可以把这些端点分为两大类：&lt;strong&gt;核心爬取功能&lt;/strong&gt;和&lt;strong&gt;辅助功能&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id=&#34;核心爬取功能&#34;&gt;核心爬取功能&lt;/h4&gt;
&lt;h5 id=&#34;1-post-crawl_sync-同步爬取---您正在使用的&#34;&gt;1. &lt;code&gt;POST /crawl_sync&lt;/code&gt; (同步爬取 - 您正在使用的)&lt;/h5&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;strong&gt;一直等待&lt;/strong&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;h5 id=&#34;2-post-crawl-和-get-tasktask_id-异步爬取---两步法&#34;&gt;2. &lt;code&gt;POST /crawl&lt;/code&gt; 和 &lt;code&gt;GET /task/{task_id}&lt;/code&gt; (异步爬取 - 两步法)&lt;/h5&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;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第一步 (&lt;code&gt;POST /crawl&lt;/code&gt;)&lt;/strong&gt;: 您先发送一个爬取请求。服务器收到后，不会马上开始爬取，而是立即返回一个&lt;strong&gt;任务ID (&lt;code&gt;task_id&lt;/code&gt;)&lt;/strong&gt;，好比给您一个取餐的号牌。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;第二步 (&lt;code&gt;GET /task/{task_id}&lt;/code&gt;)&lt;/strong&gt;: 您拿到 &lt;code&gt;task_id&lt;/code&gt; 后，可以过一会儿再用这个 ID 去调用 &lt;code&gt;/task/{task_id}&lt;/code&gt; 接口，查询任务的进度（例如：排队中、处理中、已完成、失败）。如果任务已完成，这个接口就会返回最终的爬取结果。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;h5 id=&#34;3-post-crawl_direct-直接爬取&#34;&gt;3. &lt;code&gt;POST /crawl_direct&lt;/code&gt; (直接爬取)&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;用途&lt;/strong&gt;: 从命名上看，它很可能也是一个&lt;strong&gt;同步端点&lt;/strong&gt;，类似于 &lt;code&gt;/crawl_sync&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;推测&lt;/strong&gt;: “Direct” 可能意味着它绕过了一些高级的内容处理（比如复杂的 Markdown 转换、内容过滤或文章提取），直接返回更“原始”的页面数据（例如，只提取纯文本或基础HTML）。这会让它的处理速度更快，但返回的信息没有经过深度加工。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;辅助功能&#34;&gt;辅助功能&lt;/h4&gt;
&lt;h5 id=&#34;4-get-health-健康检查&#34;&gt;4. &lt;code&gt;GET /health&lt;/code&gt; (健康检查)&lt;/h5&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;code&gt;{&amp;quot;status&amp;quot;: &amp;quot;ok&amp;quot;}&lt;/code&gt;）。自动化监控系统会定期调用这个接口，如果发现调用失败或超时，就会发出警报，提醒管理员服务可能出问题了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>API 请求映射到 n8n</title>
      <link>https://djd1226.github.io/posts/2025-07-07/</link>
      <pubDate>Mon, 07 Jul 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-07-07/</guid>
      <description>&lt;p&gt;如何将任何代码（无论是 &lt;code&gt;curl&lt;/code&gt;、Python 还是 JavaScript）中的 API 请求，映射到 n8n 的 HTTP Request 节点上。&lt;/p&gt;
&lt;h3 id=&#34;第一步理解一个-api-请求的四要素&#34;&gt;第一步：理解一个 API 请求的“四要素”&lt;/h3&gt;
&lt;p&gt;无论用什么工具，一个标准的 HTTP API 请求（特别是 &lt;code&gt;POST&lt;/code&gt; 请求）通常都由四个核心部分组成，就像寄一个快递一样：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;方法 (Method)&lt;/strong&gt;: 你想让服务器做什么操作。(&lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;PUT&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; 等)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;好比&lt;/strong&gt;: 告诉快递员你是要“寄件”(POST) 还是“查件”(GET)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;网址 (URL)&lt;/strong&gt;: 你要把请求发送到哪里。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;好比&lt;/strong&gt;: 快递包裹上的“收件人地址”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;请求头 (Headers)&lt;/strong&gt;: 关于这次请求的“元数据”或“说明书”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;好比&lt;/strong&gt;: 快递单上的附加信息，比如“内含易碎品”(Content-Type)、“寄件人身份证号”(Authorization)。它描述的是这个包裹本身，而不是里面的东西。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;请求体 (Body)&lt;/strong&gt;: 你实际发送给服务器的数据。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;好比&lt;/strong&gt;: 你要寄送的“包裹里的物品”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;n8n 的 HTTP Request 节点界面，就是围绕这“四要素”设计的，只不过是用图形化的方式来呈现。&lt;/p&gt;
&lt;h3 id=&#34;第二步将脚本代码与四要素对应&#34;&gt;第二步：将脚本代码与“四要素”对应&lt;/h3&gt;
&lt;p&gt;让我们以我们最终成功的 &lt;code&gt;curl&lt;/code&gt; 命令为例，因为它最能清晰地体现这四要素：&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &amp;#39;https://rain1226-crawl4ai.hf.space/crawl_sync&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &amp;#39;Content-Type: application/json&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -H &amp;#39;Authorization: Bearer password&amp;#39; \
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -d &amp;#39;{
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;urls&amp;#34;: [&amp;#34;https://www.python.org&amp;#34;],
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;#34;crawler_options&amp;#34;: {}
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  }&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;我们来分解这个命令：&lt;/p&gt;</description>
    </item>
    <item>
      <title>从搜狗双拼切换到小鹤双拼面</title>
      <link>https://djd1226.github.io/posts/2025-06-21/</link>
      <pubDate>Sat, 21 Jun 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-06-21/</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;零声母音节的处理方式&lt;/strong&gt;（这是最根本的区别）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;部分韵母的键位定义&lt;/strong&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面我将为您详细拆解，并提供记忆方法，助您平稳过渡。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;一最大的不同零声母的处理方式&#34;&gt;一、最大的不同：零声母的处理方式&lt;/h3&gt;
&lt;p&gt;这是您需要建立的第一个新习惯，也是小鹤方案高效的原因之一。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;搜狗双拼 (旧习惯)：&lt;/p&gt;
&lt;p&gt;处理零声母音节（如 a, an, ang, o, ou 等）时，需要先按下一个虚拟的“零声母引导键”，通常是 O 键。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入“安”(an)：需要按 &lt;code&gt;O&lt;/code&gt; + &lt;code&gt;J&lt;/code&gt; (&lt;code&gt;J&lt;/code&gt;是搜狗方案里&lt;code&gt;an&lt;/code&gt;的键位)。&lt;/li&gt;
&lt;li&gt;输入“昂”(ang)：需要按 &lt;code&gt;O&lt;/code&gt; + &lt;code&gt;D&lt;/code&gt; (&lt;code&gt;D&lt;/code&gt;是搜狗方案里&lt;code&gt;ang&lt;/code&gt;的键位)。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;小鹤双拼 (新习惯)：&lt;/p&gt;
&lt;p&gt;彻底抛弃了零声母引导键。直接将零声母音节的第一个字母视为声母。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;输入“安”(an)：直接按 &lt;code&gt;an&lt;/code&gt; 所在的键，即 &lt;code&gt;J&lt;/code&gt; 键（&lt;code&gt;a&lt;/code&gt;在&lt;code&gt;A&lt;/code&gt;，&lt;code&gt;n&lt;/code&gt;在&lt;code&gt;N&lt;/code&gt;，所以&lt;code&gt;an&lt;/code&gt;双拼在&lt;code&gt;J&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;输入“昂”(ang)：直接按 &lt;code&gt;ang&lt;/code&gt; 所在的键，即 &lt;code&gt;K&lt;/code&gt; 键。&lt;/li&gt;
&lt;li&gt;输入“爱”(ai)：直接按 &lt;code&gt;ai&lt;/code&gt; 所在的键，即 &lt;code&gt;D&lt;/code&gt; 键。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;您需要做的改变：&lt;/strong&gt; 忘记 &lt;code&gt;O&lt;/code&gt; 键！以后凡是遇到 a, e, o 开头的音节，就把它当成一个普通的双拼音节直接输入即可。这是最核心、最重要的一个转变。&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&#34;二需要重新记忆的韵母键位&#34;&gt;二、需要重新记忆的韵母键位&lt;/h3&gt;
&lt;p&gt;许多键位在两个方案中是相同的，这会减轻您的学习负担。我们重点关注那些&lt;strong&gt;发生了变化&lt;/strong&gt;的键位。&lt;/p&gt;
&lt;p&gt;下表清晰地列出了所有不同点，以及帮助您记忆的“小鹤口诀”提示。&lt;/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;&lt;strong&gt;小鹤双拼键位 (新)&lt;/strong&gt;&lt;/p&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=&#34;text-align: left&#34;&gt;韵母&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;搜狗双拼键位 (旧)&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;小鹤双拼键位 (新)&lt;/th&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;记忆提示与口诀（重点看）&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ai&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;L&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;D&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;爱(ai)戴(dài) -&amp;gt; &lt;code&gt;ai&lt;/code&gt; 在 &lt;code&gt;D&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;an&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;M&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;J&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;安(an)静(jìng) -&amp;gt; &lt;code&gt;an&lt;/code&gt; 在 &lt;code&gt;J&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ang&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;D&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;K&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;昂(áng)首挺胸看(k) -&amp;gt; &lt;code&gt;ang&lt;/code&gt; 在 &lt;code&gt;K&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;iang&lt;/code&gt;&lt;!-- raw HTML omitted --&gt;&lt;code&gt;uang&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;K&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;L&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;姑娘(niáng)靓(liàng) -&amp;gt; &lt;code&gt;iang&lt;/code&gt; 在 &lt;code&gt;L&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ong&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;轰(hōng)隆隆 -&amp;gt; &lt;code&gt;ong&lt;/code&gt; 在 &lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;iong&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;Y&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;穷(qióng)困潦倒用(y)钱 -&amp;gt; &lt;code&gt;iong&lt;/code&gt; 在 &lt;code&gt;Y&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;ing&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;H&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;Y&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;英(yīng)雄 -&amp;gt; &lt;code&gt;ing&lt;/code&gt; 和 &lt;code&gt;iong&lt;/code&gt; 都在 &lt;code&gt;Y&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;in&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;J&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;N&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;因(yīn)为(n) -&amp;gt; &lt;code&gt;in&lt;/code&gt; 在 &lt;code&gt;N&lt;/code&gt; (本身就是N)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;un&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;Y&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;P&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;温(wēn)柔一刀劈(pī) -&amp;gt; &lt;code&gt;un&lt;/code&gt; 在 &lt;code&gt;P&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;快速总结您需要重点练习的8个新键位：&lt;code&gt;D, J, K, L, H, Y, N, P&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>自选Reality的目标网站</title>
      <link>https://djd1226.github.io/posts/2025-05-28/</link>
      <pubDate>Wed, 28 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-28/</guid>
      <description>&lt;h2 id=&#34;选择目标网站需满足的条件目标网站要满足4个条件&#34;&gt;选择目标网站需满足的条件目标网站要满足4个条件：&lt;/h2&gt;
&lt;p&gt;最主要的是TLs1.3、H2协议和是否套了CDN&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1.1、使用Tls1.3协议 ：tls是传输层安全协议，1.3是Tls1.2的升级版，访问速度更快刚安全&lt;/li&gt;
&lt;li&gt;1.2、X25519：是一种签名算法，TLS 1.3 标准支持使用 X25519，速度快，数据量小，用来申请证书&lt;/li&gt;
&lt;li&gt;1.3、H2协议：即HTTP2.0，简称h2，引入了Stream，实现对一个 TCP 连接的多路复用，极大提高了传输性能&lt;/li&gt;
&lt;li&gt;1.4、未套CDN：对于非reality节点的数据转发到dest时，如果reality的dest目标网站套了CDN，这些数据会被自动转发到CF的CDN节点，CDN节点我们的reality节点就变成了别人的反代加速节点。因此目标网站不能使用套CDN的域名，如怎么判断是否套了CDN?
&lt;strong&gt;查看是否套用了CDN：&lt;/strong&gt;
在目标网站域名后添加 &lt;code&gt;/cdn-cgi/trace&lt;/code&gt; 是Cloudflare的CDN 调试接口，所有托管在 Cloudflare 上的网站都存在这个接口，并且套了CDN的网站都会使用Cloudflare签发的证书!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;reality目标网站获取方式目标网站获取有三种方式&#34;&gt;Reality目标网站获取方式目标网站获取有三种方式&lt;/h2&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;h4 id=&#34;第一种方式简单网站已经为我们筛选好了只要符合目标网站的几个特征可拿来直接使用但无法指定区域与自己的vps离得可能很远对访问速度会有影响第二种方式可以自定义查找离自己服务器近的可用网站操作相对灵活但操作上稍微繁琐需要一定的动手能力第三种方式可以方便获得目标网站但与第一种一样无法指定区域&#34;&gt;第一种方式简单，网站已经为我们筛选好了，只要符合目标网站的几个特征可拿来直接使用，但无法指定区域与自己的VPS离得可能很远，对访问速度会有影响。第二种方式可以自定义查找离自己服务器近的可用网站，操作相对灵活，但操作上稍微繁琐需要一定的动手能力。第三种方式可以方便获得目标网站，但与第一种一样无法指定区域。&lt;/h4&gt;
&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;第一种方式：网站直接获取&lt;a href=&#34;https://www.ssllabs.com/ssltest/index.htmlhttps://securityheaders.com&#34;&gt;https://www.ssllabs.com/ssltest/index.htmlhttps://securityheaders.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;第二种方式：FOFA手动搜索获取ASN查询工具：&lt;a href=&#34;https://tools.ipip.net/as.php&#34;&gt;https://tools.ipip.net/as.php&lt;/a&gt;目标网站查询工具：&lt;a href=&#34;https://fofa.info&#34;&gt;https://fofa.info&lt;/a&gt;
查询命令：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;gt; asn==&amp;#34;16509&amp;#34; &amp;amp;&amp;amp; country==&amp;#34;US&amp;#34; &amp;amp;&amp;amp; port==&amp;#34;443&amp;#34; &amp;amp;&amp;amp; cert!=&amp;#34;Let&amp;#39;s Encrypt&amp;#34; &amp;amp;&amp;amp; cert.issuer!=&amp;#34;ZeroSSL&amp;#34; &amp;amp;&amp;amp; status_code=&amp;#34;200&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这句话的意思是查询自己vps自治域美国区域，端口为443，不是由临时证书颁发机构颁发的证书，且http请求成功的网站。Let&amp;rsquo;s Encrypt与ZeroSSL都是免费证书，有效期都是90天
&lt;strong&gt;asn：&lt;/strong&gt;（自治域号码）
&lt;strong&gt;port==&amp;ldquo;443&amp;rdquo;&lt;/strong&gt; （端口）
&lt;strong&gt;cert!=&amp;ldquo;Let&amp;rsquo;s Encrypt&amp;rdquo;&lt;/strong&gt; （不是Let&amp;rsquo;s Encrypt类型的证书）
&lt;strong&gt;cert.issuer!=&amp;ldquo;ZeroSSL&amp;rdquo;&lt;/strong&gt;（证书颁发者不是ZeroSSL）
&lt;strong&gt;status_code=&amp;ldquo;200&amp;rdquo;&lt;/strong&gt;（HTTP 响应状态码，200的意思是Http请求成功）
4. 本地工具获取目标网站RealiTLScanner：&lt;a href=&#34;https://github.com/XTLS/RealiTLScanner&#34;&gt;https://github.com/XTLS/RealiTLScanner/releases3.1&lt;/a&gt;
在软件目录打开命令行窗口 CMD3.2
运行命令：将命令行中的1.1.1.1IP地址更换为自己VPS的IP地址&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; .\RealiTLScanner-windows-64.exe -addr 1.1.1.1 -port 443 -thread 100 -timeOut 5 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    <item>
      <title>使用 `sabre/dav` 库----WebDAV 教程</title>
      <link>https://djd1226.github.io/posts/2025-05-25/</link>
      <pubDate>Sun, 25 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-25/</guid>
      <description>&lt;h2 id=&#34;安装sabredav-库&#34;&gt;安装&lt;code&gt;sabre/dav&lt;/code&gt; 库&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;WebDAV 入门教程 (基于 sabre/dav)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一部分：什么是 WebDAV？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;WebDAV (Web Distributed Authoring and Versioning) 是一种基于 HTTP 协议的扩展，允许客户端像操作本地文件一样，对服务器上的文件进行创建、读取、修改和删除等操作。  简单来说，它让你可以通过网络像访问本地硬盘一样访问服务器上的文件。&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;strong&gt;PHP:&lt;/strong&gt; 确保您的 PHP 版本符合 &lt;code&gt;sabre/dav&lt;/code&gt; 的要求 (通常是 PHP 7.4 或更高版本)。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Composer:&lt;/strong&gt; Composer 是 PHP 的依赖管理工具。如果您还没有安装，请访问 &lt;a href=&#34;https://getcomposer.org/&#34;&gt;https://getcomposer.org/&lt;/a&gt; 下载并安装。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Web 服务器 (例如 Apache 或 Nginx):&lt;/strong&gt; 用于运行您的 PHP 代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;第三部分：安装 sabre/dav&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建项目目录：&lt;/strong&gt;  首先，创建一个新的目录来存放您的 WebDAV 项目。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir my-webdav-server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; my-webdav-server
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用 Composer 安装 sabre/dav：&lt;/strong&gt;  在项目目录中，运行以下命令来安装 &lt;code&gt;sabre/dav&lt;/code&gt; 库：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;composer require sabre/dav ~4.7.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这将自动下载并安装 &lt;code&gt;sabre/dav&lt;/code&gt; 及其依赖项。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cloudflare&#43;resend无限多企业邮箱，可收发邮件</title>
      <link>https://djd1226.github.io/posts/2025-05-20/</link>
      <pubDate>Tue, 20 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-20/</guid>
      <description>&lt;h3 id=&#34;在赛博大善人cloudflare那里白嫖无限多个企业级邮箱这些邮箱既可以收邮件也可以发邮件&#34;&gt;在赛博大善人cloudflare那里白嫖无限多个企业级邮箱，这些邮箱既可以收邮件，也可以发邮件。&lt;/h3&gt;
&lt;p&gt;可以用来接收网站验证码，注册账户的时候就可以很方便的注册一大堆小号。 还可以把他们当成临时邮箱，与人通信，避免暴露自己真实的邮箱，保护个人隐私。 Cloudflare是一家提供CDN、网络安全、DDos防御和域名服务的公司。人称大善人，赛博活佛，让你瞬间获得无限多个免费邮箱!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;我已经配置好了所有发送到me.xyz域名下面的邮件都会自动转到我的163的邮箱&lt;/strong&gt; 。这样就实现了无限多个邮箱可以收邮件！&lt;/p&gt;
&lt;h2 id=&#34;发邮件&#34;&gt;发邮件&lt;/h2&gt;
&lt;p&gt;使用邮箱发送邮件，我使用的服务是**&lt;a href=&#34;http://resend.com/&#34;&gt;resend.com&lt;/a&gt;** ，这也是一个免费的服务。没有账号的话就自己注册一个(github账户登录），然后添加一个自己的API Keys！
&lt;strong&gt;我已经配置好可以通过任何一个我的xyz域名邮箱来发送邮件，如name@123.xyz&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;使用python发邮件&#34;&gt;使用Python发邮件&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-csharp&#34; data-lang=&#34;csharp&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;先安装依赖&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pip&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;install&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resend&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;这里换成自己的&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;resend&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;API&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Key&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;resend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;api_key&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;re_xxxxxxxxxxxxxxxxxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Emails&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;SendParams&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;   &lt;span class=&#34;err&#34;&gt;#&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;发件人可以是自己域名下的任何一个人&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;name@123.xyz&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;name@qq.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;subject&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;hi&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s&#34;&gt;&amp;#34;html&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;&amp;#34;&amp;lt;strong&amp;gt;hello, world!&amp;lt;/strong&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resend&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Emails&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;send&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;params&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;email&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;使用curl发邮件&#34;&gt;使用cURL发邮件&lt;/h3&gt;
&lt;p&gt;Authorization 换成自己的resend API Key&lt;/p&gt;
&lt;p&gt;发件人可以是自己域名下的任何一个人&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl -X POST &lt;span class=&#34;s1&#34;&gt;&amp;#39;https://api.resend.com/emails&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; -H &lt;span class=&#34;s1&#34;&gt;&amp;#39;Authorization: Bearer re_VxeNCEn1_6w4bYF93xQKgKGFYRxNK2D3J&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; -H &lt;span class=&#34;s1&#34;&gt;&amp;#39;Content-Type: application/json&amp;#39;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt; -d 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;```&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;from&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;Acme &amp;lt;name@你的域名&amp;gt;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name@qq.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;subject&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;hello world&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;text&amp;#34;&lt;/span&gt;: &lt;span class=&#34;s2&#34;&gt;&amp;#34;it works!&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;使用smtp发件&#34;&gt;使用Smtp发件&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;使用Smtp发件，服务器地址为&lt;code&gt;smtp.resend.com&lt;/code&gt;，端口为&lt;code&gt;25/465/587/2465/2587&lt;/code&gt;，用户名为&lt;code&gt;resend&lt;/code&gt;，密码为 apikey。详见 &lt;a href=&#34;https://www.nodeseek.com/jump?to=https%3A%2F%2Fresend.com%2Fdocs%2Fsend-with-smtp%23does-the-rate-limit-apply-when-sending-with-smtp&#34;&gt;文档&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Nginx 配置反向代理指向本机的不同服务</title>
      <link>https://djd1226.github.io/posts/2025-05-18/</link>
      <pubDate>Sun, 18 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-18/</guid>
      <description>&lt;p&gt;通用的 &lt;strong&gt;Nginx 配置&lt;/strong&gt;，通过 &lt;strong&gt;反向代理&lt;/strong&gt; 将不同的域名指向本机的不同服务。所有的虚拟主机都会监听 &lt;strong&gt;80 端口&lt;/strong&gt;，但通过不同的 &lt;code&gt;server_name&lt;/code&gt; 来访问不同的服务。&lt;/p&gt;
&lt;h3 id=&#34;配置示例&#34;&gt;配置示例&lt;/h3&gt;
&lt;p&gt;假设你有多个服务运行在本机的不同端口上（例如 8080, 8081, 8082 等），并且你希望通过不同的域名来访问这些服务。&lt;/p&gt;
&lt;h4 id=&#34;配置结构&#34;&gt;配置结构：&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;service1.com&lt;/code&gt; 访问本机的服务（比如：端口 8080）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service2.com&lt;/code&gt; 访问本机的服务（比如：端口 8081）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;service3.com&lt;/code&gt; 访问本机的服务（比如：端口 8082）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;nginx-配置文件&#34;&gt;Nginx 配置文件&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-nginx&#34; data-lang=&#34;nginx&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;server_name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;service1.com&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;www.service1.com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://127.0.0.1:8080&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# 转发到本机的 8080 端口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Real-IP&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Forwarded-For&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;server_name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;service2.com&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;www.service2.com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://127.0.0.1:8081&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# 转发到本机的 8081 端口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Real-IP&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Forwarded-For&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;server&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;listen&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;80&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;server_name&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;service3.com&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;www.service3.com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;kn&#34;&gt;location&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_pass&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;http://127.0.0.1:8082&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;  &lt;span class=&#34;c1&#34;&gt;# 转发到本机的 8082 端口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;Host&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$host&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Real-IP&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$remote_addr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Forwarded-For&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;kn&#34;&gt;proxy_set_header&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$scheme&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;配置说明&#34;&gt;配置说明：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;server_name&lt;/code&gt;&lt;/strong&gt;：每个 &lt;code&gt;server&lt;/code&gt; 块都有不同的 &lt;code&gt;server_name&lt;/code&gt;，这会让 Nginx 根据请求的域名来决定应该使用哪个配置块来处理请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;proxy_pass&lt;/code&gt;&lt;/strong&gt;：将请求反向代理到本机的不同端口（如 8080、8081、8082 等）。这里假设你有三个服务分别运行在这些端口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;proxy_set_header&lt;/code&gt;&lt;/strong&gt;：这些指令确保 Nginx 正确地传递一些头信息，保留客户端的原始请求信息，包括：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;X-Real-IP&lt;/code&gt;：客户端的真实 IP 地址。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-For&lt;/code&gt;：通过代理传递的 IP 地址链。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;X-Forwarded-Proto&lt;/code&gt;：用于知道请求使用的协议（HTTP 或 HTTPS）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Host&lt;/code&gt;：客户端请求的域名。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;访问方式&#34;&gt;访问方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;当用户访问 &lt;code&gt;http://service1.com&lt;/code&gt; 时，Nginx 会将请求反向代理到本机的 &lt;code&gt;http://127.0.0.1:8080&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;当用户访问 &lt;code&gt;http://service2.com&lt;/code&gt; 时，Nginx 会将请求反向代理到本机的 &lt;code&gt;http://127.0.0.1:8081&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;当用户访问 &lt;code&gt;http://service3.com&lt;/code&gt; 时，Nginx 会将请求反向代理到本机的 &lt;code&gt;http://127.0.0.1:8082&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;注意事项&#34;&gt;注意事项&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;DNS 配置&lt;/strong&gt;：确保你在 DNS 上正确配置了 &lt;code&gt;service1.com&lt;/code&gt;, &lt;code&gt;service2.com&lt;/code&gt;, &lt;code&gt;service3.com&lt;/code&gt; 等域名，使其指向你的服务器 IP。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端口&lt;/strong&gt;：确保目标服务（例如，8080、8081、8082 等）已经在本地正确启动，并且能响应请求。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防火墙设置&lt;/strong&gt;：确保防火墙允许 Nginx 访问这些服务端口。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;小结&#34;&gt;小结&lt;/h3&gt;
&lt;p&gt;通过这种方式，你可以利用不同的域名来访问本机的不同服务，且不需要为每个服务单独配置不同的端口，所有的请求都通过 80 端口进行访问，非常适合做反向代理。&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用pyenv编译Python项目为PEX文件</title>
      <link>https://djd1226.github.io/posts/2025-05-16/</link>
      <pubDate>Fri, 16 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-16/</guid>
      <description>&lt;h2 id=&#34;前提条件&#34;&gt;前提条件&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;安装 &lt;code&gt;pyenv&lt;/code&gt;&lt;/strong&gt;
&lt;code&gt;pyenv&lt;/code&gt; 是 Python 版本管理工具，用来管理不同的 Python 版本。你需要先安装 &lt;code&gt;pyenv&lt;/code&gt; 和 &lt;code&gt;pyenv-virtualenv&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;安装 &lt;code&gt;pyenv&lt;/code&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装 pyenv&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl https://pyenv.run &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; bash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装 &lt;code&gt;pyenv-virtualenv&lt;/code&gt;：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pyenv install pyenv-virtualenv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;步骤&#34;&gt;步骤&lt;/h2&gt;
&lt;h3 id=&#34;1-安装-python-版本&#34;&gt;1. 安装 Python 版本&lt;/h3&gt;
&lt;p&gt;使用 &lt;code&gt;pyenv&lt;/code&gt; 安装合适的 Python 版本：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pyenv install 3.11.2  &lt;span class=&#34;c1&#34;&gt;# 安装指定版本的 Python&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pyenv global 3.11.2   &lt;span class=&#34;c1&#34;&gt;# 设置为全局默认版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你也可以创建一个虚拟环境：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pyenv virtualenv 3.11.2 myenv  &lt;span class=&#34;c1&#34;&gt;# 创建虚拟环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pyenv activate myenv           &lt;span class=&#34;c1&#34;&gt;# 激活虚拟环境&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;安装 &lt;code&gt;pex&lt;/code&gt; 工具&lt;/strong&gt;
&lt;code&gt;pex&lt;/code&gt; 用于打包 Python 项目为可执行文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install pex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后安装依赖：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;2-创建-setuppy-文件可选&#34;&gt;2. 创建 &lt;code&gt;setup.py&lt;/code&gt; 文件（可选）&lt;/h3&gt;
&lt;p&gt;如果你的项目没有 &lt;code&gt;setup.py&lt;/code&gt; 文件，建议手动创建一个。这个文件定义了模块和依赖。&lt;/p&gt;</description>
    </item>
    <item>
      <title>带有中文注释的 `.vimrc` 配置文件示例</title>
      <link>https://djd1226.github.io/posts/2025-05-13/</link>
      <pubDate>Tue, 13 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-13/</guid>
      <description>&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 设置基础选项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;number&lt;/span&gt;                  &lt;span class=&#34;c&#34;&gt;&amp;#34; 显示行号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;tabstop&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;               &lt;span class=&#34;c&#34;&gt;&amp;#34; 设置 Tab 宽度为 4（表示一个 Tab 占 4 个空格）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;shiftwidth&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;4&lt;/span&gt;            &lt;span class=&#34;c&#34;&gt;&amp;#34; 设置缩进时的宽度为 4（用于自动缩进）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;expandtab&lt;/span&gt;               &lt;span class=&#34;c&#34;&gt;&amp;#34; 使用空格代替 Tab（Tab 键输入的字符会变成空格）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;ignorecase&lt;/span&gt;              &lt;span class=&#34;c&#34;&gt;&amp;#34; 搜索时忽略大小写&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;smartcase&lt;/span&gt;               &lt;span class=&#34;c&#34;&gt;&amp;#34; 如果搜索字符串包含大写字母，则不忽略大小写（智能匹配）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;hlsearch&lt;/span&gt;                &lt;span class=&#34;c&#34;&gt;&amp;#34; 高亮搜索结果（搜索时高亮显示匹配的内容）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 启用语法高亮&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;syntax&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;enable&lt;/span&gt;               &lt;span class=&#34;c&#34;&gt;&amp;#34; 启用语法高亮，自动为文件中的语法元素添加颜色&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 自动加载插件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;plug&lt;/span&gt;#&lt;span class=&#34;nx&#34;&gt;begin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;~/.vim/plugged&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 插件管理器的起始配置（插件会安装在 ~/.vim/plugged 目录中）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Plug&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;tpope/vim-sensible&amp;#39;&lt;/span&gt;        &lt;span class=&#34;c&#34;&gt;&amp;#34; 安装一个常用的基础配置插件，提供常见的快捷键和设置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;Plug&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;preservim/nerdtree&amp;#39;&lt;/span&gt;       &lt;span class=&#34;c&#34;&gt;&amp;#34; 安装 NERDTree 插件，用于文件树浏览&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;call&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;plug&lt;/span&gt;#&lt;span class=&#34;nx&#34;&gt;end&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 插件管理器的结束配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 配色方案&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;colorscheme&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;desert&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 设置配色方案为 desert（你可以根据个人喜好选择其他方案）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 启用鼠标支持&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;mouse&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;a&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 启用鼠标支持，可以在 Vim 中使用鼠标进行滚动和选择&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 快捷键配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; :&lt;span class=&#34;nx&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 设置快捷键 Ctrl + S 保存文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;map&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt; :&lt;span class=&#34;nx&#34;&gt;q&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;CR&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;&amp;gt;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 设置快捷键 Ctrl + Q 退出 Vim&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&amp;#34; 启用行尾显示&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;list&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;&amp;#34; 显示行尾字符（如空格、Tab 等），有助于排查格式问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;listchars&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;tab&lt;/span&gt;:→\ &lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;trail&lt;/span&gt;:·  &lt;span class=&#34;c&#34;&gt;&amp;#34; 设置特殊字符显示：Tab 显示为箭头（→），空格显示为小圆点（·）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;配置解释&#34;&gt;配置解释：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;基础设置&lt;/strong&gt;:&lt;/p&gt;</description>
    </item>
    <item>
      <title>在PowerShell中并进行go交叉编译</title>
      <link>https://djd1226.github.io/posts/2025-05-131/</link>
      <pubDate>Tue, 13 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-131/</guid>
      <description>&lt;p&gt;在 PowerShell 中，设置环境变量的语法与 cmd 不同。你需要使用 &lt;code&gt;$env:&lt;/code&gt; 来设置环境变量。这里是你如何在 PowerShell 中进行交叉编译：&lt;/p&gt;
&lt;h4 id=&#34;1-设置环境变量&#34;&gt;1. &lt;strong&gt;设置环境变量&lt;/strong&gt;&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:GOOS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:GOARCH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这将设置目标操作系统为 &lt;code&gt;linux&lt;/code&gt;，架构为 &lt;code&gt;amd64&lt;/code&gt;，并使其在当前 PowerShell 会话中生效。&lt;/p&gt;
&lt;h4 id=&#34;2-编译-go-程序&#34;&gt;2. &lt;strong&gt;编译 Go 程序&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;然后你可以继续使用 &lt;code&gt;go build&lt;/code&gt; 来编译程序：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-o&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;myprogram&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;3-恢复环境变量可选&#34;&gt;3. &lt;strong&gt;恢复环境变量（可选）&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;如果你不再需要这些环境变量，可以清除它们：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Env&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GOOS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;Remove-Item&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Env&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;GOARCH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;以完整的示例演示&#34;&gt;以完整的示例演示&lt;/h3&gt;
&lt;p&gt;假设你在 Windows 上的 PowerShell 终端中，想要从 GitHub 克隆一个 Go 项目并编译成可以在 Alpine Linux 上运行的二进制文件。你可以按照以下步骤进行：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;克隆 GitHub 项目&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;git&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;clone&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;https&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;//&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;github&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;com&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;username&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;py&#34;&gt;git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd &lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repository&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;&lt;strong&gt;设置交叉编译环境变量&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:GOOS&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;linux&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:GOARCH&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;amd64&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;&lt;strong&gt;编译程序&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;go&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;-o&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;myprogram&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;&lt;strong&gt;传输到 Linux Alpine 系统&lt;/strong&gt;（你可以使用 SCP、FTP 等工具上传到你的目标服务器）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;总结&#34;&gt;总结&lt;/h3&gt;
&lt;p&gt;在 PowerShell 中设置环境变量的方式是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;$env:VARIABLE_NAME&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;然后你就可以像在 cmd 中一样运行 &lt;code&gt;go build&lt;/code&gt; 来交叉编译你的程序了。&lt;/p&gt;</description>
    </item>
    <item>
      <title>在 Debian 系统上安装 `oh-my-zsh`自动脚本</title>
      <link>https://djd1226.github.io/posts/2025-05-11/</link>
      <pubDate>Sun, 11 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-11/</guid>
      <description>&lt;p&gt;并添加高亮插件和自动补全插件，最后更新 &lt;code&gt;.zshrc&lt;/code&gt; 配置文件。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 更新系统软件包&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;更新系统软件包...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt update -y
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装 Zsh，如果没有安装的话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;安装 Zsh...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y zsh
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装 Git&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;安装 Git...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo apt install -y git curl wget
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装 Oh My Zsh&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;安装 Oh My Zsh...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sh -c &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 检查是否安装成功&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; ! -d &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/.oh-my-zsh&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Oh My Zsh 安装失败！&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;exit&lt;/span&gt; &lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装插件（zsh-users/zsh-syntax-highlighting 和 zsh-users/zsh-autosuggestions）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;安装 zsh 插件...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/zsh-users/zsh-syntax-highlighting.git &lt;span class=&#34;nv&#34;&gt;$ZSH_CUSTOM&lt;/span&gt;/plugins/zsh-syntax-highlighting
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone https://github.com/zsh-users/zsh-autosuggestions.git &lt;span class=&#34;nv&#34;&gt;$ZSH_CUSTOM&lt;/span&gt;/plugins/zsh-autosuggestions
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 编辑 .zshrc 文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;修改 .zshrc 文件...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 确保.zshrc文件存在&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; ! -f &lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;/.zshrc&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.zshrc 文件不存在，创建一个默认的 .zshrc 文件...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  cp &lt;span class=&#34;nv&#34;&gt;$ZSH&lt;/span&gt;/templates/zshrc.zsh-template &lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 添加插件到 .zshrc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sed -i &lt;span class=&#34;s1&#34;&gt;&amp;#39;/^plugins=/c\plugins=(git zsh-syntax-highlighting zsh-autosuggestions z)&amp;#39;&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 更新 .zshrc 配置&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;更新 .zshrc 配置...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/.zshrc
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;echo&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;安装完成！你可以开始使用 Oh My Zsh 和新插件了！&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;说明&#34;&gt;说明：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安装 Zsh 和 Git&lt;/strong&gt;：首先确保系统安装了 &lt;code&gt;zsh&lt;/code&gt; 和 &lt;code&gt;git&lt;/code&gt;，因为 &lt;code&gt;oh-my-zsh&lt;/code&gt; 安装需要 Git。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装 &lt;code&gt;oh-my-zsh&lt;/code&gt;&lt;/strong&gt;：通过执行官方安装脚本来安装 &lt;code&gt;oh-my-zsh&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安装插件&lt;/strong&gt;：安装 &lt;code&gt;zsh-syntax-highlighting&lt;/code&gt; 和 &lt;code&gt;zsh-autosuggestions&lt;/code&gt; 插件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改 &lt;code&gt;.zshrc&lt;/code&gt;&lt;/strong&gt;：脚本将 &lt;code&gt;.zshrc&lt;/code&gt; 文件中的 &lt;code&gt;plugins&lt;/code&gt; 行修改为包含这两个插件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新 &lt;code&gt;.zshrc&lt;/code&gt;&lt;/strong&gt;：使用 &lt;code&gt;source&lt;/code&gt; 命令重新加载 &lt;code&gt;.zshrc&lt;/code&gt; 配置，使插件立即生效。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;使用方法&#34;&gt;使用方法：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;将这个脚本保存为 &lt;code&gt;install_ohmyzsh.sh&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;给予脚本执行权限：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;chmod +x install_ohmyzsh.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;执行脚本：
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;./install_ohmyzsh.sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这会完成所有安装和配置。&lt;/p&gt;</description>
    </item>
    <item>
      <title>WordPress 文章完美转换 Markdown 方法</title>
      <link>https://djd1226.github.io/posts/2025-05-06/</link>
      <pubDate>Tue, 06 May 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-05-06/</guid>
      <description>&lt;p&gt;最近换用了 Markdown 写文, 但是博客中以前的文章不是 Markdown 格式, 想把它们转换为 Markdown 格式, 偶然发现了 wordpress-export-to-markdown 这个项目,可以导出页面, 评论, 文章, 图片. 试用了一下, 效果非常不错, 图片也能很好的处理, 今天来为大家介绍使用方法.&lt;/p&gt;
&lt;h2 id=&#34;下载-nodejs&#34;&gt;下载 Node.js&lt;/h2&gt;
&lt;p&gt;访问 [Node.js](&lt;a href=&#34;https://nodejs.org/zh-cn/&#34;&gt;https://nodejs.org/zh-cn/&lt;/a&gt;官网, 下载长期维护版即可.&lt;/p&gt;
&lt;p&gt;下载完成后安装, 无脑下一步即可.&lt;/p&gt;
&lt;p&gt;开始转换
访问你的 WordPress 后台, 导出 xml 文件, 选择所有内容, 否则无法导出图片.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;新建一个文件夹, 名字随便, 把刚才下载的 .xml 文件改名为 export.xml 放到此文件夹.&lt;/p&gt;
&lt;p&gt;按住 Shift 右键文件夹空白处打开 powershell&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;输入命令&lt;/p&gt;
&lt;p&gt;npx wordpress-export-to-markdown
回车下一步, 提示 (y/N) 全部选 y 即可.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样就算执行成功了(忽略我那两个错误), 返回文件夹 output 就是导出的所有内容.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Docker 部署IPTV</title>
      <link>https://djd1226.github.io/posts/2025-5-16/</link>
      <pubDate>Fri, 28 Mar 2025 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-16/</guid>
      <description>&lt;p&gt;iTV（Doubebly）原作者库已经不能下载_&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用Termux搭建Samba服务器</title>
      <link>https://djd1226.github.io/posts/2025-5-9/</link>
      <pubDate>Tue, 12 Nov 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-9/</guid>
      <description></description>
    </item>
    <item>
      <title>google搜索语法</title>
      <link>https://djd1226.github.io/posts/2025-5-17/</link>
      <pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-17/</guid>
      <description>&lt;p&gt;Google是全球最大的搜索引擎公司，每天处理数以亿计的搜索请求。灵活运用google搜索技巧可以帮助我们更快速更准确的在浩瀚的互联网中找到需要的信息。&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serv00-PHP说明文档</title>
      <link>https://djd1226.github.io/posts/2025-5-1/</link>
      <pubDate>Fri, 13 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-1/</guid>
      <description>&lt;p&gt;PHP教程说明文档&lt;/p&gt;
&lt;p&gt;PHP是一种面向对象的编程语言，设计用于实时生成网页并构建Web应用程序。&lt;/p&gt;</description>
    </item>
    <item>
      <title>serv00安装FreshRSS</title>
      <link>https://djd1226.github.io/posts/2025-5-2/</link>
      <pubDate>Thu, 12 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-2/</guid>
      <description>&lt;p&gt;serv00安装FreshRSS&lt;/p&gt;</description>
    </item>
    <item>
      <title>在共享主机serv00上安装wallabag</title>
      <link>https://djd1226.github.io/posts/2025-5-12/</link>
      <pubDate>Thu, 12 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-12/</guid>
      <description>&lt;p&gt;在共享主机上安装wallabag&lt;/p&gt;</description>
    </item>
    <item>
      <title>安装 Anki 的同步服务器</title>
      <link>https://djd1226.github.io/posts/2025-5-6/</link>
      <pubDate>Sun, 08 Sep 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-6/</guid>
      <description>&lt;p&gt;安装 Anki 的同步服务器&lt;/p&gt;</description>
    </item>
    <item>
      <title>serv00 恢复如初</title>
      <link>https://djd1226.github.io/posts/2025-5-3/</link>
      <pubDate>Sat, 31 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-3/</guid>
      <description>&lt;p&gt;清除PM2进程&lt;/p&gt;
&lt;p&gt;列出进程清单 pm2 list 恢复已保存列表的进程 &lt;code&gt;~/.npm-global/bin/pm2 resurrect&lt;/code&gt; 停止所有进程 &lt;code&gt;pm2 stop all&lt;/code&gt; 删除所有进程 &lt;code&gt;pm2 delete all&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serv00 进程保活最终解决方案</title>
      <link>https://djd1226.github.io/posts/2025-5-5/</link>
      <pubDate>Thu, 29 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-5/</guid>
      <description>&lt;p&gt;Serv00 进程保活最终解决方案&lt;/p&gt;</description>
    </item>
    <item>
      <title>chat2api添加vercel代理设置</title>
      <link>https://djd1226.github.io/posts/2025-5-15/</link>
      <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-15/</guid>
      <description>&lt;p&gt;为了防止被人追踪，也为了自己的 IP 安全，可以先搭建一个 HTTP 代理：&lt;/p&gt;</description>
    </item>
    <item>
      <title>使用虚拟环境启动Python项目</title>
      <link>https://djd1226.github.io/posts/2025-5-10/</link>
      <pubDate>Sat, 17 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-10/</guid>
      <description>&lt;p&gt;在Python项目中，使用虚拟环境是为了隔离项目的依赖，避免依赖包版本冲突问题。虚拟环境使得每个项目可以有自己的依赖包，并且这些包不会影响到系统全局的Python环境或其他项目。&lt;/p&gt;</description>
    </item>
    <item>
      <title>serv00教程-node.js</title>
      <link>https://djd1226.github.io/posts/2025-5-4/</link>
      <pubDate>Thu, 01 Aug 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-4/</guid>
      <description>&lt;p&gt;Node.js 使用教程&lt;/p&gt;</description>
    </item>
    <item>
      <title>如何在Serv00.com服务器上使用Python的虚拟环境</title>
      <link>https://djd1226.github.io/posts/2025-5-8/</link>
      <pubDate>Sat, 20 Jul 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-8/</guid>
      <description>&lt;p&gt;如何在Serv00.com服务器上使用Python的虚拟环境。&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;preview.jpeg&#34; loading=&#34;lazy&#34; src=&#34;https://pub-205cbc55af97469188f80389cf5dc778.r2.dev/2024/07/20/669b27b093093.jpeg&#34; title=&#34;preview.jpeg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>《星际争霸1》常用的编队技巧：</title>
      <link>https://djd1226.github.io/posts/24_07_10/</link>
      <pubDate>Wed, 10 Jul 2024 07:59:31 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/24_07_10/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>【实操篇】阿里云盘CDN直链提取</title>
      <link>https://djd1226.github.io/posts/2025-5-14/</link>
      <pubDate>Wed, 26 Jun 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-14/</guid>
      <description>&lt;p&gt;阿里云盘cdn直链提取的教程&lt;/p&gt;</description>
    </item>
    <item>
      <title>Serv00搭建各种服务</title>
      <link>https://djd1226.github.io/posts/2025-5-132/</link>
      <pubDate>Sat, 20 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-132/</guid>
      <description>&lt;p&gt;这个平台是个 Virtual Host ，没有 Root ，还是 FreeBSD 的系统，不是 Linux ，不太好用。但是优点是隔离性差， Memory 和 vCPU 能短时间内超过 100% 进行调用。&lt;/p&gt;</description>
    </item>
    <item>
      <title>vim添加美化样式插件</title>
      <link>https://djd1226.github.io/posts/24_04_18/</link>
      <pubDate>Thu, 18 Apr 2024 00:53:35 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/24_04_18/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>部署免费的GPT-API，实现GPT自由！</title>
      <link>https://djd1226.github.io/posts/2025-5-7/</link>
      <pubDate>Thu, 04 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-7/</guid>
      <description>&lt;p&gt;render部署GPT-API教程&lt;/p&gt;</description>
    </item>
    <item>
      <title>学习部署FreeGPT35</title>
      <link>https://djd1226.github.io/posts/2025-5-11/</link>
      <pubDate>Wed, 03 Apr 2024 00:00:00 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/2025-5-11/</guid>
      <description>&lt;p&gt;我试着部署了一下，分别通过github账户，登录了两个网站，并且都部署了missuo/FreeGPT35（Glitch和Render),但可是我不会用，先做个记录把！&lt;/p&gt;</description>
    </item>
    <item>
      <title>与GitHub仓库同步</title>
      <link>https://djd1226.github.io/posts/24_03_07/</link>
      <pubDate>Thu, 07 Mar 2024 12:21:20 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/24_03_07/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>旅游日志制作：PR（Adobe Premiere R）</title>
      <link>https://djd1226.github.io/posts/24_03_02/</link>
      <pubDate>Sat, 02 Mar 2024 13:17:54 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/24_03_02/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>使用Python实现自动化：轻松操控Hugo和Git</title>
      <link>https://djd1226.github.io/posts/24_01_051/</link>
      <pubDate>Fri, 05 Jan 2024 13:39:59 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/24_01_051/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>面对python爬虫练习的困境与决策：一次失败与放弃的思考</title>
      <link>https://djd1226.github.io/posts/24_01_05/</link>
      <pubDate>Fri, 05 Jan 2024 13:16:57 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/24_01_05/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>编写一个简单的Shell脚本来执行Hugo任务</title>
      <link>https://djd1226.github.io/posts/23_12_31/</link>
      <pubDate>Sun, 31 Dec 2023 12:53:50 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/23_12_31/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>使用frp进行内网穿透并结合Cloudflare和Cloudns实现免费域名访问</title>
      <link>https://djd1226.github.io/posts/23_12_30/</link>
      <pubDate>Sat, 30 Dec 2023 12:20:26 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/23_12_30/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>提升Anki学习效率：自制卡牌的高级技巧</title>
      <link>https://djd1226.github.io/posts/23_12_29/</link>
      <pubDate>Fri, 29 Dec 2023 05:37:40 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/23_12_29/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>使用Hugo搭建个人网站并推送到GitHub Pages</title>
      <link>https://djd1226.github.io/posts/23_12_27/</link>
      <pubDate>Wed, 27 Dec 2023 05:28:31 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/23_12_27/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>2023对于IPTV抓包，我个人认为已经没有意义了！</title>
      <link>https://djd1226.github.io/posts/23_12_26/</link>
      <pubDate>Tue, 26 Dec 2023 11:56:52 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/23_12_26/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>X96MAX盒子折腾记 第一篇：</title>
      <link>https://djd1226.github.io/posts/231221/</link>
      <pubDate>Thu, 21 Dec 2023 17:18:46 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/231221/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
    <item>
      <title>折腾了两天免费图床，最终还是选了Github</title>
      <link>https://djd1226.github.io/posts/23-12/</link>
      <pubDate>Wed, 06 Dec 2023 04:56:40 +0000</pubDate>
      <guid>https://djd1226.github.io/posts/23-12/</guid>
      <description>Exaplanation on the shortcodes with personal-web</description>
    </item>
  </channel>
</rss>
