logo

AutoJS集成百度OCR:高效文字识别源码全解析

作者:4042025.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 准备工作

  1. 获取百度OCR API Key

    • 登录百度智能云控制台
    • 创建文字识别应用
    • 获取API KeySecret Key
  2. AutoJS环境配置

    1. // 确保AutoJS版本≥4.1.1
    2. console.show(); // 开启控制台输出
    3. auto.waitFor(); // 获取无障碍权限

2.2 核心代码实现

  1. // 百度OCR配置
  2. const BAIDU_OCR = {
  3. API_KEY: "your_api_key",
  4. SECRET_KEY: "your_secret_key",
  5. ACCESS_TOKEN_URL: "https://aip.baidubce.com/oauth/2.0/token",
  6. OCR_URL: "https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic"
  7. };
  8. // 获取Access Token
  9. async function getAccessToken() {
  10. const url = BAIDU_OCR.ACCESS_TOKEN_URL +
  11. `?grant_type=client_credentials` +
  12. `&client_id=${BAIDU_OCR.API_KEY}` +
  13. `&client_secret=${BAIDU_OCR.SECRET_KEY}`;
  14. const res = http.get(url);
  15. if (res.statusCode !== 200) {
  16. throw new Error("获取Token失败: " + res.body.string());
  17. }
  18. return JSON.parse(res.body.string()).access_token;
  19. }
  20. // 截图并识别文字
  21. async function recognizeText() {
  22. // 1. 屏幕截图
  23. const imgPath = "/sdcard/screenshot.png";
  24. if (!files.exists(imgPath)) {
  25. sleep(500); // 等待截图完成
  26. }
  27. // 2. 获取Access Token
  28. const token = await getAccessToken();
  29. // 3. 构造请求参数
  30. const params = {
  31. access_token: token,
  32. image: files.readBytes(imgPath).toString("base64"),
  33. language_type: "CHN_ENG"
  34. };
  35. // 4. 发送OCR请求
  36. const ocrUrl = BAIDU_OCR.OCR_URL + "?" +
  37. Object.keys(params).map(k => `${k}=${encodeURIComponent(params[k])}`).join("&");
  38. const res = http.post(ocrUrl, {
  39. headers: { "Content-Type": "application/x-www-form-urlencoded" }
  40. });
  41. if (res.statusCode !== 200) {
  42. throw new Error("OCR识别失败: " + res.body.string());
  43. }
  44. return JSON.parse(res.body.string());
  45. }
  46. // 使用示例
  47. (async function() {
  48. try {
  49. // 模拟截图操作(实际可通过devices.captureScreen())
  50. files.writeBytes("/sdcard/screenshot.png", http.get("http://example.com/test.png").body.bytes());
  51. const result = await recognizeText();
  52. console.log("识别结果:", result.words_result.map(item => item.words).join("\n"));
  53. } catch (e) {
  54. console.error("错误:", e);
  55. }
  56. })();

2.3 关键点解析

  1. Access Token管理

    • Token有效期为30天,建议缓存避免频繁请求
    • 错误处理需包含400(参数错误)、401(认证失败)等状态码
  2. 图片处理优化

    1. // 图片压缩示例(减少传输数据量)
    2. function compressImage(path) {
    3. const img = images.read(path);
    4. const compressed = images.resize(img, img.getWidth()/2, img.getHeight()/2);
    5. images.save(compressed, path, "jpg", 80); // 80%质量
    6. }
  3. 多语言支持

    • 通过language_type参数指定:
      • CHN_ENG:中英文混合
      • ENG:纯英文
      • JAP:日语

三、性能优化建议

3.1 请求频率控制

  1. // 添加请求间隔控制
  2. let lastRequestTime = 0;
  3. async function safeRequest(fn) {
  4. const now = Date.now();
  5. if (now - lastRequestTime < 1000) { // 至少1秒间隔
  6. await sleep(1000 - (now - lastRequestTime));
  7. }
  8. lastRequestTime = Date.now();
  9. return await fn();
  10. }

3.2 错误重试机制

  1. async function retryRequest(fn, maxRetries = 3) {
  2. let lastError;
  3. for (let i = 0; i < maxRetries; i++) {
  4. try {
  5. return await fn();
  6. } catch (e) {
  7. lastError = e;
  8. await sleep(1000 * (i + 1)); // 指数退避
  9. }
  10. }
  11. throw lastError;
  12. }

四、典型应用场景

4.1 游戏验证码识别

  1. // 游戏登录场景示例
  2. async function handleCaptcha() {
  3. // 1. 定位验证码区域
  4. const captchaRect = findCaptchaRegion(); // 自定义区域检测函数
  5. // 2. 截图并识别
  6. const img = images.clip(
  7. captureScreen(),
  8. captchaRect.left,
  9. captchaRect.top,
  10. captchaRect.right,
  11. captchaRect.bottom
  12. );
  13. images.save(img, "/sdcard/captcha.png");
  14. // 3. 调用OCR
  15. const result = await recognizeText();
  16. const code = result.words_result[0].words.replace(/\s+/g, "");
  17. // 4. 输入验证码
  18. input(code);
  19. }

4.2 文档数据提取

  1. // 表格数据提取示例
  2. async function extractTableData() {
  3. const result = await recognizeText();
  4. const lines = result.words_result.map(item => item.words);
  5. // 简单表格解析(实际需更复杂逻辑)
  6. const headers = lines[0].split(/\s+/);
  7. const data = lines.slice(1).map(line => {
  8. const values = line.split(/\s+/);
  9. return headers.reduce((obj, h, i) => {
  10. obj[h] = values[i] || "";
  11. return obj;
  12. }, {});
  13. });
  14. console.log(JSON.stringify(data, null, 2));
  15. }

五、常见问题解决方案

5.1 认证失败处理

  • 检查系统时间是否准确(NTP同步)
  • 确认API Key/Secret Key正确
  • 查看百度云控制台是否欠费

5.2 识别率优化

  • 确保图片清晰(≥300dpi)
  • 避免反光和阴影
  • 对复杂背景使用二值化处理:
    1. function preprocessImage(path) {
    2. let img = images.read(path);
    3. // 转换为灰度图
    4. img = images.grayscale(img);
    5. // 二值化处理
    6. img = images.threshold(img, 128); // 阈值可根据实际调整
    7. images.save(img, path);
    8. }

5.3 性能瓶颈分析

  • 网络延迟:使用4G/WiFi测试对比
  • 图片大小:建议控制在1MB以内
  • 并发控制:避免短时间内大量请求

六、扩展功能建议

  1. 离线识别方案

    • 集成Tesseract OCR作为备用
    • 实现本地缓存机制
  2. 批量处理功能

    1. async function batchProcess(imagePaths) {
    2. const token = await getAccessToken();
    3. const results = [];
    4. for (const path of imagePaths) {
    5. const imgData = files.readBytes(path).toString("base64");
    6. const res = await http.post(
    7. `${BAIDU_OCR.OCR_URL}?access_token=${token}`,
    8. { image: imgData },
    9. { headers: { "Content-Type": "application/x-www-form-urlencoded" } }
    10. );
    11. results.push(JSON.parse(res.body.string()));
    12. }
    13. return results;
    14. }
  3. 结果后处理

    • 正则表达式过滤无效字符
    • 敏感信息脱敏处理
    • 自动纠错(结合词典)

七、安全注意事项

  1. API Key保护

    • 避免硬编码在脚本中
    • 建议使用加密存储
    • 限制IP访问范围
  2. 数据传输安全

    • 优先使用HTTPS
    • 对敏感图片进行加密
  3. 权限控制

    1. // 最小权限原则
    2. if (!requestScreenCapture()) {
    3. toast("需要截图权限");
    4. exit();
    5. }

本方案完整实现了AutoJS与百度OCR的集成,通过模块化设计和错误处理机制保证了稳定性。实际开发中,建议根据具体场景调整参数,并建立完善的日志系统以便问题排查。对于高频使用场景,可考虑部署私有OCR服务以降低成本。

相关文章推荐

发表评论