AutoJS集成百度OCR:高效文字识别源码全解析
2025.09.18 11:35浏览量:0简介:本文详细介绍基于AutoJS框架调用百度OCR API实现文字识别的完整方案,包含环境配置、API调用逻辑、源码解析及优化建议,适合Android自动化开发者和OCR应用开发者参考。
基于AutoJS的百度OCR文字识别源码详解
一、技术背景与方案选型
在Android自动化场景中,文字识别是核心需求之一。百度OCR提供高精度的文字识别服务,而AutoJS作为基于JavaScript的Android自动化工具,能够通过HTTP请求与云端API交互。本方案通过AutoJS调用百度OCR通用文字识别接口,实现屏幕截图文字提取功能。
1.1 百度OCR API优势
- 支持中英文混合识别
- 提供高精度版(识别率98%+)
- 返回文字位置坐标信息
- 免费额度充足(500次/日)
1.2 AutoJS适用场景
- 无障碍辅助功能开发
- 游戏自动化脚本
- 重复性文本录入自动化
- 数据采集类应用
二、完整实现步骤
2.1 准备工作
获取百度OCR API Key
- 登录百度智能云控制台
- 创建文字识别应用
- 获取
API Key
和Secret Key
AutoJS环境配置
// 确保AutoJS版本≥4.1.1
console.show(); // 开启控制台输出
auto.waitFor(); // 获取无障碍权限
2.2 核心代码实现
// 百度OCR配置
const BAIDU_OCR = {
API_KEY: "your_api_key",
SECRET_KEY: "your_secret_key",
ACCESS_TOKEN_URL: "https://aip.baidubce.com/oauth/2.0/token",
OCR_URL: "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
};
// 获取Access Token
async function getAccessToken() {
const url = BAIDU_OCR.ACCESS_TOKEN_URL +
`?grant_type=client_credentials` +
`&client_id=${BAIDU_OCR.API_KEY}` +
`&client_secret=${BAIDU_OCR.SECRET_KEY}`;
const res = http.get(url);
if (res.statusCode !== 200) {
throw new Error("获取Token失败: " + res.body.string());
}
return JSON.parse(res.body.string()).access_token;
}
// 截图并识别文字
async function recognizeText() {
// 1. 屏幕截图
const imgPath = "/sdcard/screenshot.png";
if (!files.exists(imgPath)) {
sleep(500); // 等待截图完成
}
// 2. 获取Access Token
const token = await getAccessToken();
// 3. 构造请求参数
const params = {
access_token: token,
image: files.readBytes(imgPath).toString("base64"),
language_type: "CHN_ENG"
};
// 4. 发送OCR请求
const ocrUrl = BAIDU_OCR.OCR_URL + "?" +
Object.keys(params).map(k => `${k}=${encodeURIComponent(params[k])}`).join("&");
const res = http.post(ocrUrl, {
headers: { "Content-Type": "application/x-www-form-urlencoded" }
});
if (res.statusCode !== 200) {
throw new Error("OCR识别失败: " + res.body.string());
}
return JSON.parse(res.body.string());
}
// 使用示例
(async function() {
try {
// 模拟截图操作(实际可通过devices.captureScreen())
files.writeBytes("/sdcard/screenshot.png", http.get("http://example.com/test.png").body.bytes());
const result = await recognizeText();
console.log("识别结果:", result.words_result.map(item => item.words).join("\n"));
} catch (e) {
console.error("错误:", e);
}
})();
2.3 关键点解析
Access Token管理
- Token有效期为30天,建议缓存避免频繁请求
- 错误处理需包含400(参数错误)、401(认证失败)等状态码
图片处理优化
// 图片压缩示例(减少传输数据量)
function compressImage(path) {
const img = images.read(path);
const compressed = images.resize(img, img.getWidth()/2, img.getHeight()/2);
images.save(compressed, path, "jpg", 80); // 80%质量
}
多语言支持
- 通过
language_type
参数指定:CHN_ENG
:中英文混合ENG
:纯英文JAP
:日语
- 通过
三、性能优化建议
3.1 请求频率控制
// 添加请求间隔控制
let lastRequestTime = 0;
async function safeRequest(fn) {
const now = Date.now();
if (now - lastRequestTime < 1000) { // 至少1秒间隔
await sleep(1000 - (now - lastRequestTime));
}
lastRequestTime = Date.now();
return await fn();
}
3.2 错误重试机制
async function retryRequest(fn, maxRetries = 3) {
let lastError;
for (let i = 0; i < maxRetries; i++) {
try {
return await fn();
} catch (e) {
lastError = e;
await sleep(1000 * (i + 1)); // 指数退避
}
}
throw lastError;
}
四、典型应用场景
4.1 游戏验证码识别
// 游戏登录场景示例
async function handleCaptcha() {
// 1. 定位验证码区域
const captchaRect = findCaptchaRegion(); // 自定义区域检测函数
// 2. 截图并识别
const img = images.clip(
captureScreen(),
captchaRect.left,
captchaRect.top,
captchaRect.right,
captchaRect.bottom
);
images.save(img, "/sdcard/captcha.png");
// 3. 调用OCR
const result = await recognizeText();
const code = result.words_result[0].words.replace(/\s+/g, "");
// 4. 输入验证码
input(code);
}
4.2 文档数据提取
// 表格数据提取示例
async function extractTableData() {
const result = await recognizeText();
const lines = result.words_result.map(item => item.words);
// 简单表格解析(实际需更复杂逻辑)
const headers = lines[0].split(/\s+/);
const data = lines.slice(1).map(line => {
const values = line.split(/\s+/);
return headers.reduce((obj, h, i) => {
obj[h] = values[i] || "";
return obj;
}, {});
});
console.log(JSON.stringify(data, null, 2));
}
五、常见问题解决方案
5.1 认证失败处理
- 检查系统时间是否准确(NTP同步)
- 确认API Key/Secret Key正确
- 查看百度云控制台是否欠费
5.2 识别率优化
- 确保图片清晰(≥300dpi)
- 避免反光和阴影
- 对复杂背景使用二值化处理:
function preprocessImage(path) {
let img = images.read(path);
// 转换为灰度图
img = images.grayscale(img);
// 二值化处理
img = images.threshold(img, 128); // 阈值可根据实际调整
images.save(img, path);
}
5.3 性能瓶颈分析
- 网络延迟:使用4G/WiFi测试对比
- 图片大小:建议控制在1MB以内
- 并发控制:避免短时间内大量请求
六、扩展功能建议
离线识别方案
- 集成Tesseract OCR作为备用
- 实现本地缓存机制
批量处理功能
async function batchProcess(imagePaths) {
const token = await getAccessToken();
const results = [];
for (const path of imagePaths) {
const imgData = files.readBytes(path).toString("base64");
const res = await http.post(
`${BAIDU_OCR.OCR_URL}?access_token=${token}`,
{ image: imgData },
{ headers: { "Content-Type": "application/x-www-form-urlencoded" } }
);
results.push(JSON.parse(res.body.string()));
}
return results;
}
结果后处理
- 正则表达式过滤无效字符
- 敏感信息脱敏处理
- 自动纠错(结合词典)
七、安全注意事项
API Key保护
- 避免硬编码在脚本中
- 建议使用加密存储
- 限制IP访问范围
数据传输安全
- 优先使用HTTPS
- 对敏感图片进行加密
权限控制
// 最小权限原则
if (!requestScreenCapture()) {
toast("需要截图权限");
exit();
}
本方案完整实现了AutoJS与百度OCR的集成,通过模块化设计和错误处理机制保证了稳定性。实际开发中,建议根据具体场景调整参数,并建立完善的日志系统以便问题排查。对于高频使用场景,可考虑部署私有OCR服务以降低成本。
发表评论
登录后可评论,请前往 登录 或 注册