logo

基于AutoJS调用百度OCR:从零搭建高效文字识别工具

作者:有好多问题2025.09.26 20:48浏览量:0

简介:本文详细解析基于AutoJS调用百度OCR API实现文字识别的完整方案,包含API申请、代码实现、错误处理及优化建议,适合移动端开发者快速集成OCR功能。

一、技术选型与背景说明

AutoJS作为一款基于JavaScript的Android自动化工具,凭借其无障碍服务权限和脚本执行能力,在移动端自动化场景中广泛应用。百度OCR(光学字符识别)服务提供高精度的文字识别能力,支持通用文字、身份证、银行卡等多场景识别。将两者结合,可实现移动端高效文字提取方案,适用于信息采集、表单填写、数据录入等场景。

1.1 技术优势分析

  • AutoJS特性:无需ROOT权限,支持UI操作模拟、控件查找、定时任务等,适合移动端轻量级开发。
  • 百度OCR优势:提供免费额度(每月500次通用识别),支持高精度多语言识别,API响应速度快(通常<1s)。
  • 典型应用场景:自动化表单填写、纸质文档电子化、验证码识别、截图内容提取等。

1.2 开发前准备

  • 硬件要求:Android 5.0+设备,AutoJS 4.1.1+版本。
  • 软件依赖:百度AI开放平台账号、AutoJS脚本环境。
  • 知识储备:熟悉JavaScript基础语法、HTTP请求处理。

二、百度OCR API申请与配置

2.1 注册百度AI开放平台

  1. 访问百度AI开放平台并注册账号。
  2. 进入「文字识别」服务,创建通用文字识别应用。
  3. 获取API KeySecret Key(需妥善保管,避免泄露)。

2.2 获取Access Token

百度OCR API通过OAuth2.0认证,需先获取Access Token:

  1. function getAccessToken(apiKey, secretKey) {
  2. let url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials" +
  3. "&client_id=" + apiKey + "&client_secret=" + secretKey;
  4. let res = http.get(url);
  5. let json = JSON.parse(res.body.string());
  6. return json.access_token;
  7. }

关键参数

  • grant_type:固定为client_credentials
  • client_id:API Key
  • client_secret:Secret Key

2.3 识别接口调用

通用文字识别API地址:

  1. https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=YOUR_ACCESS_TOKEN

请求参数说明:
| 参数名 | 类型 | 必填 | 说明 |
|———————|————|———|—————————————|
| image | string | 是 | 图片二进制数据(Base64)|
| language_type| string | 否 | 中英文混合识别传CHN_ENG|

三、AutoJS完整实现代码

3.1 基础识别脚本

  1. // 配置参数
  2. const API_KEY = "your_api_key";
  3. const SECRET_KEY = "your_secret_key";
  4. // 主函数
  5. function main() {
  6. // 1. 获取Access Token
  7. let token = getAccessToken(API_KEY, SECRET_KEY);
  8. if (!token) {
  9. toast("获取Token失败");
  10. return;
  11. }
  12. // 2. 选择图片(示例:从相册选择)
  13. let imgPath = "/sdcard/test.jpg"; // 替换为实际路径
  14. if (!files.exists(imgPath)) {
  15. toast("图片不存在");
  16. return;
  17. }
  18. // 3. 读取图片并转为Base64
  19. let imgBase64 = files.readBase64(imgPath);
  20. // 4. 调用OCR接口
  21. let url = "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token=" + token;
  22. let res = http.postJson(url, {
  23. image: imgBase64,
  24. language_type: "CHN_ENG"
  25. });
  26. // 5. 解析结果
  27. let json = JSON.parse(res.body.string());
  28. if (json.error_code) {
  29. toast("识别失败: " + json.error_msg);
  30. return;
  31. }
  32. // 提取文字
  33. let text = json.words_result.map(item => item.words).join("\n");
  34. console.log("识别结果:\n" + text);
  35. setClip(text); // 复制到剪贴板
  36. toast("识别成功,结果已复制");
  37. }
  38. // 启动脚本
  39. main();

3.2 关键代码解析

  1. 图片处理

    • 使用files.readBase64()直接读取图片文件
    • 支持PNG/JPG格式,建议图片尺寸<4MB
  2. 错误处理

    1. if (json.error_code) {
    2. let errMap = {
    3. 110: "Access Token失效",
    4. 111: "Access Token过期",
    5. 112: "Access Token无效"
    6. };
    7. let msg = errMap[json.error_code] || "未知错误";
    8. toast("错误: " + msg);
    9. }
  3. 性能优化

    • 添加请求超时设置:http.setTimeout(5000)
    • 对大图片进行压缩(示例使用AutoJS的images.resize()

四、进阶功能实现

4.1 截图即时识别

  1. // 截取当前屏幕并识别
  2. function captureAndRecognize() {
  3. let img = captureScreen();
  4. let path = "/sdcard/screenshot.png";
  5. images.save(img, path);
  6. // 调用基础识别函数(需传入path)
  7. // ...
  8. }

4.2 批量图片处理

  1. function batchRecognize(dirPath) {
  2. let files = files.listDir(dirPath, function(name) {
  3. return name.endsWith(".jpg") || name.endsWith(".png");
  4. });
  5. files.forEach(file => {
  6. let text = recognizeSingleImage(dirPath + "/" + file);
  7. // 保存结果到文件
  8. let resultPath = dirPath + "/" + files.getNameWithoutExtension(file) + ".txt";
  9. files.write(resultPath, text);
  10. });
  11. }

4.3 定时任务实现

  1. // 每天9点执行识别任务
  2. events.on("exit", function() {
  3. let now = new Date();
  4. let hours = now.getHours();
  5. if (hours === 9) {
  6. main(); // 执行主识别函数
  7. }
  8. });

五、常见问题解决方案

5.1 认证失败处理

  • 现象:返回{"error_code":110,"error_msg":"Access Token invalid"}
  • 原因:Token过期或生成错误
  • 解决
    1. 检查系统时间是否准确
    2. 重新生成Access Token
    3. 确保API Key/Secret Key正确

5.2 图片识别率低优化

  • 建议
    1. 确保图片清晰(>300DPI)
    2. 避免复杂背景(建议纯色背景)
    3. 对倾斜图片进行矫正:
      1. // 使用OpenCV进行透视变换(需AutoJS Pro)
      2. let warped = images.warpPerspective(img, ...);

5.3 流量控制策略

百度OCR免费版限制:

  • QPS≤5(每秒请求数)
  • 每日500次调用

优化方案

  1. // 添加请求间隔
  2. function safeRequest(callback) {
  3. let lastTime = 0;
  4. return function() {
  5. let now = Date.now();
  6. if (now - lastTime < 200) { // 200ms间隔
  7. sleep(200);
  8. }
  9. lastTime = now;
  10. return callback.apply(this, arguments);
  11. };
  12. }

六、部署与维护建议

  1. 代码封装

    • 将OCR功能封装为模块:
      1. module.exports = {
      2. recognize: function(imgPath) { /* ... */ },
      3. getToken: function() { /* ... */ }
      4. };
  2. 日志记录

    1. function logError(msg) {
    2. let logPath = "/sdcard/ocr_error.log";
    3. let timestamp = new Date().toISOString();
    4. files.append(logPath, timestamp + ": " + msg + "\n");
    5. }
  3. 版本更新

    • 关注百度OCR API变更日志
    • 定期测试Access Token生成逻辑

七、总结与扩展

本方案实现了基于AutoJS的百度OCR集成,具有以下特点:

  • 轻量级:无需额外Android权限
  • 灵活:支持截图、相册、批量等多种模式
  • 高效:通过错误处理和流量控制保障稳定性

扩展方向

  1. 添加表格识别功能(使用table_recognize接口)
  2. 实现实时摄像头识别(结合AutoJS的camera模块)
  3. 开发Web服务接口(通过AutoJS的http.server

通过本方案,开发者可快速构建移动端文字识别工具,满足自动化办公、数据采集等场景需求。实际开发中需注意遵守百度API使用条款,避免滥用导致服务限制。

相关文章推荐

发表评论

活动