feat(article): 添加AI编程爆发趋势深度分析文章
- 新增004号文章《AI 编程爆发:程序员不写代码的时代真的来了》 - 添加AI编程工具进化路径图表(diagram-01-evolution.mmd) - 添加2026年AI编程工具格局对比图(diagram-02-landscape.mmd) - 添加Vibe Coding工作流示意图(diagram-03-vibe-coding.mmd) - 添加AI工具使用率与职级关系图表(diagram-04-seniority.mmd) - 添加开发者能力模型转变对比图(diagram-05-skills.mmd) - 创建七牛云图片批量上传脚本(upload_qiniu_004.py)
This commit is contained in:
parent
d4b8a2f844
commit
62cda9f9a0
247
articles/004-AI 编程爆发:程序员不写代码的时代真的来了.md
Normal file
247
articles/004-AI 编程爆发:程序员不写代码的时代真的来了.md
Normal file
@ -0,0 +1,247 @@
|
|||||||
|
# AI 编程爆发:程序员不写代码的时代真的来了
|
||||||
|
|
||||||
|
> 发布日期:2026-03-16
|
||||||
|
> 分类:深度观点 / 行业趋势
|
||||||
|
> 作者:老邓唠AI
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## 引子:一个让我后背发凉的数据
|
||||||
|
|
||||||
|
最近 Pragmatic Engineer 发布了一份覆盖 906 名软件工程师的调研报告,里面有几个数据让我看完沉默了很久:
|
||||||
|
|
||||||
|
- **95%** 的开发者每周至少使用一次 AI 编程工具
|
||||||
|
- **75%** 的人用 AI 完成了至少一半的工程工作
|
||||||
|
- **56%** 的人说 AI 已经接管了他们 70% 以上的编码任务
|
||||||
|
|
||||||
|
你没看错——**超过一半的程序员,七成以上的代码不是自己写的了。**
|
||||||
|
|
||||||
|
Y Combinator 更夸张:最新一批入选的创业公司中,**25% 的公司报告其 95% 的代码由 AI 生成**。
|
||||||
|
|
||||||
|
这不是未来,这是现在。2026 年 3 月,此刻正在发生的事。
|
||||||
|
|
||||||
|
今天老邓不做工具评测,聊点更大的——AI 编程工具的爆发,到底在怎样改变"写代码"这件事?程序员这个职业,还存在吗?
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、爆发的全景:从补全到接管
|
||||||
|
|
||||||
|
### 1.1 三代进化
|
||||||
|
|
||||||
|
AI 编程工具不是突然爆发的,它经历了三代清晰的进化:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
| 阶段 | 时间 | 代表产品 | 核心能力 |
|
||||||
|
|------|------|---------|---------|
|
||||||
|
| **第一代:补全** | 2021-2023 | GitHub Copilot、Tabnine | 实时代码补全,逐行建议 |
|
||||||
|
| **第二代:AI 原生 IDE** | 2024-2025 | Cursor、Windsurf | 理解整个项目,多文件编辑 |
|
||||||
|
| **第三代:终端智能体** | 2025-2026 | Claude Code、Codex、Roo Code | 自主执行任务,读写文件,运行命令 |
|
||||||
|
|
||||||
|
第一代是"打字加速器"——你写一半,它猜后一半。
|
||||||
|
|
||||||
|
第二代是"结对编程伙伴"——它理解你的项目上下文,能跨文件重构。
|
||||||
|
|
||||||
|
第三代才是真正的质变——**它不再是工具,它是一个能独立干活的智能体。** 你用自然语言描述需求,它读代码、改代码、跑测试、修 bug,全程不需要你碰键盘。
|
||||||
|
|
||||||
|
### 1.2 2026 年的工具格局
|
||||||
|
|
||||||
|
现在的 AI 编程市场,已经打成了一片红海:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
| 阵营 | 代表 | 哲学 |
|
||||||
|
|------|------|------|
|
||||||
|
| **AI 原生 IDE** | Cursor(100 万+ 用户)、Windsurf | 把 AI 深度集成进编辑器的每个角落 |
|
||||||
|
| **终端智能体** | Claude Code(8 个月登顶 #1)、OpenAI Codex | 在终端里自主工作,不绑定任何 IDE |
|
||||||
|
| **开源插件** | Roo Code、Cline、Kilo Code | VS Code/JetBrains 插件,灵活选模型 |
|
||||||
|
| **平台内置** | GitHub Copilot(2000 万用户)、Amazon Q | 与现有开发工作流无缝集成 |
|
||||||
|
|
||||||
|
**一个惊人的变化:Claude Code 从 2025 年 5 月发布,仅用 8 个月就超越了 GitHub Copilot 和 Cursor,成为最受欢迎的 AI 编程工具。** 满意度排名中,Claude Code 以 46% 遥遥领先,Cursor 19%,GitHub Copilot 仅 9%。
|
||||||
|
|
||||||
|
这说明什么?开发者正在从"AI 辅助"走向"AI 主导"。终端智能体这种"全自主"模式,正在成为主流。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、开发方式的五大剧变
|
||||||
|
|
||||||
|
### 2.1 从"写代码"到"写需求"
|
||||||
|
|
||||||
|
传统开发:产品经理写需求文档 → 开发拆任务 → 逐行写代码 → 调试 → 提交
|
||||||
|
|
||||||
|
AI 时代:**用自然语言描述你想要什么 → AI 生成完整实现 → 你审查和调整**
|
||||||
|
|
||||||
|
这有个新名词——**Vibe Coding(氛围编程)**。Andrej Karpathy 在 2025 年初提出的概念,到 2026 年已经成为 Collins 词典年度词汇,MIT Technology Review 将"生成式编码"列入年度十大突破技术。
|
||||||
|
|
||||||
|
Vibe Coding 的核心理念是:**你负责方向和判断,AI 负责实现。**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
最炸裂的数据:**Vibe Coding 的使用者中,63% 不是程序员**——他们是设计师、产品经理、创业者,甚至文科生。
|
||||||
|
|
||||||
|
### 2.2 从"单打独斗"到"多工具协奏"
|
||||||
|
|
||||||
|
2026 年的开发者不再只用一个工具。调研显示:
|
||||||
|
|
||||||
|
- **70%** 的开发者同时使用 2-4 个 AI 工具
|
||||||
|
- **15%** 使用 5 个以上
|
||||||
|
|
||||||
|
一个典型的 2026 开发者工作流:
|
||||||
|
|
||||||
|
| 场景 | 工具选择 | 原因 |
|
||||||
|
|------|---------|------|
|
||||||
|
| 快速原型 | Cursor | 所见即所得,多文件编辑快 |
|
||||||
|
| 复杂重构 | Claude Code | 百万 token 上下文,理解整个仓库 |
|
||||||
|
| 代码审查 | GitHub Copilot | 与 PR 工作流天然集成 |
|
||||||
|
| 调试排查 | Roo Code / Cline | 开源灵活,可自定义 Agent 行为 |
|
||||||
|
|
||||||
|
**工具的选择不再是"哪个最好",而是"哪个最适合当前任务"。**
|
||||||
|
|
||||||
|
### 2.3 从"初级写代码"到"AI 写代码、人审代码"
|
||||||
|
|
||||||
|
以前的分工:初级工程师写代码,高级工程师审代码。
|
||||||
|
|
||||||
|
现在的分工:**AI 写代码,所有人审代码。**
|
||||||
|
|
||||||
|
Pragmatic Engineer 的调研发现了一个有趣的倒挂:**Staff+ 级别的资深工程师是 AI Agent 最重的用户**(63.5% 使用率),比初级工程师(49.7%)高了近 14 个百分点。
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
为什么?因为资深工程师**最知道什么是好代码**,他们能更高效地驾驭 AI,也能更准确地判断 AI 的输出是否靠谱。
|
||||||
|
|
||||||
|
这就引出了一个颠覆性的结论:**AI 时代最值钱的能力不是写代码,而是判断代码。**
|
||||||
|
|
||||||
|
### 2.4 从"人适应工具"到"工具适应人"
|
||||||
|
|
||||||
|
以前学编程:学语法 → 学框架 → 学 IDE 快捷键 → 用键盘写代码。
|
||||||
|
|
||||||
|
现在:**用你最自然的方式表达想法,工具来适应你。**
|
||||||
|
|
||||||
|
想用 IDE?Cursor。想用终端?Claude Code。想在浏览器里搞?Replit。想用手机?ChatGPT 也能生成代码。
|
||||||
|
|
||||||
|
甚至连交互方式都在分化:
|
||||||
|
|
||||||
|
| 交互方式 | 代表工具 | 适合人群 |
|
||||||
|
|---------|---------|---------|
|
||||||
|
| IDE 集成 | Cursor、Windsurf | 习惯 GUI 的开发者 |
|
||||||
|
| 终端 CLI | Claude Code、Codex | 追求效率的专业开发者 |
|
||||||
|
| 对话式 | ChatGPT、Claude.ai | 非技术人员、快速验证 |
|
||||||
|
| 低代码平台 | Bolt、Lovable、v0 | 设计师、产品经理 |
|
||||||
|
|
||||||
|
### 2.5 从"代码产出"到"规格驱动"
|
||||||
|
|
||||||
|
这是最深层的变化。
|
||||||
|
|
||||||
|
以前衡量开发者的标准是代码产出——写了多少行、提了多少 PR、解了多少 bug。
|
||||||
|
|
||||||
|
现在?AI 一天能生成人类一个月的代码量。**代码产出作为衡量标准已经失效了。**
|
||||||
|
|
||||||
|
新的核心能力变成了:
|
||||||
|
|
||||||
|
- **写清楚需求规格(Spec)**:你的 prompt 质量直接决定 AI 的输出质量
|
||||||
|
- **架构设计能力**:AI 能写函数,但不擅长做系统级的架构决策
|
||||||
|
- **审查和质控**:在 AI 生成的代码洪流中,快速判断什么能用、什么有坑
|
||||||
|
- **上下文工程**:如何组织和喂给 AI 最有效的上下文信息
|
||||||
|
|
||||||
|
InfoQ 的年度盘点直接用了一个惊悚的标题:**"Spec 正在蚕食人类编码"**。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、两个阵营的激烈碰撞
|
||||||
|
|
||||||
|
围绕"AI 会不会取代程序员",行业里形成了两个截然对立的阵营。
|
||||||
|
|
||||||
|
### 3.1 乐观派:蛋糕变大了
|
||||||
|
|
||||||
|
乐观派的核心论点:**AI 编程不是在抢程序员的饭碗,而是在做大整个蛋糕。**
|
||||||
|
|
||||||
|
论据:
|
||||||
|
- 以前因为"找不到程序员"或"开发成本太高"而胎死腹中的项目,现在都可以做了
|
||||||
|
- 非技术人员能做原型了,创业门槛大幅降低
|
||||||
|
- 美国劳工统计局数据:纯"Programmer"岗位下降 25%,但"Developer"、"系统架构"、"产品工程"岗位没怎么降
|
||||||
|
|
||||||
|
他们的结论是:**AI 会消灭"写代码"这个动作,但不会消灭"做软件"这件事。** 开发者会从"代码打字员"升级为"软件导演"。
|
||||||
|
|
||||||
|
### 3.2 警告派:洗牌已经开始
|
||||||
|
|
||||||
|
警告派也有硬核论据:
|
||||||
|
|
||||||
|
- 辛顿("AI 教父"):AI 将在 2026 年取代大量工作岗位
|
||||||
|
- 马斯克:"编程奇点就在 2026 年"
|
||||||
|
- Google 总监警告:"只会写 Prompt 的程序员,2026 年将被淘汰"
|
||||||
|
- Y Combinator:25% 的新创公司 95% 的代码由 AI 生成——**这些公司根本没招几个程序员**
|
||||||
|
|
||||||
|
他们的结论是:**中间层程序员受冲击最大。** 纯执行、不懂业务、不懂架构的"CRUD 工程师"正在被 AI 直接替代。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、老邓的观点
|
||||||
|
|
||||||
|
说说我自己的看法。
|
||||||
|
|
||||||
|
### "程序员"不会消失,但"写代码的人"会变少
|
||||||
|
|
||||||
|
这不是文字游戏。
|
||||||
|
|
||||||
|
AI 消灭的是"写代码"这个**机械劳动**,但"用软件解决问题"这个需求不但没减少,反而因为 AI 降低了门槛而爆炸式增长。
|
||||||
|
|
||||||
|
打个比方:**电梯发明后,"爬楼梯"这个动作少了,但盖楼反而更多了。** AI 编程就是软件行业的"电梯"。
|
||||||
|
|
||||||
|
### 最危险的人:会写代码但不会思考
|
||||||
|
|
||||||
|
你以为 AI 只淘汰不会写代码的人?错了。
|
||||||
|
|
||||||
|
**最危险的是那些"只会写代码"的人。**
|
||||||
|
|
||||||
|
他们能用 Python 写个脚本,能用 React 撸个页面,但你问他为什么要这样设计、有没有更好的方案、这个架构三个月后会不会崩——他说不上来。
|
||||||
|
|
||||||
|
这样的人,AI 可以 100% 替代。
|
||||||
|
|
||||||
|
### 未来程序员的四个必备能力
|
||||||
|
|
||||||
|
我认为 2026-2028 年,有竞争力的开发者需要:
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
**1. 需求翻译力** — 把模糊的业务需求翻译成 AI 能理解的精确规格。这不是写 prompt 那么简单,而是一种系统性的需求工程能力。
|
||||||
|
|
||||||
|
**2. 架构判断力** — AI 能写函数,但不擅长做系统级决策。选什么数据库、怎么拆微服务、性能瓶颈在哪——这些需要经验和判断力。
|
||||||
|
|
||||||
|
**3. 质量审计力** — AI 生成的代码可能有安全漏洞、性能问题、逻辑边界错误。能快速发现这些问题的人,就是 AI 时代的"质检官"。
|
||||||
|
|
||||||
|
**4. AI 驾驭力** — 知道什么时候用 Cursor、什么时候切 Claude Code、什么时候该手写。就像赛车手知道什么时候踩油门、什么时候踩刹车。
|
||||||
|
|
||||||
|
### 给不同人群的建议
|
||||||
|
|
||||||
|
**给初级开发者:** 不要停止学习底层原理。AI 能帮你写代码,但如果你不懂代码背后的逻辑,你就无法判断 AI 写的对不对。**先成为一个好的代码审查者,再成为一个好的 AI 驾驭者。**
|
||||||
|
|
||||||
|
**给资深开发者:** 恭喜你,你的经验和判断力在 AI 时代反而更值钱了。拥抱 Agent 工具,让 AI 处理你以前不愿意做的琐碎工作,把精力放在架构和设计上。
|
||||||
|
|
||||||
|
**给非技术人群:** 这是你们的黄金时代。Vibe Coding 让你无需学编程就能把想法变成产品。但记住,**做出来只是第一步,做好才是关键**——产品思维和业务理解比写代码更重要。
|
||||||
|
|
||||||
|
**给团队管理者:** 不要再用代码行数衡量开发者了。新的 KPI 应该是:需求完成速度、架构设计质量、系统稳定性。**你需要的不是更多写代码的人,而是更强的"软件导演"。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、尾声:代码不死,只是换了个写法
|
||||||
|
|
||||||
|
2026 年的 AI 编程革命,本质上是一次**生产力的重新分配**。
|
||||||
|
|
||||||
|
代码不会消失——软件的世界只会越来越大。但谁来写代码、怎么写代码、写代码意味着什么——这些都在被重新定义。
|
||||||
|
|
||||||
|
90% 的代码由 AI 生成不可怕,可怕的是你还在用 2020 年的方式工作。
|
||||||
|
|
||||||
|
**工具在进化,你呢?**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 参考资料
|
||||||
|
|
||||||
|
- [AI Tooling for Software Engineers in 2026 | Pragmatic Engineer](https://newsletter.pragmaticengineer.com/p/ai-tooling-2026)
|
||||||
|
- [Developer Survey 2026: AI Coding Tool Adoption Hits 73%](https://claude5.ai/news/developer-survey-2026-ai-coding-73-percent-daily)
|
||||||
|
- [Cursor vs Windsurf vs Claude Code in 2026 | DEV Community](https://dev.to/pockit_tools/cursor-vs-windsurf-vs-claude-code-in-2026-the-honest-comparison-after-using-all-three-3gof)
|
||||||
|
- [Vibe Coding:AI 驱动的编程新范式](https://blog.ccino.org/p/vibe-coding-ai-paradigm-2025-2026/)
|
||||||
|
- [2026年AI编程工具全景测评 | 知乎](https://zhuanlan.zhihu.com/p/1999804779141030200)
|
||||||
|
- [2026年必藏的3款顶尖AI编程开源工具 | CSDN](https://aicoding.csdn.net/69676dacea53844658f6c9ba.html)
|
||||||
|
- [AI 时代需要更多新型程序员 | 知乎](https://zhuanlan.zhihu.com/p/1996205110490071089)
|
||||||
|
- [Spec 正在蚕食人类编码 | InfoQ](https://www.infoq.cn/article/5lxt9ibO77f3HKbITN5s)
|
||||||
BIN
articles/004/cover.png
Normal file
BIN
articles/004/cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 796 KiB |
23
articles/004/diagram-01-evolution.mmd
Normal file
23
articles/004/diagram-01-evolution.mmd
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
graph LR
|
||||||
|
subgraph 第一代["第一代:代码补全(2021-2023)"]
|
||||||
|
A1["GitHub Copilot"]
|
||||||
|
A2["Tabnine"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph 第二代["第二代:AI 原生 IDE(2024-2025)"]
|
||||||
|
B1["Cursor"]
|
||||||
|
B2["Windsurf"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph 第三代["第三代:终端智能体(2025-2026)"]
|
||||||
|
C1["Claude Code"]
|
||||||
|
C2["OpenAI Codex"]
|
||||||
|
C3["Roo Code"]
|
||||||
|
end
|
||||||
|
|
||||||
|
第一代 -->|"从补全到理解"| 第二代
|
||||||
|
第二代 -->|"从辅助到自主"| 第三代
|
||||||
|
|
||||||
|
style 第一代 fill:#0d2137,stroke:#94A3B8,color:#e0f7fa
|
||||||
|
style 第二代 fill:#0d2137,stroke:#F59E0B,color:#e0f7fa
|
||||||
|
style 第三代 fill:#0d2137,stroke:#10B981,color:#e0f7fa
|
||||||
BIN
articles/004/diagram-01-evolution.png
Normal file
BIN
articles/004/diagram-01-evolution.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 100 KiB |
26
articles/004/diagram-02-landscape.mmd
Normal file
26
articles/004/diagram-02-landscape.mmd
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
graph TB
|
||||||
|
subgraph IDE["AI 原生 IDE"]
|
||||||
|
I1["Cursor<br/>100万+ 用户"]
|
||||||
|
I2["Windsurf<br/>$15/月"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph Agent["终端智能体"]
|
||||||
|
A1["Claude Code<br/>满意度 #1 (46%)"]
|
||||||
|
A2["OpenAI Codex"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph Open["开源插件"]
|
||||||
|
O1["Roo Code"]
|
||||||
|
O2["Cline"]
|
||||||
|
O3["Kilo Code"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph Platform["平台内置"]
|
||||||
|
P1["GitHub Copilot<br/>2000万用户"]
|
||||||
|
P2["Amazon Q"]
|
||||||
|
end
|
||||||
|
|
||||||
|
style IDE fill:#0d2137,stroke:#22D3EE,color:#e0f7fa
|
||||||
|
style Agent fill:#0d2137,stroke:#10B981,color:#e0f7fa
|
||||||
|
style Open fill:#0d2137,stroke:#F59E0B,color:#e0f7fa
|
||||||
|
style Platform fill:#0d2137,stroke:#818CF8,color:#e0f7fa
|
||||||
BIN
articles/004/diagram-02-landscape.png
Normal file
BIN
articles/004/diagram-02-landscape.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 147 KiB |
10
articles/004/diagram-03-vibe-coding.mmd
Normal file
10
articles/004/diagram-03-vibe-coding.mmd
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
graph LR
|
||||||
|
A["💡 用自然语言<br/>描述需求"] --> B["🤖 AI 生成<br/>完整代码"]
|
||||||
|
B --> C["👀 人工审查<br/>调整方向"]
|
||||||
|
C --> D["✅ 测试验证<br/>交付上线"]
|
||||||
|
D -.->|"新需求"| A
|
||||||
|
|
||||||
|
style A fill:#0d3b66,stroke:#00e5ff,color:#e0f7fa
|
||||||
|
style B fill:#10a37f,stroke:#fff,color:#fff
|
||||||
|
style C fill:#F59E0B,stroke:#fff,color:#fff
|
||||||
|
style D fill:#4caf50,stroke:#fff,color:#fff
|
||||||
BIN
articles/004/diagram-03-vibe-coding.png
Normal file
BIN
articles/004/diagram-03-vibe-coding.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 68 KiB |
5
articles/004/diagram-04-seniority.mmd
Normal file
5
articles/004/diagram-04-seniority.mmd
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
xychart-beta
|
||||||
|
title "AI Agent 使用率 vs 职级"
|
||||||
|
x-axis ["初级工程师", "中级工程师", "高级工程师", "Staff+"]
|
||||||
|
y-axis "Agent 使用率 (%)" 0 --> 80
|
||||||
|
bar [49.7, 52.3, 58.1, 63.5]
|
||||||
BIN
articles/004/diagram-04-seniority.png
Normal file
BIN
articles/004/diagram-04-seniority.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 17 KiB |
19
articles/004/diagram-05-skills.mmd
Normal file
19
articles/004/diagram-05-skills.mmd
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
graph TB
|
||||||
|
subgraph 过去["❌ 过去:代码能力为王"]
|
||||||
|
P1["语法精通"]
|
||||||
|
P2["框架熟练"]
|
||||||
|
P3["手写代码速度"]
|
||||||
|
P4["代码行数产出"]
|
||||||
|
end
|
||||||
|
|
||||||
|
subgraph 未来["✅ 未来:判断能力为王"]
|
||||||
|
F1["需求翻译力<br/>模糊需求 → 精确规格"]
|
||||||
|
F2["架构判断力<br/>系统设计 · 技术选型"]
|
||||||
|
F3["质量审计力<br/>安全 · 性能 · 边界"]
|
||||||
|
F4["AI 驾驭力<br/>选对工具 · 高效协作"]
|
||||||
|
end
|
||||||
|
|
||||||
|
过去 -->|"能力模型转变"| 未来
|
||||||
|
|
||||||
|
style 过去 fill:#0d2137,stroke:#c62828,color:#e0f7fa
|
||||||
|
style 未来 fill:#0d2137,stroke:#10B981,color:#e0f7fa
|
||||||
BIN
articles/004/diagram-05-skills.png
Normal file
BIN
articles/004/diagram-05-skills.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 161 KiB |
63
scripts/upload_qiniu_004.py
Normal file
63
scripts/upload_qiniu_004.py
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
"""上传文章 004 的所有图片到七牛云 OSS"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
import glob
|
||||||
|
from qiniu import Auth, put_file, CdnManager
|
||||||
|
|
||||||
|
ACCESS_KEY = 't1PIPGcvBY9lJVXFZFb48maTQsGGhvLsR5QQlNq0'
|
||||||
|
SECRET_KEY = 'KGooFdF5eCLdCIMCOD6x5ofMzu4vYE17T5Mvp9qC'
|
||||||
|
BUCKET_NAME = 'union-saas'
|
||||||
|
CDN_DOMAIN = 'https://cdn.union.jxyunge.com'
|
||||||
|
UPLOAD_PREFIX = 'self-media/004/'
|
||||||
|
|
||||||
|
|
||||||
|
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', '004')
|
||||||
|
|
||||||
|
# 收集所有 PNG 图片文件
|
||||||
|
files = sorted(glob.glob(os.path.join(img_dir, '*.png')))
|
||||||
|
|
||||||
|
urls = []
|
||||||
|
results = {}
|
||||||
|
for f in files:
|
||||||
|
name = os.path.basename(f)
|
||||||
|
key = UPLOAD_PREFIX + name
|
||||||
|
url = upload_file(f, key)
|
||||||
|
if url:
|
||||||
|
results[name] = url
|
||||||
|
urls.append(url)
|
||||||
|
|
||||||
|
print(f'\n===== 上传完成: {len(results)}/{len(files)} =====')
|
||||||
|
for name, url in results.items():
|
||||||
|
print(f'{name}: {url}')
|
||||||
|
|
||||||
|
# 刷新 CDN 缓存
|
||||||
|
if urls:
|
||||||
|
print('\n刷新 CDN 缓存...')
|
||||||
|
q = Auth(ACCESS_KEY, SECRET_KEY)
|
||||||
|
cdn = CdnManager(q)
|
||||||
|
ret, info = cdn.refresh_urls(urls)
|
||||||
|
if info.status_code == 200:
|
||||||
|
print('CDN 缓存刷新成功')
|
||||||
|
else:
|
||||||
|
print(f'CDN 刷新失败: {info}')
|
||||||
|
|
||||||
|
return results
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
Loading…
Reference in New Issue
Block a user