基于 ddddocr 的通用验证码识别 OCR HTTP API 服务,提供简单易用的 RESTful 接口。
| 功能 | 接口 | 方法 | 说明 |
|---|---|---|---|
| OCR文字识别 | /classification | POST | 支持颜色过滤、PNG修复、概率输出 |
| 目标检测 | /detection | POST | 检测图片中文字或图标的坐标位置 |
| 滑块匹配 | /capcode | POST | 滑块验证码识别(匹配算法) |
| 滑块对比 | /slideComparison | POST | 滑块验证码识别(对比算法) |
| 计算验证码 | /calculate | POST | 识别并计算数学表达式结果 |
| 点选验证码 | /select | POST | 识别点选验证码的文字和位置 |
| 图片分割 | /crop | POST | 将图片分割为多个部分 |
| 字符集设置 | /set_ranges | POST | 设置OCR识别的字符集范围 |
| 健康检查 | / 或 /health 或 /status | GET | 服务运行状态检查 |
# 拉取并运行(使用默认端口7777)
docker run -d \
-p 7777:7777 \
--restart=always \
--name ddddocr \
yilee01/ddddocr:latest
# 克隆项目
git clone https://github.com/liheji/ddddocr.git
cd ddddocr
# 安装依赖
pip install -r requirements.txt
# 创建日志目录
mkdir -p logs
# 运行服务(默认端口7777)
python app.py
# 或使用环境变量自定义配置
export PORT=7777
export HOST=0.0.0.0
export OCR_BETA=true
python app.py
# Windows PowerShell
$env:PORT=7777
$env:HOST="0.0.0.0"
python app.py
所有配置通过环境变量进行设置,配置文件位于 const/setting.py:
| 变量名 | 说明 | 默认值 |
|---|---|---|
PORT | 服务端口 | 7777 |
HOST | 监听地址 | 0.0.0.0 |
DEBUG | 调试模式 | false |
OCR_BETA | 使用OCR beta模型 | true |
DET_BETA | 使用检测beta模型 | true |
SHOW_AD | 显示广告 | false |
LOG_LEVEL | 日志级别 | INFO |
LOG_FILE | 日志文件路径 | logs/app.log |
所有API接口统一返回以下JSON格式:
成功响应:
{
"code": 0,
"msg": "success",
"data": {...}
}
错误响应:
{
"code": 400,
"msg": "错误信息",
"data": null
}
错误码定义在 const/errno.py:
| 错误码 | 说明 |
|---|---|
| 0 | 成功 |
| 1 | 失败 |
| 400 | 参数错误 |
| 401 | 未授权 |
| 403 | 禁止访问 |
| 404 | 未找到 |
| 500 | 内部服务器错误 |
| 503 | 服务错误 |
接口地址: POST /classification
请求参数:
{
"image": "图片数据(base64字符串或URL)",
"png_fix": false,
"probability": false,
"color_filter_colors": ["red", "blue"],
"charset_ranges": "0123456789+-x/="
}
参数说明:
image (必需): 图片数据,支持格式:
data:image/png;base64,...)png_fix (可选): 是否启用PNG修复,默认 falseprobability (可选): 是否返回识别概率,默认 falsecolor_filter_colors (可选): 颜色过滤列表
["red", "blue", "green", "yellow", "orange", "purple", "pink"][[[0,50,50],[10,255,255]]]charset_ranges (可选): 字符集限制,如 "0123456789+-x/="响应示例:
{
"code": 0,
"msg": "success",
"data": "识别结果文本"
}
接口地址: POST /detection
请求参数:
{
"image": "图片数据(base64字符串或URL)"
}
响应示例:
{
"code": 0,
"msg": "success",
"data": [
[x1, y1, x2, y2],
[x1, y1, x2, y2]
]
}
接口地址: POST /capcode
请求参数:
{
"slidingImage": "滑块图片",
"backImage": "背景图片",
"simpleTarget": true
}
参数说明:
slidingImage (必需): 滑块图片,支持base64或URLbackImage (必需): 背景图片,支持base64或URLsimpleTarget (可选): 是否使用简单目标模式,默认 true响应示例:
{
"code": 0,
"msg": "success",
"data": 150
}
接口地址: POST /slideComparison
请求参数:
{
"slidingImage": "滑块图片",
"backImage": "背景图片"
}
响应示例:
{
"code": 0,
"msg": "success",
"data": 150
}
接口地址: POST /calculate
请求参数:
{
"image": "图片数据",
"charset_ranges": "0123456789+-x/="
}
响应示例:
{
"code": 0,
"msg": "success",
"data": 42
}
接口地址: POST /select
请求参数:
{
"image": "图片数据"
}
响应示例:
{
"code": 0,
"msg": "success",
"data": [
{
"text": "识别文字",
"bbox": [x1, y1, x2, y2]
}
]
}
接口地址: POST /crop
请求参数:
{
"image": "图片数据",
"y_coordinate": 150
}
参数说明:
image (必需): 图片数据y_coordinate (必需): Y坐标分割点响应示例:
{
"code": 0,
"msg": "success",
"data": {
"slidingImage": "base64编码的上半部分图片",
"backImage": "base64编码的下半部分图片"
}
}
接口地址: POST /set_ranges
请求参数:
{
"ranges": "0123456789+-x/="
}
响应示例:
{
"code": 0,
"msg": "字符集范围设置成功",
"data": "0123456789+-x/="
}
接口地址: GET / 或 GET /health 或 GET /status
响应示例:
{
"code": 0,
"msg": "API运行成功!",
"data": {
"status": "running",
"version": "1.0.0"
}
}
import requests
import base64
# 读取图片并转换为base64
with open("captcha.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
# OCR识别
response = requests.post(
"http://localhost:7777/classification",
json={
"image": image_data,
"color_filter_colors": ["red", "blue"],
"probability": False
}
)
result = response.json()
if result["code"] == 0:
print(f"识别结果: {result['data']}")
else:
print(f"错误: {result['msg']}")
# 滑块验证码
with open("sliding.png", "rb") as f:
sliding_image = base64.b64encode(f.read()).decode()
with open("back.png", "rb") as f:
back_image = base64.b64encode(f.read()).decode()
response = requests.post(
"http://localhost:7777/capcode",
json={
"slidingImage": sliding_image,
"backImage": back_image,
"simpleTarget": True
}
)
result = response.json()
if result["code"] == 0:
print(f"滑块位置: {result['data']}")
else:
print(f"错误: {result['msg']}")
// OCR识别
async function recognizeCaptcha(imageBase64) {
const response = await fetch('http://localhost:7777/classification', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
image: imageBase64,
color_filter_colors: ['red', 'blue'],
probability: false
})
});
const result = await response.json();
if (result.code === 0) {
return result.data;
} else {
throw new Error(result.msg);
}
}
# OCR识别
curl -X POST http://localhost:7777/classification \
-H "Content-Type: application/json" \
-d '{
"image": "base64_encoded_image_data",
"color_filter_colors": ["red", "blue"]
}'
# 滑块验证码
curl -X POST http://localhost:7777/capcode \
-H "Content-Type: application/json" \
-d '{
"slidingImage": "base64_encoded_sliding_image",
"backImage": "base64_encoded_back_image"
}'
# 健康检查
curl http://localhost:7777/health
# 构建镜像
docker build -t yilee01/ddddocr .
# 运行容器(默认端口7777)
docker run -d -p 7777:7777 --name ddddocr yilee01/ddddocr
# 运行容器(自定义端口)
docker run -d -p 8888:8888 -e PORT=8888 --name ddddocr yilee01/ddddocr
# 查看日志
docker logs -f ddddocr
# 停止容器
docker stop ddddocr
# 删除容器
docker rm ddddocr
ddddocr/
├── app.py # Flask应用入口文件
├── requirements.txt # Python依赖
├── Dockerfile # Docker镜像构建文件
├── README.md # 项目说明文档
├── build.sh # 构建脚本
├── utils/ # 工具类目录
│ ├── __init__.py
│ ├── response.py # 标准化响应工具类
│ └── image_utils.py # 图片处理工具类
├── core/ # 核心功能目录
│ ├── __init__.py
│ └── captcha.py # CAPTCHA核心识别类
├── api/ # API路由目录
│ ├── __init__.py
│ └── routes.py # 路由定义
├── const/ # 常量配置目录
│ ├── __init__.py
│ ├── setting.py # 配置常量
│ └── errno.py # 错误码常量
└── logs/ # 日志目录
└── app.log # 应用日志
# 安装开发依赖
pip install -r requirements.txt
# 创建日志目录
mkdir -p logs
# 运行服务(开发模式)
export DEBUG=true
export PORT=7777
python app.py
# Windows PowerShell
$env:DEBUG="true"
$env:PORT="7777"
python app.py
所有API接口使用统一的响应格式类 R(位于 utils/response.py):
# 成功响应
R.ok(data={"result": "success"}).json()
# 错误响应
R.error(code=400, msg="参数错误").json()
配置通过环境变量管理,配置常量定义在 const/setting.py:
# 读取环境变量,如果没有则使用默认值
PORT = int(os.getenv('PORT', 7777))
HOST = os.getenv('HOST', '0.0.0.0')
错误码定义在 const/errno.py:
SUCCESS = 0
FAILURE = 1
PARAM_ERROR = 400
NOT_FOUND = 404
INTERNAL_ERROR = 500
SERVICE_ERROR = 503
欢迎提交 Issue 和 Pull Request!
⭐ 如果这个项目对你有帮助,欢迎 Star!
Content type
Image
Digest
sha256:90f817312…
Size
244.1 MB
Last updated
7 months ago
docker pull yilee01/ddddocr