feat(article): 更新文章内容并集成CDN图片上传功能
- 将文章中的本地图片路径替换为CDN链接 - 修改文章引子部分,更新案例描述和内容细节 - 添加即梦AI图片生成命令配置文件 - 添加七牛云OSS上传命令配置文件和上传脚本 - 创建七牛云存储凭证文档 - 更新OpenClaw相关内容和图片引用链接
This commit is contained in:
parent
95e1129fd2
commit
fdf5cc278f
54
.claude/commands/generate-image.md
Normal file
54
.claude/commands/generate-image.md
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
# 即梦 AI 图片生成
|
||||||
|
|
||||||
|
使用即梦 AI(火山引擎)生成图片。
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
用户会提供:
|
||||||
|
1. **prompt**:图片描述(中文)
|
||||||
|
2. **output_path**:输出路径(可选,默认保存到当前工作目录)
|
||||||
|
|
||||||
|
## 执行步骤
|
||||||
|
|
||||||
|
1. 激活项目虚拟环境:`source .venv/bin/activate`
|
||||||
|
2. 调用 `scripts/jimeng_gen.py` 生成图片
|
||||||
|
3. 即梦 API 仅支持 **1024x1024** 正方形尺寸
|
||||||
|
4. 如果用户需要 16:9 比例,先生成 1024x1024,再用 Pillow 居中裁剪为 1024x576
|
||||||
|
5. 展示生成的图片给用户
|
||||||
|
|
||||||
|
## 调用示例
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source .venv/bin/activate && python scripts/jimeng_gen.py "图片描述prompt" "输出路径.png"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 16:9 裁剪(如需要)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source .venv/bin/activate && python -c "
|
||||||
|
from PIL import Image
|
||||||
|
img = Image.open('输出路径.png')
|
||||||
|
w, h = img.size
|
||||||
|
new_h = int(w * 9 / 16)
|
||||||
|
top = (h - new_h) // 2
|
||||||
|
img.crop((0, top, w, top + new_h)).save('输出路径.png')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 即梦 API **仅支持 1024x1024**,其他尺寸会提交成功但生成失败
|
||||||
|
- 需要非正方形图片时,先生成方形再裁剪
|
||||||
|
- 提交后需要轮询等待结果,通常 5-10 秒完成
|
||||||
|
- 脚本位于 `scripts/jimeng_gen.py`,密钥已内置
|
||||||
|
- 虚拟环境位于 `.venv/`,已安装 `requests` 和 `Pillow`
|
||||||
|
|
||||||
|
## API 凭证(已内置于脚本)
|
||||||
|
|
||||||
|
- Endpoint: `https://visual.volcengineapi.com`
|
||||||
|
- Region: `cn-north-1`
|
||||||
|
- Service: `cv`
|
||||||
|
- 模型: `jimeng_t2i_v40`(即梦图片生成 4.0)
|
||||||
|
- 签名: HMAC-SHA256 V4
|
||||||
|
|
||||||
|
$ARGUMENTS
|
||||||
99
.claude/commands/upload-qiniu.md
Normal file
99
.claude/commands/upload-qiniu.md
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
# 七牛云 OSS 上传
|
||||||
|
|
||||||
|
将本地文件上传到七牛云 CDN 存储。
|
||||||
|
|
||||||
|
## 使用方式
|
||||||
|
|
||||||
|
用户会提供:
|
||||||
|
1. **file_path**:要上传的本地文件路径(支持单个文件或目录)
|
||||||
|
2. **prefix**:OSS 存储路径前缀(可选,默认 `self-media/`)
|
||||||
|
|
||||||
|
## 执行步骤
|
||||||
|
|
||||||
|
1. 激活项目虚拟环境:`source .venv/bin/activate`
|
||||||
|
2. 使用七牛 Python SDK 上传文件
|
||||||
|
3. 返回 CDN 访问链接
|
||||||
|
|
||||||
|
## 单文件上传
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source .venv/bin/activate && python -c "
|
||||||
|
from qiniu import Auth, put_file
|
||||||
|
import os
|
||||||
|
|
||||||
|
AK = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0'
|
||||||
|
SK = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC'
|
||||||
|
BUCKET = 'union-saas'
|
||||||
|
CDN = 'https://cdn.union.jxyunge.com'
|
||||||
|
|
||||||
|
local_path = '本地文件路径'
|
||||||
|
key = 'self-media/远程存储路径'
|
||||||
|
|
||||||
|
q = Auth(AK, SK)
|
||||||
|
token = q.upload_token(BUCKET, key, 3600)
|
||||||
|
ret, info = put_file(token, key, local_path, version='v2')
|
||||||
|
|
||||||
|
if info.status_code == 200:
|
||||||
|
print(f'上传成功: {CDN}/{key}')
|
||||||
|
else:
|
||||||
|
print(f'上传失败: {info}')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 批量上传目录
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source .venv/bin/activate && python scripts/upload_qiniu.py
|
||||||
|
```
|
||||||
|
|
||||||
|
脚本 `scripts/upload_qiniu.py` 会上传 `articles/001/images/` 下所有 PNG 文件。
|
||||||
|
|
||||||
|
## 自定义批量上传
|
||||||
|
|
||||||
|
```bash
|
||||||
|
source .venv/bin/activate && python -c "
|
||||||
|
from qiniu import Auth, put_file
|
||||||
|
import os, glob
|
||||||
|
|
||||||
|
AK = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0'
|
||||||
|
SK = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC'
|
||||||
|
BUCKET = 'union-saas'
|
||||||
|
CDN = 'https://cdn.union.jxyunge.com'
|
||||||
|
|
||||||
|
local_dir = '本地目录路径'
|
||||||
|
prefix = 'self-media/自定义前缀/'
|
||||||
|
|
||||||
|
q = Auth(AK, SK)
|
||||||
|
for f in sorted(glob.glob(os.path.join(local_dir, '*'))):
|
||||||
|
name = os.path.basename(f)
|
||||||
|
key = prefix + name
|
||||||
|
token = q.upload_token(BUCKET, key, 3600)
|
||||||
|
ret, info = put_file(token, key, f, version='v2')
|
||||||
|
status = '成功' if info.status_code == 200 else '失败'
|
||||||
|
print(f'[{status}] {name} -> {CDN}/{key}')
|
||||||
|
"
|
||||||
|
```
|
||||||
|
|
||||||
|
## 在 Markdown 中替换图片链接
|
||||||
|
|
||||||
|
上传后,将文章中的本地图片路径替换为 CDN 链接:
|
||||||
|
- 本地路径格式:``
|
||||||
|
- CDN 链接格式:``
|
||||||
|
|
||||||
|
## 七牛凭证
|
||||||
|
|
||||||
|
| 配置项 | 值 |
|
||||||
|
|--------|------|
|
||||||
|
| 上传地址 | `https://up-z0.qiniup.com` |
|
||||||
|
| AK | `t1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0` |
|
||||||
|
| SK | `KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC` |
|
||||||
|
| CDN 域名 | `https://cdn.union.jxyunge.com` |
|
||||||
|
| 空间名 | `union-saas` |
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
- 虚拟环境 `.venv/` 已安装 `qiniu` SDK
|
||||||
|
- 上传同名文件会覆盖
|
||||||
|
- CDN 链接格式:`https://cdn.union.jxyunge.com/{key}`
|
||||||
|
|
||||||
|
$ARGUMENTS
|
||||||
@ -4,19 +4,21 @@
|
|||||||
> 分类:技术解读 / 科普
|
> 分类:技术解读 / 科普
|
||||||
> 作者:老邓唠AI
|
> 作者:老邓唠AI
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## 引子:一觉醒来,AI 帮我省了 4200 美元
|
## 引子:律所用它打官司,淘宝店主用它盯竞品
|
||||||
|
|
||||||
2026 年 2 月的一个清晨,软件工程师 AJ Stuyvenberg 醒来后发现,他的 AI 助手在他睡觉的 8 个小时里,自动与三家汽车经销商进行了多轮邮件砍价,为他想买的 2026 款现代汽车谈下了 **4200 美元的折扣**。
|
2026 年 2 月,上海某律所合伙人张律师做了一个大胆的实验:他让一只"龙虾"接管了自己的工作流。
|
||||||
|
|
||||||
他甚至没有下达过具体指令。
|
这只龙虾每天自动抓取裁判文书网的最新判例,分析对手律所过去三年的胜率数据,甚至能模拟庭审对抗——把对方律师可能的论点逐条拆解,提前准备反驳策略。**以前助理团队要干两周的案件调研,龙虾一个晚上就跑完了。**
|
||||||
|
|
||||||
这个 AI 助手的名字叫 **OpenClaw**——一只龙虾。
|
这只龙虾的名字叫 **OpenClaw**。
|
||||||
|
|
||||||
而更疯狂的是:另一位用户 Hormold 的龙虾,在没有明确授权的情况下,自己翻阅了一封保险拒赔邮件,引用保单条款撰写法律驳回函,迫使保险公司重新启动调查。
|
而在杭州,一位淘宝店主让龙虾同时监控拼多多、京东、抖音三个平台的竞品价格,**实时自动调整自己的定价策略**——竞品降了 5 块,龙虾 10 秒内就把自己的价格跟上,还顺手改了详情页的促销文案。另一位闲鱼买家更绝:让龙虾同时跟 **8 个卖家砍价**,最终以低于心理价位 30% 的价格拿下了一台二手 MacBook。
|
||||||
|
|
||||||
**这不是科幻。这是 2026 年正在发生的事。**
|
**他们甚至不需要盯着屏幕。龙虾在后台 24 小时自己干活。**
|
||||||
|
|
||||||
|
这不是科幻。这是 2026 年正在发生的事。
|
||||||
|
|
||||||
今天,老邓带你深入拆解这只龙虾,以及围绕它诞生的 12 个"兄弟"——从 4000 行代码的极简龙虾,到 10 块钱开发板上的嵌入式龙虾,再到中国大厂的国产龙虾军团。
|
今天,老邓带你深入拆解这只龙虾,以及围绕它诞生的 12 个"兄弟"——从 4000 行代码的极简龙虾,到 10 块钱开发板上的嵌入式龙虾,再到中国大厂的国产龙虾军团。
|
||||||
|
|
||||||
@ -24,7 +26,7 @@
|
|||||||
|
|
||||||
## 一、OpenClaw:那只改变游戏规则的龙虾
|
## 一、OpenClaw:那只改变游戏规则的龙虾
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 它不是聊天机器人,是"数字员工"
|
### 它不是聊天机器人,是"数字员工"
|
||||||
|
|
||||||
@ -116,7 +118,7 @@ OpenClaw 的问题催生了反思,反思催生了一批"兄弟"——它们要
|
|||||||
|
|
||||||
### 3.1 Nanobot —— 4000 行代码的极简龙虾
|
### 3.1 Nanobot —— 4000 行代码的极简龙虾
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
| 维度 | 详情 |
|
| 维度 | 详情 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@ -131,7 +133,7 @@ OpenClaw 的问题催生了反思,反思催生了一批"兄弟"——它们要
|
|||||||
|
|
||||||
### 3.2 PicoClaw —— 10 美元开发板上的龙虾
|
### 3.2 PicoClaw —— 10 美元开发板上的龙虾
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
| 维度 | 详情 |
|
| 维度 | 详情 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@ -144,7 +146,7 @@ OpenClaw 的问题催生了反思,反思催生了一批"兄弟"——它们要
|
|||||||
|
|
||||||
### 3.3 ZeroClaw —— Rust 写的安全堡垒
|
### 3.3 ZeroClaw —— Rust 写的安全堡垒
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
| 维度 | 详情 |
|
| 维度 | 详情 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@ -160,7 +162,7 @@ OpenClaw 的安全是"门上加锁",ZeroClaw 是"用钢筋混凝土重建房
|
|||||||
|
|
||||||
### 3.5 memU —— 知识图谱记忆龙虾
|
### 3.5 memU —— 知识图谱记忆龙虾
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
| 维度 | 详情 |
|
| 维度 | 详情 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@ -178,11 +180,11 @@ OpenClaw 的记忆是平铺式日志,memU 把记忆做成知识图谱——自
|
|||||||
|
|
||||||
## 四、龙虾全家桶:中国大厂篇
|
## 四、龙虾全家桶:中国大厂篇
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 4.1 LobsterAI —— 网易有道
|
### 4.1 LobsterAI —— 网易有道
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
名字就叫"龙虾 AI",国内最接近 OpenClaw 的产品。两个杀手锏:
|
名字就叫"龙虾 AI",国内最接近 OpenClaw 的产品。两个杀手锏:
|
||||||
- **有 GUI 图形界面**:OpenClaw 纯命令行,小白用不来;LobsterAI 降低了门槛
|
- **有 GUI 图形界面**:OpenClaw 纯命令行,小白用不来;LobsterAI 降低了门槛
|
||||||
@ -192,7 +194,7 @@ OpenClaw 的记忆是平铺式日志,memU 把记忆做成知识图谱——自
|
|||||||
|
|
||||||
### 4.2 HiClaw —— 阿里 Higress
|
### 4.2 HiClaw —— 阿里 Higress
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
HiClaw 是目前**安全架构最先进**的方案。核心设计:
|
HiClaw 是目前**安全架构最先进**的方案。核心设计:
|
||||||
|
|
||||||
@ -238,7 +240,7 @@ HiClaw 是目前**安全架构最先进**的方案。核心设计:
|
|||||||
|
|
||||||
### 选龙虾决策树
|
### 选龙虾决策树
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
**按你是谁来选:**
|
**按你是谁来选:**
|
||||||
- **小白用户** → **Nanobot**,4000 行代码读懂 Agent 是怎么回事
|
- **小白用户** → **Nanobot**,4000 行代码读懂 Agent 是怎么回事
|
||||||
@ -258,7 +260,7 @@ HiClaw 是目前**安全架构最先进**的方案。核心设计:
|
|||||||
|
|
||||||
## 六、安全避坑指南:养龙虾的 5 条铁律
|
## 六、安全避坑指南:养龙虾的 5 条铁律
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
经过上面的分析,你应该已经明白:**龙虾越强大,风险越大。** 以下是养龙虾的 5 条铁律:
|
经过上面的分析,你应该已经明白:**龙虾越强大,风险越大。** 以下是养龙虾的 5 条铁律:
|
||||||
|
|
||||||
|
|||||||
6
passport/七牛.md
Normal file
6
passport/七牛.md
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
七牛上传地址 https://up-z0.qiniup.com
|
||||||
|
七牛云存储AK t1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0
|
||||||
|
七牛云存储SK KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC
|
||||||
|
七牛云存储地址 https://cdn.union.jxyunge.com
|
||||||
|
七牛云存储空间名 union-saas
|
||||||
|
|
||||||
48
scripts/upload_qiniu.py
Normal file
48
scripts/upload_qiniu.py
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
"""上传图片到七牛云 OSS"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
from qiniu import Auth, put_file
|
||||||
|
|
||||||
|
ACCESS_KEY = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0'
|
||||||
|
SECRET_KEY = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC'
|
||||||
|
BUCKET_NAME = 'union-saas'
|
||||||
|
CDN_DOMAIN = 'https://cdn.union.jxyunge.com'
|
||||||
|
UPLOAD_PREFIX = 'self-media/001/'
|
||||||
|
|
||||||
|
|
||||||
|
def upload_file(local_path, key):
|
||||||
|
"""上传单个文件到七牛"""
|
||||||
|
q = Auth(ACCESS_KEY, SECRET_KEY)
|
||||||
|
token = q.upload_token(BUCKET_NAME, key, 3600)
|
||||||
|
ret, info = put_file(token, key, local_path, version='v2')
|
||||||
|
if info.status_code == 200:
|
||||||
|
url = f'{CDN_DOMAIN}/{key}'
|
||||||
|
print(f' OK {os.path.basename(local_path)} -> {url}')
|
||||||
|
return url
|
||||||
|
else:
|
||||||
|
print(f' FAIL {os.path.basename(local_path)}: {info}')
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
img_dir = os.path.join(os.path.dirname(__file__), '..', 'articles', '001', 'images')
|
||||||
|
files = sorted(glob.glob(os.path.join(img_dir, '*.png')))
|
||||||
|
|
||||||
|
results = {}
|
||||||
|
for f in files:
|
||||||
|
name = os.path.basename(f)
|
||||||
|
key = UPLOAD_PREFIX + name
|
||||||
|
url = upload_file(f, key)
|
||||||
|
if url:
|
||||||
|
results[name] = url
|
||||||
|
|
||||||
|
print(f'\n===== 上传完成: {len(results)}/{len(files)} =====')
|
||||||
|
for name, url in results.items():
|
||||||
|
print(f'{name}: {url}')
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Loading…
Reference in New Issue
Block a user