Rain Blog
腾讯发布 CodeBuddy Code CLI 平替 Cla
测试版本:codebuddy-code-cli: 1.1.0 官网地址:https://copilot.tencent.com/cli 国际版使用额度:https://www.codebuddy.ai/profile/usage 目录 前言 优劣势分析 简介与安装 登录授权与模型支持 CLI 参数与常用命令 交互模式与快捷键 配置文件结构 核心功能体验 Shell 指令执行 Chat 与上下文管理 对话模式切换 自定义斜杠命令 记忆文件 (CODEBUDDY.md) MCP 服务配置 总结 前言 出于 Claude Code 的限制加上本人并不想花太多时间在环境上折腾,之前使用 Claude Code CLI 分别配合过 GLM 4.5、Kimi K2、DeepSeek 3.1、Qwen3 Coder 以及一些中转站,整体来说能用,但总感觉差点什么。 直到腾讯发布了 CodeBuddy Code CLI,号称可平替 Claude Code 且国内可无网络限制使用,便第一时间进行了体验。 优劣势分析 核心优势 限时公测免费:无需邀请码。 多模型切换:可调用 Gemini Pro 2.5 和 Claude Sonnet 4 模型(国际版)。 当前限制 暂不支持 /agents、/hooks、/ide 等高阶能力。 暂不支持后台任务。 暂不支持 HTTP/SSE 协议的部分 MCP。 版本分流: 国内版:仅支持 DeepSeek 3.1 等少数模型。 国际版:支持 Claude Sonnet 4 和 Gemini-Pro 2.5,但消耗的是 CodeBuddy IDE 国际版权益(新用户 2 周一次性 500 积分,老用户每日 50 积分免费额度)。 简介与安装 CodeBuddy Code CLI 是面向专业工程师的 AI 命令行工具,支持通过自然语言驱动全流程开发。它具备智能代码库分析、内置完整工具链、多场景任务自动化等特性,与插件和 IDE 构成完整的 AI 编程生态。 ...
# VPS 积分兑换代金券最优方案指南
基础环境与限制 VPS 费用:26.27 元/月 积分获取速度:60 积分/天(1 元 = 10 积分) 支持面额:10、20、50、100、500 元(仅支持同面额多张,不可跨面额组合) 续费规则:单次仅支持选择 1–9 个月续费 损耗机制:代金券单张独立扣减,单张余额一旦小于 26.27 元即变为无法合并、无法抵扣的废钱 最优兑换方案对比 方案 兑换面额与张数 消耗积分 获取周期 单次续费月数 实际扣费 最终废弃余额 适用场景 短期首选(推荐) 20 元 × 4 张(80元) 800 积分 约 14 天 续费 3 个月 78.81 元 1.19 元 积分不足、防止机器断服停机 长期终极 500 元 × 1 张(500元) 5000 积分 约 84 天 分批续 19 个月 499.13 元 0.87 元 积分充足、追求极致资金利用率 实操策略与执行步骤 第一阶段:以 80 元(4 张 20 元)保底过渡 ...
B4试卷PDF切分与重排指南
交互式菜单选择版: 运行脚本后,它会自动列出当前目录下的所有 PDF 文件并标上序号,如果只有 1 个就直接选中;如果有多个,你只需敲对应的数字编号即可,省去手打文件名的麻烦,且不会误处理无关文件。 交互选择版脚本:auto_unimpose.py import copy import glob import os import sys from pypdf import PdfReader, PdfWriter def select_pdf_file(): """扫描当前目录下的 PDF,列出菜单供用户选择""" # 查找所有 pdf,排除之前生成的成果文件 pdf_files = [ f for f in glob.glob("*.pdf") if not f.endswith("_A4_顺序版.pdf") and not f.startswith("output_") ] if not pdf_files: print("[!] 错误:当前目录下没有找到任何待处理的 PDF 文件!") sys.exit(1) # 如果恰好只有 1 个文件,直接默认选中 if len(pdf_files) == 1: print(f"[*] 发现唯一待处理文件: {pdf_files[0]}") return pdf_files[0] # 存在多个文件时,按修改时间降序排序并展示列表 pdf_files.sort(key=lambda x: os.path.getmtime(x), reverse=True) print("=" * 45) print("请选择要处理的试卷 PDF 文件(输入序号):") for idx, fname in enumerate(pdf_files, 1): print(f" [{idx}] {fname}") print("=" * 45) while True: choice = input(f"请输入数字序号 (1-{len(pdf_files)}),或按 'q' 退出: ").strip() if choice.lower() == "q": print("已取消操作。") sys.exit(0) if choice.isdigit(): val = int(choice) if 1 <= val <= len(pdf_files): selected = pdf_files[val - 1] print(f"[*] 已选择: {selected}") return selected print("[!] 输入无效,请重新输入正确的数字。") def run_unimpose(): input_pdf_path = select_pdf_file() base_name = os.path.splitext(input_pdf_path)[0] output_pdf_path = f"{base_name}_A4_顺序版.pdf" reader = PdfReader(input_pdf_path) writer = PdfWriter() total_sheets = len(reader.pages) if total_sheets == 0: print("[!] 错误:该 PDF 没有任何页面!") return N = total_sheets * 2 # 自动推导总单页容量 print( f"[*] 页面统计:共 {total_sheets} 个 B4 大面,切分后对应 {N} 页" " A4。" ) pages_dict = {} for idx, page in enumerate(reader.pages): rect = page.mediabox width = float(rect.width) height = float(rect.height) mid_x = width / 2 # 1. 裁剪左半页 left_page = copy.copy(page) left_page.mediabox = copy.copy(rect) left_page.mediabox.upper_right = (mid_x, height) # 2. 裁剪右半页 right_page = copy.copy(page) right_page.mediabox = copy.copy(rect) right_page.mediabox.lower_left = (mid_x, 0) # 3. 骑马钉解拼数学映射 # idx 从 0 开始: # 偶数面 (正面): 左 = N - idx, 右 = 1 + idx # 奇数面 (反面): 左 = 1 + idx, 右 = N - idx if idx % 2 == 0: p_left = N - idx p_right = 1 + idx else: p_left = 1 + idx p_right = N - idx pages_dict[p_left] = left_page pages_dict[p_right] = right_page # 4. 按 1 ~ N 顺序写入新文件 print("[*] 正在按页码重新装订排序...") for p_num in sorted(pages_dict.keys()): writer.add_page(pages_dict[p_num]) with open(output_pdf_path, "wb") as f: writer.write(f) print(f"[✓] 全部完成!生成文件已保存在同目录:\n -> {output_pdf_path}") if __name__ == "__main__": run_unimpose() 终端运行效果演示 如果有多个 PDF,运行 python auto_unimpose.py 时终端会弹出: ...
谷歌邮箱(Gmail)“自动清理30天前邮件”
1. 个人 Gmail 账号(最常见情况) Gmail 没有内置的完全自动按时间删除功能(无法设置“所有邮件满30天就自动删”)。过滤器主要对新邮件生效,时间搜索(如 older_than:30d)无法用于长期自动运行。 推荐实用方法: 手动批量清理(最简单): 在 Gmail 搜索框输入:older_than:30d(30天前)或 older_than:1m(1个月前)。 点击“全选” → “选择所有符合此搜索条件的对话” → 删除。 删除的邮件会进入已删除邮件(垃圾箱),30天后系统自动永久删除。 使用过滤器针对特定邮件(例如广告、订阅邮件): 设置过滤器时,在“有以下字词”中加入 older_than:30d,结合其他条件(如发件人)。 动作选择“删除邮件”。 注意:此方式对新邮件更有效,老邮件仍需手动触发。 高级自动方式:使用 Google Apps Script 编写脚本定时运行删除(免费,但需要一点设置)。 很多人用这个实现真正的“自动清理”。
Google 精准分流(WARP)总结文档
Google 精准分流(WARP)总结文档 适用于被 Google “送中”的 VPS,需要正常使用 Google 服务(尤其是 Antigravity CLI agy),同时不影响其他业务(如 x-ui 代理节点)。 1. 原理说明 Cloudflare WARP 把流量通过 Cloudflare 网络出口。 精准分流只把命中 Google 官方 IP 段(CIDR)的流量(IPv4/IPv6、TCP/UDP/QUIC)路由到 WARP,其他所有流量继续使用 VPS 原生 IP。 结果: Google 看到的是 Cloudflare 干净 IP,解除“送中”。 x-ui 面板、节点出站、其他业务完全不受影响。 资源占用极低(内存通常几十 MB,CPU 几乎可忽略)。 2. 适用环境 系统:Ubuntu 虚拟化:KVM(支持 TUN,完美兼容) 已安装:x-ui / 3x-ui(不冲突,脚本明确不改代理配置) 目标:正常使用 agy、Gemini、YouTube、Gmail 等 Google 服务 3. 推荐安装方式(已验证成功) 使用专门的 warp-vps-manager 脚本(Google 精准分流 + WireGuard 模式): # 以 root 执行 bash <(curl -fsSL https://raw.githubusercontent.com/mqfut123/warp-vps-manager/main/install.sh) 安装过程选择: ...
cc-connect + Claude Code Route
配置完成日期:2026-05-01 1. 架构总览 ┌──────────────┐ Telegram API ┌────────────────┐ │ Telegram 客户端│ ─────────────────> │ Telegram Bot │ │ (你的手机) │ @my_connect_bot └──────────────┘ └───────┬────────┘ │ WebSocket / Long polling ↓ ┌──────────────────────────┐ │ cc-connect (systemd守护) │ │ - 监听 Telegram 消息 │ │ - 调度 Claude Code 子进程 │ │ - allow_from 鉴权 │ └──────────────┬───────────┘ │ spawn: ccr code --verbose ... ↓ ┌──────────────────────────┐ │ ccr code (shim) │ │ - 强制覆盖 ANTHROPIC_* │ │ - 检测并自动拉起 ccr 服务 │ │ - exec claude │ └──────────────┬───────────┘ │ ANTHROPIC_BASE_URL=http://127.0.0.1:3456 ↓ ┌──────────────────────────┐ │ claude (Claude Code CLI) │ │ - stream-json 协议 │ └──────────────┬───────────┘ │ HTTP (anthropic 协议) ↓ ┌──────────────────────────┐ │ ccr 服务 (127.0.0.1:3456) │ │ - 协议转换 (anthropic→OpenAI) │ │ - 路由到上游 provider │ └──────────────┬───────────┘ │ ↓ ┌──────────────────────────┐ │ 上游 LLM provider │ │ (LongCat / GLM / Grok 等) │ └──────────────────────────┘ 每个组件的单一职责: ...
Ollama API 使用指南
📋 服务信息 配置项 值 服务地址 http://192.168.6.9:11434 API 基础路径 http://192.168.6.9:11434/v1 已安装模型 qwen2.5:0.5b (397 MB) API Key ollama(或任意字符串,Ollama 不验证) 🔌 OpenAI 兼容接口 Ollama 提供与 OpenAI API 完全兼容的接口,可直接使用支持 OpenAI 的客户端和工具。 可用端点 端点 说明 GET /v1/models 列出可用模型 POST /v1/chat/completions 聊天完成(推荐) POST /v1/completions 文本补全 POST /v1/embeddings 嵌入向量 🚀 API 调用示例 1. curl 命令行 列出模型 curl http://192.168.6.9:11434/v1/models 聊天请求 curl http://192.168.6.9:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:0.5b", "messages": [ {"role": "user", "content": "你好,请介绍一下自己"} ], "temperature": 0.7, "max_tokens": 512 }' 流式响应 curl http://192.168.6.9:11434/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "qwen2.5:0.5b", "messages": [{"role": "user", "content": "你好"}], "stream": true }' 2. Python (OpenAI SDK) from openai import OpenAI # 创建客户端 client = OpenAI( base_url="http://192.168.6.9:11434/v1", api_key="ollama" # 任意值即可 ) # 聊天请求 response = client.chat.completions.create( model="qwen2.5:0.5b", messages=[ {"role": "system", "content": "你是一个有帮助的助手"}, {"role": "user", "content": "你好,请介绍一下自己"} ], temperature=0.7, max_tokens=512 ) print(response.choices[0].message.content) 流式响应 from openai import OpenAI client = OpenAI( base_url="http://192.168.6.9:11434/v1", api_key="ollama" ) response = client.chat.completions.create( model="qwen2.5:0.5b", messages=[{"role": "user", "content": "你好"}], stream=True ) for chunk in response: if chunk.choices[0].delta.content: print(chunk.choices[0].delta.content, end="", flush=True) 安装依赖 pip install openai 3. JavaScript/TypeScript (Node.js) import OpenAI from "openai"; const client = new OpenAI({ baseURL: "http://192.168.6.9:11434/v1", apiKey: "ollama" }); const response = await client.chat.completions.create({ model: "qwen2.5:0.5b", messages: [{ role: "user", content: "你好" }], temperature: 0.7, max_tokens: 512 }); console.log(response.choices[0].message.content); 安装依赖 npm install openai 4. HTTP 请求参数说明 请求体参数 参数 类型 说明 默认值 model string 模型名称 必填 messages array 消息列表 必填 temperature float 温度 (0-2) 0.7 max_tokens int 最大输出 token 数 无限制 stream boolean 是否流式输出 false top_p float 核采样阈值 0.9 frequency_penalty float 频率惩罚 0 presence_penalty float 存在惩罚 0 消息格式 { "role": "user" | "assistant" | "system", "content": "消息内容" } 📱 常用客户端配置 ChatGPT-Next-Web / LobeChat / Cherry Studio 配置项 值 API 接口地址 http://192.168.6.9:11434/v1 API Key ollama 模型名称 qwen2.5:0.5b Open WebUI docker run -d -p 3000:8080 \ -e OLLAMA_BASE_URL=http://192.168.6.9:11434 \ --add-host=host.docker.internal:host-gateway \ --name open-webui \ --restart always \ openwebui/open-webui:main 🔧 服务管理命令 # 查看服务状态 sudo systemctl status ollama # 重启服务 sudo systemctl restart ollama # 查看日志 sudo journalctl -u ollama -f # 停止服务 sudo systemctl stop ollama # 启动服务 sudo systemctl start ollama 📦 Ollama 命令行工具 # 列出已安装模型 ollama list # 运行模型(交互式) ollama run qwen2.5:0.5b # 拉取新模型 ollama pull qwen2.5:1.5b # 删除模型 ollama rm qwen2.5:0.5b # 查看模型详情 ollama show qwen2.5:0.5b ⚙️ 配置文件位置 文件/目录 说明 /etc/systemd/system/ollama.service.d/override.conf Ollama 服务配置 /usr/share/ollama/.ollama/models/ 模型存储目录 当前服务环境变量 OLLAMA_HOST=0.0.0.0:11434 HTTP_PROXY=http://127.0.0.1:20171 HTTPS_PROXY=http://127.0.0.1:20171 NO_PROXY=127.0.0.1,localhost,::1,... 🔐 安全建议 局域网访问:当前配置允许局域网内所有设备访问 防火墙设置:如需限制访问,可配置防火墙规则 sudo ufw allow from 192.168.6.0/24 to any port 11434 生产环境:建议使用反向代理(如 Nginx)添加认证和 HTTPS 📊 性能说明 由于运行在 ARM64 Cortex-A53 设备上: ...
Hugo → WordPress 自动同步方案总结
一、目标 每次运行 Hugo 博客脚本发布新文章时,自动将该文章同步到 WordPress 作为备份。 二、整体流程 note.txt → 生成 MD 文件 → 复制到 Hugo content/posts ↓ Hugo 生成静态网站 (public / public2 / public3) ↓ Git push 到 GitHub / Git FTP 上传 ↓ WordPress 自动同步(新增模块) 三、核心原理 1. 同步入口 在 all_fpt_ok.py 脚本末尾追加 WordPress 同步模块,每次运行 Hugo 发布脚本时自动触发,无需额外操作。 2. 文件定位 每次只同步今天生成的一篇文章(YYYY-MM-DD.md),通过当前日期匹配文件名。 3. 解析 Frontmatter 读取 MD 文件开头的 frontmatter,提取: 字段 示例 用途 title "Debian 系统精簡" WordPress 文章标题 date 2025-12-12 WordPress 文章发布日期 4. Markdown → HTML 使用 Python 的 markdown 库将 MD 正文转为 HTML,支持: ...
Python/PHP 服务适配sv66容器
1. 方案目标 在 sv66(无 root、共享容器环境)上部署轻量 Python/PHP 服务,并通过 Cloudflare 反向代理/CDN 对外提供稳定访问。 核心链路: 用户 -> Cloudflare(反向代理/CDN/WAF) -> cloudflared 隧道 -> 127.0.0.1:本地服务端口 该方案不依赖公网高位端口直连,通常比直接开放端口更稳定。 2. 架构与端口规划 api.yourdomain.com -> Python 服务 127.0.0.1:18080 php.yourdomain.com -> PHP 服务 127.0.0.1:18081 cloudflared 以普通用户方式常驻运行(无需 root) 3. 部署 Python 轻服务(示例) mkdir -p ~/apps/py-api cat > ~/apps/py-api/server.py <<'PY' #!/usr/bin/env python3 # 简单健康检查接口 from http.server import BaseHTTPRequestHandler, HTTPServer class H(BaseHTTPRequestHandler): def do_GET(self): if self.path == "/health": body = b'{"ok":true,"service":"py-api"}' self.send_response(200) self.send_header("Content-Type", "application/json") self.send_header("Content-Length", str(len(body))) self.end_headers() self.wfile.write(body) else: self.send_response(404) self.end_headers() HTTPServer(("127.0.0.1", 18080), H).serve_forever() PY nohup python3 ~/apps/py-api/server.py > ~/apps/py-api/run.log 2>&1 & curl -sS http://127.0.0.1:18080/health 4. 部署 PHP 轻服务(示例) mkdir -p ~/apps/php-web/public cat > ~/apps/php-web/public/index.php <<'PHP' <?php header('Content-Type: application/json; charset=utf-8'); echo json_encode(['ok'=>true,'service'=>'php-web']); PHP nohup php -S 127.0.0.1:18081 -t ~/apps/php-web/public > ~/apps/php-web/run.log 2>&1 & curl -sS http://127.0.0.1:18081/ 5. 接入 Cloudflare Tunnel(推荐) 方式A(最快) 在 Cloudflare Zero Trust 后台创建 Tunnel,获取 token。 在 sv66 下载并运行 cloudflared(用户态): mkdir -p ~/bin ~/cloudflared cd ~/bin curl -L -o cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 chmod +x cloudflared nohup ~/bin/cloudflared tunnel --no-autoupdate run --token '你的TOKEN' > ~/cloudflared/run.log 2>&1 & 在 Cloudflare 后台给 Tunnel 绑定 Hostname: api.yourdomain.com -> http://127.0.0.1:18080 php.yourdomain.com -> http://127.0.0.1:18081 6. 保活(已验证 sv66 的 crontab 可用) 编辑 crontab: ...
supabase 免费版
官方规则: Supabase 免费版通常在 1 周(7 天) 没有任何活动后会将项目设为“暂停(Paused)”。 Supabase 的保活机制监测的是 API 活跃度。只要你的脚本向数据库发送了请求,并且数据库返回了响应(即便只是返回一个空数组或一行数据),系统就会判定你的项目处于“活跃”状态。 1. Supabase URL (项目地址) 这是最基础的。API Key 是钥匙,URL 就是门牌号。 位置: 就在 API Key 页面上方,或者 Settings -> API -> Project URL。 样子: https://xxxxxx.supabase.co 2. 对应的 SDK(“翻译官”) 你不能直接用嘴跟数据库说话,得用它的语言。Supabase 官方提供了非常好用的库: 如果你用 Python: 需要安装 supabase 库。 pip install supabase 如果你用 Node.js (Vercel/Armbian): 需要安装 @supabase/supabase-js。 npm install @supabase/supabase-js 3. 表名和字段名 (Table & Columns) 你需要知道你要操作哪张表,以及表里有哪些“格子”(列)。 比如你的保活脚本操作的是 keep_alive 表。 如果你要存用户,你得知道字段是叫 username 还是 user_name。 4. RLS 策略 (Row Level Security) —— 最容易踩坑的地方 这是 Supabase 的“保安”。即便你拿到了 anon 钥匙,如果没有配置 RLS,你的脚本依然读不到数据(返回空数组或报错)。 ...