<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>G.ArkWeb3投资撸毛</title><description>Web3全职撸毛｜Binance Alpha｜ OKX Boost｜交易所理财活动｜打新资讯</description><link>https://1314047.xyz/</link><item><title>VPS 流量监控 Telegram Bot 部署教程</title><link>https://1314047.xyz/blog/2026-05-28-tg.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-05-28-tg.html</guid><pubDate>Thu, 28 May 2026 00:00:00 GMT</pubDate><content:encoded>## 项目简介

这是一个基于：

- `vnStat`
- `Python Telegram Bot`
- `systemd`

实现的 VPS 流量监控机器人。

支持：

- 查看今日流量
- 查看本月流量
- 查看系统状态
- 查看实时流量
- 查看 VPS 在线时间
- Telegram 远程管理
- systemd 后台运行

适用于：

- Debian 12/13
- Ubuntu
- Oracle Cloud
- 搬瓦工
- NAT VPS
- Xray / Hysteria / Sing-box 节点机

---

# 一、创建 Telegram Bot

打开：

[Telegram 官方网站](https://telegram.org?utm_source=chatgpt.com)

搜索：

`@BotFather`

发送：

```
/newbot
```

按照提示：

1. 输入机器人名称
2. 输入机器人用户名（必须以 bot 结尾）

创建成功后会获得：

```
BOT_TOKEN
```

例如：

```
123456789:AAxxxxxxxxxxxxxxxxxxxxx
```

保存好。

---

# 二、获取 Telegram 用户 ID

搜索机器人：

```
@userinfobot
```

或者：

```
@RawDataBot
```

发送任意消息。

获得：

```
YOUR_USER_ID
```

例如：

```
6112345678
```

保存好。

---

# 三、安装基础环境

SSH 登录 VPS。

执行：

```
apt update &amp;&amp; apt install -y python3 python3-pip vnstat curl
```

---

# 四、启动 vnStat

执行：

```
systemctl enable vnstatsystemctl restart vnstat
```

检查是否正常：

```
vnstat
```

如果能看到流量数据说明正常。

---

# 五、创建项目目录

执行：

```
mkdir -p /root/vpsbotcd /root/vpsbot
```

---

# 六、创建 bot.py

执行：

```
nano bot.py
```

把下面完整代码复制进去。

---

# 七、完整 bot.py 代码

```
import os
import subprocess
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes

BOT_TOKEN = &quot;这里替换成你的BOT_TOKEN&quot;
ALLOWED_USER = 这里替换成你的TG用户ID


def run(cmd):
    return subprocess.getoutput(cmd)


def format_size(bytes_value):
    bytes_value = float(bytes_value)

    if bytes_value &gt;= 1024 ** 4:
        return f&quot;{bytes_value / 1024 ** 4:.2f} TB&quot;

    elif bytes_value &gt;= 1024 ** 3:
        return f&quot;{bytes_value / 1024 ** 3:.2f} GB&quot;

    elif bytes_value &gt;= 1024 ** 2:
        return f&quot;{bytes_value / 1024 ** 2:.2f} MB&quot;

    elif bytes_value &gt;= 1024:
        return f&quot;{bytes_value / 1024:.2f} KB&quot;

    return f&quot;{bytes_value:.2f} B&quot;


async def start(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    text = &quot;&quot;&quot;
🚀 VPS 流量监控机器人已启动

📊 可用命令：

/day 今日流量
/month 本月流量
/live 实时网速
/sys 系统状态
/uptime 在线时间
/reboot 重启 VPS
&quot;&quot;&quot;

    await update.message.reply_text(text)


async def day(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    output = run(&quot;vnstat --oneline b&quot;)

    try:
        data = output.split(&quot;;&quot;)

        rx = format_size(data[3])
        tx = format_size(data[4])
        total = format_size(data[5])

        text = f&quot;&quot;&quot;
📊 今日流量

⬇ 下载：{rx}
⬆ 上传：{tx}
📦 总计：{total}
&quot;&quot;&quot;

        await update.message.reply_text(text)

    except Exception as e:
        await update.message.reply_text(f&quot;解析失败:\n{e}&quot;)


async def month(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    result = run(&quot;vnstat -m&quot;)

    await update.message.reply_text(f&quot;📅 本月流量\n\n{result}&quot;)


async def live(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    result = run(&quot;vnstat -tr 5&quot;)

    await update.message.reply_text(f&quot;📡 实时流量\n\n{result}&quot;)


async def sysinfo(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    cpu = run(&quot;top -bn1 | grep load&quot;)
    mem = run(&quot;free -h&quot;)
    disk = run(&quot;df -h /&quot;)

    text = f&quot;&quot;&quot;
🖥 系统状态

CPU：
{cpu}

🧠 内存：
{mem}

💾 磁盘：
{disk}
&quot;&quot;&quot;

    await update.message.reply_text(text)


async def uptime(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    result = run(&quot;uptime -p&quot;)

    await update.message.reply_text(f&quot;⏱ 在线时间\n\n{result}&quot;)


async def reboot(update: Update, context: ContextTypes.DEFAULT_TYPE):
    if update.effective_user.id != ALLOWED_USER:
        return

    await update.message.reply_text(&quot;♻ VPS 即将重启...&quot;)
    os.system(&quot;reboot&quot;)


app = ApplicationBuilder().token(BOT_TOKEN).build()

app.add_handler(CommandHandler(&quot;start&quot;, start))
app.add_handler(CommandHandler(&quot;day&quot;, day))
app.add_handler(CommandHandler(&quot;month&quot;, month))
app.add_handler(CommandHandler(&quot;live&quot;, live))
app.add_handler(CommandHandler(&quot;sys&quot;, sysinfo))
app.add_handler(CommandHandler(&quot;uptime&quot;, uptime))
app.add_handler(CommandHandler(&quot;reboot&quot;, reboot))

print(&quot;Bot Started&quot;)

app.run_polling()
```

---

# 八、安装 Python 依赖

执行：

```
pip3 install python-telegram-bot --break-system-packages
```

&gt; Debian 13 必须加 `--break-system-packages`

---

# 九、测试运行

执行：

```
python3 bot.py
```

如果看到：

```
Bot Started
```

说明运行成功。

---

# 十、Telegram 测试

给你的机器人发送：

```
/start
```

然后测试：

```
/day
```

正常会返回今日流量。

---

# 十一、创建 systemd 后台服务

创建服务文件：

```
nano /etc/systemd/system/vpsbot.service
```

写入：

```
[Unit]Description=VPS Telegram BotAfter=network.target[Service]Type=simpleWorkingDirectory=/root/vpsbotExecStart=/usr/bin/python3 /root/vpsbot/bot.pyRestart=always[Install]WantedBy=multi-user.target
```

---

# 十二、启动后台服务

执行：

```
systemctl daemon-reloadsystemctl enable vpsbotsystemctl start vpsbot
```

---

# 十三、查看运行状态

执行：

```
systemctl status vpsbot
```

---

# 十四、查看日志

如果机器人异常：

```
journalctl -u vpsbot -f
```

---

# 十五、常用命令

## 重启机器人

```
systemctl restart vpsbot
```

---

## 停止机器人

```
systemctl stop vpsbot
```

---

## 开机自启

```
systemctl enable vpsbot
```

---

## 关闭开机启动

```
systemctl disable vpsbot
```

---

# 十六、支持的 Telegram 指令

|指令|功能|
|---|---|
|`/start`|帮助菜单|
|`/day`|今日流量|
|`/month`|本月流量|
|`/live`|实时网速|
|`/sys`|系统状态|
|`/uptime`|在线时间|
|`/reboot`|重启 VPS|

---

# 十七、后续可扩展功能

后续可以继续增加：

- 流量超限提醒
- 每日自动推送
- 多 VPS 管理
- Xray 状态检测
- Hysteria2 状态检测
- Docker 状态
- CPU/内存告警
- Telegram 按钮菜单
- 在线节点检测
- 自动重启代理服务

---

# 十八、项目优点

相比很多 GitHub 上的 VPS 管理项目：

- 更轻量
- 更稳定
- 无复杂依赖
- 占用极低
- 易维护
- 适合长期运行

核心依赖：

- vnStat
- python-telegram-bot
- systemd

即可。</content:encoded><author>G.Ark</author></item><item><title>Nodeseek 关键词检测并推送至 Telegram（Docker 版）</title><link>https://1314047.xyz/blog/2026-05-22-tg.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-05-22-tg.html</guid><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><content:encoded>本教程将指导你如何使用 Docker 部署一个 Nodeseek 关键词监控工具。该工具能够自动检测 Nodeseek 论坛上的新帖子，并根据你设定的关键词，将相关内容实时推送到你的 Telegram 机器人。这对于希望第一时间获取特定信息的用户来说非常方便。

### 前置条件

在开始之前，请确保你已具备以下条件：

-   一台安装了 Docker 和 Docker Compose 的服务器或设备。
-   一个 Telegram 机器人 Token。如果你还没有，可以参考 [Telegram Bot Father 官方指南](https://core.telegram.org/bots#6-botfather) 创建一个。
-   你的 Telegram 聊天 ID。你可以通过向你的机器人发送消息，然后访问 `https://api.telegram.org/bot&lt;你的机器人Token&gt;/getUpdates` 来获取 `chat_id`。

### 部署步骤

#### 步骤 1：创建工作目录和文件

首先，在你的服务器上创建一个用于存放 Nodeseek 监控服务相关文件的目录，并进入该目录。

```bash
mkdir -p data/docker_data/nodeseek
cd data/docker_data/nodeseek/
```

#### 步骤 2：创建 `docker-compose.yml` 配置文件

在当前目录下创建一个名为 `docker-compose.yml` 的文件，并将以下内容复制进去。**请务必替换 `TG_BOT_TOKEN` 和 `TG_CHAT_ID` 为你自己的信息。**

```yaml
services:
  nseek-monitor:
    image: dajie000/rss_nodeseek:latest
    container_name: rss_nodeseek
    restart: always
    environment:
      - TG_BOT_TOKEN=123 # 替换为你的 Telegram 机器人 Token (无需引号)
      - TG_CHAT_ID=123 # 替换为接收通知的 Telegram 聊天 ID (无需引号)
      - CHECK_MIN_INTERVAL=20 # 最小检查间隔（秒）。修改后需停止容器并重新启动才能生效。
      - CHECK_MAX_INTERVAL=40 # 最大检查间隔（秒）。修改后需停止容器并重新启动才能生效。
      - TZ=Asia/Shanghai # 设置时区为上海
    volumes:
      - ./data:/data # 挂载本地当前目录的data文件夹到容器内的/data目录，用于持久化存储数据（如日志 monitor.log 和关键词配置 config.json）
    logging:
      driver: &quot;json-file&quot;
      options:
        max-size: &quot;5m&quot; # 每个容器日志文件最大 5MB
        max-file: &quot;1&quot; # 最多保留 1 个日志文件
```

**参数说明：**

-   `TG_BOT_TOKEN`: 你的 Telegram 机器人 API Token。
-   `TG_CHAT_ID`: 你希望接收通知的 Telegram 聊天 ID。可以是个人用户、群组或频道 ID。
-   `CHECK_MIN_INTERVAL` / `CHECK_MAX_INTERVAL`: 定义了程序检查 Nodeseek 更新的随机时间间隔范围。例如，设置为 20 和 40 秒，程序将在 20 到 40 秒之间随机选择一个时间间隔进行检查，以避免过于频繁的请求。
-   `TZ`: 设置容器的时区，确保日志时间正确。
-   `volumes`: 将宿主机的 `./data` 目录挂载到容器的 `/data` 目录。这意味着容器内生成的所有数据（包括日志和关键词配置文件 `config.json`）都将保存在宿主机的 `./data` 目录下，即使容器被删除，数据也不会丢失。
-   `logging`: 配置 Docker 容器的日志管理，限制日志文件的大小和数量，防止日志文件过大占用磁盘空间。

#### 步骤 3：配置关键词 `config.json`

在 `docker-compose.yml` 文件所在的目录下，进入 `data` 文件夹，并创建一个名为 `config.json` 的文件。

```bash
mkdir -p data
touch data/config.json
```

然后编辑 `data/config.json` 文件，添加你想要监控的关键词。关键词支持正则表达式。

```json
{
    &quot;keywords&quot;: [
  &quot;关键词1&quot;,
  &quot;关键词2&quot;,
  &quot;关键词3&quot;,
  &quot;VPS&quot;,
  &quot;流量&quot;,
  &quot;香港&quot;,
  &quot;新加坡&quot;,
  &quot;日本&quot;,
  &quot;美国&quot;,
  &quot;AMD&quot;,
  &quot;Intel&quot;,
  &quot;ARM&quot;,
  &quot;优惠&quot;,
  &quot;促销&quot;,
  &quot;特价&quot;,
  &quot;免费&quot;,
  &quot;试用&quot;,
  &quot;出&quot;,
  &quot;收&quot;,
  &quot;求&quot;,
  &quot;出号&quot;,
  &quot;收号&quot;,
  &quot;求号&quot;,
  &quot;出鸡&quot;,
  &quot;收鸡&quot;,
  &quot;求鸡&quot;,
  &quot;出账号&quot;,
  &quot;收账号&quot;,
  &quot;求账号&quot;,
  &quot;出闲置&quot;,
  &quot;收闲置&quot;,
  &quot;求闲置&quot;,
  &quot;出闲置物品&quot;,
  &quot;收闲置物品&quot;,
  &quot;求闲置物品&quot;,
  &quot;出闲置账号&quot;,
  &quot;收闲置账号&quot;,
  &quot;求闲置账号&quot;,
  &quot;出闲置鸡&quot;,
  &quot;收闲置鸡&quot;,
  &quot;求闲置鸡&quot;,
  &quot;出闲置VPS&quot;,
  &quot;收闲置VPS&quot;,
  &quot;求闲置VPS&quot;,
  &quot;出闲置流量&quot;,
  &quot;收闲置流量&quot;,
  &quot;求闲置流量&quot;,
  &quot;出闲置香港&quot;,
  &quot;收闲置香港&quot;,
  &quot;求闲置香港&quot;,
  &quot;出闲置新加坡&quot;,
  &quot;收闲置新加坡&quot;,
  &quot;求闲置新加坡&quot;,
  &quot;出闲置日本&quot;,
  &quot;收闲置日本&quot;,
  &quot;求闲置日本&quot;,
  &quot;出闲置美国&quot;,
  &quot;收闲置美国&quot;,
  &quot;求闲置美国&quot;,
  &quot;出闲置AMD&quot;,
  &quot;收闲置AMD&quot;,
  &quot;求闲置AMD&quot;,
  &quot;出闲置Intel&quot;,
  &quot;收闲置Intel&quot;,
  &quot;求闲置Intel&quot;,
  &quot;出闲置ARM&quot;,
  &quot;收闲置ARM&quot;,
  &quot;求闲置ARM&quot;,
  &quot;出闲置优惠&quot;,
  &quot;收闲置优惠&quot;,
  &quot;求闲置优惠&quot;,
  &quot;出闲置促销&quot;,
  &quot;收闲置促销&quot;,
  &quot;求闲置促销&quot;,
  &quot;出闲置特价&quot;,
  &quot;收闲置特价&quot;,
  &quot;求闲置特价&quot;,
  &quot;出闲置免费&quot;,
  &quot;收闲置免费&quot;,
  &quot;求闲置免费&quot;,
  &quot;出闲置试用&quot;,
  &quot;收闲置试用&quot;,
  &quot;求闲置试用&quot;
    ],
```

**注意：**
-   每个关键词用双引号包裹，并用逗号分隔。
-   这是一个 JSON 数组，请确保格式正确。
-   你可以根据自己的需求添加或删除关键词。

#### 步骤 4：运行 Docker 容器

在 `docker-compose.yml` 文件所在的目录（即 `/root/data/docker_data/nodeseek/`）下，运行以下命令启动服务：

```bash
docker compose up -d
```

-   `docker compose up -d` 命令会根据 `docker-compose.yml` 文件创建并启动容器，`-d` 参数表示在后台运行。

### 查看运行状态和日志

#### 查看容器状态

你可以使用以下命令检查容器是否正常运行：

```bash
docker ps -f name=rss_nodeseek
```

#### 查看实时日志

要查看程序的实时运行日志，请先 `cd` 到 `docker-compose.yml` 所在的目录，然后运行：

```bash
tail -f ./data/monitor.log
```

如果一切正常，你将看到程序正在检查 Nodeseek 并处理关键词的日志信息。

### Telegram 机器人命令

你的 Telegram 机器人支持一些简单的命令，你可以向机器人发送 `/help` 来获取帮助信息。

```
/help
```

### 停止和重启服务

如果你需要停止或重启服务，可以在 `docker-compose.yml` 所在的目录下执行：

-   **停止服务：**
    ```bash
    docker compose down
    ```
-   **重启服务：**
    ```bash
    docker compose restart nseek-monitor
    ```
    或者先 `down` 再 `up -d`。

### 常见问题与故障排除

-   **机器人不推送消息：**
    -   检查 `TG_BOT_TOKEN` 和 `TG_CHAT_ID` 是否填写正确。
    -   确保你的机器人已启动，并且你已向机器人发送过消息（对于个人聊天）。
    -   查看 `monitor.log` 日志文件，看是否有错误信息。
-   **关键词不生效：**
    -   检查 `data/config.json` 文件格式是否正确，关键词是否已保存。
    -   修改 `config.json` 后，需要重启容器才能加载新的配置：`docker compose restart nseek-monitor`。
-   **容器无法启动：**
    -   检查 `docker-compose.yml` 文件是否有语法错误。
    -   查看 `docker logs rss_nodeseek` 命令输出的日志，获取详细错误信息。

希望这份完善后的教程能帮助你顺利部署和使用 Nodeseek 关键词检测推送服务！</content:encoded><author>G.Ark</author></item><item><title>Komari探针部署与美化</title><link>https://1314047.xyz/blog/2026-05-06-komari.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-05-06-komari.html</guid><pubDate>Wed, 06 May 2026 00:00:00 GMT</pubDate><content:encoded>## 一、系统环境要求

- 操作系统：Debian 12
- 用户权限：root 或具备 sudo 权限的用户

## 二、Komari 安装步骤

### 1. 下载安装脚本

```
curl -fsSL https://raw.githubusercontent.com/komari-monitor/komari/main/install-komari.sh -o install-komari.sh
```

### 2. 添加执行权限

```
chmod +x install-komari.sh
```

### 3. 执行安装脚本

```
sudo ./install-komari.sh
```

安装过程中将自动完成依赖安装与系统配置，无需人工干预。

## 三、查找 Komari 安装目录

安装完成后，可通过以下命令定位 Komari 的实际安装路径：

```
sudo find / -type d -name &quot;komari&quot; 2&gt;/dev/null
```

默认情况下，Komari 通常安装在：

/opt/komari

## 四、修改管理员密码

### 1. 进入 Komari 目录

```
cd /opt/komari
```

### 2. 执行密码修改命令

```
./komari chpasswd -p 你的新密码
```

示例：

```
./komari chpasswd -p Ab890725
```

### 3. 重启服务生效

```
sudo reboot
```

## 五、验证安装状态

服务器重启后，可通过浏览器访问 Komari 控制面板：

- 访问地址：[http://你的服务器IP:3000](http://xn--ip-0p3cl7jf7fo83a16x:3000/)（以安装输出为准）
- 默认用户名：admin
- 密码：你刚刚设置的新密码

注意事项：

- 确保防火墙已放行 Komari 使用的端口
- 建议首次登录后立即完成安全配置
- 可定期检查 Komari 日志以确认运行状态

## 六、Komari 前端美化与功能增强

以下内容为 Komari 探针自定义代码，可用于 **隐藏默认元素、固定顶部服务器名称、增加流量进度条、优化价格与流量展示逻辑**。

### 1. 自定义 Head 脚本

将以下代码插入 Komari 页面 Head 区域：
```
&lt;script&gt;
(function() {
  // 配置
  var CONFIG = {
    interval: 60000,
    apiUrl: &apos;/api/rpc2&apos;,
    trafficTolerance: 0.10
  };

  // 注入样式
  var style = document.createElement(&apos;style&apos;);
  style.textContent = &apos;.server-footer-name&gt;div:first-child{visibility:hidden!important}.server-footer-theme{display:none!important}&apos;;
  document.head.appendChild(style);

  // 全局配置
  window.CustomDesc = &quot;BITJEBE&apos;s Node&quot;;
  window.ShowNetTransfer = true;
  window.DisableAnimatedMan = true;
  window.FixedTopServerName = true;

  // 工具函数
  var UNITS = [&apos;B&apos;, &apos;KiB&apos;, &apos;MiB&apos;, &apos;GiB&apos;, &apos;TiB&apos;, &apos;PiB&apos;];
  var UNIT_MAP = { KIB: 1024, MIB: 1048576, GIB: 1073741824, TIB: 1099511627776 };
  var CYCLE_MAP = { 30: &apos;月&apos;, 92: &apos;季&apos;, 184: &apos;半年&apos;, 365: &apos;年&apos;, 730: &apos;二年&apos;, 1095: &apos;三年&apos;, 1825: &apos;五年&apos; };

  function formatBytes(bytes) {
    if (!bytes) return { value: &apos;0&apos;, unit: &apos;B&apos; };
    var i = Math.floor(Math.log(bytes) / Math.log(1024));
    return { value: (bytes / Math.pow(1024, i)).toFixed(2), unit: UNITS[i] };
  }

  function formatTime(s) {
    if (!s) return &apos;N/A&apos;;
    try {
      return new Date(s).toLocaleString(&apos;zh-CN&apos;, { timeZone: &apos;Asia/Shanghai&apos;, hour: &apos;2-digit&apos;, minute: &apos;2-digit&apos;, second: &apos;2-digit&apos; });
    } catch (e) { return &apos;N/A&apos;; }
  }

  function getCycleText(c) {
    if (!c || c &lt;= 0) return c === -1 || c === 0 ? &apos;一次性&apos; : &apos;年&apos;;
    for (var days in CYCLE_MAP) {
      if (Math.abs(c - days) &lt;= 3) return CYCLE_MAP[days];
    }
    var y = Math.round(c / 365);
    return y &gt;= 1 &amp;&amp; y &lt;= 10 ? y + &apos;年&apos; : &apos;年&apos;;
  }

  function calcResetDays(expiredAt) {
    if (!expiredAt) return &apos;N/A&apos;;
    try {
      var day = new Date(expiredAt).getDate(), now = new Date();
      var reset = new Date(now.getFullYear(), now.getMonth(), day);
      if (reset &lt;= now) reset.setMonth(reset.getMonth() + 1);
      return Math.ceil((reset - now) / 86400000) + &apos;日&apos;;
    } catch (e) { return &apos;N/A&apos;; }
  }

  function parseTraffic(text) {
    var m = text.match(/([\d.]+)\s*(GiB|MiB|TiB|KiB)/i);
    return m ? parseFloat(m[1]) * (UNIT_MAP[m[2].toUpperCase()] || 1) : null;
  }

  function normName(n) { return n.toUpperCase().replace(/[^A-Z0-9-]/g, &apos;&apos;); }

  function getColor(p) { return &apos;hsl(&apos; + ((100 - p) * 1.4) + &apos;,70%,50%)&apos;; }

  // 渲染器
  var barCache = new Map();

  function createBar(d) {
    var uf = formatBytes(d.used), tf = formatBytes(d.limit);
    var pc = Math.min(100, d.used / d.limit * 100).toFixed(2);
    var div = document.createElement(&apos;div&apos;);
    div.className = &apos;space-y-1.5 traffic-bar&apos;;
    div.dataset.uuid = d.uuid;
    div.style.width = &apos;100%&apos;;
    div.innerHTML = 
      &apos;&lt;div class=&quot;flex items-center justify-between&quot;&gt;&apos; +
        &apos;&lt;div class=&quot;flex items-baseline gap-1&quot;&gt;&apos; +
          &apos;&lt;span class=&quot;text-[10px] font-medium text-neutral-800 dark:text-neutral-200 used-val&quot;&gt;&apos; + uf.value + &apos;&lt;/span&gt;&apos; +
          &apos;&lt;span class=&quot;text-[10px] font-medium text-neutral-800 dark:text-neutral-200 used-unit&quot;&gt;&apos; + uf.unit + &apos;&lt;/span&gt;&apos; +
          &apos;&lt;span class=&quot;text-[10px] text-neutral-500 dark:text-neutral-400&quot;&gt;/ &apos; + tf.value + &apos; &apos; + tf.unit + &apos;&lt;/span&gt;&apos; +
        &apos;&lt;/div&gt;&apos; +
        &apos;&lt;div class=&quot;text-[10px] font-medium text-neutral-600 dark:text-neutral-300 percent-val&quot;&gt;&apos; + pc + &apos;%&lt;/div&gt;&apos; +
      &apos;&lt;/div&gt;&apos; +
      &apos;&lt;div class=&quot;relative h-1.5&quot; style=&quot;width:100%&quot;&gt;&apos; +
        &apos;&lt;div class=&quot;absolute inset-0 bg-neutral-100 dark:bg-neutral-800 rounded-full&quot;&gt;&lt;/div&gt;&apos; +
        &apos;&lt;div class=&quot;absolute inset-0 rounded-full transition-all duration-300 progress-bar&quot; style=&quot;width:&apos; + pc + &apos;%;background-color:&apos; + getColor(parseFloat(pc)) + &apos;&quot;&gt;&lt;/div&gt;&apos; +
      &apos;&lt;/div&gt;&apos; +
      &apos;&lt;div class=&quot;flex items-center justify-between&quot;&gt;&apos; +
        &apos;&lt;div class=&quot;text-[10px] text-neutral-500 dark:text-neutral-400 update-time&quot;&gt;更新于: &apos; + formatTime(d.next_update) + &apos;&lt;/div&gt;&apos; +
        &apos;&lt;div class=&quot;text-[10px] text-neutral-500 dark:text-neutral-400 reset-date&quot;&gt;距离流量重置: &apos; + d.reset_date + &apos;&lt;/div&gt;&apos; +
      &apos;&lt;/div&gt;&apos;;
    return div;
  }

  function updateBar(el, d) {
    var uf = formatBytes(d.used);
    var pc = Math.min(100, d.used / d.limit * 100).toFixed(2);
    el.querySelector(&apos;.used-val&apos;).textContent = uf.value;
    el.querySelector(&apos;.used-unit&apos;).textContent = uf.unit;
    el.querySelector(&apos;.percent-val&apos;).textContent = pc + &apos;%&apos;;
    el.querySelector(&apos;.update-time&apos;).textContent = &apos;更新于: &apos; + formatTime(d.next_update);
    el.querySelector(&apos;.reset-date&apos;).textContent = &apos;距离流量重置: &apos; + d.reset_date;
    var bar = el.querySelector(&apos;.progress-bar&apos;);
    bar.style.width = pc + &apos;%&apos;;
    bar.style.backgroundColor = getColor(parseFloat(pc));
  }

  function fixPrice(container, d) {
    if (!d.price || d.billing_cycle == null) return;
    var text = &apos;价格: &apos; + (d.currency || &apos;$&apos;) + d.price + &apos;/&apos; + getCycleText(d.billing_cycle);
    var ps = container.getElementsByTagName(&apos;p&apos;);
    for (var i = 0; i &lt; ps.length; i++) {
      if (ps[i].textContent.indexOf(&apos;价格:&apos;) !== -1) ps[i].textContent = text;
    }
  }

  function getCardTraffic(container) {
    var divs = container.querySelectorAll(&apos;.inline-flex&apos;);
    var up = null, down = null;
    for (var i = 0; i &lt; divs.length; i++) {
      var t = divs[i].textContent;
      if (t.indexOf(&apos;上传&apos;) !== -1) up = parseTraffic(t);
      else if (t.indexOf(&apos;下载&apos;) !== -1) down = parseTraffic(t);
    }
    return up &amp;&amp; down ? { up: up, down: down } : null;
  }

  function matchCard(candidates, d) {
    if (candidates.length === 1) return candidates[0];
    var best = null, bestDiff = Infinity;
    for (var i = 0; i &lt; candidates.length; i++) {
      var traffic = getCardTraffic(candidates[i].closest(&apos;div&apos;));
      if (!traffic) continue;
      var upDiff = Math.abs(traffic.up - d.net_total_up) / Math.max(d.net_total_up, 1);
      var downDiff = Math.abs(traffic.down - d.net_total_down) / Math.max(d.net_total_down, 1);
      if (upDiff &lt; CONFIG.trafficTolerance &amp;&amp; downDiff &lt; CONFIG.trafficTolerance) {
        var avg = (upDiff + downDiff) / 2;
        if (avg &lt; bestDiff) { best = candidates[i]; bestDiff = avg; }
      }
    }
    return best || candidates[0];
  }

  function render(list) {
    var sections = document.querySelectorAll(&apos;section.grid.items-center.gap-2&apos;);
    var used = new Set();

    for (var i = 0; i &lt; list.length; i++) {
      var d = list[i];
      if (!d.limit || !d.used) continue;

      var norm = normName(d.name);
      var candidates = [];
      for (var j = 0; j &lt; sections.length; j++) {
        if (used.has(sections[j])) continue;
        var nameEl = sections[j].querySelector(&apos;p&apos;);
        if (nameEl &amp;&amp; normName(nameEl.textContent.trim()) === norm) candidates.push(sections[j]);
      }
      if (!candidates.length) continue;

      var target = matchCard(candidates, d);
      used.add(target);

      var container = target.closest(&apos;div&apos;);
      fixPrice(container, d);

      // 找到上传下载的 section 作为插入点
      var uploadDownloadSec = null;
      var allSections = container.querySelectorAll(&apos;section.flex.items-center.w-full.justify-between.gap-1&apos;);
      for (var k = 0; k &lt; allSections.length; k++) {
        if (allSections[k].textContent.indexOf(&apos;上传:&apos;) !== -1 &amp;&amp; allSections[k].textContent.indexOf(&apos;下载:&apos;) !== -1) {
          uploadDownloadSec = allSections[k];
          break;
        }
      }
      
      if (!uploadDownloadSec) continue;

      // 检查是否已存在进度条（防止重复）
      var existingBar = container.querySelector(&apos;.traffic-bar[data-uuid=&quot;&apos; + d.uuid + &apos;&quot;]&apos;);
      
      if (existingBar) {
        // 已存在，只更新数据
        updateBar(existingBar, d);
      } else {
        // 不存在，创建新的
        var bar = createBar(d);
        uploadDownloadSec.parentNode.insertBefore(bar, uploadDownloadSec.nextSibling);
        barCache.set(d.uuid, bar);
      }
    }
  }

  // 数据管理
  var dataCache = null, loading = false;

  function rpc(method, params) {
    return fetch(CONFIG.apiUrl, {
      method: &apos;POST&apos;,
      headers: { &apos;Content-Type&apos;: &apos;application/json&apos; },
      credentials: &apos;include&apos;,
      body: JSON.stringify({ id: Date.now(), method: method, params: params || {}, jsonrpc: &apos;2.0&apos; })
    }).then(function(r) { return r.json(); });
  }

  function calcUsed(up, down, type) {
    if (type === &apos;max&apos;) return Math.max(up, down);
    if (type === &apos;min&apos;) return Math.min(up, down);
    if (type === &apos;up&apos;) return up;
    if (type === &apos;down&apos;) return down;
    return up + down;
  }

  function fetchData(cb) {
    var now = Date.now();
    if (dataCache &amp;&amp; now - dataCache.time &lt; CONFIG.interval) { cb(dataCache.data); return; }
    if (loading) return;
    loading = true;

    rpc(&apos;common:getNodes&apos;).then(function(res) {
      var nodes = Object.values(res.result || res.data || {});
      return Promise.all(nodes.map(function(n) {
        return rpc(&apos;common:getNodeRecentStatus&apos;, { uuid: n.uuid, limit: 1 }).then(function(sr) {
          var rec = ((sr.result || sr.data || {}).records || [])[0] || {};
          var up = rec.net_total_up || 0, down = rec.net_total_down || 0;
          return {
            name: n.name, uuid: n.uuid,
            limit: n.traffic_limit || 0,
            used: calcUsed(up, down, n.traffic_limit_type || &apos;sum&apos;),
            next_update: rec.time,
            reset_date: calcResetDays(n.expired_at),
            price: n.price, currency: n.currency, billing_cycle: n.billing_cycle,
            net_total_up: up, net_total_down: down
          };
        }).catch(function() {
          return {
            name: n.name, uuid: n.uuid, limit: n.traffic_limit || 0, used: 0,
            next_update: null, reset_date: calcResetDays(n.expired_at),
            price: n.price, currency: n.currency, billing_cycle: n.billing_cycle,
            net_total_up: 0, net_total_down: 0
          };
        });
      }));
    }).then(function(data) {
      dataCache = { time: now, data: data };
      cb(data);
    }).finally(function() { loading = false; });
  }

  // 观察器 - 优化防止频繁触发
  var observer = null, timer = null, renderPending = false;

  function update() { fetchData(render); }

  function scheduleRender() {
    if (renderPending) return;
    renderPending = true;
    setTimeout(function() {
      renderPending = false;
      update();
    }, 300);
  }

  function init() {
    if (observer) return;
    
    observer = new MutationObserver(scheduleRender);
    observer.observe(document.body, { childList: true, subtree: true });
    
    update();
    timer = setInterval(update, CONFIG.interval);
    
    window.addEventListener(&apos;beforeunload&apos;, function() {
      if (observer) observer.disconnect();
      if (timer) clearInterval(timer);
      barCache.clear();
    }, { once: true });
  }

  // 启动
  function tryInit() {
    if (document.querySelector(&apos;section.grid[class*=&quot;grid-cols-&quot;]&apos;)) {
      requestAnimationFrame(init);
    } else {
      setTimeout(tryInit, 250);
    }
  }

  if (document.readyState === &apos;loading&apos;) {
    document.addEventListener(&apos;DOMContentLoaded&apos;, tryInit, { once: true });
  } else {
    tryInit();
  }
})();
&lt;/script&gt;


```

### 2. 自定义 Body 脚本（流量进度条与数据增强

以下脚本用于动态获取节点流量数据，并在卡片中插入可视化进度条，同时修正价格、流量周期与重置时间展示逻辑。
```
&lt;script&gt;
(function() {
  // 配置
  var CONFIG = {
    interval: 60000,
    apiUrl: &apos;/api/rpc2&apos;,
    trafficTolerance: 0.10
  };

  // 注入样式
  var style = document.createElement(&apos;style&apos;);
  style.textContent = &apos;.server-footer-name&gt;div:first-child{visibility:hidden!important}.server-footer-theme{display:none!important}&apos;;
  document.head.appendChild(style);

  // 全局配置
  window.CustomDesc = &quot;BITJEBE&apos;s Node&quot;;
  window.ShowNetTransfer = true;
  window.DisableAnimatedMan = true;
  window.FixedTopServerName = true;

  // 工具函数
  var UNITS = [&apos;B&apos;, &apos;KiB&apos;, &apos;MiB&apos;, &apos;GiB&apos;, &apos;TiB&apos;, &apos;PiB&apos;];
  var UNIT_MAP = { KIB: 1024, MIB: 1048576, GIB: 1073741824, TIB: 1099511627776 };
  var CYCLE_MAP = { 30: &apos;月&apos;, 92: &apos;季&apos;, 184: &apos;半年&apos;, 365: &apos;年&apos;, 730: &apos;二年&apos;, 1095: &apos;三年&apos;, 1825: &apos;五年&apos; };

  function formatBytes(bytes) {
    if (!bytes) return { value: &apos;0&apos;, unit: &apos;B&apos; };
    var i = Math.floor(Math.log(bytes) / Math.log(1024));
    return { value: (bytes / Math.pow(1024, i)).toFixed(2), unit: UNITS[i] };
  }

  function formatTime(s) {
    if (!s) return &apos;N/A&apos;;
    try {
      return new Date(s).toLocaleString(&apos;zh-CN&apos;, { timeZone: &apos;Asia/Shanghai&apos;, hour: &apos;2-digit&apos;, minute: &apos;2-digit&apos;, second: &apos;2-digit&apos; });
    } catch (e) { return &apos;N/A&apos;; }
  }

  function getCycleText(c) {
    if (!c || c &lt;= 0) return c === -1 || c === 0 ? &apos;一次性&apos; : &apos;年&apos;;
    for (var days in CYCLE_MAP) {
      if (Math.abs(c - days) &lt;= 3) return CYCLE_MAP[days];
    }
    var y = Math.round(c / 365);
    return y &gt;= 1 &amp;&amp; y &lt;= 10 ? y + &apos;年&apos; : &apos;年&apos;;
  }

  function calcResetDays(expiredAt) {
    if (!expiredAt) return &apos;N/A&apos;;
    try {
      var day = new Date(expiredAt).getDate(), now = new Date();
      var reset = new Date(now.getFullYear(), now.getMonth(), day);
      if (reset &lt;= now) reset.setMonth(reset.getMonth() + 1);
      return Math.ceil((reset - now) / 86400000) + &apos;日&apos;;
    } catch (e) { return &apos;N/A&apos;; }
  }

  function parseTraffic(text) {
    var m = text.match(/([\d.]+)\s*(GiB|MiB|TiB|KiB)/i);
    return m ? parseFloat(m[1]) * (UNIT_MAP[m[2].toUpperCase()] || 1) : null;
  }

  function normName(n) { return n.toUpperCase().replace(/[^A-Z0-9-]/g, &apos;&apos;); }

  function getColor(p) { return &apos;hsl(&apos; + ((100 - p) * 1.4) + &apos;,70%,50%)&apos;; }

  // 渲染器
  var barCache = new Map();

  function createBar(d) {
    var uf = formatBytes(d.used), tf = formatBytes(d.limit);
    var pc = Math.min(100, d.used / d.limit * 100).toFixed(2);
    var div = document.createElement(&apos;div&apos;);
    div.className = &apos;space-y-1.5 traffic-bar&apos;;
    div.dataset.uuid = d.uuid;
    div.style.width = &apos;100%&apos;;
    div.innerHTML = 
      &apos;&lt;div class=&quot;flex items-center justify-between&quot;&gt;&apos; +
        &apos;&lt;div class=&quot;flex items-baseline gap-1&quot;&gt;&apos; +
          &apos;&lt;span class=&quot;text-[10px] font-medium text-neutral-800 dark:text-neutral-200 used-val&quot;&gt;&apos; + uf.value + &apos;&lt;/span&gt;&apos; +
          &apos;&lt;span class=&quot;text-[10px] font-medium text-neutral-800 dark:text-neutral-200 used-unit&quot;&gt;&apos; + uf.unit + &apos;&lt;/span&gt;&apos; +
          &apos;&lt;span class=&quot;text-[10px] text-neutral-500 dark:text-neutral-400&quot;&gt;/ &apos; + tf.value + &apos; &apos; + tf.unit + &apos;&lt;/span&gt;&apos; +
        &apos;&lt;/div&gt;&apos; +
        &apos;&lt;div class=&quot;text-[10px] font-medium text-neutral-600 dark:text-neutral-300 percent-val&quot;&gt;&apos; + pc + &apos;%&lt;/div&gt;&apos; +
      &apos;&lt;/div&gt;&apos; +
      &apos;&lt;div class=&quot;relative h-1.5&quot; style=&quot;width:100%&quot;&gt;&apos; +
        &apos;&lt;div class=&quot;absolute inset-0 bg-neutral-100 dark:bg-neutral-800 rounded-full&quot;&gt;&lt;/div&gt;&apos; +
        &apos;&lt;div class=&quot;absolute inset-0 rounded-full transition-all duration-300 progress-bar&quot; style=&quot;width:&apos; + pc + &apos;%;background-color:&apos; + getColor(parseFloat(pc)) + &apos;&quot;&gt;&lt;/div&gt;&apos; +
      &apos;&lt;/div&gt;&apos; +
      &apos;&lt;div class=&quot;flex items-center justify-between&quot;&gt;&apos; +
        &apos;&lt;div class=&quot;text-[10px] text-neutral-500 dark:text-neutral-400 update-time&quot;&gt;更新于: &apos; + formatTime(d.next_update) + &apos;&lt;/div&gt;&apos; +
        &apos;&lt;div class=&quot;text-[10px] text-neutral-500 dark:text-neutral-400 reset-date&quot;&gt;距离流量重置: &apos; + d.reset_date + &apos;&lt;/div&gt;&apos; +
      &apos;&lt;/div&gt;&apos;;
    return div;
  }

  function updateBar(el, d) {
    var uf = formatBytes(d.used);
    var pc = Math.min(100, d.used / d.limit * 100).toFixed(2);
    el.querySelector(&apos;.used-val&apos;).textContent = uf.value;
    el.querySelector(&apos;.used-unit&apos;).textContent = uf.unit;
    el.querySelector(&apos;.percent-val&apos;).textContent = pc + &apos;%&apos;;
    el.querySelector(&apos;.update-time&apos;).textContent = &apos;更新于: &apos; + formatTime(d.next_update);
    el.querySelector(&apos;.reset-date&apos;).textContent = &apos;距离流量重置: &apos; + d.reset_date;
    var bar = el.querySelector(&apos;.progress-bar&apos;);
    bar.style.width = pc + &apos;%&apos;;
    bar.style.backgroundColor = getColor(parseFloat(pc));
  }

  function fixPrice(container, d) {
    if (!d.price || d.billing_cycle == null) return;
    var text = &apos;价格: &apos; + (d.currency || &apos;$&apos;) + d.price + &apos;/&apos; + getCycleText(d.billing_cycle);
    var ps = container.getElementsByTagName(&apos;p&apos;);
    for (var i = 0; i &lt; ps.length; i++) {
      if (ps[i].textContent.indexOf(&apos;价格:&apos;) !== -1) ps[i].textContent = text;
    }
  }

  function getCardTraffic(container) {
    var divs = container.querySelectorAll(&apos;.inline-flex&apos;);
    var up = null, down = null;
    for (var i = 0; i &lt; divs.length; i++) {
      var t = divs[i].textContent;
      if (t.indexOf(&apos;上传&apos;) !== -1) up = parseTraffic(t);
      else if (t.indexOf(&apos;下载&apos;) !== -1) down = parseTraffic(t);
    }
    return up &amp;&amp; down ? { up: up, down: down } : null;
  }

  function matchCard(candidates, d) {
    if (candidates.length === 1) return candidates[0];
    var best = null, bestDiff = Infinity;
    for (var i = 0; i &lt; candidates.length; i++) {
      var traffic = getCardTraffic(candidates[i].closest(&apos;div&apos;));
      if (!traffic) continue;
      var upDiff = Math.abs(traffic.up - d.net_total_up) / Math.max(d.net_total_up, 1);
      var downDiff = Math.abs(traffic.down - d.net_total_down) / Math.max(d.net_total_down, 1);
      if (upDiff &lt; CONFIG.trafficTolerance &amp;&amp; downDiff &lt; CONFIG.trafficTolerance) {
        var avg = (upDiff + downDiff) / 2;
        if (avg &lt; bestDiff) { best = candidates[i]; bestDiff = avg; }
      }
    }
    return best || candidates[0];
  }

  function render(list) {
    var sections = document.querySelectorAll(&apos;section.grid.items-center.gap-2&apos;);
    var used = new Set();

    for (var i = 0; i &lt; list.length; i++) {
      var d = list[i];
      if (!d.limit || !d.used) continue;

      var norm = normName(d.name);
      var candidates = [];
      for (var j = 0; j &lt; sections.length; j++) {
        if (used.has(sections[j])) continue;
        var nameEl = sections[j].querySelector(&apos;p&apos;);
        if (nameEl &amp;&amp; normName(nameEl.textContent.trim()) === norm) candidates.push(sections[j]);
      }
      if (!candidates.length) continue;

      var target = matchCard(candidates, d);
      used.add(target);

      var container = target.closest(&apos;div&apos;);
      fixPrice(container, d);

      // 找到上传下载的 section 作为插入点
      var uploadDownloadSec = null;
      var allSections = container.querySelectorAll(&apos;section.flex.items-center.w-full.justify-between.gap-1&apos;);
      for (var k = 0; k &lt; allSections.length; k++) {
        if (allSections[k].textContent.indexOf(&apos;上传:&apos;) !== -1 &amp;&amp; allSections[k].textContent.indexOf(&apos;下载:&apos;) !== -1) {
          uploadDownloadSec = allSections[k];
          break;
        }
      }
      
      if (!uploadDownloadSec) continue;

      // 检查是否已存在进度条（防止重复）
      var existingBar = container.querySelector(&apos;.traffic-bar[data-uuid=&quot;&apos; + d.uuid + &apos;&quot;]&apos;);
      
      if (existingBar) {
        // 已存在，只更新数据
        updateBar(existingBar, d);
      } else {
        // 不存在，创建新的
        var bar = createBar(d);
        uploadDownloadSec.parentNode.insertBefore(bar, uploadDownloadSec.nextSibling);
        barCache.set(d.uuid, bar);
      }
    }
  }

  // 数据管理
  var dataCache = null, loading = false;

  function rpc(method, params) {
    return fetch(CONFIG.apiUrl, {
      method: &apos;POST&apos;,
      headers: { &apos;Content-Type&apos;: &apos;application/json&apos; },
      credentials: &apos;include&apos;,
      body: JSON.stringify({ id: Date.now(), method: method, params: params || {}, jsonrpc: &apos;2.0&apos; })
    }).then(function(r) { return r.json(); });
  }

  function calcUsed(up, down, type) {
    if (type === &apos;max&apos;) return Math.max(up, down);
    if (type === &apos;min&apos;) return Math.min(up, down);
    if (type === &apos;up&apos;) return up;
    if (type === &apos;down&apos;) return down;
    return up + down;
  }

  function fetchData(cb) {
    var now = Date.now();
    if (dataCache &amp;&amp; now - dataCache.time &lt; CONFIG.interval) { cb(dataCache.data); return; }
    if (loading) return;
    loading = true;

    rpc(&apos;common:getNodes&apos;).then(function(res) {
      var nodes = Object.values(res.result || res.data || {});
      return Promise.all(nodes.map(function(n) {
        return rpc(&apos;common:getNodeRecentStatus&apos;, { uuid: n.uuid, limit: 1 }).then(function(sr) {
          var rec = ((sr.result || sr.data || {}).records || [])[0] || {};
          var up = rec.net_total_up || 0, down = rec.net_total_down || 0;
          return {
            name: n.name, uuid: n.uuid,
            limit: n.traffic_limit || 0,
            used: calcUsed(up, down, n.traffic_limit_type || &apos;sum&apos;),
            next_update: rec.time,
            reset_date: calcResetDays(n.expired_at),
            price: n.price, currency: n.currency, billing_cycle: n.billing_cycle,
            net_total_up: up, net_total_down: down
          };
        }).catch(function() {
          return {
            name: n.name, uuid: n.uuid, limit: n.traffic_limit || 0, used: 0,
            next_update: null, reset_date: calcResetDays(n.expired_at),
            price: n.price, currency: n.currency, billing_cycle: n.billing_cycle,
            net_total_up: 0, net_total_down: 0
          };
        });
      }));
    }).then(function(data) {
      dataCache = { time: now, data: data };
      cb(data);
    }).finally(function() { loading = false; });
  }

  // 观察器 - 优化防止频繁触发
  var observer = null, timer = null, renderPending = false;

  function update() { fetchData(render); }

  function scheduleRender() {
    if (renderPending) return;
    renderPending = true;
    setTimeout(function() {
      renderPending = false;
      update();
    }, 300);
  }

  function init() {
    if (observer) return;
    
    observer = new MutationObserver(scheduleRender);
    observer.observe(document.body, { childList: true, subtree: true });
    
    update();
    timer = setInterval(update, CONFIG.interval);
    
    window.addEventListener(&apos;beforeunload&apos;, function() {
      if (observer) observer.disconnect();
      if (timer) clearInterval(timer);
      barCache.clear();
    }, { once: true });
  }

  // 启动
  function tryInit() {
    if (document.querySelector(&apos;section.grid[class*=&quot;grid-cols-&quot;]&apos;)) {
      requestAnimationFrame(init);
    } else {
      setTimeout(tryInit, 250);
    }
  }

  if (document.readyState === &apos;loading&apos;) {
    document.addEventListener(&apos;DOMContentLoaded&apos;, tryInit, { once: true });
  } else {
    tryInit();
  }
})();
&lt;/script&gt;


```

## 七、Komari 通知模板（Telegram）

以下为 Komari 事件通知的 Telegram 模板示例，支持：

- 上线 / 离线通知
- 异常告警
- 到期与续费提醒
- 面板与实例详情按钮跳转

### 消息发送函数（示例1）
```
async function sendMessage(message, title, instanceId = null) {
  const token = &quot;YOUR_BOT_TOKEN&quot;;
  const chatId = &quot;YOUR_CHAT_ID&quot;;
  const panelUrl = &quot;http://YOUR_PANEL_URL&quot;;

  if (!token || !chatId) return false;

  const url = `https://api.telegram.org/bot${token}/sendMessage`;

  let inline_keyboard = [];
  let row = [{ text: &quot;📊 进入面板&quot;, url: panelUrl }];

  if (instanceId) {
    row.push({
      text: &quot;🌐 实例详情&quot;,
      url: `${panelUrl}/instance/${instanceId}`
    });
  }

  inline_keyboard.push(row);

  const resp = await fetch(url, {
    method: &quot;POST&quot;,
    headers: { &quot;Content-Type&quot;: &quot;application/json&quot; },
    body: JSON.stringify({
      chat_id: chatId,
      text: `&lt;b&gt;${title}&lt;/b&gt;\n\n${message}`,
      parse_mode: &quot;HTML&quot;,
      reply_markup: { inline_keyboard }
    })
  });

  if (!resp.ok) {
    const err = await resp.text();
    throw new Error(`Telegram API Error: ${err}`);
  }

  return true;
}

async function sendEvent(event) {
  try {
    const escapeHtml = (str) =&gt;
      String(str || &quot;&quot;)
        .replace(/&amp;/g, &quot;&amp;amp;&quot;)
        .replace(/&lt;/g, &quot;&amp;lt;&quot;)
        .replace(/&gt;/g, &quot;&amp;gt;&quot;);

    const formatTime = (timeStr) =&gt; {
      if (!timeStr || timeStr.startsWith(&quot;0001&quot;)) return &quot;未知&quot;;
      const d = new Date(timeStr.replace(/\.\d+Z$/, &quot;Z&quot;));
      const bj = new Date(d.getTime() + 8 * 3600 * 1000);

      const f = (n) =&gt; String(n).padStart(2, &quot;0&quot;);

      return `${bj.getUTCFullYear()}-${f(bj.getUTCMonth() + 1)}-${f(bj.getUTCDate())} ${f(bj.getUTCHours())}:${f(bj.getUTCMinutes())}:${f(bj.getUTCSeconds())}`;
    };

    const formatSize = (bytes) =&gt; {
      if (!bytes) return &quot;0&quot;;
      const gb = bytes / 1024 / 1024 / 1024;

      if (gb &gt;= 1024) return `${(gb / 1024).toFixed(2)}TB`;
      if (gb &gt;= 1) return `${gb.toFixed(1)}G`;
      return `${Math.round(gb * 1024)}MB`;
    };

    const formatTraffic = (bytes) =&gt; {
      if (!bytes) return &quot;无限制&quot;;
      const gb = bytes / 1024 / 1024 / 1024;
      return gb &gt;= 1024
        ? `${(gb / 1024).toFixed(2)}TB`
        : `${gb.toFixed(2)}GB`;
    };

    const hideIP = (ip) =&gt; {
      if (!ip) return &quot;未知&quot;;

      if (ip.includes(&quot;.&quot;)) {
        const p = ip.split(&quot;.&quot;);
        return `${p[0]}.${p[1]}.xxx.xxx`;
      }

      if (ip.includes(&quot;:&quot;)) {
        return ip.split(&quot;:&quot;).slice(0, 3).join(&quot;:&quot;) + &quot;:xxxx:xxxx&quot;;
      }

      return ip;
    };

    const eventTitles = {
      Online:  &quot;🟢 服务器上线&quot;,
      Offline: &quot;🔴 服务器离线&quot;,
      Alert:   &quot;⚠️ 异常警报&quot;,
      Renew:   &quot;💰 续费通知&quot;,
      Expire:  &quot;🚨 到期预警&quot;,
      Test:    &quot;🧪 测试通知&quot;
    };

    const title = eventTitles[event.event] || &quot;📌 系统通知&quot;;

    let message = &quot;&quot;;
    let targetInstanceId = null;

    if (event.clients?.length) {
      const c = event.clients[0];
      targetInstanceId = c.uuid;

      message += `━━━━━━━━━━━━━━\n`;
      message += `🖥️ &lt;b&gt;${escapeHtml(c.name || &quot;未知节点&quot;)}&lt;/b&gt;`;

      if (c.region) {
        message += `  &lt;code&gt;[${escapeHtml(c.region)}]&lt;/code&gt;`;
      }

      message += `\n`;
      message += `⚙️ 配置：${c.cpu_cores || 0}C / ${formatSize(c.mem_total)}${c.swap_total ? &quot;+&quot; + formatSize(c.swap_total) : &quot;&quot;} / ${formatSize(c.disk_total)}\n`;
      message += `🌐 IPv4：&lt;code&gt;${hideIP(c.ipv4)}&lt;/code&gt;\n`;
      message += `🌐 IPv6：&lt;code&gt;${hideIP(c.ipv6)}&lt;/code&gt;\n`;
      message += `📶 流量：${formatTraffic(c.traffic_limit)}`;

      if (c.traffic_limit_type) {
        message += ` (${escapeHtml(c.traffic_limit_type)})`;
      }

      message += `\n`;

      if (event.event === &quot;Renew&quot; || event.event === &quot;Expire&quot;) {
        message += `💳 账单：${escapeHtml(c.currency || &quot;$&quot;)}${c.price || 0}`;
        if (c.billing_cycle) {
          message += ` / ${c.billing_cycle}天`;
        }
        message += `\n`;
      }
    }

    message += `━━━━━━━━━━━━━━\n`;
    message += `📍 状态：&lt;b&gt;${escapeHtml(event.event)}&lt;/b&gt;\n`;
    message += `🕒 时间：&lt;code&gt;${formatTime(event.time)}&lt;/code&gt;\n`;

    if (event.message?.trim()) {
      message += `📄 详情：&lt;i&gt;${escapeHtml(event.message)}&lt;/i&gt;\n`;
    }

    if (event.event === &quot;Offline&quot;) {
      message += `\n🚨 &lt;b&gt;节点离线，请立即检查！&lt;/b&gt;`;
    }

    if (event.event === &quot;Alert&quot;) {
      message += `\n⚠️ &lt;b&gt;检测到异常，请关注监控数据！&lt;/b&gt;`;
    }

    if (event.event === &quot;Expire&quot;) {
      message += `\n⏰ &lt;b&gt;服务器即将到期，请及时续费！&lt;/b&gt;`;
    }

    return await sendMessage(message, title, targetInstanceId);

  } catch (error) {
    return await sendMessage(
      `脚本执行失败：&lt;code&gt;${String(error.message)}&lt;/code&gt;`,
      &quot;❌ 通知错误&quot;
    );
  }
}
```
# 效果示例（离线）

```
🔴 服务器离线━━━━━━━━━━━━━━
🖥️ Tokyo-01 [Japan]
⚙️ 配置：2C / 4.0G+1.0G / 40.0G
🌐 IPv4：1.2.xxx.xxx
🌐 IPv6：2400:xxxx:xxxx
📶 流量：500.00GB━━━━━━━━━━━━━━
📍 状态：Offline
🕒 时间：2026-05-05 21:33:22
📄 详情：Ping timeout

🚨 节点离线，请立即检查！
```
### 消息发送函数（示例2）
```
async function sendMessage(message, title, instanceId = null) {
  const token = &quot;YOUR_BOT_TOKEN&quot;;
  const chatId = &quot;YOUR_CHAT_ID&quot;;
  const panelUrl = &quot;http://YOUR_PANEL_URL&quot;;

  const url = `https://api.telegram.org/bot${token}/sendMessage`;

  const inline_keyboard = [[
    { text: &quot;📊 控制面板&quot;, url: panelUrl },
    ...(instanceId ? [{
      text: &quot;🌐 实例详情&quot;,
      url: `${panelUrl}/instance/${instanceId}`
    }] : [])
  ]];

  const resp = await fetch(url, {
    method: &quot;POST&quot;,
    headers: { &quot;Content-Type&quot;: &quot;application/json&quot; },
    body: JSON.stringify({
      chat_id: chatId,
      text: `&lt;b&gt;${title}&lt;/b&gt;\n\n${message}`,
      parse_mode: &quot;HTML&quot;,
      reply_markup: { inline_keyboard }
    })
  });

  if (!resp.ok) {
    throw new Error(await resp.text());
  }

  return true;
}

async function sendEvent(event) {
  try {
    const esc = (s) =&gt;
      String(s || &quot;&quot;)
        .replace(/&amp;/g, &quot;&amp;amp;&quot;)
        .replace(/&lt;/g, &quot;&amp;lt;&quot;)
        .replace(/&gt;/g, &quot;&amp;gt;&quot;);

    const fmtTime = (t) =&gt; {
      const d = new Date(t.replace(/\.\d+Z$/, &quot;Z&quot;));
      const bj = new Date(d.getTime() + 8 * 3600 * 1000);
      const f = (n) =&gt; String(n).padStart(2, &quot;0&quot;);

      return `${bj.getUTCFullYear()}-${f(bj.getUTCMonth()+1)}-${f(bj.getUTCDate())} ${f(bj.getUTCHours())}:${f(bj.getUTCMinutes())}:${f(bj.getUTCSeconds())}`;
    };

    const fmtSize = (b) =&gt; {
      if (!b) return &quot;0&quot;;
      const gb = b / 1024 / 1024 / 1024;
      if (gb &gt;= 1024) return `${(gb / 1024).toFixed(2)}T`;
      if (gb &gt;= 1) return `${gb.toFixed(1)}G`;
      return `${Math.round(gb * 1024)}M`;
    };

    const fmtTraffic = (b) =&gt; {
      if (!b) return &quot;∞&quot;;
      const gb = b / 1024 / 1024 / 1024;
      return gb &gt;= 1024 ? `${(gb / 1024).toFixed(2)}T` : `${gb.toFixed(1)}G`;
    };

    const maskIP = (ip) =&gt; {
      if (!ip) return &quot;N/A&quot;;
      if (ip.includes(&quot;.&quot;)) {
        const p = ip.split(&quot;.&quot;);
        return `${p[0]}.${p[1]}.***.***`;
      }
      return ip.split(&quot;:&quot;).slice(0, 3).join(&quot;:&quot;) + &quot;:****&quot;;
    };

    const titles = {
      Online:  &quot;🟢 NODE ONLINE&quot;,
      Offline: &quot;🔴 NODE OFFLINE&quot;,
      Alert:   &quot;⚠️ ALERT TRIGGERED&quot;,
      Renew:   &quot;💰 BILL RENEWED&quot;,
      Expire:  &quot;🚨 EXPIRING SOON&quot;,
      Test:    &quot;🧪 TEST EVENT&quot;
    };

    const title = titles[event.event] || &quot;📌 SYSTEM EVENT&quot;;

    let msg = &quot;&quot;;
    let instanceId = null;

    if (event.clients?.length) {
      const c = event.clients[0];
      instanceId = c.uuid;

      msg += `&lt;code&gt;`;
      msg += `╔════════ NODE INFO ════════\n`;
      msg += `║ NAME   │ ${esc(c.name || &quot;Unknown&quot;)}\n`;
      msg += `║ REGION │ ${esc(c.region || &quot;N/A&quot;)}\n`;
      msg += `║ SPEC   │ ${c.cpu_cores || 0}C / ${fmtSize(c.mem_total)} / ${fmtSize(c.disk_total)}\n`;
      msg += `║ SWAP   │ ${fmtSize(c.swap_total)}\n`;
      msg += `║ IPv4   │ ${maskIP(c.ipv4)}\n`;
      msg += `║ IPv6   │ ${maskIP(c.ipv6)}\n`;
      msg += `║ TRAF   │ ${fmtTraffic(c.traffic_limit)}\n`;

      if (event.event === &quot;Renew&quot; || event.event === &quot;Expire&quot;) {
        msg += `║ BILL   │ ${esc(c.currency || &quot;$&quot;)}${c.price || 0}`;
        if (c.billing_cycle) msg += ` / ${c.billing_cycle}d`;
        msg += `\n`;
      }

      msg += `╚═══════════════════════════\n`;
      msg += `&lt;/code&gt;`;
    }

    msg += `&lt;code&gt;`;
    msg += `STATUS : ${event.event}\n`;
    msg += `TIME   : ${fmtTime(event.time)} UTC+8\n`;
    msg += `&lt;/code&gt;`;

    if (event.message?.trim()) {
      msg += `\n&lt;b&gt;DETAIL&lt;/b&gt;\n&lt;blockquote&gt;${esc(event.message)}&lt;/blockquote&gt;`;
    }

    if (event.event === &quot;Offline&quot;) {
      msg += `\n\n🚨 &lt;b&gt;Immediate action required.&lt;/b&gt;`;
    }

    if (event.event === &quot;Alert&quot;) {
      msg += `\n\n⚠️ &lt;b&gt;Metric threshold exceeded.&lt;/b&gt;`;
    }

    if (event.event === &quot;Expire&quot;) {
      msg += `\n\n⏰ &lt;b&gt;Renew before expiration.&lt;/b&gt;`;
    }

    return await sendMessage(msg, title, instanceId);

  } catch (err) {
    return await sendMessage(
      `&lt;code&gt;${String(err.message)}&lt;/code&gt;`,
      &quot;❌ SCRIPT ERROR&quot;
    );
  }
}
```

### 效果示例
```
🔴 NODE OFFLINE

╔════════ NODE INFO ════════
║ NAME   │ JP-Tokyo-01
║ REGION │ Japan
║ SPEC   │ 2C / 4.0G / 40.0G
║ SWAP   │ 1.0G
║ IPv4   │ 1.2.***.***
║ IPv6   │ 2400:abcd:1234:****
║ TRAF   │ 500.0G
╚═══════════════════════════

STATUS : Offline
TIME   : 2026-05-05 21:45:33 UTC+8

DETAIL
Ping timeout

🚨 Immediate action required.
```

## 八、总结

本文完整覆盖了 Komari 的：

- Debian 12 环境部署
- 安装与验证流程
- 管理员密码管理
- 前端 UI 与流量展示增强
- Telegram 通知模板

适合作为 Komari 的长期使用文档或二次定制基础。如后续需要：

- 拆分 JS 模块
- 自定义主题样式
- 对接更多通知渠道

可在此结构上持续扩展。</content:encoded><author>G.Ark</author></item><item><title>如何优雅地搭建“机场前置+独立落地”链式代理？</title><link>https://1314047.xyz/blog/2026-04-30-new-job.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-04-30-new-job.html</guid><pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate><content:encoded>## 1. 什么是链式代理？为什么要这么搞？

链式代理就是让你的网络流量连续穿过**两个**代理服务器，也就是“代理套娃”。  
目的是用双倍的流量成本，换取极速的网络加上干净独享的 IP。

## 2. 核心架构图解

text

[本地客户端] → [机场专线前置节点] → [个人独享落地节点] → [目标网站/服务]

- **机场专线前置节点**：负责提供稳定、低延迟的国际出口通道
    
- **个人独享落地节点**：负责提供原生、干净的最终出口 IP
    

## 3. 准备工作

#### 必备条件

- 代理软件（V2rayN 或 Clash Verge Rev）
    
- 优质的机场前置节点
    
- 落地节点
    

#### 软件下载（请更新到最新版本）

- **V2rayN**：GitHub Releases 页面搜索 [2dust/v2rayN](`https://github.com/2dust/v2rayN/releases`)
    
- **Clash Verge Rev**：GitHub Releases 页面搜索  [clash-verge-rev/clash-verge](`https://github.com/clash-verge-rev/clash-verge-rev/releases`)
    

&gt; 💡 **实测提示**：V2rayN 比 Clash Verge Rev 稳定很多！

#### 节点说明

- **个人节点搭建**：可参考后续白嫖微软 + 个人节点搭建教程
    
- **前置节点**：机场、线路机等均可使用，教程通用
    

## 4. V2rayN 教程

#### 4.1 导入节点与订阅

点击1-2-3-4，添加机场订阅
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345780.png)

在机场分组（1）里面，点击2-3添加落地节点
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345772.png)

添加落地节点如下：
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345764.png)

#### 4.2 创建“链式代理”配置

点击1-2-3添加中转节点和落地节点
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345757.png)

添加后如下+注意事项：不要弄错顺序！！！
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345740.png)

#### 4.3 使用

点击1-3使用搭建的链式代理,2有延迟代表链式代理成功！

## 5、Clash Verge Rev教程

#### 5.1 导入落地节点

在订阅中转机场右键编辑节点
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345730.png)

点击1-2添加落地节点，看到3点击保存！
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345716.png)
#### 5.2 创建“链式代理”配置
在代理选项中，点击1-2-3-4。2是中转节点（机场），3是落地节点
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345704.png)

#### 5.3 使用
点击对号使用
![](assets/如何优雅地搭建“机场前置+独立落地”链式代理？/file-20260430103345688.png)</content:encoded><author>G.Ark</author></item><item><title>怎么部署Alpha Trade Toolkit</title><link>https://1314047.xyz/blog/2026-04-19-U.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-04-19-U.html</guid><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><content:encoded>---

&gt; 项目地址：
&gt;  [https://github.com/0xxue/alpha-trade-toolkit](https://github.com/0xxue/alpha-trade-toolkit?utm_source=chatgpt.com)

------

## 📌 一、项目架构说明

这个项目**不是传统 Web 应用**，不能直接丢到服务器运行。

它的架构是：

### 1️⃣ 本地控制端（GUI）

- 运行在你的电脑（Windows / Linux桌面）
- 启动方式：`python main.py`
- 功能：
  - 管理服务器
  - 导入用户 headers
  - 绑定用户与服务器
  - 批量部署

------

### 2️⃣ 远程执行端（VPS）

- 多台 Linux 服务器
- 通过 SSH 被本地控制端连接
- 用于运行交易逻辑

------

### 📊 整体流程

```
本地GUI → SSH连接 → VPS执行脚本
```

------

## 🚀 二、部署流程总览

正确顺序：

1. 本地启动 GUI
2. 准备 VPS 服务器
3. 配置服务器列表
4. 导入 headers
5. 绑定用户与服务器
6. 批量部署
7. 启动交易

------

## 💻 三、本地控制端部署

### 1）环境要求

- Python 3.10+
- Windows / Linux（带桌面）

------

### 2）克隆项目

```
git clone https://github.com/0xxue/alpha-trade-toolkit.git
cd alpha-trade-toolkit
```

------

### 3）创建虚拟环境

#### Windows

```
python -m venv .venv
.venv\Scripts\activate
```

------

### 4）安装依赖

```
pip install -r requirements.txt
```

⚠️ 注意：项目依赖不完整，需要补充：

```
pip install playwright flask flask-cors websocket-client requests
playwright install chromium
```

------

### 5）启动项目

```
python main.py
```

启动后会：

- 自动创建 `config/`
- 自动创建 `account/`
- 初始化服务器配置文件
- 打开 GUI 界面

------

## ⚙️ 四、部署后配置

------

### 1）配置服务器

编辑：

```
config/servers.txt
```

格式：

```
IP:端口:用户名:密码
```

示例：

```
1.2.3.4:22:root:password
5.6.7.8:root:password
```

支持两种格式：

- `IP:用户名:密码`
- `IP:端口:用户名:密码`

------

### 2）添加用户 headers

路径：

```
account/
```

文件命名：

```
new_account_headers_用户名.txt
```

示例：

```
account/new_account_headers_alice.txt
account/new_account_headers_bob.txt
```

------

### 3）绑定用户与服务器

绑定信息会保存到：

```
config/server_bindings.json
```

规则：

- 一台服务器只能绑定一个用户

------

### 4）其他配置文件

```
config/team_config.json
config/team_passwords.json
config/deployment_mode.json
config/proxy.txt
```

说明：

| 文件                 | 作用         |
| -------------------- | ------------ |
| team_config.json     | 团队配置     |
| deployment_mode.json | 运行模式     |
| proxy.txt            | 代理（可选） |
| server_bindings.json | 自动生成     |

------

## 🧭 五、GUI 操作流程

启动后按顺序操作：

### Step 1：Deploy Panel

- 检查服务器是否加载成功

### Step 2：User Panel

- 确认 headers 用户已识别

### Step 3：Binding Panel

- 用户绑定服务器（1:1）

### Step 4：Deploy

- 批量部署

### Step 5：Trading Panel

- 启动交易 / 查看状态

------

## 🖥️ 六、远程服务器准备

### 推荐系统

- Ubuntu 22.04
- Debian 12

------

### 安装基础环境

```
apt update &amp;&amp; apt upgrade -y
apt install -y python3 python3-pip python3-venv curl wget unzip git
```

------

### 安装浏览器（必须）

```
apt install -y chromium-browser
```

否则 Playwright 会报错

------

### SSH 要求

- 开启 SSH
- 端口 22 可访问
- 支持 root / sudo 登录

------

## ✅ 七、部署成功验证

### 本地验证

- GUI 正常打开
- 能看到服务器
- 能看到用户
- 绑定成功

------

### 远程验证

服务器上应出现：

```
/root/new_account_headers_用户名.txt
/root/2fa_secret_用户名.txt
/root/trading_status_用户名.json
/root/trading_用户名.log
```

可能还有 systemd 服务：

```
qr-用户名.service
```

------

## ⚠️ 八、常见坑

### 1）误以为是 Web 项目

❌ 错误
 ✅ 实际是 GUI 工具

------

### 2）只安装 requirements.txt

❌ 不够
 ✅ 需要手动补依赖

------

### 3）没有 headers 文件

❌ 用户不会显示

------

### 4）一机多用户

❌ 不支持
 ✅ 必须 1:1

------

### 5）服务器没有浏览器

❌ Playwright 会失败

------

## 🧪 九、最简测试方案

### 配置

- 1 台本地电脑
- 1 台 VPS

------

### 本地执行

```
git clone https://github.com/0xxue/alpha-trade-toolkit.git
cd alpha-trade-toolkit

python -m venv .venv
.venv\Scripts\activate

pip install -r requirements.txt
pip install playwright flask flask-cors websocket-client requests
playwright install chromium

python main.py
```

------

### 配置文件

#### servers.txt

```
你的IP:22:root:密码
```

#### headers

```
account/new_account_headers_testuser.txt
```

------

### GUI 操作

1. 检查服务器
2. 检查用户
3. 绑定
4. 部署
5. 启动交易

------

## 🔒 十、优化建议（强烈建议）

这个项目偏“半成品”，建议你自己增强：

### 安全方面

- 使用 SSH Key（不要密码）
- headers 加密存储
- 配置文件加密

------

### 工程方面

- 补完整 requirements.txt
- 增加 `.env.example`
- 区分 API / Web 模式

------

### 风控方面

- 使用测试账号
- 不要直接上主账号

------

## 📌 总结

### 部署核心

- 本地运行 GUI
- VPS 执行任务
- SSH 批量管理

------

### 使用核心

```
服务器配置 → headers导入 → 用户绑定 → 批量部署 → 启动交易
```</content:encoded><author>G.Ark</author></item><item><title>怎么部署Binance-Alpha-Trande-Bot</title><link>https://1314047.xyz/blog/2026-04-19-b.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-04-19-b.html</guid><pubDate>Sun, 19 Apr 2026 00:00:00 GMT</pubDate><content:encoded># Binance Alpha Trade Bot 部署与运行说明（整理版）

## 一、项目概述

项目名称：[Binance-Alpha-Trande-Bot]()

本项目是一个使用 Go 语言开发的币安（Binance）自动交易机器人系统，主要用于连接 Binance API 进行自动化交易操作。

从代码结构来看，该项目属于典型的自动交易 / 高频交易系统，可能包含以下能力模块：

- 高频交易（Flash Trade）
    
- 自动卖出（Auto Sell）
    
- 批量交易（Batch Trade）
    
- 多账号或分布式交易支持
    

该类系统通常用于：

- 自动化套利
    
- 交易量刷单（刷成交）
    
- 策略化买卖执行
    

注意：该类系统风险较高，需要谨慎使用真实资金。

---

## 二、运行环境准备

### 1. 安装 Go 环境

检查是否安装成功：

```bash
go version
```

建议版本：Go 1.20 及以上

---

### 2. 安装项目依赖

在项目根目录执行：

```bash
go mod tidy
```

作用：自动下载并整理项目依赖（类似 Python 的 pip install）

---

## 三、项目结构分析

常见关键目录：

```
cmd/              # 程序入口
config.json       # 配置文件
flash_trade.go    # 高频交易模块
alpha_autosell.go # 自动卖出模块
```

### 1. cmd 目录

Go 项目标准入口位置，一般包含：

```
cmd/main.go
```

或：

```
cmd/master/main.go
```

---

## 四、运行项目

### 方法一：直接运行

```bash
go run ./cmd
```

或：

```bash
go run cmd/main.go
```

或（如果存在 master）：

```bash
go run ./cmd/master
```

---

### 方法二：编译运行（推荐）

编译成可执行文件：

```bash
go build -o bot.exe ./cmd
```

运行：

```bash
bot.exe
```

---

## 五、配置文件说明

项目依赖配置文件：

```
config.json
```

通常包含内容：

- Binance API KEY
    
- Binance API SECRET
    
- 交易参数
    
- 策略配置
    

重要提示：

API Key 拥有资金操作权限，请勿泄露。

---

## 六、Redis 依赖（重要）

该项目依赖 Redis 作为数据存储或缓存组件。

### 启动 Redis（Docker 方式）

```bash
docker run -d -p 6379:6379 redis
```

### 验证 Redis 是否运行

```bash
docker ps
```

看到 redis 即表示成功。

---

## 七、运行时常见问题解决

### 1. Go 依赖下载慢

设置国内代理：

```bash
go env -w GOPROXY=https://goproxy.cn,direct
```

---

### 2. 网络代理环境（可选）

如果使用代理工具：

Windows CMD：

```bash
set HTTP_PROXY=http://127.0.0.1:10808
set HTTPS_PROXY=http://127.0.0.1:10808
```

---

## 八、后台服务访问

程序启动后，可能提供本地 Web 服务：

```
http://localhost:18080
```

用于查看：

- 交易状态
    
- 任务运行情况
    
- 策略执行日志
    

---

## 九、功能模块分析

### 1. flash_trade

高频交易模块，可能用于：

- 快速挂单
    
- 短时间套利
    
- 成交量刷单
    

---

### 2. alpha_autosell

自动卖出模块：

- 止盈策略
    
- 自动止损
    
- 拉升后自动出货
    

---

### 3. batch_trade

批量交易模块：

- 多账号操作
    
- 并发执行交易
    
- 策略同步执行
    

---

## 十、风险提示

该项目属于高频交易系统，存在以下风险：

- 无风控或弱风控逻辑
    
- 可能产生频繁交易手续费
    
- API 权限泄露风险
    
- 实盘误操作可能导致资金损失
    

建议：

- 优先使用 Binance 测试网  
    [https://testnet.binance.vision/](https://testnet.binance.vision/)
    
- 不建议直接使用真实资金测试
    

---

## 十一、总结运行流程

标准流程如下：

1. 安装 Go 环境
    
2. 下载依赖：go mod tidy
    
3. 启动 Redis
    
4. 配置 config.json
    
5. 运行项目：go run ./cmd/master
    
6. 访问后台：localhost:18080
    

---

（文档整理版，用于部署与复用）</content:encoded><author>G.Ark</author></item><item><title>OpenAI 免费 GPT Plus 绑定 OpenClaw 操作记录</title><link>https://1314047.xyz/blog/2025-04-us-trip.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2025-04-us-trip.html</guid><pubDate>Sat, 11 Apr 2026 00:00:00 GMT</pubDate><content:encoded>&gt;今天发现 OpenAI 提供了 1 个月免费 GPT Plus。  
于是我顺手领取并完成了与 OpenClaw 的绑定，整个流程记录如下。

---

一、订阅免费 GPT Plus

1. 必须使用网页端订阅

本次免费 GPT Plus 需要通过网页端完成订阅。在 iOS 端的在线订阅页面，并没有出现免费提示。

---

2. 网页端遇到的第一个问题：需要绑定支付方式

进入网页订阅流程后，首先遇到的问题是：

• 系统要求先绑定支付方式  
• 我尝试使用 国内招行 Visa 卡  
• 结果是：直接被拒绝，无法支付

也就是说，单独使用这张国内 Visa 卡，在当前订阅流程下无法成功完成操作。

---

3. 关键步骤：切换订阅国家/地区

在订阅页面的右下角，可以选择国家/地区。  
系统一开始会根据代理地址自动定位，我这里默认显示的是日本。

后来的处理方式是：

• 将国家/地区从 日本  
• 改为 德国

切换为德国后，支付界面发生了变化，出现了 PayPal 支付入口。

---

4. 通过 PayPal 完成支付

出现 PayPal 支付选项后，我采取了以下方式：

• 使用 PayPal  
• 在 PayPal 中绑定 招行 Visa 卡  
• 然后通过 PayPal 完成支付

结果：

• 支付成功  
• GPT Plus 订阅成功开通  
• 顺利拿到了这次 1 个月免费 GPT Plus

---

二、将 OpenAI 订阅绑定到 OpenClaw

完成 GPT Plus 订阅后，接着进行 OpenClaw 绑定 OpenAI 账号。

1. 在 OpenClaw Config 中进行绑定

进入 OpenClaw Config，开始绑定 OpenAI 订阅账号。

---

2. 终端会提示一个登录网址

绑定过程中，终端会输出一个登录网址。  
此时需要：

• 点击该网址  
• 跳转到本机浏览器打开网页  
• 在网页中完成 OpenAI 账号登录

---

3. 登录后会生成回调地址

网页登录完成之后，浏览器会返回一个回调地址（callback URL）。

接下来的关键操作是：

• 将这个回调地址完整复制  
• 粘贴回 OpenClaw 终端

完成这一步后，就可以成功完成 OpenAI 账号授权。

---

三、模型选择注意事项

绑定完成后，在 OpenClaw 的模型选择界面，有一个非常重要的注意点：

• 不要选择 OpenAI 系列模型  
• 要选择 OpenAI Codex 系列模型</content:encoded><author>G.Ark</author></item><item><title>尾盘交易赛门槛判断规则</title><link>https://1314047.xyz/blog/2026-04-01-weipan.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-04-01-weipan.html</guid><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>### 一、先分盘型

先不要急着算，先判断这是哪种盘。

#### 1. 平稳盘

特征：

- 门槛涨得慢
- 越接近结束，涨幅越平缓
- 总交易额和门槛大致同步

判断方法：

- 最近 2 小时门槛每小时涨幅 &lt; **20%**
- 没有连续跳涨

处理：

- 可以用**线性外推**
- 最终门槛通常 = 当前门槛 × **1.05 ~ 1.20**

---

#### 2. 普通尾盘盘

特征：

- 最后一天明显抬升
- 但不是爆炸式上涨
- 最后一小时会加速，但还可控

判断方法：

- 最近 2 小时门槛每小时涨幅在 **20% ~ 80%**
- 有加速，但没连续翻倍

处理：

- 用**分段外推**
- 最终门槛通常 = 当前门槛 × **1.2 ~ 1.6**

---

#### 3. 极端挤榜盘

特征：

- 倒数 3~4 小时门槛连续暴涨
- 榜尾互相顶价
- 总交易额增量看起来不算特别夸张，但门槛猛冲

判断方法：  
只要满足下面任意 2 条，就要高度警惕：

- 最近 1 小时门槛涨幅 &gt; **100%**
- 连续 2 小时门槛倍增或接近倍增
- 19 点后门槛仍在高速拉升
- 小盘、低门槛、名额固定，尾盘突然集中补量

处理：

- 不要再用线性法
- 直接按**挤榜模型**
- 最终门槛通常 = 当前门槛 × **1.5 ~ 3.0**
- 极端时甚至更高

---

## 二、真正该看的，不是总交易额，而是门槛斜率

很多人容易误判在这里。

### 错误思路

- 看总交易额只涨了 5%
- 就觉得门槛也只会涨一点

### 正确思路

门槛看的是：

&gt; **第 N 名附近的人在怎么互挤**

所以：

- **总交易额** 代表全场热度
- **门槛变化速度** 才代表榜尾竞争强度

### 实战里优先级

1. **先看门槛每小时涨幅**
2. 再看门槛是否连续加速
3. 最后才看总交易额是否放大

---

## 三、快速判断公式

### 平稳盘

- 最终门槛 ≈ 当前门槛 × **1.05 ~ 1.20**

### 普通尾盘盘

- 最终门槛 ≈ 当前门槛 × **1.20 ~ 1.60**

### 极端挤榜盘

- 最终门槛 ≈ 当前门槛 × **1.50 ~ 3.00**

---

## 四、小时级盯盘法

### 距结束 4 小时

这是最关键的分水岭。

如果这时门槛：

- 还很平稳，说明多半不是极端盘
- 开始大跳，说明尾盘要起飞
- 已经连续翻倍，直接按极端盘处理

---

### 距结束 3 小时

重点看门槛是不是还在加速。

#### 如果 1 小时涨幅：

- **&lt;20%**：平稳盘
- **20%~80%**：普通尾盘盘
- **80%~150%**：高风险尾盘盘
- **&gt;150%**：极端挤榜盘

---

### 距结束 2 小时

如果到这里还在猛涨，就别再指望后面会自然停。

经验上：

- 普通盘：最后两小时再涨 **20%~50%**
- 极端盘：最后两小时再涨 **50%~150%**
- 特别极端：最后两小时 **翻倍** 也可能

---

### 距结束 1 小时

这时候最容易误判。

记住一句话：

&gt; **最后一小时的总交易额增量小，不代表门槛涨得少。**

因为最后一小时常常是榜尾小范围激烈补量，能把门槛迅速往上顶。

---

## 五、你这次 ICNT 的标准复盘

### 已知过程

- 17:00：**449.61**
- 18:00：**1772.83**
- 19:00：**4500**
- 最终：**12433.29**

### 这说明什么

- 17→18：接近 **4 倍**
- 18→19：又是 **2.5 倍以上**
- 这已经不是普通尾盘盘
- 而是标准的**极端挤榜盘**

### 当时正确做法

19:00 已经看到 4500 时，就应该直接按：

- 最终门槛 ≈ **4500 × 2 ~ 3**
- 也就是 **9000 ~ 13500**

这就会非常接近最后真实值 **12433.29**

---

## 六、以后你可以直接照着用的判断模板

### 模板 1：先定性

- 当前离结束还有多久？
- 最近 2 小时门槛各涨了多少？
- 是平稳、普通尾盘，还是极端挤榜？

### 模板 2：再定量

- 平稳盘：× **1.05 ~ 1.20**
- 普通尾盘：× **1.20 ~ 1.60**
- 极端挤榜：× **1.50 ~ 3.00**

### 模板 3：最后做安全分层

- **压线值**：预测区间下沿
- **稳妥值**：预测区间中位
- **保险值**：预测区间上沿再加一点

---

## 七、最简口诀版

你以后盯盘时，直接记这几句就行：

&gt; **先看门槛，不先看总量。**  
&gt; **门槛连续翻倍，就是极端盘。**  
&gt; **最后一小时，总量小涨也可能门槛暴涨。**  
&gt; **极端挤榜盘，终值按当前门槛的 2 到 3 倍防守。**

---

## 八、便签版
```
交易赛门槛判断：

1. 先看门槛每小时涨幅，不先看总交易额
    
2. 最近1小时涨幅&lt;20%：平稳盘
    
3. 最近1小时涨幅20%~80%：普通尾盘盘
    
4. 最近1小时涨幅&gt;100%，且连续两小时猛涨：极端挤榜盘
    
5. 平稳盘终值=当前门槛×1.05~1.20
    
6. 普通尾盘终值=当前门槛×1.20~1.60
    
7. 极端挤榜终值=当前门槛×1.50~3.00
    
8. 最后一小时总交易额涨得不多，不代表门槛涨得不多
    
9. 真正决定门槛的是榜尾互挤，不是全场平均成交
    
10. 极端盘要按2~3倍去防守
```</content:encoded><author>G.Ark</author></item><item><title>我是怎么在自己的 RSS 工具里订阅 YouTube 和 Telegram 频道的</title><link>https://1314047.xyz/blog/2026-04-01-rssdingyue.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-04-01-rssdingyue.html</guid><pubDate>Wed, 01 Apr 2026 00:00:00 GMT</pubDate><content:encoded>最近折腾了一圈 RSS 订阅，试了 YouTube、Telegram、微博、X、小红书、B 站这些来源，最后发现一个很现实的结论：

**不是所有平台都适合折腾 RSS。**

有些平台本身就支持得不错，比如 **YouTube**。  
有些平台虽然没有官方 RSS，但公开网页结构比较稳定，比如 **Telegram 公开频道**。  
而有些平台反爬太重、接口常变，就算自建 RSSHub 也不一定好用。

所以这篇只记录两个目前我实际验证下来**最值得用**的方式：

- YouTube 频道订阅
- Telegram 公开频道订阅

这两类对我来说，才是真正“能长期用”的 RSS 来源。

---

## 一、YouTube 频道怎么转成 RSS

YouTube 其实一直能订阅，只是很多人不知道它的 RSS 入口格式。

最常用的格式是：

https://www.youtube.com/feeds/videos.xml?channel_id=频道ID

比如：

https://www.youtube.com/feeds/videos.xml?channel_id=UC_x5XG1OV2P6uZZ5FSM9Ttw

只要拿到频道的 `channel_id`，就能拼出可订阅地址。

---

### 1. 如果频道链接本来就是 `channel/UC...`

例如：

https://www.youtube.com/channel/UCxxxxxxxxxxxxxxxxxxxxxx

那后面的 `UCxxxxxxxxxxxxxxxxxxxxxx` 就是频道 ID。

直接拼成：

https://www.youtube.com/feeds/videos.xml?channel_id=UCxxxxxxxxxxxxxxxxxxxxxx

就可以用了。

---

### 2. 如果频道链接是用户名、旧链接或者 `@handle`

现在很多 YouTube 频道不是 `channel/UC...` 这种形式，而是：

https://www.youtube.com/@xxxx

或者像这种旧地址：

https://www.youtube.com/Chickenzhou

这种时候，不能直接拿这个页面地址去订阅，要先把它转成真正的频道 ID。

我之前实际碰到的一个例子是：

https://www.youtube.com/Chickenzhou

后来在页面源码里找到了：

&quot;channelIds&quot;:[&quot;UCAQDfYdQY8CPUBci02OsPbA&quot;]

这里面的：

UCAQDfYdQY8CPUBci02OsPbA

就是这个博主真正的 channel ID。

所以它最终可订阅的 RSS 地址就是：

https://www.youtube.com/feeds/videos.xml?channel_id=UCAQDfYdQY8CPUBci02OsPbA

---

### 3. 怎么找 channel ID

如果主页不是直接显示 `UC...`，可以这样找：

1. 打开频道主页
2. 按 `F12` 打开开发者工具
3. 查看页面源码
4. 搜索这些关键词：
    - `channelId`
    - `channelIds`
    - `rssUrl`

一般都能找到类似：

&quot;channelIds&quot;:[&quot;UCxxxxxxxxxxxxxxxx&quot;]

这串 `UC...` 就是你要的频道 ID。

注意不要把页面里别的字段看错了。  
比如我之前看到过：

&quot;unsubscribeButtonContent&quot;

这个不是频道 ID，也不是 RSS 地址，只是页面里某个按钮配置字段，和订阅地址没关系。

真正有用的是：

&quot;channelIds&quot;:[&quot;UCAQDfYdQY8CPUBci02OsPbA&quot;]

---

### 4. 最终在 RSS 工具里怎么填

直接新建订阅，把下面这种地址贴进去就行：

https://www.youtube.com/feeds/videos.xml?channel_id=频道ID

例如：

```
https://www.youtube.com/feeds/videos.xml?channel_id=UCAQDfYdQY8CPUBci02OsPbA
```

---

## 二、Telegram 公开频道怎么转成 RSS

Telegram 和 YouTube 不一样。

它没有像 YouTube 那样好用的官方 RSS 地址，但 **Telegram 的公开频道网页是可以被抓取的**，所以一般用 **RSSHub** 来转。

如果你已经部署了 RSSHub，那么 Telegram 是非常适合接入的，成功率也比较高。

---

### 1. Telegram 频道的 RSSHub 路由格式

如果频道用户名是：

@123

那么在 RSSHub 里通常写成：

/telegram/channel/123

完整地址就是：

`rsshub://` 形式：

```
rsshub://telegram/channel/123
```

如果你不是本地部署，而是别的 RSSHub 实例，就把域名换掉。

---

### 2. Telegram 频道用户名怎么取

假设一个公开频道链接是：

https://t.me/awesomeRSSHub

那用户名就是：

awesomeRSSHub

---

## 三、我的实际经验：什么值得折腾，什么不值得折腾

这次试下来，我对 RSS 的看法变得很现实：

### 真正值得订阅的

- YouTube 频道
- Telegram 公开频道
- 一些自带 RSS 的博客
- 一些新闻站、资讯站

### 不太值得继续花时间折腾的

- X
- 微博
- 小红书
- 很多强反爬的社交平台
- 某些依赖 Cookie 和登录态的平台

原因很简单：

**能直接订阅的，本来就最好用。**  
**不能直接订阅的，如果平台反爬太重，RSSHub 也不一定救得回来。**

所以后来我对 RSSHub 的定位也变了：

它不是“万能网页转 RSS 工具”，  
而是“给一部分还能抓的平台做补充”。

在这个前提下，Telegram 是值得接入 RSSHub 的。  
但 YouTube 这种本来就能直接订阅的，其实根本不用多绕一层 RSSHub。

---

## 四、结语

如果只是想把常看的内容集中到一个 RSS 工具里，我现在的建议很简单：

- **YouTube：直接用官方 feed**
- **Telegram：走 RSSHub**
- **博客和新闻站：优先找原站 feed**
- **反爬重的平台：别投入太多时间**

折腾 RSS 最怕的不是不会配，而是花了很多时间之后才发现：  
**有些平台从一开始就不想让你订阅。**

所以与其追求“什么都能抓”，不如优先把 **真正稳定可用的来源** 建起来。  
对我来说，YouTube 和 Telegram 就属于这一类。</content:encoded><author>G.Ark</author></item><item><title>Lista 智能借贷还有补贴：10% 年化的 U，到底该借还是该买？</title><link>https://1314047.xyz/blog/2026-03-19-U.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-19-U.html</guid><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>明天也就是2026-03-20 **10% 年化的 U 补贴** 继续，你会怎么选？

我的答案还是一样：**我更倾向于借，而不是直接买。**

原因并不复杂。  
因为在 **Lista 的智能借贷** 里，当前 **借 U 这件事本身还有额外补贴**。如果把这部分收益算进去，整体年化其实会比表面看到的更高。

最近我重新看了一下 **Lista 最新更新的智能借贷看板**，发现 **USDT / USDC 的池子目前还有大约 4.2% 的补贴**。  
这意味着，假如借款端继续维持 10% 年化，那么整套策略的综合收益，理论上还能进一步抬升。

---

## 为什么我还是选择“借”？

很多人看到 10% 年化的 U，第一反应可能是：

“既然看好，不如直接买入不就好了？”

但我的思路更偏向于：**优先利用平台现有补贴，把借贷效率吃满。**

因为在 Lista 这套机制里，收益并不只来自单一的一层，而是可能同时来自两部分：

第一部分，是**借出后的资金收益**；  
第二部分，是**抵押资产本身所带来的补贴收益**。

当这两部分叠加时，综合年化自然就上去了。

---

## 简单算一笔账：综合年化大概能到多少？

假设借满 **10,000 U（USDT + USDC）**，按当前看板数据粗略估算：

### 1. 可借出的金额

按照 **94.57%** 的借贷比例计算：

`10000 × 94.57% = 9457 U`

也就是说，1 万 U 的规模，大约能借出 **9457 U**。

### 2. 借款端收益

如果这部分借出的资金，能拿到 **10% 年化**：

`9457 × 10% = 945.7 U`

这一部分的理论收益约为 **945.7 U**。

### 3. 抵押端收益

与此同时，抵押资产本身还有约 **4% 左右的补贴收益**：

`10000 × 4% = 400 U`

也就是 **400 U** 左右。

### 4. 综合收益

把两部分加在一起：

`945.7 + 400 = 1345.7 U`

对应的综合年化约为：

`1345.7 ÷ 10000 = 13.457%`

也就是说，**如果在 Lista 上把这套路径走通，理论年化可以从 10% 提升到约 13.457%**。

---

## 为什么这个机会很多人没注意到？

说实话，不是大家不想参与，而是 **Lista 这个“智能借贷看板”的入口确实藏得有点深**。

我自己找的时候也绕了几圈，最后才定位到。

### 当前大致路径是：

**顶部菜单栏「兑换」**  
→ 进入页面后  
→ 找到右下角那个类似 **方形广告位** 的入口  
→ 进入智能借贷看板  
→ 查看补贴池  
→ 再点进具体池子  
→ 才能看到借 U 的补贴借贷池

整套流程走下来，**大概要点四五次**，才能真正找到目标池子。

这对于普通用户来说，确实不算友好。  
尤其是当一个产品本身主打效率和收益时，信息入口过深，实际会直接影响参与率。

---

## 我对 Lista 产品体验的几个小建议

这次为了截图，我甚至还开了 **F12**，把添加流动性页面里一些不必要的内容手动删减了一下，方便展示核心信息。  
一边折腾一边忍不住想：**其实这里面很多信息，本来就应该被更清晰地整合。**

如果要给 **@lista_dao** 提几个 UI / UE 方向的小建议，我会说这几点：

### 1. 智能借贷看板入口太深

一个对收益用户很关键的功能，不应该藏在这么深的位置。  
最好能在一级或二级导航中直接给到入口，而不是放在一个容易被忽略的“广告位”里。

### 2. LP 条目信息展示不够完整

现在虽然能在看板中看到高收益 LP，但**必须点进每一个具体 LP**，才能知道到底可以借什么币。  
这会增加大量无效点击。

更好的方式是：  
**直接在列表页展示“可借币种”“补贴类型”“核心收益来源”等关键信息**。  
这样用户一眼就能判断这是不是自己要找的池子。

### 3. LP 奖励领取 / 检查入口不够明显

目前 LP 奖励似乎需要在**每周四到“我的资产”页面点击检查按钮**，这个动作本身就已经不够直觉了，入口还比较隐蔽。  
从产品体验上来说，建议至少做到：

- 更明显的提醒
    
- 明确的奖励发放时间说明
    
- 更直观的领取 / 检查路径
    

否则很多用户可能明明有奖励，却根本不知道该去哪看、什么时候领。

---

## 还有一个很直观的感受：信息分散得太厉害了

我个人觉得，**Lista 添加流动性页面里的大部分有效信息，其实都可以直接整合到智能借贷看板中**。

因为对用户来说，最关心的通常不是页面模块做得多完整，而是这几个核心问题：

- 这个池子能借什么？
    
- 借贷比例是多少？
    
- 当前补贴多少？
    
- 年化大概多少？
    
- 奖励怎么领？
    
- 风险点在哪里？
    

如果这些关键信息都要分散在不同页面里，用户自然会觉得链路又长又碎。  
而如果能把这些内容集中到一个清晰的看板中，整个产品的理解成本会下降很多。

---

## 我的结论

所以回到最开始那个问题：

**如果明天 10% 年化的 U 补贴继续，是借还是买？**

我的选择依然是：**优先考虑借。**

因为在 Lista 当前的机制下，借贷端之外还有额外补贴可以叠加。  
如果按现有看板数据粗略估算，综合年化理论上可以来到 **13.457% 左右**。  
对于已经熟悉平台操作的人来说，这个收益结构还是有吸引力的。

当然，机会归机会，体验问题也确实存在。  
尤其是入口层级深、信息展示不完整、奖励检查路径隐蔽，这些都会直接影响用户参与效率。  
如果后续 Lista 能把这些细节打磨得更顺一些，整体使用体验应该会提升不少。

---

## 风险提示

以上内容仅为个人信息分享和产品体验观察，**不构成任何投资建议**。  
补贴、年化、借贷比例和具体收益都会随市场情况及平台规则变化，请务必以实际页面展示为准，并在参与前做好充分研究与风险评估。</content:encoded><author>G.Ark</author></item><item><title>0损耗撸 xStocks 积分，这才是更适合普通人的姿势</title><link>https://1314047.xyz/blog/2026-03-19-xstocks.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-19-xstocks.html</guid><pubDate>Thu, 19 Mar 2026 00:00:00 GMT</pubDate><content:encoded>这两天，[@xStocksFi](https://defi.xstocks.fi/) 的积分规则基本算是定下来了。

关于 xStocks，最近争议其实不少。  
有人说这项目营销味太重，也有人吐槽积分上限、权重规则都还不够透明。

但对我来说，只要这件事**能做到接近无损**，那就值得尝试。

不管是撸毛还是投资，最重要的始终是**赔率**。  
如果你承担的成本，只是一点点手续费和滑点；但未来一旦项目真正跑出来，尤其是在“美股代币化 + 合规交易所合作”这条叙事里站稳脚跟，那它后面的估值空间和潜在空投，想象力其实很大。

现阶段，xStocks 主要有三种赚积分的方式：

1. **交易代币化美股**（如 NVDAx、TSLAx、SPYx 等）
    
2. **为支持的交易对 / 流动性池提供流动性**
    
3. **在 DeFi 应用中使用 xStocks 资产**
    

不过问题也很现实：  
**这三种方式目前各自的积分权重，暂时还没有完全公开。**

我自己长期是定投标普 500 的，但我知道很多人来这里不是为了投资，他们只想撸毛，甚至希望**尽可能不承担市场波动风险**。

所以这两天我专门研究了一个相对中性的打法：  
**现货持有 xStocks 资产拿积分，同时在另一个平台开等额空单做对冲。**

这样做的好处很直接：

- 尽量把价格波动风险压到最低
    
- 主要承担的是手续费、滑点和资金占用成本
    
- 还能顺带吃到另一个项目的潜在空投预期
    
- 有点“一鱼两吃”的意思
    

而且我自己现在就是这么做的。

---

## 一、先注册 xStocks

目前注册还有 **20% 积分加成**，算是比较典型的早期福利。

注册链接：  
https://defi.xstocks.fi/points?ref=IV63CUC9
注册时我建议**优先选择 Solana 链**。

原因很简单：

- 当前 Solana 上的流动性更好
    
- 交易滑点相对更小
    
- 实操过程更顺畅，损耗更低
    

本质上你可以把 xStocks 理解成一个目前在 **Solana 生态里更活跃** 的项目。  
至于为什么暂时不优先上自家的 Ink 链，我个人猜测还是流动性和用户基础的原因，当然这只是我的判断。

---

## 二、第一步：持有某只代币化美股，拿基础积分

这里的核心逻辑很简单：  
**先买入一只你准备做对冲的 xStocks 美股代币，然后持有。**

### 具体操作流程

1. 打开官网  
    **https://defi.xstocks.fi/points?ref=IV63CUC9**
    
2. 连接钱包  
    建议优先使用 **Solana 链钱包**，因为目前流动性最好，滑点通常更低。
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205524129.png)
3. 查看当前已经上线的产品  
    比如 NVDAx、TSLAx、SPYx 等。
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205535639.png)
4. 找到对应代币的**合约地址**
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205541871.png)
5. 下单前最好先确认两件事：
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205556452.png)
    - 当前价格是否明显偏离正股价格
        
    - 该代币的流动性是否足够
        
6. 复制合约地址后，到钱包或聚合器里搜索交易  
    我自己用的是 **OKX Wallet**，可视化体验会舒服一点。
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205606108.png)
7. 有些 xStocks 代币默认不会直接显示  
    比如某些代币可能需要你通过**合约地址手动搜索**才能找到。
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205612330.png)
8. 再次确认流动性  
    如果某个池子的流动性太低，就不建议碰，否则买进去容易，出来可能损耗很高。
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205619299.png)
9. 直接兑换买入  
    这里通常会有一点点滑点，但只要流动性尚可，损耗一般都还能接受。
    ![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205626245.png)
10. 买完后先持有  
    这一步的目的不是赌涨跌，而是为了后面的**积分获取 + 对冲策略**做准备。
    

---

## 三、第二步：在 Trade / Hyperliquid 上开空，对冲价格波动

对于纯撸毛用户来说，最怕的其实不是没积分，  
而是为了拿积分，结果先把本金波动吃满了。

所以更稳妥的思路是：

**在 xStocks 这边持有现货资产拿积分，同时在另一边开对应标的的空单做对冲。**

这样一来：

- 如果标的下跌，现货亏，但空单赚
    
- 如果标的上涨，现货赚，但空单亏
    

理论上，只要仓位匹配得比较接近，  
你拿到的就是一个**接近中性**的敞口。

你的主要收益来源，不再是价格波动，  
而是：

- xStocks 的积分
    
- 对冲平台潜在的空投 / 激励
    
- 以及后续项目估值提升带来的额外预期
    

我之前本来想用更传统的方式去对冲，比如直接买熟悉的反向 ETF。  
但后来想到自己本身也在撸 **Trade / Hyperliquid 生态**，那不如直接把对冲仓位开在那边。

结果是一样的：  
**风险被对冲了，但两边都有空投预期。**

这就是我说的“一鱼两吃”。

### 具体步骤

**第一步：打开 Hyperliquid / HIP-3 入口**  
链接：  
**[https://app.hyperliquid.xyz/join/HYPER78](https://app.hyperliquid.xyz/join/HYPER78)**

**第二步：进入交易界面**  
从 HIP-3 里面找到你对应的标的。
![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205652304.png)
**第三步：开对应数量的空单**  
比如你在 xStocks 买的是 TSLAx，那就在另一边开一个尽量等额的 Tesla 空单。
![](assets/0损耗撸%20xStocks%20积分，这才是更适合普通人的姿势/file-20260320205658393.png)
这样做的目的，就是尽量把波动风险锁住，避免因为正股波动导致你整体策略失衡。

---

## 四、这个策略为什么更适合“只想撸毛、不想承担风险”的人？

因为它本质上不是在赌方向，  
而是在做一个**偏中性的积分获取策略**。

### 这个策略的优点

**1. 风险相对更可控**  
你不是单边持仓，而是现货 + 空单对冲，尽量削弱价格波动影响。

**2. 更接近“低损耗撸毛”**  
真正的成本主要来自手续费、滑点、资金费率等，而不是大幅度价格风险。

**3. 有机会双项目同时吃预期**  
一边拿 xStocks 积分，一边还能覆盖到 Hyperliquid / Trade 生态的潜在激励。

**4. 适合不想频繁操作的人**  
买完、对冲完，后续更多是观察和微调，不需要像做 LP 一样频繁管理仓位。

---

## 五、为什么我暂时不优先推荐 LP 策略？

也有人会选择去组 LP，因为 LP 往往也能拿积分，  
甚至未来如果权重更高，收益可能会更猛。

但问题是，**LP 并不是真的“无损”**。

如果行情波动较大，而你又没有及时调仓，  
很容易吃到：

- 无常损失
    
- 池子价格偏移
    
- 被动暴露更多波动风险
    

相比之下，**1 倍对冲的现货 + 空单策略**会更稳一些。  
至少对于纯撸毛用户来说，这种方式的逻辑更简单，也更容易执行。

当然，后面还要继续看官方规则。  
如果未来确认 **LP 的积分权重远高于普通持仓**，那策略肯定还要迭代。

但在当前信息不完整的阶段，  
我个人更倾向先用这种**稳一点的中性打法**去参与。

---

## 六、我自己的结论

我目前就是按这个思路在做：

- 在 xStocks 持有对应的代币化美股拿积分
    
- 在另一边开空单做对冲
    
- 同时覆盖两个项目的潜在空投预期
    

在我看来，  
这两个项目都属于当前 2026 年 Web3 里 **RWA 叙事**里非常核心、也非常有辨识度的头部项目。

所以这套打法最吸引我的地方，不是“暴赚”，  
而是：

**在尽量控制风险的前提下，去拿一个可能很大的未来预期。**

这才是我愿意参与的原因。

希望最后，这两个项目都能给出一个不错的结果。  
也希望这套思路，能给那些**只想稳稳撸积分、不想承受太大波动**的人一点参考。

---

## 七、最后提醒：这套策略并不是真的“零风险”

虽然我上面一直在说“接近无损”或者“中性策略”，  
但还是要提醒一下，这不等于完全没有风险。

你仍然需要考虑：

- 买入和卖出的**滑点**
    
- 两边平台的**手续费**
    
- 永续空单可能产生的**资金费率**
    
- 对冲数量不完全一致导致的**敞口偏差**
    
- 极端行情下的**流动性风险**
    
- 项目规则后续变化带来的**积分收益不确定性**
    

所以更准确的说法应该是：

**这是一种尽量降低价格风险、以积分收益为核心目标的策略，  
而不是绝对意义上的“零损耗”。**
&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/yWoi4eoNDJg?si=eUEp5DIUhB44Xq__&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;&lt;/iframe&gt;</content:encoded><author>G.Ark</author></item><item><title>币安 Alpha 监控部署教程（Telegram 推送版)</title><link>https://1314047.xyz/blog/2026-03-15-binancealpha.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-15-binancealpha.html</guid><pubDate>Sun, 15 Mar 2026 00:00:00 GMT</pubDate><content:encoded>这篇教程记录了如何把一个监控 **币安 Alpha 空投/公告信息** 的 Python 脚本，部署到 Linux 服务器上，并通过 **Telegram Bot** 实现消息推送。
## 一、项目目标

实现一个长期运行的监控脚本，定时从数据源抓取币安 Alpha 空投信息，并在以下场景推送到 Telegram：

1. 发现新的 Alpha 空投项目时推送
2. 项目信息补充了积分门槛时推送
3. 每天早上推送“今日预告”
4. 在活动开始前 20 分钟发送提醒

------

## 二、项目原理

脚本的核心逻辑很简单：

- 周期性请求接口：
   `https://alpha123.uk/api/data?fresh=1`
- 读取返回的 `airdrops` 数据
- 与上一轮缓存做对比
- 如果发现新增项目或状态变化，就发送 Telegram 消息
- 使用 APScheduler 定时执行轮询和提醒任务

------

## 三、准备环境

### 1. 服务器要求

建议使用 Linux 服务器，例如 Ubuntu / Debian。

需要安装：

- Python 3
- pip
- 虚拟环境 venv

### 2. 安装 Python 环境

```
apt update
apt install -y python3 python3-venv python3-pip
```

------

## 四、创建项目目录

```
mkdir -p ~/binance_alpha
cd ~/binance_alpha
```

创建虚拟环境并激活：

```
python3 -m venv venv
source venv/bin/activate
```

------

## 五、安装依赖

在项目目录中新建 `requirements.txt`：

```
requests
apscheduler
```

安装依赖：

```
pip install -r requirements.txt
```

------

## 六、创建 Telegram Bot

### 1. 找 BotFather 创建机器人

在 Telegram 搜索：

```
@BotFather
```

发送命令：

```
/newbot
```

按提示设置：

- bot 名称
- bot 用户名（必须以 `bot` 结尾）

创建完成后，BotFather 会返回一个 **Bot Token**，格式类似：

```
1234567890:AAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
```

这个 token 非常重要，相当于机器人的密码。

------

### 2. 获取自己的 chat_id

在 Telegram 搜索：

```
@userinfobot
```

发送命令：

```
/start
```

返回：

```
Id: 185xxxxxx
```

其中这个数字：

```
185xxxxxx
```

就是你的 `chat_id`。

------

## 七、项目文件结构

最终目录结构如下：

```
binance_alpha/
├── main.py
├── msg_handler.py
├── requirements.txt
└── run.log
```

------

## 八、完整代码

项目地址：https://github.com/K1314047/binance_alpha/tree/main


## 九、运行测试

在项目目录中运行：

```
python main.py
```

如果正常，会看到类似输出：

```
✅ 获取空投数据成功
✅ 空投监测系统已启动（Telegram 推送版）
✅ Alpha 空投监控已启动
✅ Telegram 推送成功
```

同时 Telegram 也会收到一条启动提示消息。

停止运行按：

```
Ctrl + C
```

停止时会收到：

```
⏹ Alpha 空投监控已停止
```

------

## 十、后台运行

如果希望脚本退出终端后仍然继续运行，可以使用 `nohup`。

### 启动后台运行

```
nohup python main.py &gt; run.log 2&gt;&amp;1 &amp;
```

命令解释：

- `nohup`：让程序不受终端关闭影响
- `&gt; run.log`：把输出写入日志文件
- `2&gt;&amp;1`：把错误输出也写入日志
- `&amp;`：放到后台执行

启动后，终端可能显示：

```
[1] 32452
```

其中 `32452` 是进程号。

------

### 查看日志

```
tail -f run.log
```

如果看到类似输出，说明程序在正常工作：

```
✅ 获取空投数据成功
✅ 空投监测系统已启动（Telegram 推送版）
✅ Telegram 推送成功
```

------

### 查看进程是否还在运行

```
ps -ef | grep &quot;python main.py&quot;
```

或者：

```
ps -p 32452 -o pid,cmd
```

如果还能看到 `python main.py`，就说明后台任务仍在运行。

------

### 停止后台运行

正常停止：

```
kill 32452
```

强制停止：

```
kill -9 32452
```

------

## 十一、安全建议

### 1. 不要把 Bot Token 明文公开

Bot Token 一旦泄露，别人就可以控制你的机器人。

建议：

- 不要上传到公开 GitHub
- 不要发在群聊或论坛
- 最好使用环境变量保存

------

### 2. 更推荐使用环境变量保存 token

例如把 `msg_handler.py` 改成：

```
import os
import requests


class msg_handler:
    TELEGRAM_BOT_TOKEN = os.getenv(&quot;TELEGRAM_BOT_TOKEN&quot;, &quot;&quot;)
    TELEGRAM_CHAT_ID = os.getenv(&quot;TELEGRAM_CHAT_ID&quot;, &quot;&quot;)
```

运行前先设置：

```
export TELEGRAM_BOT_TOKEN=&quot;你的真实token&quot;
export TELEGRAM_CHAT_ID=&quot;1859193713&quot;
python main.py
```

这样更安全。

------

## 十二、最终部署步骤速查版

### 第一步：进入项目目录

```
cd ~/binance_alpha
source venv/bin/activate
```

### 第二步：安装依赖

```
pip install -r requirements.txt
```

### 第三步：运行测试

```
python main.py
```

### 第四步：确认 Telegram 能收到启动消息

收到后按 `Ctrl + C` 停止。

### 第五步：后台运行

```
nohup python main.py &gt; run.log 2&gt;&amp;1 &amp;
```

### 第六步：查看日志

```
tail -f run.log
```

### 第七步：确认进程仍在

```
ps -ef | grep &quot;python main.py&quot;
```

------

## 十三、总结

这个项目本质上是一个轻量级的定时监控脚本，核心功能已经够用：

- 自动抓取币安 Alpha 空投信息
- 自动比较更新
- 自动推送到 Telegram
- 支持每日预告和活动提醒

如果只是个人使用，当前方案已经足够。
 如果后续要长期稳定运行，建议继续升级成：

- 环境变量保存密钥
- `systemd` 开机自启
- 日志轮转
- 请求失败重试</content:encoded><author>G.Ark</author></item><item><title>一文讲清楚 ByBitUSDT 循环借贷</title><link>https://1314047.xyz/blog/2026-03-14-bybit.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-14-bybit.html</guid><pubDate>Sat, 14 Mar 2026 00:00:00 GMT</pubDate><content:encoded>先说结论：  
**ByUSDT 循环借贷并不是“闭眼捡钱”的无风险套利，而是一种建立在平台规则、利率差和账户风控之上的策略。能做，但前提是你必须清楚收益从哪里来，风险又在哪里。**

这个策略，最早是我们理财群里第一批发现并梳理出来的。当时我没有第一时间发推做教程，而是先把整个玩法的逻辑、风险点和可持续性想清楚。

## 当时我们第一时间就明确了几个核心风险

### 1. 平台规则变动风险

这是最大的不确定性之一。  
比如平台可能会：

- 调整借贷或申购限额
    
- 修改 ByUSDT 的收益规则
    
- 限制循环出来的资金继续享受利息
    
- 直接针对多号或异常账户进行风控
    

一旦规则变化，原本成立的策略可能立刻失效，甚至出现“借出来了，但后续没法按原计划继续循环”的情况。

### 2. 利差收窄风险

这个策略本质上吃的是**存款收益和借款成本之间的利差**。  
只要两边利率发生变化，收益模型就会被重算：

- ByUSDT 利率下降
    
- 借款利率上升
    

这两个变化，都会直接压缩你的利润空间。  
所以从一开始，我就让我的🦞帮大家持续监控利率变化。后来也确实看到了，ByUSDT 收益从 **10%+** 下降到了 **7%+**，说明参与的人明显变多了，策略红利在被快速摊薄。

## ByUSDT 到底是什么？

ByUSDT 并不是一般意义上的稳定币。  
它**没有交易对**，目前也不存在常规意义上的二级市场脱锚风险，而是与 USDT 保持 **1:1 兑换关系**。

也就是说，它更像是平台内部用于理财申购和计息的一个映射资产，而不是你平时理解的那种可自由交易的稳定币。

但也正因为如此，**它的核心风险不在“币价脱锚”，而在“平台规则和风控变化”**。

## 现在的情况：平台已经开始出手

目前平台已经开始查封**多号循环贷**，甚至也出现了**单号被封禁**的情况。  
一旦收到封禁邮件，就无法继续参与 ByUSDT 相关理财活动。

这也再次说明：

**这个策略不是不能做，而是绝对不能当成无风险提款机去做。**

尤其是很多人一看到“循环”“放大收益”，就默认自己找到了低风险套利。事实上，任何带杠杆的策略，只要你不理解规则边界和风控逻辑，最后都可能不是赚收益，而是吃封控、吃利差压缩、甚至吃爆仓。

“1011”USDE 循环贷爆仓事件过去并不久，当时多少人以为自己在做稳健套利，最后资金直接归零。  
所以这类策略，最重要的从来不是“怎么放大”，而是“你有没有能力控制风险”。

## 这个策略适合什么人？

适合：

- 能看懂借贷逻辑和收益结构的人
    
- 会主动监控利率变化的人
    
- 知道平台风控随时可能介入的人
    
- 明白杠杆不是利润放大器，而是风险放大器的人
    

不适合：

- 看别人赚钱就想无脑跟的人
    
- 不会算真实收益率的人
    
- 不知道自己最大风险敞口在哪里的人
    
- 觉得“只要不跌就不会亏”的人
    

## 操作方法

### 第一步：申购 ByUSDT

将 **USDT 存入活期理财**，申购 **ByUSDT**。

### 第二步：在统一交易账户借币

进入统一交易账户进行借币，选择合适的杠杆。  
**你通过杠杆借出来的资金量，决定了你理论上最多能循环出来的规模。**

### 第三步：划转并重复循环

借出后，将 **USDT 划转到资金账户**。  
这时你会发现，每次都还能继续划转出一部分资金。

接着把这部分 USDT 再次存入活期理财，申购 ByUSDT，然后继续划转、继续申购，如此重复，完成循环。

## 最后再强调一次

ByUSDT 循环借贷，本质上是一个：

- 吃利差的策略
    
- 依赖平台规则的策略
    
- 强依赖账户安全和风控环境的策略
    
- 一旦杠杆失控，后果可能很重的策略
    

所以它不是不能做，而是一定要在**明白规则、控制杠杆、持续监控利率和风控信号**的前提下做。

真正专业的人，看到的是：

- 当前净利差还有多少
    
- 平台规则是否稳定
    
- 自己的杠杆是否安全
    
- 一旦收益下滑或规则变化，能否第一时间退出
    

而不是只盯着“表面年化”。

## 我们接下来要解决的，就是这个痛点

很多人不是不会操作，而是：

- 不会实时监控自己的风险
    
- 不会计算策略的真实收益率
    
- 不知道利率变化后策略是否还值得继续
    
- 不知道自己的杠杆是不是已经过高
    

所以接下来，我们的产品会重点帮助大家解决这些问题：  
**监控策略风险、跟踪利率变化、测算实际收益率，让你知道自己到底是在赚钱，还是在承担不值得的风险。**</content:encoded><author>G.Ark</author></item><item><title>Linux Mint + OpenClaw 随身启动 U 盘制作教程</title><link>https://1314047.xyz/blog/2026-03-12-Upan.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-12-Upan.html</guid><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>只需要一个普通 U 盘，就可以做出一个可随身携带、插上电脑即可启动的 Linux Mint 系统，而且还能自动保存文件、配置和 OpenClaw 环境。
这类启动 U 盘适合以下场景：

- 想随身携带自己的工作环境
    
- 想在不同电脑上快速进入统一系统
    
- 想体验 Linux + OpenClaw 的便携部署方式
    
- 想自己 DIY 一个有特色的“技术礼物”或展示作品
    

这篇文章会从零开始，教你在 **Windows 电脑** 上制作一个带**持久化存储**的 Linux Mint 启动 U 盘，并在系统中安装 OpenClaw。

## 一、准备材料

### 硬件准备

- 一个 **32GB 或更大容量** 的 USB 3.0 U 盘  
    推荐 64GB，空间更充足，体验更好
    
- 一台支持 **U 盘启动** 的电脑
    
- 一台 Windows 电脑，用来制作启动盘
    

### 软件准备

- **Linux Mint ISO 镜像**
    
- **Rufus 写盘工具**
    

---

## 二、重要提醒

**制作启动 U 盘会清空 U 盘中的全部数据。**

开始之前，请务必先备份好 U 盘内的重要文件，以免数据丢失。

---

## 三、制作流程总览

整个过程大致分为 4 个阶段：

1. 下载 Linux Mint 镜像
    
2. 使用 Rufus 制作带持久化存储的启动 U 盘
    
3. 从 U 盘启动进入 Linux Mint
    
4. 安装 Node.js 和 OpenClaw，并完成初始化配置
    

---

# 四、详细制作步骤

## 步骤 1：下载 Linux Mint 镜像

前往 Linux Mint 官网下载系统镜像。

### 推荐版本

**Linux Mint Cinnamon LTS**

下载完成后，文件名通常类似于：

linuxmint-22-cinnamon-64bit.iso

如果你是第一次使用 Linux Mint，Cinnamon 版本界面更友好，也更适合作为日常便携系统使用。

---

## 步骤 2：在 Windows 上制作持久化启动 U 盘

### 操作步骤

1. 将 U 盘插入电脑
    
2. 打开 **Rufus**
    
3. 在 **Device** 中选择你的 U 盘
    
4. 在 **Boot Selection** 中选择刚刚下载好的 Linux Mint ISO
    
5. 将 **Persistent Storage（持久化存储）** 向右拖动  
    建议分配 **8GB 到 16GB**
    
6. 点击 **Start** 开始写入
    
7. 等待制作完成
    

完成后，安全弹出 U 盘。

### 什么是持久化存储？

持久化存储的作用是：  
你在 Linux Mint 系统里创建的文件、安装的软件、修改的配置，在重启后仍然会保留，而不是每次重启都恢复成初始状态。

---

## 步骤 3：从 U 盘启动电脑

### 操作步骤

1. 将制作好的 U 盘插入目标电脑
    
2. 重启电脑
    
3. 开机时连续按 **F12 / ESC / F2 / DEL** 之一，进入启动菜单或 BIOS  
    不同品牌电脑按键可能不同
    
4. 选择 **USB 启动**
    
5. 在启动菜单中选择：
    

Start Linux Mint

如果成功进入 Linux Mint 桌面，说明启动成功。

---

## 步骤 4：验证持久化功能是否正常

进入系统后，在桌面创建一个测试文件，例如：

test.txt

然后重启电脑，再次从 U 盘进入 Linux Mint。

如果重启后这个文件依然存在，就说明**持久化功能设置成功**。

---

## 步骤 5：安装基础工具

打开终端，执行以下命令：

sudo apt update  
sudo apt upgrade -y  
sudo apt install -y curl wget git build-essential

这一步会安装一些常用工具，为后续安装 Node.js 和 OpenClaw 做准备。

---

## 步骤 6：安装 Node.js

执行以下命令：

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -  
sudo apt install -y nodejs

安装完成后，输入以下命令检查版本：

node -v

如果能正确显示版本号，说明 Node.js 安装成功。

---

## 步骤 7：安装 OpenClaw

执行以下命令：

npm install -g openclaw@latest

安装完成后，检查版本：

openclaw --version

如果能正常输出版本信息，说明安装成功。

---

## 步骤 8：初始化 OpenClaw

执行：

openclaw onboard

然后根据提示填写所需配置，例如 API Key 等信息。

这一步完成后，OpenClaw 的基本环境就配置好了。

---

## 步骤 9：测试运行

执行以下命令启动测试：

openclaw gateway --port 18789

如果程序能够正常启动，说明整个环境已经搭建完成。

---

# 五、常见问题

## 1. 电脑无法从 U 盘启动

请检查以下几项：

- BIOS 中是否启用了 **USB Boot**
    
- 是否关闭了某些限制启动方式的安全选项
    
- U 盘是否制作成功
    
- 是否选择了正确的启动项
    

---

## 2. Node.js 安装失败

可以先执行：

sudo apt update

然后再重新安装。  
如果网络较慢，也可能导致安装失败，可以稍后重试。

---

## 3. OpenClaw 无法启动

可以尝试重新安装：

npm install -g openclaw@latest

或者检查以下内容：

- Node.js 是否安装成功
    
- npm 是否可用
    
- API Key 是否填写正确
    
- 网络环境是否正常
    

---

# 六、备份建议

为了避免配置丢失，建议定期备份以下目录：

~/.config  
~/.local/share/openclaw

可以使用 `rsync` 备份，例如：

rsync -av ~/.local/share/openclaw /media/usb/backup/

这样即使系统出现问题，也可以快速恢复 OpenClaw 的配置和数据。

---

# 七、适合做成什么样的成品？

如果你愿意进一步折腾，这个 U 盘还可以做成一个更完整的“成品”：

- 定制 U 盘外壳或印字
    
- 预装常用开发工具
    
- 预设 OpenClaw 配置模板
    
- 搭配说明卡片，作为礼物或展示作品
    
- 制作成自己的便携式 Linux 工作环境
    

这样不仅更实用，也更有辨识度。

---

# 八、总结

通过这套方法，你可以做出一个：

- 可启动的 Linux Mint 随身系统
    
- 带持久化存储的便携工作环境
    
- 可直接运行 OpenClaw 的 U 盘设备
    

制作过程并不复杂，核心就是：

**下载镜像 → Rufus 写盘 → 开启持久化 → 启动系统 → 安装 Node.js → 安装并配置 OpenClaw**

只要按步骤操作，基本都能顺利完成。

如果中途遇到启动失败、安装报错、配置问题，也可以逐步排查解决。</content:encoded><author>G.Ark</author></item><item><title>纳斯达克官方合作xStocks 撸毛全攻略， 低成本刷交易教程</title><link>https://1314047.xyz/blog/2026-03-12-xstocks.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-12-xstocks.html</guid><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>最近不少人私信问我：**xStocks 现在到底能不能提前交易？如果想抢早期机会，应该怎么操作？**

我猜大家关注这件事，主要还是因为过去不少 Perp DEX 都出现过类似情况。比如像 Variational 这类早期项目，有些人在功能还不完善的时候，提前刷了几千 U 的交易量，等积分系统或激励规则正式上线之后，直接拿到了不错的回溯积分。

所以，很多人现在关心的核心问题其实就两个：

第一，**xStocks 现在能不能提前参与？**  
第二，**如果能参与，具体要怎么做，资金风险又该怎么控制？**

这篇文章我就尽量把这件事讲清楚。

---

## 一、RWA 的风，确实吹到链上了

如果要给 2026 年的币圈叙事做个总结，我认为最核心的两个方向就是：

- **RWA**
    
- **稳定币**
    

而这两天，RWA 赛道里被讨论得最多的项目之一，就是 **xStocks**。

事情的起点，是纳斯达克官方发布的一则公告：宣布与 Kraken 旗下的 **xStocks** 展开合作。消息出来之后，整个市场的关注度明显上来了，相关内容也开始被大范围传播。

但我看了一圈，很多文章更多是在讲“消息面”和“想象空间”，真正把**普通人现在怎么参与、怎么观察、怎么尽量低风险操作**讲清楚的并不多。

正好这个平台我之前就用过，对它的产品形态比较熟悉。没想到它现在突然开始走积分预期这条线，所以这篇文章，我就从一个实际使用者的角度，把这件事尽量讲明白。

---

## 二、这个项目到底是不是“大毛”？

这肯定是大家最关心的问题。

我的看法很直接：**现在还不好下定论。**

判断它是不是“大毛”，关键不在于市场情绪有多热，而在于一个更本质的问题：

### 这类合作是不是“稀缺资源”？

如果纳斯达克未来只和少数几家美国合规交易平台合作，那么 xStocks 的想象空间就会很大，平台的稀缺性和估值预期也会明显抬升。

但如果过一段时间，纳斯达克陆续再宣布新增很多合作方，那 xStocks 的独特性就会下降。到那个时候，它可能更多只是 Kraken 体系里的一个子业务，而不是一个具备极强独占性的入口。

所以截至目前，**没有人能百分之百判断它是不是大毛**。  
能下结论的人，除非是“神仙”。

但做撸毛这件事，本来就是这样：  
**你不需要提前知道结果，你只需要在风险可控的前提下，尽量站到变化最早发生的地方。**

了解我的朋友都知道，我在撸毛这件事上一直比较保守，不喜欢无脑冲，更不喜欢盲目送人头。  
所以这篇文章的核心逻辑也很简单：

**先看懂项目，再小成本参与；先抢位置，再看后续规则。**

---

## 三、现阶段更适合怎么参与？

我目前的判断是：

### 现阶段更适合做的，不是盲目刷量，而是先完成早期注册，拿一个早期席位。

原因很简单：

- 现在平台还处于早期阶段
    
- 很多功能并没有完全开放
    
- 后续规则、积分逻辑、是否回溯，都没有明确公告
    
- 但早期资格本身，往往是最容易“后面想补都补不到”的东西
    

所以，如果你想参与，**当前更适合的动作是先注册、先熟悉产品、先观察链上流动性，而不是一上来就大资金猛刷。**

注册链接：  
**[https://defi.xstocks.fi/points?ref=XSTOCKS07](https://defi.xstocks.fi/points?ref=XSTOCKS07)**

### 注册时选哪条链？

我个人建议，**优先选 Solana 链**。

原因是：

- 目前 **Sol 链上的流动性相对更好**
    
- 深度更好，滑点一般更低
    
- 操作成本也更友好
    


当然，如果你更熟悉 EVM，走以太坊生态也不是不行，只是综合下来，现阶段 Sol 体验通常更顺一些。

---

## 四、现在刷交易量有没有意义？

这个问题一定要讲清楚。

我个人认为，xStocks 后续如果做积分体系，**大概率会把交易量作为一个重要指标**。这几乎是交易类项目最常见的一套逻辑，因为交易量本身就是平台未来收入的重要来源之一。

但问题在于：

### 目前平台的交易功能，其实还没有完全“前台化”。

也就是说，虽然已经有产品上线，但很多普通用户在前端页面里，并不能直接像中心化交易所那样，傻瓜式点击买卖。  
现在这套流程，还是更偏向于“懂一点链上操作的人，才能提前参与”。

这也是为什么最近开始有人来问：

**“现在到底怎么提前交易？”**

大家之所以对“早鸟交易”这么感兴趣，本质上还是因为市场已经被前几轮项目教育过了：

- 早期交易
    
- 先占位置
    
- 后面如果积分规则回溯，可能会吃到额外收益
    

但我要强调一句：

## 现在提前交易，是否一定有回溯积分？官方没有确认。

这件事目前完全没有定论。  
所以你不能把它理解成“现在刷了就一定有收益”。

更准确地说，现阶段的操作属于：

- **提前埋伏**
    
- **博一个可能存在的回溯**
    
- **但没有官方承诺**
    

因此，不要 FOMO，不要上头。  
如果你决定参与，最好把它理解成一种**小成本试错**，而不是确定性套利。

我个人的预判是，xStocks 下一轮产品迭代，很可能会把现在这套相对“隐性”的交易流程做得更完整、更可视化。  
等到那时候，普通用户入场会更容易，但“早期参与者”的优势也可能没现在这么明显了。

---

## 五、如果现在想做一笔早鸟交易，具体怎么操作？

下面我把流程尽量讲细一点。

### 第 1 步：打开官网并完成注册

官网入口：  
**[https://defi.xstocks.fi/points?ref=STORCKS](https://defi.xstocks.fi/points?ref=STORCKS)**

先完成注册，并连接钱包。

### 第 2 步：连接钱包，优先选 Sol 链

我还是那个建议：  
**优先 Sol 链。**

原因还是三个：

- 流动性通常更好
    
- 滑点相对更低
    
- 整体损耗更可控
    

![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221527914.png)

### 第 3 步：查看平台当前已经上线的商品

你需要先看哪些标的已经上线。  
不是所有资产都适合拿来做早期交易测试。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221558053.png)
### 第 4 步：找到对应商品的智能合约地址

这一步很关键。因为当前很多钱包或聚合器里，默认并不会直接展示 xStocks 对应的代币，你往往需要通过**合约地址**去精确搜索。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221605445.png)
### 第 5 步：先确认价格是否正常

在真正买入之前，建议先做一个基础检查：

- 当前标的价格是否明显偏离正常水平
    
- 链上池子的深度是否太差
    
- 是否存在异常高滑点
    

如果价格明显失真，就不要硬上。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221624214.png)
### 第 6 步：用支持搜索合约地址的钱包进行兑换

我自己用的是 **OKX Wallet**，因为可视化做得不错，搜索和兑换体验相对顺手。  
当然，你也可以用自己熟悉的钱包或聚合器，核心不是用哪个，而是**能不能准确识别合约并控制滑点**。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221640119.png)
### 第 7 步：通过合约地址搜索对应资产

很多时候，默认列表里不会直接出现某个 xStocks 资产。  
所以你需要把前面拿到的**智能合约地址粘贴进去搜索**，再找到对应资产。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221651902.png)
### 第 8 步：重点检查流动性

这一步非常重要。

如果某个池子的流动性很差，即使你只买几十到几百 U，也可能吃到很大的滑点。  
那种情况就不适合拿来刷交易量。

我当前观察下来，像特斯拉相关标的的流动性相对还可以，但你每次交易前都最好自己再看一遍，不要直接照搬别人的结论。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221702387.png)
### 第 9 步：先买入

确认无误后，直接兑换即可。  
但要提前接受一个现实：

- 会有滑点损耗
    
- 钱包可能还会收额外手续费
    

我自己实际操作的时候，OKX Wallet 这边就有 **0.25% 的手续费**，这部分成本要算进去。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221719730.png)
### 第 10 步：买完后再卖出

这一步的逻辑很简单：  
你的目标不是持仓，也不是赌涨跌，而是**产生交易量**。

所以完成买入后，再卖回去就行。
![](assets/纳斯达克官方合作xStocks%20撸毛全攻略，%20低成本刷交易教程/file-20260312221732591.png)
### 第 11 步：计算交易量和损耗

比如你用 100U 买入，再卖出一次：

- 买入算一笔
    
- 卖出算一笔
    
- 总交易量大致就是 **200U**
    

但中间会有损耗。  
我自己那次大概做了 200U 的往返交易，最终损耗在 **0.6U 左右**：

- 其中 **0.5U** 左右被钱包手续费吃掉
    
- 剩下大概 **0.1U** 是滑点和交易过程损耗
    

这个损耗不算特别高，但前提是你选的池子流动性还可以。

### 第 12 步：不要长持仓

这个非常重要。

如果你的目标是撸潜在积分，而不是投资这些标的，那最合理的做法就是：

**买完，产生交易行为，卖掉，离场。**

不要因为“反正都买了”就顺手长期拿着。  
那样你承担的就不是撸毛风险，而是价格波动风险了，逻辑完全变了。

---

## 六、为什么我不建议去组 LP？

我看到已经有人开始教别人去做 LP 了。

我的建议是：**普通撸毛用户，现阶段尽量别碰。**

原因很简单：

- LP 有**无常损失**
    
- 流动性差的时候，退出也可能有额外成本
    
- 你承担的风险显著高于“做一笔低损耗往返交易”
    

我们做撸毛，核心思路应该是：

**用尽量可控的小成本，换一个潜在的资格、行为记录和积分预期。**

而不是为了多做一点动作，把自己暴露到更复杂、更难控制的风险里。

所以我的观点一直很明确：

### 花一点可接受的损耗，拿可能存在的积分预期，可以。

### 为了博更多，去上 LP，不太值得。

---

## 七、现在参与这件事，最重要的风险提示

这一段我建议你一定认真看。

### 1）官方还没有确认早鸟交易是否有回溯积分

这是最大的不确定性。  
现在做交易，不等于以后一定有奖励。

### 2）不要 FOMO

别人说“这是大毛”，不代表就一定是。  
别因为情绪上头就去重仓试。

### 3）控制资金量

如果你只是测试流程、占位观察，没必要用太大的本金。  
先小额跑通一次，比什么都重要。

### 4）不要碰流动性太差的池子

流动性太差，滑点会直接吃掉你所谓的“潜在积分收益”。

### 5）不要为了撸毛变成持仓

你的目标是产生交易行为，不是押注标的涨跌。  
如果你开始长期持有，那就是另一套逻辑了。

---

## 写在最后

最后再强调一次：

**至于现在提前交易，未来是否一定会给到很高的回溯积分，官方目前并没有明确说法。**

所以，这件事本质上还是一笔：

- 有逻辑
    
- 有预期
    
- 但没有确定答案的早期尝试
    

你能做的，不是去幻想确定性，而是：

- 先注册
    
- 先熟悉流程
    
- 小额测试
    
- 控制损耗
    
- 保持理性
    

真正成熟的撸毛，不是到处冲，而是**在不确定里，尽量用最小成本拿到最大可能性**。</content:encoded><author>G.Ark</author></item><item><title>告别天天熬夜盯盘，XXYY API Skill 完整扫链功能正式上线</title><link>https://1314047.xyz/blog/2026-03-12-saolian.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-12-saolian.html</guid><pubDate>Thu, 12 Mar 2026 00:00:00 GMT</pubDate><content:encoded>再也不用天天熬夜、枯坐盯盘了。

XXYY API Skill 完整扫链功能现已上线，你可以直接配置一只 24 小时不间断工作的扫链 Agent，帮你持续监控链上机会，并在满足条件时自动完成交易。

上线之后，不少群友都在问：怎么才能快速上手，拥有一只 7×24 小时工作的扫链助手？

教程来了。

现在，你只需要把 GitHub 链接发给你的龙虾或者 Agent，就可以让 AI 接入 XXYY 交易能力，完成链上扫描与极速交易。我们已经将交易 API 封装成一个可直接部署的 Agent Skill，接入门槛非常低。

---

## XXYY API Skill 的核心优势

### 1. 资金更安全

整个过程中无需向 Agent 提供私钥，尽可能降低敏感信息暴露风险。

### 2. 上链交易速度快

支持毫秒级交易执行，全面覆盖 SOL、BSC、BASE、ETH 等主流链。

### 3. 费率低，同时保留平台福利

通过 API 进行交易，同样可以享受 XXYY 提供的返佣与返现政策。

### 4. 筛选能力更强

XXYY 支持 29 个复杂筛选项，不只是简单的数据流推送，而是可以根据更细致的条件进行扫链，让 Agent 更专注于真正值得关注的目标。

### 5. 支持自动化交易闭环

结合 XXYY 交易 API，可以实现从扫链、发现项目、执行买入，到后续自动止盈止损的一整套自动化流程，尽可能做到无人值守运行。

目前，该功能已面向所有 XXYY 用户免费开放申请。

---

## 如何快速接入

你只需要把下面这段提示词直接发给你的 Agent 或龙虾，即可开始配置。

## 可直接使用的提示词
```
请接入 XXYY 的 api skill：  
https://github.com/Jimmy-Holiday/xxyy-trade-skill  
  
这个是我的 API Key：  
[在此填入你的Key]  
  
请你根据 XXYY 的 api skill，开始同时扫 SOL 链和 BSC 链，并按照下面的筛选格式进行扫链：  
  
新交易对：  
Top10 占比 22-40% | 狙击者 &lt; 6% | 内幕 &lt; 8% | 持有者 &gt; 10 | 市值 &gt; 8k | 至少 1 个社交媒体 | 时间 &lt; 70min  
  
即将打满：  
时间 &lt; 120min | DEX 付费 | 市值 &gt; 13k  
  
已发射（捡垃圾）：  
时间 &lt; 240min | Top10 占比 &gt; 18% | 持有者 &gt; 300 | 市值 20k-160k  
  
每 5 分钟轮询一次，有出现新的项目或者值得购买的项目时，可以直接通过 XXYY API skill 购买。  
  
交易钱包地址：  
[填入你 XXYY 交易钱包地址]  
  
参数设置如下：  
滑点：20  
Gas：1gwei  
SOL 链 Gas：0.001sol
```


---

## 这套配置适合什么人

上面这套扫链参数，属于一套比较适合直接上手的通用方案，能够帮助你快速跑通整个流程。

当然，真正进阶的玩法并不止这一套。你完全可以根据自己的交易习惯，替换成其他成熟玩家的扫链逻辑。因为 XXYY 提供了多达 29 个不同筛选项，你可以自由组合、不断调优，把自己的 Agent 训练成更符合自己风格的扫链执行助手。

也就是说，XXYY API Skill 并不只是提供一个“能扫链”的工具，而是给你一个可持续迭代、可深度定制的自动化交易框架。

---

## 自动交易能力才是这次更新的重点

除了扫链能力之外，XXYY 自带的交易能力，才是整个自动化闭环真正成立的关键。

只要你提前在网页端配置好自动止盈止损策略，那么通过 API 交易买入的项目，也会自动创建对应的止盈止损挂单。

这意味着，你的 Agent 不只是负责发现机会，还可以进一步完成：

扫链  
发现项目  
自动买入  
自动挂止盈止损  
自动卖出

整套链路打通之后，才能真正接近全自动运行的状态。

---

## 你可以把它理解成一套完整的自动化扫链方案

通过 XXYY API Skill，你可以获得：

- 自动接入交易 API 的 Agent 能力
    
- 多链并行扫链能力
    
- 基于复杂条件的精细化筛选能力
    
- 满足条件后的自动交易执行能力
    
- 配合网页端止盈止损实现后续自动卖出能力
    

如果你一直希望把“盯盘、筛选、下单、卖出”这一整套流程尽可能自动化，那么这套方案已经可以让你快速落地。

---

## 相关链接

Skill 仓库地址：  
[https://github.com/Jimmy-Holiday/xxyy-trade-skill](https://github.com/Jimmy-Holiday/xxyy-trade-skill)

API 申请入口：  
[https://xxyy.io/apikey](https://xxyy.io/apikey)

---

## 结语

如果你之前还在手动盯盘、手动筛选、手动下单，那么现在可以开始把这些重复动作交给 Agent 处理。

XXYY API Skill 的意义，不只是“让 AI 看数据”，而是让 AI 真正具备从发现机会到执行交易的能力。

配置完成后，你就拥有了一套可以 24 小时运行的自动化扫链系统。后续你要做的，更多是持续优化策略，而不是反复盯盘。</content:encoded><author>G.Ark</author></item><item><title>不用买 API ！GPT-5.4 接入OpenClaw龙虾（小白极简安装教程）</title><link>https://1314047.xyz/blog/2026-03-11-n.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-03-11-n.html</guid><pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate><content:encoded>OpenClaw在宣传中强调部署简单，上手便捷，但实际存在诸多实操难点：

- **环境依赖复杂**：需要Node.js 22.x+、Python、Docker，还要解决各种版本冲突
- **配置步骤多**：安装依赖 → 安装OpenClaw核心 → 配置大模型API → 放行端口 → 启动服务
- **官方甚至不建议在主力机部署**：因为它可以执行命令、访问文件，建议放在隔离环境（如云服务器或虚拟机）
- **本地运行还要考虑设备关机、断网问题**

在部署过程需提前安装Node.js环境，配置npm依赖，调试环节耗时不说且易出现权限报错，依赖缺失等问题，即便完成部署，后续修改模型API，调整文件目录后工具易出现运行异常，故障排查与修复通常需耗时20分钟以上才能实现工具正常启动。

**在此，推荐一种更适配测试场景的UI自动化解决方案-Codex，该工具无需复杂安装部署，无需额外调试，可快速落地UI自动化校验工作，彻底解决OpenClaw应用过程中的各类内耗问题。**

**Codex 是 OpenAI 推出的一款面向软件工程领域的智能代理系统。** 它并非单一工具，而是一个**统一的 AI 工作台**，可以通过桌面应用、命令行、Web 界面、IDE 插件等多种入口访问，背后由专用的 **codex-1 模型**（基于 OpenAI o3 模型针对软件工程任务优化而来）驱动。

**本地配置openclaw小龙虾****🦞****，使用Codex（桌面版、vscode插件、cli均可),无本地依赖，无需配置驱动，环境变量或 API Key，1 分钟完成初始化,仅需输入一句话即可轻松完成！**

**前置准备**

✅**翻墙工具，全局TUN模式节点切换到非香港地区**

使用高质量真全局的VPN，非娱乐VPN

✅**ChatGPT Business 团队成员账号**（成本15元/月 包售后）

走 API key 是按 token 计费， ChatGPT 订阅自带 Codex 额度，直接喂给龙虾就行，不需要额外买 OpenAI API，不需要花冤枉钱，OpenClaw 可以走 Codex OAuth 登录你的 ChatGPT 账号，这样用的是 20 刀订阅额度。*OpenAI 官宣明确允许使用,目前零风险，放心用。*(免费用户目前也有 Codex 权限)

![图像](https://pbs.twimg.com/media/HDDmuSJbQAA716A?format=png&amp;name=small)

**下载OpenAI Codex桌面版**

官网免费下载：

https://openai.com/zh-Hans-CN/codex/

![图像](https://pbs.twimg.com/media/HDDbuwUaMAQlZdl?format=jpg&amp;name=small)

**下载完成后登录账号如下，无需额外配置环境、无需安装驱动**

![图像](https://pbs.twimg.com/media/HDDckBHbcAAZf5e?format=jpg&amp;name=small)

**输入：“帮我用OAuth的方式接入OpenClaw”**

![图像](https://pbs.twimg.com/media/HDDdskQaMAYteWQ?format=jpg&amp;name=small)

**一路选择 “是”，按提示模型选择GPT-5.4 ,即可完成部署**

![图像](https://pbs.twimg.com/media/HDDeVbSaMAcjfVY?format=jpg&amp;name=small)

**在Codex聊天框输入 “帮我把telegram接入我的龙虾”，把tg机器人的API Token直接喂给他**

![图像](https://pbs.twimg.com/media/HDDf53JaUAAos9_?format=jpg&amp;name=small)

**获取 Telegram 机器人的 Token（API Token）非常简单，整个过程都在 Telegram 内部通过官方的“机器人之父” BotFather完成。**

**以下是具体步骤**：

1. **找到BotFather****：**打开Telegram，在顶部的搜索栏输入

   [@BotFather](https://x.com/@BotFather)

   。请认准名字旁边标有蓝色官方认证的勾号 (✅) 的账号。

2. **开始对话****：**点击进入与BotFather的聊天界面，点击屏幕下方的**开始**按钮（或者手动发送/start命令）。

3. **创建新机器人****：**向 BotFather 发送命令：/newbot。

4. **设置机器人名称****：** BotFather可以给机器人起一个名字。这个名字会显示在用户的斯托克列表和聊天窗口中，可以随时更改，也支持中文。

5. **设置机器人用户名****：**接着，你需要为机器人设置一个唯一的用户名。这个用户名**必须以bot结尾**（如：my_test_bot或MyTestBot），且设置后不能轻易修改。

6. **获取Token****：**如果用户名绑定占用，BotFather会回复一条恭喜您创建成功的长消息。在这条消息中，您可以找到一串红色的字符串，这就是您的**API Token**（格式通常类似123456789:ABCdefGhIJKlmNoPQRsTUVwxyZ）。

&gt; **⚠️****安全提醒：**此Token相当于您机器人的最高权限密码。请务必保管好。如果发现泄露，请随时向BotFather发送/revoke命令来重置Token。

![图像](https://pbs.twimg.com/media/HDDhQzEaMAkzhHQ?format=png&amp;name=900x900)

**
Codex 额度查看**：打开 Codex 网页版➡️左侧菜单栏选 Codex➡️右上角点设置➡️左侧菜单选 Usage,

OpenClaw 消耗的是 Codex 额度，跟你平时用 ChatGPT 聊天的额度是分开的,不用白不用。

![图像](https://pbs.twimg.com/media/HDDoPiXaMAI1H7i?format=jpg&amp;name=small)</content:encoded><author>G.Ark</author></item><item><title>Binance Alpha 盲盒：加密空投的新玩法还是权宜之计？</title><link>https://1314047.xyz/blog/2026-02-10-n.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-02-10-n.html</guid><pubDate>Tue, 10 Feb 2026 00:00:00 GMT</pubDate><content:encoded>在加密货币世界中，Binance Wallet 的 Alpha 积分系统一直备受“撸毛”爱好者青睐。它允许用户通过简单操作积累积分，并兑换为各种项目的代币空投。然而，随着熊市持续和优质新项目日益稀缺，Binance 于 2026 年 2 月 11 日推出了首期 **“Alpha 盲盒”** 功能。这一创新机制迅速引发社区热议，许多用户将其视为平台应对挑战的临时解决方案。

本文将基于近期 X 平台上的讨论，剖析 Alpha 盲盒的运作原理、潜在优势与风险，以及用户的真实反馈，帮助你更好地评估是否参与。

## Alpha 盲盒的机制与背景

Alpha 盲盒本质上是 Binance 对传统空投模式的升级版。

- **运作方式**：用户可以使用积累的 Alpha 积分（**每 15 积分兑换一个盲盒**）来“开盒”，盲盒内随机包含多个项目的代币奖励。这些项目可能包括新上线的热门币种，也可能混杂旧项目或低价值代币。
- **设计初衷**：官方公告强调，这一设计旨在“**汇聚优质项目，提供二次参与机会**”。

### 为什么推出盲盒？

从社区分析来看，这可能是 Binance 面对项目池枯竭的应对策略。在过去，用户往往通过单一项目空投获得集中奖励，但这容易导致代币价格暴跌（例如，大量空投导致抛售压力）。盲盒通过随机打包多个项目，分散了风险，同时为旧项目注入新活力。

**门槛设计也更友好**：积分消耗每 5 分降低 5 分，首期采用“先到先得”模式，鼓励用户及早行动。

然而，这种随机性也引入了“**赌博**”元素。用户无法预知盲盒内容，可能开出高价值代币（如百 USDT 大奖），也可能抽到“垃圾币”或归零项目。这与老虎机或抽卡游戏类似，增加了趣味性，但也考验运气和耐心。

## 用户社区的反馈与观点

X 平台上的讨论显示，用户对 Alpha 盲盒的态度复杂而多元。

- **质疑与幽默**：许多资深“撸毛”者认为，这是平台“转移矛盾”的聪明之举：以往的单一空投容易引发对项目方的不满，现在盲盒将竞争转向用户内部——谁运气好，谁就赚到。一些人幽默吐槽：“开到垃圾币怎么办？大家一起离职吧！”反映出对回报不确定性的担忧。
- **积极尝试**：也有观点指出，Alpha 积分规则久未变动，盲盒是合理的升级，尤其在参与人数减少的当下，仍有跟进价值。初期盲盒可能“有肉吃”（较高回报），因为平台需要吸引流量。
- **直言不讳**：也有用户直言，熊市下新项目短缺，盲盒不过是“炒剩饭”——用旧币充数，性价比不如以往。
- **谨慎观望**：部分用户表示会试水，但如果开到归零币，就会放弃。

**总体而言**，社区共识是：盲盒提升了用户黏性，但若首期回报低于预期，可能加速参与者流失。一些建议包括公布盲盒项目池目录，以增加透明度。同时，用户也在跨平台比较（如 OKX Boost），显示 Alpha 盲盒正面临竞争压力。

## 潜在优势与风险评估

### 优势：

- **分散风险**：多项目打包减少单一代币的价格冲击，有利于生态稳定。
- **二次机会**：旧项目代币可获新生，适合长期持有者。
- **趣味性与初期红利**：随机机制像游戏，可能吸引新用户，初期回报或较高。
- **系统可持续性**：积分产出有限但消耗可设计，有助于系统长期运转。

### 风险：

- **价值稀释**：随机性可能导致回报“垃圾化”，不如聚焦单个优质项目。
- **机会成本**：积分用于盲盒后，无法用于其他玩法；若回报低，用户可能流失。
- **市场信心影响**：若盲盒被视为项目方抛售旧币的“出货工具”，可能引发市场负面情绪。
- **经济性考量**：用户需评估投入产出比，如果年化收益过低，则参与意义不大。

## 结语与建议

Alpha 盲盒的推出标志着 Binance 在加密空投领域的创新尝试，它试图在资源有限的环境中维持用户热情。但从社区反馈看，这更像是**权宜之计**，而非革命性变革。

**给你的建议**：

1. **小额试水**：如果你已是 Alpha 积分持有者，不妨在首期（2 月 11 日）用小部分积分参与，观察实际回报。
2. **关注官方信息**：留意 @BinanceWallet 的更新，特别是关于项目池和概率的说明。
3. **理性计算**：评估个人积分消耗与预期收益，保持理性。
4. **保持灵活**：加密世界瞬息万变，如果回报持续不佳，及时调整策略。

未来，盲盒是否能演变为更透明、可持续的模式，仍需时间检验。</content:encoded><author>G.Ark</author></item><item><title>给想“全职撸毛”的新手一些现实建议（强烈建议从兼职开始）</title><link>https://1314047.xyz/blog/2026-02-09-quan.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-02-09-quan.html</guid><pubDate>Mon, 09 Feb 2026 00:00:00 GMT</pubDate><content:encoded>## 一、先说结论：2025–2026 年，全职撸毛已经不再是“低门槛高回报”的路径

在 2025–2026 年这个阶段，全职做链上空投、积分、测试网、打新等，已经**高度内卷**：

- 大毛项目明显减少
- 小毛收益持续缩水
- 工作室、脚本化、批量号严重挤压散户空间
- 单纯靠“点点点”已经很难维持体面收入

但这并不意味着撸毛彻底没机会。**仍然有人活得不错**，他们普遍依赖的是：

- 精品号而非批量号
- 打新 + 长期交互
- 信息差、认知差、执行差

如果你真的考虑全职撸毛，下面这些现实问题你必须提前想清楚。

## 二、全职撸毛前，必须面对的 5 个现实门槛

### 1、财务准备：至少 6–12 个月生活费（建议 12 个月以上）

- 撸毛收入**极度不稳定**
- 连续 3–6 个月零收入是完全正常的情况
- 任何“靠撸毛当月覆盖生活费”的想法，都会让你在压力下做出错误决策

**没有足够现金流 = 必然失败。**

------

### 2、心态准备：接受收益断崖式下降

- 单号随便几百 U 的时代基本结束
- 多数项目需要 **半年到两年** 才可能发币
- 很多项目最终不发币，甚至直接消失

你必须能接受：

- 大量时间投入 → 可能 0 回报
- 长期做“无效劳动”
- 用概率和组合对抗不确定性

一句话总结：
 **做了不一定有，不做一定没有。**

------

### 3、学习能力：必须长期跟进链与规则的变化

至少要做到以下几点：

- 熟悉主流生态
  - EVM 系（Ethereum、L2 等）
  - Solana
  - Cosmos
  - Move 系（Sui / Aptos 等）
- 理解基本的反女巫逻辑
  - 大部分项目都在防批量
  - 行为模式、资金路径、交互深度越来越重要

**不学习，只靠抄作业，生存周期会非常短。**

------

### 4、抵制诱惑的能力（这是最重要的一条）

很多人问：

&gt; 明明撸毛赚过钱，为什么最后还是没钱？

答案往往只有一个：
 **赚的钱，被炒币、合约、土狗亏回去了。**

你会每天看到：

- 谁又单币 A7
- 谁一把合约翻几十倍
- 谁打到“下一个百倍币”

作为撸毛人，如果你扛不住这些诱惑：

- 所有辛苦都是白费
- 一次上头，几个月白干

------

### 5、不炒币，不玩合约

我始终相信：
 **币圈只有两类人是长期赢家的概率最高的**

- 第一类：只囤 BTC 的
- 第二类：只撸毛的

把辛苦攒下来的确定性收益，拿去换不确定性的赌博，结局往往只有一个。

## 三、给新人的最终建议

**非常不建议新手直接全职撸毛。**

更稳妥的路径是：

1. 先兼职撸毛
2. 跑通完整流程
3. 多次真实拿到收益
4. 对周期、概率、项目筛选有深刻理解
5. 在资金、心态、认知都成熟后，再考虑全职

**等你真正“靠撸毛赚到钱”并且足够熟悉它，再全职也不迟。**</content:encoded><author>G.Ark</author></item><item><title>博客同步工作流</title><link>https://1314047.xyz/blog/2026-01-25-blog-sync.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-01-25-blog-sync.html</guid><pubDate>Sun, 25 Jan 2026 00:00:00 GMT</pubDate><content:encoded>自从开始折腾博客以来，我已经给博客添加了好几个同步数据流。目的是把自己的散落在各地的数据都汇总起来。

要完成这个事，最好是依赖相对开放的平台，因为我是用 GitHub Pages 来部署博客，所以定时去拉取数据是比较合适的方式。而这些平台它们会提供对应的 API，这样方便数据的同步。

它们整体的流程都是差不多。使用 GitHub Action 来定时拉取数据，只需要配置对应的环境变量（Token）就可以了。每当有数据变更，就触发网站本身的 Deploy Action 即可。

![image.png](https://images.lynkxu.com/2026/01/77ddce702a9b300c3bdc76a67891ab40.png)




## 运动数据 - Strava

最开始的时候，是想记录自己的马拉松数据，然后就扩展到把自己的运动数据都汇总到自己的网站上。为了完成这个，[Strava](https://www.strava.com/) 是一个非常好的选择。由于 Strava 本身就是全球性的运动 APP，支持把这种运动数据同步到 Strava 的网站上，而且它提供了 API 来获取数据。


## 书影音数据 - NeoDB

对比豆瓣，使用 [NeoDB](https://neodb.social/discover/) 来存储我的影音数据就更加的合适。NeoDB 本身也聚合了豆瓣这类网站的数据，所以用起来还是挺方便的。

## 碎碎念 - Mastodon

在折腾 NeoDB 的时候就发现了 [Mastodon](https://mastodon.social/)。后来发现使用 Mastodon 来同步「碎碎念」是一个非常好的方式。之前自己就在想怎么让自己随手就可以发布内容到「碎碎念」上，甚至考虑过使用 Telegram Bot 来完成同步，这下也不需要这么麻烦了。我只需要在 Mastodon 上发布，过几小时就会自动出现在我的 Blog 上。

## 文章 - Mastodon

文章这类比较长的内容就不适合在 Mastodon 上编写了，但是我也希望都能同步过去。所以这里是一个反向同步，从我的 Blog 同步到平台上。

需要注意的是，这里会有一个问题：**我的文章同步到 Mastodon 之后，会被「碎碎念」再次同步回来**。

这是我不想看到的，所以我在同步文章到 Mastodon 时添加了 tag，然后在「碎碎念」拉取数据的时候过滤掉这个 tag 即可。</content:encoded><author>G.Ark</author></item><item><title>浏览器安全设置：如何防止网站读取你的剪贴板信息（防“撸毛”必备）</title><link>https://1314047.xyz/blog/2026-01-23-some-thinking.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-01-23-some-thinking.html</guid><pubDate>Fri, 23 Jan 2026 00:00:00 GMT</pubDate><content:encoded>请遵循以下步骤，为你的浏览器设置一道安全防线。

#### **核心操作：禁止网站访问剪贴板**

此设置可有效阻止网站自动读取你复制的内容。

**Chrome / Edge / Brave等Chromium内核浏览器设置步骤：**

1. **打开设置**
   1. 点击浏览器右上角的 **“三个点”** 图标（菜单），选择 **“设置”**。

1. **进入隐私与安全**
   1. 在左侧导航栏中，点击 **“隐私、搜索和服务”**（Chrome）或 **“隐私和安全”**（其他浏览器）。

1. **找到网站设置**
   1. 在页面中，找到并点击 **“网站设置”** 或 **“Cookie 和网站权限”**。

1. **展开更多权限**
   1. 在“权限”列表中，向下滚动并点击 **“更多权限”** 以展开所有选项。

1. **管理剪贴板权限**
   1. 找到 **“剪贴板”** 选项并点击进入。
   2. 将默认设置更改为：
   3. **“不允许网站查看您剪贴板中的文字和图片”**。

#### **💡 进阶安全建议**

仅修改浏览器设置是基础，结合以下习惯能构筑更坚固的防线：

- **防火（安全意识）：**
  - **谨慎授权：** 仔细检查钱包弹窗请求，特别是涉及“剪贴板读取”、“无限授权”等敏感权限。
  - **使用新钱包：** 为高风险交互准备独立的新钱包和少量资金，与主资产隔离。
  - **验证链接：** 永远通过官方渠道获取项目链接，警惕 Discord、TG 群中的不明链接。

- **防盗（操作习惯）：**
  - **手动核对地址：** 转账前，务必手动核对收款地址的首尾字符，切勿完全依赖粘贴。
  - **使用安全输入法：** 在输入助记词、私钥时，可使用系统自带输入法，并留意是否有异常进程。
  - **及时清理剪贴板：** 复制敏感信息（如私钥）后，立即在剪贴板中覆盖一段无意义文本（如“已覆盖”）。
  - **专用设备/环境：** 如有条件，使用专用于加密操作的设备或浏览器隐私模式/新用户，减少插件和缓存风险。

#### **⚠️ 重要提醒**

启用此设置后，一些需要正常使用粘贴功能的网站（如在线文档、部分Web3工具）可能需要你手动点击权限弹窗来临时授权。这是一个必要的安全取舍。

**安全是唯一通往财富的捷径。保持警惕，保护好自己的数字资产。**</content:encoded><author>G.Ark</author></item><item><title>域名&amp;图床搭建记录</title><link>https://1314047.xyz/blog/2026-01-19-blog.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-01-19-blog.html</guid><pubDate>Mon, 19 Jan 2026 00:00:00 GMT</pubDate><content:encoded>起因是我在[别人的博客](https://mer.run/about/)上看到了 [elog](https://elog.1874.cool/) 这个工具，可以同步语雀/Notion等笔记到博客上，感觉不错。

这样就有一个问题是需要**自定义图床**才能更方便的让这个流程自动化起来。然后就了解到可以使用大善人 Cloudflare R2 的服务，提供每月 10 GB 的 Storage，还有大量的读写操作限额。感觉应该是够我用了。

还有个问题是自定义图床是需要自己的域名的，所以就需要先买一个。之前一直都是使用 Github Pages 的域名，所以并没有购买域名。于是乎就有了 2 件可以做的事：

1. 购买域名，并绑定到 Github Pages
2. ~~完成 elog 的自动化配置（包括 Cloudflare R2 图床配置）~~
3. 把 Cloudflare R2 图床配置通过 PicList 集成到 Obsidian 中

&gt; 折腾到一半发现语雀的 token 同步方式需要超级会员😅，以及可能发生的格式不匹配问题，还是决定放弃 elog 的集成方式。准备先把 Cloudflare R2 图床配置集成到 Obsidian 中。

## 购买域名

随手查了一下，`lynkxu.com` 目前并没有被注册，于是直接就买了 5 年的域名。这个域名看起来就没什么特别的含义，也就没有人买，于是我果断下手。

![domain.png](https://images.lynkxu.com/blog/2026/01/a3ab676299592963f2cf9ab323f9129a.png)

## 绑定 Github Pages

&gt; 网上是有各种教程的，只是年份久远，说的不清不楚的，搞得我一头雾水。现在又有了 AI 的帮助，信息反倒变得更加混乱了，一时间不知道该听谁的。于是乎就把自己折腾成功之后的经验记录下来，希望能帮到一些人。

正如 [github pages使用cloudflare加速自定义域名概要](https://www.cnblogs.com/noah227/p/18226411) 所说，总体上我们要做三件事：

- 个人域名配置解析到 Cloudflare 的DNS
- Cloudflare 再解析到 Github Pages
- Github Pages 再根据 Repo 配置的自定义域名解析到相应的页面

首先来完成第一步，我们需要在域名购买商那里把域名的 DNS 服务器切换到 Cloudflare 的 DNS（图一）。

那么Cloudflare 的 DNS 怎么获取呢？如图二，只需要在 Cloudflare -&gt; Domains 里添加你的域名，他就会告诉你当前域名的 DNS 以及 Cloudflare 的 DNS 是多少。然后去域名购买商那里修改即可。

&lt;div class=&quot;img-grid cols-2&quot;&gt;
  &lt;figure&gt;
    &lt;img src=&quot;https://images.lynkxu.com/blog/2026/01/65d0804e4ca198d1be2d29c33a408e82.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
    &lt;!-- &lt;figcaption&gt;多邻国&lt;/figcaption&gt; --&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;img src=&quot;https://images.lynkxu.com/blog/2026/01/a5de167aeee7c422093527f026986b42.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
    &lt;!-- &lt;figcaption&gt;长桥&lt;/figcaption&gt; --&gt;
  &lt;/figure&gt;
&lt;/div&gt;

然后让我们来完成第二步，Cloudflare 再解析到 Github Pages。只需要在 Cloudflare -&gt; Domains -&gt; DNS 中添加如图所示的几条记录即可。

- 注意替换自定义域名和 Github Pages 域名。
- 代理状态先关闭，等待全部绑定步骤完成后再开启。

![cloudflare-dns.png](https://images.lynkxu.com/blog/2026/01/dd2d0edc708da373fc3ca43c28b5b425.png)


然后在 GitHub Repo 的 Setting -&gt; Pages 中完成 custom domain 和 Https 的配置即可。

![github-pages.png](https://images.lynkxu.com/blog/2026/01/f99eb706f1a9e432a54e2dc6bd0b9624.png)


至此，Github Pages 和 域名的绑定就算完成了。

## Cloudflare R2 图床配置

图床配置大家说的就比较清楚了，这里列几个我用到的参考：
- https://zhuanlan.zhihu.com/p/1922747381658653955
- https://blog.tangwudi.com/technology/homedatacenter12452/

也说明一个我配置中遇到的小问题：
我已经在 PicList 中添加了 Cloudflare R2 对应的配置， 如下

![image.png](https://images.lynkxu.com/2026/01/8e3a4591a54c2a8e7723e7b7059672f1.png)

测试上传的时候失败了，于是乎我想到我没有配置代理。添加完代理上传果然成功了。但是在「管理」页面中我可以看到图片存在，但却无法预览。想着后面再解决。

在 obsidian 中配置插件后，上传图传也成功了。但是部署之后发现，仍然无法获取图片。于是继续排查。发现 PicList 相册中的图片链接和 Cloudflare 控制台获取的图片链接不同。PicList 缺少一个 blog 前缀。而 blog 是我的存储桶名。

```bash
# piclist
https://xxx.lynkxu.com/2026/01/xxx.png
# cloudflare
https://xx.lynkxu.com/blog/2026/01/xxx.png
```

我就会想起，当我在设置自定义节点的时候，我发现 Cloudflare 控制台的「对象存储页面」有一个 S3 API，在「特定存储桶的设置」里还有一个 S3 API。他们的差异就是是否含有存储桶名称。我在填写 S3 API 的时候多填写了 blog 路径，是`https://6b3exxxxx.xxx.xx/blog`。导致上传的地址是在 blog 存储桶的 blog 文件夹下，所以 Cloudflare 给出的路径就多了一个 blog 目录。

于是乎替换自定义节点的地址，去掉 blog 路径即可！

&gt; 我想这就是做为程序员（非常重要）的直觉吧！</content:encoded><author>G.Ark</author></item><item><title>当信息过载的时候</title><link>https://1314047.xyz/blog/2026-01-04-infomation-overload.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2026-01-04-infomation-overload.html</guid><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;img src=&quot;/blog/2026-01-04-overload/moments.jpg&quot; class=&quot;align-right&quot; alt=&quot;我的朋友圈&quot; /&gt;

元旦假期这几天，朋友圈的内容特别多。很多人都会选择出去玩，然后发一些自己旅行的照片。想想是我也可能会发的。只是当这类内容太多了的时候，就会出现一些「**过载**」的情况。


我是不经常给别人点赞的类型，因为会害怕点赞成为一种习惯，当不点赞的时候反倒会变成问题。一般只会给一些很重要的事情点赞，比如结婚，换工作这类，或者是我真的觉得很有意思的内容。

这些出去玩内容平时也是可以点赞的，毕竟打工人很少有时间出去玩。只是这几天这种内容太多了，我已经审美疲劳，实在没有心力再去点赞，甚至没有想点开图片看的欲望。这好像还是我第一次有这种感觉，看到朋友圈里这么多的内容，没有任何想看的欲望，甚至有点厌烦，觉得无趣。

我之前倒是有过关闭朋友圈的经历，还是在我考研的那一年，用来减少自己刷手机的频率。有用吗？是有点作用的，而且我后来真的习惯了没有朋友圈的日子。忘记是什么原因，可能是考完研之后觉得无所谓了，就又打开了朋友圈。以前的我平时是不太发朋友圈的，一年可能也发不了一条。可能也和我的心情有关，当我在一个很压抑、焦虑的环境里时，我确实不太喜欢发朋友圈。可是当我的心情出现比较大的波动的时候，我就会有很多表达欲，发朋友圈/微博的频率明显提高。现在换工作之后，心情也好了，发朋友圈也变多了。

不是觉得发的多有什么问题，只是总觉得自己发的内容没有什么深度，无非就是随手拍的图片加一点无病呻吟哈哈。所以这也是为什么这段时间自己有很多想写的东西。我希望通过量的积累换来质的变化。第一步是多写。这对我来说是好事，多写还会倒逼自己多看，只有多输入才能多输出。

&lt;u&gt;“愿在这个喧嚣的时代，我能少一些无效的浏览，多一些深度的思考与真诚的表达。”&lt;/u&gt;</content:encoded><author>G.Ark</author></item><item><title>2025 年总结 - 找回自己</title><link>https://1314047.xyz/blog/2025-12-29-review-in-2025.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2025-12-29-review-in-2025.html</guid><pubDate>Wed, 31 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&gt; 当我在尝试列举这篇 2025 总结中要写的内容时，才意识到这一年自己做了好多事情。&lt;br&gt;而且我有一种预感：当我几年后回头看，这必将是人生重要的转折点之一。

## 年度日志

如果说 2024 年是在**等待**，2025 就是在**改变**。

这一年我去了很多地方，从休斯顿的 NASA 中心到济州岛的橘子园，从香港的尖沙咀到扬州的烟雨楼台。地理跨度很大，同时带来的改变也很大。

以前我总把“长期主义”当作虚词，但 2025 用一个个具体瞬间提醒我：真正让时间站到你这边的，是行动。

### 春 —— 世界很大我想去看看
春节前后，我和爸妈第一次一起去美国，完成了一次对我们全家都不算轻松的远行。回头看，这段经历留给我的不是“打卡了什么”，而是一些给我很大感悟的瞬间。

- 面签当天我临时补打了材料。这个不起眼的决定，却举足轻重。
- 体验到一种更松弛的日常。便利不必然等于快乐，需要学着把“开心”放回生活里。
- 回国的长途飞行里，我更确定自己想要的，是更少的焦虑、更清晰的选择。

美国之行的完整记录我单独写成了一篇：「[`2025 美国行`](/blog/2025-02-us-trip.html)」。

从美国回来之后，还有一件事需要被提上日程了 —— 换工作。

前面也提到从去年下半年开始，我想换工作的心情就愈发强烈。只是离职也算是一种跳出舒适圈的行为，所以并不是很容易。就这样从去年下半年拖到了今年年初。这个过程从今年三月份开始，一直到五月份结束，我离开了原有的互联网公司，进入了一家外企。

整个换工作的过程和想法我也写成了一篇文章：「[`新的工作，新的开始`](/blog/2025-09-01-new-job.html)」。

### 夏 —— 是时候做出改变了

当新的工作定来之后，也就是提了离职之后，我的心态突然就轻松，终于有时间做一些想做的事情了。

在交接的这一个月里，正好赶上五一黄金周，我还有一场和对象前往济州岛的旅行。这个旅行本身和离职没什么关系，在年初就是我们已经规划好了的，我们是在五一之后的下一个周凑了几天假期前往的，主要是为了避开黄金周的人流，这样也能节省一些费用，正好把剩下的假期全部清除了。

总的来说，风景很美，食物种类不多但是味道还不错，几乎全是中国游客所以不用担心语言问题。坐在海边吹着海风看着海以及在牛岛的骑行应该算得上是我旅途里最开心的时刻了吧。

&gt; 如果有时间，就补一下济州岛游记（挖坑）。

在换工作的这段时间里，我还做了一件很重要的事，就是去香港开卡。开银行卡的目的就是为了学习炒美股。这个想法也是很早就有了，年初去美国的时候我就去办了一张 BOA 银行卡，但是银行的风控策略过于严格，当我回国尝试发起电汇的时候，银行卡就被锁了，而且解锁十分困难，遂放弃。

这次趁着换工作的间隙，立马买了飞深圳的机票，准备前往香港。其实我中间只有 4 天的休息时间，所以这趟香港之旅只能有 3 天。第一天飞到深圳，晚上和朋友吃个饭，第二天去香港办完卡就返回深圳，第三天就返回上海，可以说是马不停蹄了。这还是我第一次去深圳，也是我第一次去香港，或者说第一次去真正意义上的南方。

刚下到深圳的飞机，就感觉南方的天气确实让我不太习惯。虽然当时还只是五月底，并不算是真正的夏天，但是深圳已经非常潮湿和炎热，体感非常难受。而且我也不出所料的见到了南方著名的宠物-小强。另外深圳给我一种比上海更加市侩但是更紧绷的感觉，不是很喜欢。

第二天到了香港。我没有预约汇丰银行的线下业务，结果我的手机就没法直接在汇丰 App 上开户，只能去线下开户。汇丰不预约几乎是没有号的，就近的几家果然都没有名额了，我只能选择了一家看起来很偏的营业网点，准备去碰碰运气。幸运的事就发生了，他们还可以办理开户，就这样我成功办了汇丰开户。开完户我本来准备去吃饭，朋友推荐了一家早茶，但是在门口徘徊许久没好意思进去，遂放弃。还是自己太社恐了。那天天气很热，在外面我根本呆不住，于是乎办完卡我就匆匆离开了香港。我的第一次南方之旅就这样结束了。

济州岛之旅是为了开心和放松，去了很多景点，吃了很多特色美食。而南方之旅本就是为了开卡去的，所以没有打卡什么景点也是意料之中。最重要的是，这开启了我的美股投资之路。

### 秋 —— 开始我的新生活

六月开始新的工作，而这一个秋天我都在围绕新工作/新的生活展开。

首先，我需要重新租房子。租房真不是一件容易的事情，而且这还伴随着另一件很累的事情——搬家。一开始我还住在旧的房子里，离公司大约有 1h 不到的车程。刚换工作的前两周里，我每天下班和周末都会跑 1-2 个地方去看房子。以办公地点为中心，地铁为主要交通工具，总通勤时间控制到 35 min 以内。就这样看了两周，最终还是选择了一个某如平台的房子。主要还是我不想和房东打交道。虽然预算有点超支，不够租到了自己满意的房子才是最重要的。搬家也花费了差不多两周，因为全都是我一个人完成打包，联系搬家公司，再重新整理等等，不得不说真的太累了！甚至萌生了下次一定请「日式搬家」的念头。

新公司没有健身房，我不得不开始寻找一个商业健身房了。目标是家附近的健身房，越近越好。我到也看了乐刻，但是人多空间又小，就换了一家，正好家附近有一家新开的几个月的健身房，看起来还不错。虽然现在健身要开始花钱了，但是似乎我健身的更有动力了，而且定下了一个今年的减脂目标，可能是因为觉得不努力就是亏钱吧哈哈哈。新的工作晚上 6 点钟就下班了。于是我晚上的安排就变成了下班后去健身房，然后再回家做饭吃。就这样又采购了一堆厨房用品，但是由于自己准备减体脂，所以也不会做什么大菜，所以也没添置太多东西。

回到工作本身。外企当然是不再加班了，大家工作的节奏也放缓了很多。最直观的感受是，焦虑感消失了。其实工作量并没有减少太多，虽然没有了 DDL，全凭自觉的写需求反倒会到自己每天都必须有一定产出。之前的工作里在 DDL 之前我甚至可以一天都不写代码，但是人却无法放松下来。因为你不知道什么时候就会出现一个什么样的任务，要求你在什么时候完成。同时还背负着工时考核，绩效考核等等一系列额外的压力，反倒会陷入无限的焦虑中。当然不升反降的工资偶尔还是会让我胡思乱想，但是我相信，**做你想做的事情才是正确的**。

这里还有一些差异比如：
- 大家更习惯使用 Terminal 进行操作，特别是开发工具。
- 大家更习惯依赖可靠的第三方服务/代码库来完成开发。
- 更严格的 Code Review。同事对代码风格等都有着比较严格的要求。
- 工程师驱动型的文化。工程师会比较多的参与到业务决策中，推动公司的发展。
- 更加亲近的同事关系。同事之间会有更多的人情味在，虽然对我来说并不太习惯。

当然也会有很多不太适应的地方，比如基建相对国内大厂是比较薄弱的，所以开发的时候还是会有很多不便。另外技术栈相对老旧，比如公司的主力项目其实是 Ruby 项目，维护起来成本较高。而且公司相对较小，有时候还需要完成一部分简单的前端工作，好在现在有了 AI，这也不是个很困难的事情。

八月底，我就顺利转正了。这里面没有大厂里经常谈到「落地」地问题，转正就是一个自然而然的事情，甚至不需要答辩，只有一个简单的通知。让我一度以为自己是不是没有通过转正，为什么临近转正日期也没有人和我沟通。。。

另外，九月初的时候，也就是离我去香港开卡已经三个月，我终于终于完成了汇丰的开户流程，完成了我的第一笔入金，正式开始了我的美股闯荡之旅。我的计划是 $10000 的本金，看看自己的表现如何。让我们在接下来的「长桥」年度报告中揭晓答案吧。

### 冬 —— 时间会给出答案

转正之后的生活也没有太多变化，更多的是检验之前立下 flag 的成果。让我们从各种软件的数据/年度报告中来一探究竟吧！

#### 多邻国

年初因为要换工作而开始了多邻国打卡，这一打卡就是 200 多天。虽然后面每天打卡的时间降低了很多，但是我终于是把这件事情坚持了下来。英语的重要性不言而喻，希望能继续坚持。


&lt;div class=&quot;img-grid cols-2&quot;&gt;
  &lt;figure&gt;
    &lt;img src=&quot;/blog/2025-12-29-review/duolingo.png&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
    &lt;figcaption&gt;多邻国&lt;/figcaption&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;img src=&quot;/blog/2025-12-29-review/changqiao.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
    &lt;figcaption&gt;长桥&lt;/figcaption&gt;
  &lt;/figure&gt;
&lt;/div&gt;

#### 长桥

2025.09.22 - 2026.01.01 我的总体收益率是 17% 左右，算是达到了自己的目标吧。

当然我入市的前一个月行情很好，自己赚了很多，收益率一度达到 30%。但是在黑色十一月期间就一路亏损，总收益直接掉到负值。那段时间市场上的负面消息不断，我天真的以为美股韧性很强，一时的下跌都不是问题（虽然确实也如此），但是我是持有期权的。那时候我对期权没有太清楚的认知，只是因为期权赚了一些钱就天真的以为依靠这个赚钱不是很困难。在下跌的过程我就采取了越跌越买的策略，并且是买短期期权。然后市场就教我做人了，这一次在 NVDA 的期权上我就亏了 $2000，而且是血本无归的亏损，期权价值跌为 0。好在我并没有把全部身价赌上去，在市场开始好转的时候我的收益也开始增长，最终收于 17% 这个数字。

我对股市的认知是，**炒股就是赌博，而投资不是**。

但有意思是，什么是投资。就像段永平说的，你投资是买的这家公司，而你要看懂这家公司。他也说到看懂一家公司是非常难的。我衡量自己是否看懂一家公司的标准就是：是否敢把所有钱的都去买这家公司/公司股价下跌的时候会不会选择继续购买。

截至目前，我能做到的可能只有茅台/苹果这两家公司和 BTC。另外考虑到机会成本，其实也不一定会真的全部买入他们。我不觉得我是真的看懂了，但是我相信他们。这也是非常有意思的事情。其实可能也不需要完全看懂一家公司，**有时候你需要懂你自己**。这是一场为自己的信念买单的事情，当你发现你做的是对的时候，这种快乐是难以形容的。


这个过程中，自己看了不少段永平/巴菲特的视频，也确实学到了很多。更重要的是，我找懂了一个可以验证自己想法的事情，而且这个事情的做法和自己的原则十分相似，这让我真的非常开心。


#### 运动

还有一件很重要的事情就是运动。其实从我坚持锻炼算起，已经 2-3 年了。今年因为换工作中断了 2-3 个月，是我最久的一次中断。好在后续就捡了回来。

最终，我的体脂来到了 13.1%，也成功的看到了腹肌。而且由于无氧运动的重量被提了上来，自己的肌肉线条也更加明显。现在应该是我迄今为止身材最好的时候了（骄傲脸）。

&lt;div class=&quot;img-grid cols-2&quot;&gt;
  &lt;figure&gt;
    &lt;img src=&quot;/blog/2025-12-29-review/fit-1.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
    &lt;!-- &lt;figcaption&gt;多邻国&lt;/figcaption&gt; --&gt;
  &lt;/figure&gt;
  &lt;figure&gt;
    &lt;img src=&quot;/blog/2025-12-29-review/fit-2.jpg&quot; alt=&quot;&quot; loading=&quot;lazy&quot; /&gt;
    &lt;!-- &lt;figcaption&gt;长桥&lt;/figcaption&gt; --&gt;
  &lt;/figure&gt;
&lt;/div&gt;

因为主要的目标就是把体脂降下来，所以除了坚持控制饮食之外，今年我也增加了有氧的运动量。也因此爱上了跑步。从 6 月份的一个月 20,30 km，到 8 月份的近 80 km，后续每个月都在 60-80km 之间。2025 年一共跑了 399.34km。

希望在新的一年能够月跑量突破 100km。


#### 总结

回看我的 2025 年，「改变」这两个字贯穿始终。

我舍弃了不错的薪水，选择了更想要的生活。这是不是一个正确的选择，当时的我没法回答，现在的我也没法回答。但我感觉到我正在向着正确的方向前进。

2026，让我们继续出发。

## 年度指南
### 最值得买

| Category | Product              | Price         | Reason         | Score(10) |
| -------- | -------------------- | ------------- | -------------- | --------- |
| 扫地机器人    | **Roborock P20 Pro** | ¥ 2,057.85    | 保持地面干净，省时省力    | 9         |
| 手机壳      | **PITAKA**           | ¥ 328.00      | 让我第一次能够习惯戴壳    | 8.8       |
| 电脑       | **Mac mini 4**       | ¥ 3,500.00    | 超高性价比，做工无敌     | 8.5       |
| AI 助手    | **Cursor Pro**       | $ 20.00 per m | 程序员都懂！无敌生产力    | 8.5       |
| 耳机       | **AirPods 4**        | ¥ 719.10      | 配合 iPhone 使用更佳 | 8         |
| 运动手表     | **Coros Pace Pro**   | ¥ 1,7502.44   | 爱上跑步从它开始       | 8         |
| 手机       | **iPhone 17 Pro**    | ¥ 8,999.00    | 设计在线，续航升级      | 7         |


### 最不值得买

| Category | Product        | Price    | Reason          | Score(10) |
| -------- | -------------- | -------- | --------------- | --------- |
| 耳机       | **荣耀亲选 LCHSE** | ¥ 303.50 | 做工一般，夹耳朵        | 2         |
| 地垫       | **七棉吸水浴室地垫**   | ¥ 37.70  | 不易清洁，也不易干       | 2         |
| 挂钩       | **百草园免打孔挂钩**   | ¥ 14.99  | 粘的不牢固，很容易掉      | 1         |
| 垃圾桶    | **佳帮手厨房滑盖垃圾桶** | ¥ 22.70  | 垃圾袋无法固定，开合会导致偏移 | 1         |

## 2026 TODO

### 基本目标
- [ ] 体脂率维持在 15% 以下
- [ ] 完成一场半程马拉松 
- [ ] 完成一场全程马拉松

### 进阶目标
- [ ] 体脂率维持在 12% 以下
- [ ] 半程马拉松跑进 2h
- [ ] 全程马拉松跑进 4h</content:encoded><author>G.Ark</author></item><item><title>2025年复盘：从17万负债到全职Web3</title><link>https://1314047.xyz/blog/2025-12-30-leetcode-go-record.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2025-12-30-leetcode-go-record.html</guid><pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate><content:encoded>2025年快结束了。

这一年过得很快，但回头看又觉得很长。
 如果让我用一句话总结，大概是：

**从背着17万负债，到在Web3勉强站稳脚跟的一年。**

今天抽空写下来，也算给未来的自己留个记录。

------

## 一切从一个“土狗社区”开始

2025年1月，我开始真正关注土狗。

当时在推特上看到一个叫 **stonks** 的币。
 原项目方已经跑路了，但有个叫 **大B哥** 的人站出来，准备重新把社区做起来。

那时候社区最需要的就是 **人气**。

于是大家开始在推特上疯狂冲推。
 而大B哥也给冲推的人发一点工资。

说实话，那段时间我其实挺窘迫的。
 **基本就是靠着冲推那点工资过日子。**

但也正是在那个阶段，我开始慢慢接触到 **撸毛这个赛道**。

一开始只是旁观，后来慢慢参与进去。
 回头看，那大概算是我真正进入 **Web3世界的起点**。

后来随着社区稳定，stonks也不再需要冲推了。

**工资自然也没了。**

那时候我只能开始自己找路——
 于是开始尝试打土狗。

不过当时我其实还没有完全离开 **Web2的工作**，还处在一种“半只脚在Web3”的状态。

------

## 我印象最深的一次亏损

有一件事，我到现在都记得很清楚。

有一天我陪客服喝完酒，老婆开车来接我回家。

我上车之后很快就睡着了。
 但我不知道的是，在我上车之前，她自己开了一单土狗。

后来她跟我说，那一路都是高速，她一直在开车，根本没办法看行情。

所以那单就一直 **拿着仓位**。

等到路过服务区的时候，她实在忍不住了，把车停下来打开手机看了一眼。

**亏了300U。**

到家以后我已经上床准备睡觉了。

她跑进房间跟我说这件事。

我记得很清楚，她当时的表情就像一个做错事的小孩，小心翼翼地跟我说：

“亏了300U……”

我当时其实也愣了一下，但还是跟她说：

&gt; 没关系的，刚开始嘛，亏损很正常。

其实那时候，我们的处境并不好。

那段时间我们还有 **17万左右的负债**，生活过得挺紧巴巴的。

第二天，她去找她爸爸借了 **两万块钱**。

那两万块，对我们来说其实挺重要的。
 也就是靠这笔钱，我们把那段时间撑过去了。

------

## 转折：币安 Alpha

后来我们遇到了 **币安 Alpha**。

一开始刷的是 **ZKJ**。

结果后来ZKJ直接割人了。
 当时其实挺难受的，但也只能继续找机会。

后来又开始刷 **KOGE**。

那段时间的感觉很奇怪。

每天都像是在 **踩钢丝**。

既兴奋，又紧张。
 但现在回头看，其实那时候是 **非常好刷分的一段时间**。

也是从那时候开始，我们慢慢有了一些稳定收益。

负债一点点减少。

直到后来，我们做了一个决定：

**把Web2的工作停掉，全职做Web3。**

这个决定其实不轻松。

但当时我们觉得，既然已经找到了一条路，那就干脆认真走下去。

------

## 收益下降之后

现在Alpha的收益，其实已经没有最早那时候高了。

但我们还是在坚持做。

我们的想法其实很简单：

- **只要还有利润，就继续做**
- 如果有一天收益 **低于理财收益**

那我们就会把资金归集起来，去做更稳健的理财。

毕竟在熊市阶段，最重要的一件事就是：

**守住本金。**

------

## 这一年做过的事情

除了币安 Alpha，我们这一年其实也做了不少尝试。

比如：

- Bitget 的活动
- OKX 的活动
- Gate 的活动
- 还有一些链上的撸毛项目

整体来说运气还不错。

大多数项目都是 **盈利的**。

也有个别小亏，但基本都在 **可以接受的范围内**。

如果要说 **2025年的主要收入来源**，那还是：

**币安 Alpha。**

------

## 写在最后

有时候回头看这一年，会觉得有点不真实。

从：

- 靠冲推工资过日子
- 背着17万负债

到：

- 全职做Web3
- 靠撸毛和活动慢慢稳定下来

我们没有暴富。

但至少：

**活下来了。**

Web3这个行业变化很快，周期也很明显。

所以现在我给自己定的原则其实很简单：

**牛市多赚，熊市守本。**

只要还能一直在牌桌上，机会总会再来。</content:encoded><author>G.Ark</author></item><item><title>OKX Boost X Launch 监控脚本部署教程</title><link>https://1314047.xyz/blog/2025-12-10-rust-note.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2025-12-10-rust-note.html</guid><pubDate>Wed, 10 Dec 2025 00:00:00 GMT</pubDate><content:encoded>### **项目简介**

监控 OKX Boost X Launch 项目，在参与时间和领取时间到点时自动发送 Telegram 通知。

**项目地址：** https://github.com/kuzicode/okx-boost-alert

![](https://pic1.imgdb.cn/item/698a0f9601b1be04704f2103.jpg)

------

### **快速部署指南**

#### **第一步：准备环境**

1. **安装 Python 3.8+**
   1. 访问 [python.org](https://www.python.org/downloads/)
   2. 下载安装包，安装时务必勾选 **&quot;Add Python to PATH&quot;**

1. **下载项目代码**
   1. bash
   2. `# 方法1：使用 Git（推荐） git clone https://github.com/kuzicode/okx-boost-alert.git cd okx-boost-alert # 方法2：手动下载# 从 GitHub 下载 ZIP 压缩包，解压到任意目录`

#### **第二步：安装依赖**

bash

```plain
# 1. 创建虚拟环境
python -m venv venv

# 2. 激活虚拟环境# 方式A：PowerShell用户
.\venv\Scripts\Activate.ps1
# 如果提示权限错误，先执行：
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# 方式B：CMD用户
venv\Scripts\activate

# 3. 安装项目依赖
pip install -r requirements.txt

# 4. 安装 Playwright 浏览器
playwright install chromium
```

#### **第三步：配置参数**

bash

```plain
# 1. 复制配置文件
copy .env.example .env

# 2. 编辑配置文件# 右键点击 .env 文件 → 打开方式 → 选择记事本# 填入以下必要信息：# TELEGRAM_BOT_TOKEN=你的机器人Token# TELEGRAM_CHAT_ID=你的群组/频道ID
```

**配置文件说明：**

text

```plain
TELEGRAM_BOT_TOKEN=你的Bot Token（从 @BotFather 获取）
TELEGRAM_CHAT_ID=群组/频道ID（如 -1001234567890）
TELEGRAM_TOPIC_ID=话题ID（可选，用于群组话题）
CHECK_INTERVAL_MINUTES=5  # 检查间隔（分钟）
```

#### **第四步：测试运行**

bash

```plain
python monitor.py
```

首次运行会打开浏览器进行测试，看到成功提示信息即可。

------

### **Windows 开机自启动设置**

#### **VBS脚本 + 启动文件夹（推荐）**

**步骤1：创建启动脚本**

1. 在项目文件夹内新建文本文件

1. 重命名为 `start_monitor.vbs`

1. 右键 → 编辑，粘贴以下代码：

vbscript

```plain
Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Set ws = CreateObject(&quot;WScript.Shell&quot;)

&apos; 获取VBS文件所在的目录（即项目目录）
scriptPath = fso.GetParentFolderName(WScript.ScriptFullName)
ws.CurrentDirectory = scriptPath

&apos; 直接使用虚拟环境中的Python，避免激活问题
pythonPath = scriptPath &amp; &quot;\venv\Scripts\python.exe&quot;
scriptFile = scriptPath &amp; &quot;\monitor.py&quot;

&apos; 隐藏窗口运行（0=隐藏，1=显示）
ws.Run &quot;cmd /c &quot;&quot;&quot; &amp; pythonPath &amp; &quot;&quot;&quot; &quot;&quot;&quot; &amp; scriptFile &amp; &quot;&quot;&quot;&quot;, 0

&apos; 可选：启动提示（调试完成后可删除）
&apos; MsgBox &quot;OKX Boost监控已启动！&quot;, vbInformation, &quot;启动成功&quot;
```

**步骤2：设置开机自启动**

1. 按 `Win + R` 键

1. 输入 `shell:startup`，回车

1. 将 `start_monitor.vbs` 文件复制到此文件夹

1. 重启电脑测试效果

### **验证与监控**

------

#### **检查是否运行成功**

1. **查看进程**：`Ctrl + Shift + Esc` → 进程 → 查找 `python.exe`

1. **查看日志**：项目文件夹会生成运行日志

1. **测试通知**：修改测试时间触发通知

#### **停止监控**

bash

```plain
# 方法1：任务管理器结束进程
Ctrl + Shift + Esc → 找到 python.exe → 结束任务

# 方法2：命令行停止
taskkill /f /im python.exe

# 方法3：删除启动项
删除启动文件夹中的 VBS 文件
```

#### **更新项目**

bash

```plain
# 1. 停止当前监控
taskkill /f /im python.exe

# 2. 拉取最新代码git pull origin main

# 3. 重新安装依赖（如有更新）
pip install -r requirements.txt

# 4. 重新启动
python monitor.py
```

------

### **常见问题解决**

| **问题**        | **解决方法**                        |
| --------------- | ----------------------------------- |
| 无法导入模块    | 确认虚拟环境已激活，重新安装依赖    |
| Playwright 报错 | 运行 `playwright install chromium`  |
| Telegram 无通知 | 检查 `.env` 配置是否正确            |
| 开机不启动      | 检查启动文件夹路径，确认VBS脚本位置 |
| 权限不足        | 以管理员身份运行 CMD/PowerShell     |

------

### **注意事项**

1. 确保网络可以正常访问 OKX 和 Telegram

1. 定期检查脚本更新，获取最新功能

1. 重要活动建议提前手动验证

1. 保持电脑不休眠（修改电源设置）

按照以上步骤操作，你的监控脚本将在 Windows 10/11 上稳定运行，实现 24 小时自动监控和通知！</content:encoded><author>G.Ark</author></item><item><title>撸空投多开安全起见，谨慎使用指纹浏览器</title><link>https://1314047.xyz/blog/2025-09-23-kong.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2025-09-23-kong.html</guid><pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate><content:encoded>## **一、为什么要用多个独立 Chrome 实例（优点）**

- 账号隔离：多个 Google / Facebook / Twitter 等账号互不干扰。
- 独立 Cookie 与缓存：防止自动登录到错账户。
- 降低指纹追踪风险：适用于营销、电商、广告推广场景。
- 崩溃隔离：一个实例崩溃不会影响其它实例。
- 提高工作效率：为不同任务建立不同配置（书签、扩展、插件）。
- 独立代理：给不同实例使用不同 VPN / IP。
- 适合 Web3 / 加密交易 / DApp：多个钱包、账户隔离。

------

## **二、准备：在 D 盘（或任意盘）创建两个文件夹**

建议创建两个文件夹用于存放用户数据与快捷方式（也可放到其它盘）：

- D:\fenliulanqi2\Chrome_UserData （存放 Chrome 用户数据）
- D:\fenliulanqi2\Chrome_ShortCuts （存放生成的快捷方式）

你可以在资源管理器中右键新建，也可以用 PowerShell 一次性创建：

```
New-Item -ItemType Directory -Path &quot;D:\\fenliulanqi2\\Chrome_UserData&quot; -Force
New-Item -ItemType Directory -Path &quot;D:\\fenliulanqi2\\Chrome_ShortCuts&quot; -Force
```

------

## **三、PowerShell 脚本（生成 10 个 Chrome 分身快捷方式）**

1. 打开记事本（Win + R → notepad → 回车）。
2. 将下面脚本全部复制并粘贴到记事本中。
3. 保存为 D:\chrome.ps1（文件类型选择“所有文件 (*.*)”）。

脚本（已修正路径拼接与引号，生成 1 到 10 共 10 个分身）：

```
# -*- coding: utf-8 -*-

# Title: 自动生成多个具有独立环境的 Chrome 浏览器

# Describe: d盘新建一个记事本文件，复制以下代码，保存为 chrome.ps1 ，

# 菜单栏以管理员运行 PowerShell 运行，输入 d: 然后输入Set-ExecutionPolicy RemoteSigned 回车后获取权限输入y，

# 输入命令 .\\chrome.ps1 即可

# 先建立两个文件夹并复制其路径，替换以下两个路径

$UserDataPath = &quot;D:\\fenliulanqi2\\Chrome_UserData&quot; # 存放 Chrome 用户数据

$FilePath = &quot;D:\\fenliulanqi2\\Chrome_ShortCuts&quot;    # 存放快捷方式图标，从这个文件夹里打开浏览器分身

# 右键打开你桌面上的 Chrome 浏览器快捷方式，复制“目标”一栏的内容，替换下方路径

# （注意：只复制 C:\\Users\\....\\chrome.exe ，chrome.exe 后面的比如“--profile-directory”等字符不要复制）

$TargetPath = &quot;C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe&quot;

# 复制 Chrome 浏览器快捷方式的“起始位置”一栏的内容，替换下方路径

$WorkingDirectory = &quot;C:\\Program Files\\Google\\Chrome\\Application&quot;

# 设置生成分身的数量（从1到10）

$array = 1..10

foreach ($n in $array)

{

    $x = $n.ToString()

    $ShortcutFile = $FilePath + &quot;\\Chrome_&quot; + $x + &quot;.lnk&quot; #

    $WScriptShell = New-Object -ComObject WScript.Shell

    $Shortcut = $WScriptShell.CreateShortcut($ShortcutFile)

    $Shortcut.TargetPath = $TargetPath

    $Shortcut.Arguments = &quot;--user-data-dir=&quot; + $UserDataPath + &quot;\\&quot; + $x

    $Shortcut.WorkingDirectory = $WorkingDirectory

    $Shortcut.Description = &quot;Chrome&quot; #备注，可以随便写

    $Shortcut.Save()

}
```

注意：

- 确认 $TargetPath 与 $WorkingDirectory 与你系统上的 Chrome 安装路径一致（右键桌面 Chrome 快捷方式可以复制“目标”与“起始位置”）。
- 如果 Chrome 安装在 32 位 Program Files (x86) 下，请修改为对应路径。

------

## **四、保存并运行脚本（管理员权限）**

1. 以管理员权限运行 PowerShell / Windows 终端：
   - 按 Win + X → 选择 “Windows 终端（管理员）” 或 “PowerShell（管理员）”。
2. 切换到 D 盘：

```
d:
```

1. 允许执行本地脚本（只需执行一次）：

```
Set-ExecutionPolicy RemoteSigned
# 如果提示：是否更改执行策略？ 回答 Y 并回车
```

（出于安全考虑，执行完脚本后你可以将执行策略改回默认，如：Set-ExecutionPolicy Restricted）

1. 运行脚本：

```
.\\chrome.ps1
```

运行完成后，打开 D:\fenliulanqi2\Chrome_ShortCuts，你会看到 Chrome_1.lnk … Chrome_10.lnk 等 10 个快捷方式。

------

## **五、打开与使用**

- 双击任意 Chrome_x.lnk（例如 Chrome_1.lnk）即可启动一个独立的 Chrome 实例，数据会存放在 D:\fenliulanqi2\Chrome_UserData&lt;编号&gt;。
- 第一次启动某个分身时，Chrome 会像全新安装一样进行设置（也可以安装扩展或登录不同账号）。

小提示：

- 若不希望首次运行弹出欢迎页面，可在 Arguments 中追加参数：–no-first-run
- 若希望指定每个分身的窗口大小/位置或更多启动参数，可在 $Shortcut.Arguments 中追加对应参数。

------

## **六、代理与独立 IP 的使用建议**

- 建议在每个分身上安装代理切换扩展（如你提供的 Proxy Switcher 插件），以便为不同分身指定不同代理或节点。
- 独立 IP 来源：
  - 住宅 IP（成本高，但更接近真实用户环境）。
  - 商业 VPN / 机场节点（性价比更高，节点选择更多）。
- 若用多节点建议使用 SOCKS5 方式并配合软路由（如 Passwall）暴露多个不同地区的 SOCKS 节点，然后在每个分身里配置对应代理扩展。
- 注意合规与账号安全，不要滥用代理导致账号被封。

------

## **七、同步工具与资源**

- GitHub 项目（Chrome-Manager）：https://github.com/devilflasher/Chrome-Manager
- 本地可运行工具（注意安全，建议自行从源码打包）：https://jdssl.top/wp-content/uploads/2025/02/chrome_manager.zip

（建议优先从官方 / GitHub 源码自行打包构建可执行文件，以避免安全风险）

------

## **八、常见问题与排查**

- 没看到快捷方式：确认脚本路径、文件夹存在且你有写权限。可在 PowerShell 中手动查看：

```
Get-ChildItem &quot;D:\\fenliulanqi2\\Chrome_ShortCuts&quot;
```

- Chrome 报错“另一个 Chrome 正在运行”或 profile 被占用：确保每个分身使用不同的 user-data-dir；不要用同一 profile 同时多次启动。
- 执行策略拒绝：以管理员身份运行 PowerShell 并执行 Set-ExecutionPolicy RemoteSigned。</content:encoded><author>G.Ark</author></item><item><title>告别高价VPS！手把手教你用NAT主机打造高性价比节点</title><link>https://1314047.xyz/blog/2025-08-30-nat.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2025-08-30-nat.html</guid><pubDate>Sat, 30 Aug 2025 00:00:00 GMT</pubDate><content:encoded>### 一、**Debian 系统安装 Hysteria2**

**1. 一键搭建命令**

```
wget -N --no-check-certificate &lt;https://raw.githubusercontent.com/flame1ce/hysteria2-install/main/hysteria2-install-main/hy2/hysteria.sh&gt; &amp;&amp; bash hysteria.sh
```

**2. 设置服务器端口（UDP）**

- 在防火墙和路由器中开放对应的UDP端口，确保外部可以访问。
- 例如，默认端口可以设置为 `40443`，根据实际需求调整。
### **二、Alpine 系统安装 Hysteria2**

**1. 更新系统**

```
apk update &amp;&amp; apk upgrade

```

**2. 一键搭建命令**

```
wget -O hy2.sh &lt;https://raw.githubusercontent.com/zrlhk/alpine-hysteria2/main/hy2.sh&gt;  &amp;&amp; sh hy2.sh

```

&gt; 注意：如果搭建未成功，可以重复执行该命令，脚本会覆盖之前的密码。

![domain.png](https://pic1.imgdb.cn/item/69f0ec4476a7fecb5ef3692a.png)


**3. 配置客户端（以 v2rayN 为例）**

- **别名**：自定义名称，如 `XXX`
- **地址**：服务器公网 IP 地址
- **端口**：`40443`（或你设置的端口）
- **密码**：脚本安装时生成的密码（可在服务器脚本输出或配置文件中查看）
- **传输层安全**：TLS
- **SNI**：`bing.com`（可根据需要修改）
- **跳过证书验证**：勾选 `True`

![domain.png](https://pic1.imgdb.cn/item/69f0edce76a7fecb5ef36d41.png)

![domain.png](https://pic1.imgdb.cn/item/69f0ee0476a7fecb5ef36ddb.png)
**4. 服务器 NAT 端口转发**

- 必须设置 UDP 端口转发，确保 UDP 流量能够正确转发到服务器。
- 例如，将服务器的 UDP 40443 端口转发到服务器对应端口。

![image.png](https://pic1.imgdb.cn/item/69f0ee2a76a7fecb5ef36e41.png)

**5.更换端口的完整步骤**

- **停止 Hysteria 服务**：

bash

```
rc-service hysteria stop
```

- **编辑配置文件**：

bash

```
nano /etc/hysteria/config.yaml
```

- **修改端口号**（找到 `listen` 行）：

yaml

```
listen: :40444# 将40443改为您想要的新端口
```

- **重启服务**：

bash

```
rc-service hysteria start
```

- **验证服务状态**：

bash

```
rc-service hysteria status
ps aux | grep hysteria
```

- **检查新端口是否在监听**

bash

```
netstat -tulpn | grep :40444
# 或者
ss -tulpn | grep :40444
```

### 三、**NAT IP 被墙后转用 VMESS/VLESS**

**1、一键搭建代码**

```
curl -fsSL &lt;https://raw.githubusercontent.com/eooce/ssh_tool/main/ssh_tool.sh&gt; -o ssh_tool.sh &amp;&amp; chmod +x ssh_tool.sh &amp;&amp; ./ssh_tool.sh
```

**2、选择12.节点搭建合集**

![image.png](https://pic1.imgdb.cn/item/69f0ee5576a7fecb5ef36eac.png)

**3、这我选择的1（1.F佬Sing-box一键脚本）**

![image.png](https://pic1.imgdb.cn/item/69f0ee7976a7fecb5ef36f0f.png)

**4、选择1**

![image.png](https://pic1.imgdb.cn/item/69f0eeae76a7fecb5ef36f94.png)

**5、选择a**

![image.png](https://pic1.imgdb.cn/item/69f0eedf76a7fecb5ef37019.png)

**6、这个是重点，根据自己服务器提供的端口输入**

![image.png](https://pic1.imgdb.cn/item/69f0ef0676a7fecb5ef37070.png)

**7、服务器NAT端口转发一定要设置**

![image.png](https://pic1.imgdb.cn/item/69f0ef2776a7fecb5ef370c7.png)

**8、自己有argo域名就写自己的，没有就直接默认**
![](assets/告别高价VPS！手把手教你用NAT主机打造高性价比节点/file-20260429013507055.png)

**9、复制，导入到对应软件就可以了**
![](assets/告别高价VPS！手把手教你用NAT主机打造高性价比节点/file-20260429013530760.png)

视频教程：[https://pan.quark.cn/s/f40a3a49534d](https://pan.quark.cn/s/f40a3a49534d)

### 四、VMess**一键脚本**

```jsx
bash &lt;(curl -Ls &lt;https://main.ssss.nyc.mn/sb.sh&gt;)
```

### 五、NAT小机**最简单的搭建节点教程**

安装命令一键生成：[https://yonggekkk.github.io/argosbx/](https://yonggekkk.github.io/argosbx/)
![](assets/告别高价VPS！手把手教你用NAT主机打造高性价比节点/file-20260429013545235.png)
![](assets/告别高价VPS！手把手教你用NAT主机打造高性价比节点/file-20260429013556228.png)</content:encoded><author>G.Ark</author></item><item><title>记在二十五岁</title><link>https://1314047.xyz/blog/2023-01-31-age25.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2023-01-31-age25.html</guid><pubDate>Tue, 31 Jan 2023 00:00:00 GMT</pubDate><content:encoded>## 1. 2022年flag回顾

这份写于2022年4月的[2022年任务清单](https://lynxux.github.io/posts/2022-04-03-flags-in-2022/)，现在会看起来，确实有很多事情没有完成

### 关于工作

首先就是刷题，截至今天，最终题数定格在了377。在暑期实习求职结束后，就几乎没有刷题了。这是自己秋招失利的一部分原因。

然后是开源项目，只完成了MIT 6.824以及evio的源码阅读。

### 关于学习

自己也算是顺利毕业，算是完成了目标。

### 关于生活

腹肌其实通过4月到8月的努力有了雏形，但是后面没能坚持。。。

新的一年希望再接再厉，不要再打自己的脸！

## 2.</content:encoded><author>G.Ark</author></item><item><title>go 的包管理踩坑记录</title><link>https://1314047.xyz/blog/2022-07-26-go-lib.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2022-07-26-go-lib.html</guid><pubDate>Tue, 26 Jul 2022 00:00:00 GMT</pubDate><content:encoded>对于现在学习goland的新手来说（比如我），最熟悉的包管理方式应该就是GO MODULE（mod模式）了，因为GO 1.11版本之后就开始默认使用GOMODULE了。

但是看过相关的文章大家都应该知道，在GO 1.5版本之前GO使用gopath进行包的管理，在GO 1.5之后又增加了vendor机制。

&gt; 如果一点都不了解go的包管理的可以去[Go包管理详解-知乎](https://zhuanlan.zhihu.com/p/92992277)先看一下。

首先，GO mod模式会从import的地址上去查找对应的项目，然后把项目拉取到本地的gopath的pkg中。

**问题 1** ：**如果我们要暂时修改import包中的代码，要怎么办？**

那我们可能直接修改gopath/pkg里的源码文件吗？

 – 答案是不可以，因为是只读的

我想GO官方是希望我们使用自己的fork的仓库进行修改，然后拉取再进行测试，但是这样的操作实在过于繁琐，所以此时我们可以使用go vendor

当我们使用go mod vender命令之后，会在项目的当前目录生成vendor文件，存放着我们所有需要的依赖文件。我们可以修改vendor文件里的源文件，然后进行测试。（当然这种方式并不推荐）

**问题 2 ：如果老的项目不使用mod进行管理，那么我们要怎么办？**

此时，一般项目中都会有vendor目录，如果没有也不要紧，此时都会从gopath的src目录下进行依赖的查找，所以推荐的方式时完全按照go path的方式去组织项目

就是把所有的项目全部按照import中文件夹的组织方式进行存放，此时一般都会从gopath的src种查找源文件，而且此时如果需要修改引用的包中的源代码也是可以直接修改的。

但是如果项目有vendor目录，会先查找vendor，如果找不到再从go path的src下查找。

&gt; 此时不要忘了把 GO111MODULE 设置为 off 或者空（为空要保证项目目录下没有mod文件）

**问题3：为什么goland中无法查找go path下的包？**

大概率是因为goland是默认开启GOMODULE集成的，即使你在terminal中关闭了GOMODULE，goland还是会使用mod模式。我们需要在`Go/Go Modules`设置中关闭`Enable Go modules intergation`

参考：

【1】[Go包管理详解-知乎](https://zhuanlan.zhihu.com/p/92992277)</content:encoded><author>G.Ark</author></item><item><title>2022年任务清单</title><link>https://1314047.xyz/blog/2022-04-03-flags-in-2022.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2022-04-03-flags-in-2022.html</guid><pubDate>Sun, 03 Apr 2022 00:00:00 GMT</pubDate><content:encoded>&gt; 想到了就去做吧！

## 关于工作

#### 1. Leetcode刷到700题

- 截止04.03，已刷320题
- 截止04.13，已刷331题（本月由于部分题2刷，可能进度稍慢）

#### 2. MIT 6.824 (分布式系统)

- 预计5月前完成（lab1， lab2）
- 截止04.04，完成lab1
- 截止04.13，完成lab2A
- 截止04.15，完成lab2B
- 截止04.17，完成lab2C
- 截止04.20，完成lab2D
- 截止04.24，完成所有（lecture + lab1，2）

#### 3. MIT 6.s081 或者 Tsinghua rcore (操作系统)

- 7月前完成

#### 4. Stanford CS144 或者 gev/evio 开源项目 (计算机网络)

- 9月前完成

#### 5. rosedb 或者 CMU 15-445 或者 MIT 6.830 (数据库)

- 12月前完成

---

## 关于学习

#### 1. 中期报告

#### 2. 毕业论文

---

## 关于生活

#### 1. 运动

- 学校解封之后，还是要继续健身啊！希望能看到腹肌！

#### 2. 待补充</content:encoded><author>G.Ark</author></item><item><title>记在二十四岁</title><link>https://1314047.xyz/blog/2022-03-01-age24.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2022-03-01-age24.html</guid><pubDate>Tue, 01 Mar 2022 00:00:00 GMT</pubDate><content:encoded>&gt; 这篇本应该写在二月六日的文章，却被拖到了三月。为什么会拖了这么久呢？
&gt;
&gt; 今年已经是我研二的下学期了，开学的我就要开始投简历找工作，开始走出校园，走向社会。可是由于对找工作的准备不足，又或是说自己还是那个自己，并没有什么长进。所以这个寒假里自己都忙于刷题，为的就是能稍微弥补一下。
&gt;
&gt; 可是我忙学习忙到没时间写总结吗？也不是，归根结底还是自己太懒了。
&gt;
&gt; 那为什么今天又有了时间写呢？今天我刚刚经历完我第一次面试，就想着把这些事情完成。

## 事记

这一年，回想到底做了哪些事情，我可能也回想不起多少

这一年结束了学生时代的所有考试（应该？），经历第一次的项目结题和第一次做了手术。似乎就没有什么其他很重大的事情了。

**1. 结束了学生时代的所有考试**

我本科大四的生活好像发出过一次这样的感慨，没想到后来又读了研究生。这次发出这样的感概应该不会有下次了把，毕竟自己没有读博的打算。为什么这件事情对我来说还挺重要的呢？可能是因为我实在是厌烦了应试教育。每次考试我都要花很长的时间复习，可是自己对这些知识似乎并没有完全掌握，囫囵吞枣式的复习完成之后能考一个还过的去的分数就可以了。这么多年下来，总感觉自己学了很多东西，但是又忘记了，好像一无所获，一事无成。

（最近准备面试的生活，又一次有了考试的感觉，可能还是因为自己还是什么都没有学习，又只能靠着临时抱佛脚把。。。

**2. 经历了第一次的项目结题**

算是第一次经历一次很大的事件，虽然这件事自己做的事情不多，但是毕竟是亲身经历，还是会觉得感触颇深。

- 首先就是验证了之前的想法，验收前再怎么焦虑，验收的时候就会发现这其实没什么。可是这样还是改变不了自己的心态，也许多经历几次就会好把。

- 其次，验收的时候真的很忙，也是自己第一次这么忙，从早上6点到晚上12点就一直在忙，中间连喘息的机会都没有。庆幸的是，自己也没觉得这有什么，算是又多了一次体验把。

**3. 做了一个小手术**

害，这个其实没什么好说的，只是因为是第一次做手术，感觉还是挺值得纪念的。也算是解决一件事情。

**最近**

开学以来，因为找工作，其实很忙。开学的两周里，除了做了一点老师的事情，其他的每天都在准备面经，到今天面经才基本上完成。然后今天晚上就经历了第一次面试，因为面试的岗位并不是我主动投递的，所以我也预料到了结果，但是表现的很差还是影响心情...继续加油把！

## 其他

最近的面试使得自己有忙碌了起来，也使自己开始思考关于工作的很多事情。比如，我要找一份什么样的工作（我想要去哪一个公司的哪一个部门）等等。看起来，我总是想在当前的选择中找到一个最好的，但是最好的那个自己似乎也能力不足。我是不是有点太贪心了呢？正确的做法是不是先做，而不是考虑那么多？不知道，在思考下去好像变成了哲学问题。

在这个自己的本命年，我要找实习找工作并且毕业，看起来是很重要的一年，因为我要做出很多的选择，这些选择可能对以后影响深远。不过就是自己好像还没有能力去选择。

新的一年，希望自己不要总是对自己作出限制，不要想得太多，努力把！</content:encoded><author>G.Ark</author></item><item><title>回顾我的研一生活</title><link>https://1314047.xyz/blog/2021-09-06-first-year-graduate.html</link><guid isPermaLink="true">https://1314047.xyz/blog/2021-09-06-first-year-graduate.html</guid><pubDate>Mon, 06 Sep 2021 00:00:00 GMT</pubDate><content:encoded>距离回学校已经没有几天了，我也即将开始我的研二生活。

很巧的是，当我写下这些文字的时候，我发现一年前的今天，我刚好正式开始了我的研究生生活。

回看我的研一生活，有很多悲伤，痛苦，焦虑的时刻，也有一些开心的时刻。但是我第一个会想到的，应该还是那些并不太愉快的事情吧。

---

主要的原因应该还是自己发现研究生的生活和自己想象的有很大区别，而自己也是初次面临类似工作的生活状态，有很多不适应的地方。

这一年，平日里除了上课，写作业，就总是在给导师写专利，写软著，写报告，做一点基础的编码工作。感觉也不是很闲，但是却好像没有学到太多东西；与导师相处也并不是很愉快，有点为自己的毕业担心；眼看着要到研二了，找工作的事情又增加了我的焦虑。

自己的性格本就是比较操心的类型，我总是会想的比较多，喜欢提早做准备。然而导师有很多事情自己没有办法掌控，但是又需要我去做。同时自己也比较自闭，导师带我去开会时，我一方面觉得做的东西不好，不好意思去开会；另一方面陌生人多的场合我都不喜欢去。这都会使我变得异常焦虑。

我常常也会自我安慰，比如告诉自己社会就是这样；外出开会可以使自己变得更加的外向，使自己更加适应这样的场合等等。但是想起来的话，还是会变得很不开心。

我可能就是很矛盾吧，总是在不断地提出问题再自我否定。

---

吐槽了这么多， 那就再说一些开心的事情。

比如：

- 和沙雕网友们面了基，也认识了很多新朋友！
- 去了趟昆山、杭州，也和老友们见了面！
- 换了很多新的电子设备！
- 开始为找工作做准备了！

---

新的学期，还是希望论文能顺利，能找到实习，如果还能出去旅游一趟就完美了！</content:encoded><author>G.Ark</author></item></channel></rss>