# 我用 PHP + DeepSeek 做了一个标题打分工具，从零到上线

> 一个输入框，一个 AI，15 分钟做出能用的标题分析器。

---

我做了一个免费的在线工具——**标题打分器**，输入文章标题，DeepSeek AI 自动从吸引力、点击率预判、情绪张力、关键词精准度、传播性五个维度打分，并给出优化建议。纯浏览器端运行，不需要注册。

地址：https://zeku.cn/tools/title-scorer/

这篇文章写的是**从零到上线的完整过程**。技术栈：PHP + DeepSeek API + 纯前端 JS，不用框架。

---

## 为什么做这个

我写公众号，起标题是日常痛点。市面上有标题打分工具，但要么收费，要么要注册。我想要一个**输入即用、免费、纯粹**的工具。

技术选型时在 OpenAI 和 DeepSeek 之间选了 DeepSeek，两个理由：

1. **便宜**——DeepSeek 百万 token 1 块钱，OpenAI 同等质量贵 10 倍以上
2. **中文强**——标题分析涉及中文情绪词、传播性判断，DeepSeek 的表现比 GPT-4 更接地气

---

## 项目结构

```
tools/title-scorer/
├── index.php    # 前端页面
└── proxy.php    # API 代理
```

两个文件，一共 180 行代码。

### 为什么需要 proxy.php

浏览器直接调 DeepSeek API 会暴露 API Key。用一个 PHP 代理，Key 放在服务器端 `.env` 里，前端只跟自己的代理通信。

这是个人工具站最常用的架构模式——前端负责交互，PHP 做一层薄薄的代理转发。不用框架，不用数据库，一个 `file_get_contents` 搞定。

---

## 核心代码逐行拆解

### 前端（index.php）

前端就是一个 textarea + 一个按钮。用户输入标题，fetch 到 proxy，拿到结果后渲染。

```javascript
fetch('/tools/title-scorer/proxy.php', {
    method: 'POST',
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
    body: 'title=' + encodeURIComponent(title)
})
```

`Content-Type` 用 `application/x-www-form-urlencoded` 而不是 JSON，因为 PHP 的 `$_POST` 只认这个格式。一行代码省掉 JSON 解析。

结果的渲染逻辑是动态生成 HTML——总分用大字显示（≥80 绿色，60-79 黄色，<60 红色），五个维度用进度条展示，优缺点和建议用三个不同颜色的卡片区分。全部用 CSS 变量，自动适配暗色主题。

### 代理（proxy.php）

核心就三件事：读 Key、拼 Prompt、转发请求。

```php
// 1. 读 API Key
$env = parse_ini_file(__DIR__ . '/../../.env', false, INI_SCANNER_RAW);
$apiKey = $env['DEEPSEEK_API_KEY'] ?? '';

// 2. 拼 Prompt
$prompt = "你是一个专业的自媒体标题分析师...
标题：「{$title}」
请严格按 JSON 格式返回...";

// 3. 调 DeepSeek
file_get_contents('https://api.deepseek.com/v1/chat/completions', false, $ctx);
```

DeepSeek 的 API 地址是 `https://api.deepseek.com/v1/chat/completions`，接口格式和 OpenAI 兼容。如果你之前用过 OpenAI SDK，直接改 `base_url` 就行。

请求体：

```php
$payload = json_encode([
    'model' => 'deepseek-chat',
    'messages' => [
        ['role' => 'system', 'content' => '只返回 JSON，不返回其他'],
        ['role' => 'user', 'content' => $prompt]
    ],
    'temperature' => 0.3,  // 低温度，输出更稳定
    'max_tokens' => 800
]);
```

---

## 踩坑记录

### 坑 1：DeepSeek 返回了 Markdown

Prompt 里明确说了「只返回 JSON」，但 DeepSeek 偶尔还是会在 JSON 外包 ` ```json ``` `。解决方案是两行正则清理：

```php
$content = preg_replace('/^```(?:json)?\s*/i', '', $content);
$content = preg_replace('/\s*```$/i', '', $content);
```

### 坑 2：中文 JSON 解析

标题里如果有双引号、反斜杠等特殊字符，直接拼到 JSON 里会炸。Prompt 里用花括号`「{$title}」`包裹而不是双引号，避免注入问题。

### 坑 3：timeout 设置

默认 `file_get_contents` 超时 60 秒，但 DeepSeek 有时候思考时间较长。设置 30 秒足够了——如果超时，用户看到的是「请求失败」，不会卡死。

### 坑 4：temperature 的选择

开始设的 0.8，结果评价不稳定——同一个标题两次评分差 15 分。降到 0.3 之后一致性明显改善。打分类工具不需要创意，需要稳定。

---

## 部署

部署到 zeku.cn 就两步：

1. 注册 https://platform.deepseek.com ，获取 API Key，填入 `.env`：
   ```
   DEEPSEEK_API_KEY=sk-xxxxx
   ```
   DeepSeek 新用户送 500 万 token，够打几千次分。

2. 把 `tools/title-scorer/` 目录上传到服务器。

没有数据库、没有 npm install、没有构建步骤。FTP 传上去就能用。

---

## 成本

按 DeepSeek 当前定价（￥1/百万 token），一次标题分析消耗约 500 token（Prompt + 回复），成本约 **￥0.0005**，也就是**万分之五分钱**。一天 100 次查询 = 5 分钱。

这就是为什么 DeepSeek 适合个人开发者做 AI 工具——成本低到可以忽略不计。

---

## 还可以怎么扩展

- **批量打分**：上传 CSV，一次分析 50 个标题
- **历史记录**：存到 SQLite，对比不同版本的标题
- **A/B 测试**：输入两个标题，AI 判断哪个更好
- **领域定制**：针对公众号、小红书、抖音分别调 prompt

每一个扩展方向都是 50 行代码的事。

---

## 小结

一个能用的 AI 工具，不需要微调模型、不需要 Python 机器学习、不需要分布式系统。**PHP + DeepSeek API + 一个写得好的 Prompt**，就够了。

如果你也想做类似的工具，三个要点：

1. Prompt 是产品的核心——花 80% 的时间调试 prompt
2. 代理模式保护 API Key——PHP 转发，前端不碰密钥
3. temperature 设低——打分类工具要一致性不要创造性

工具地址：https://zeku.cn/tools/title-scorer/
