"白描APP" OCR 软件 API 逆向抓取

引言

最近接触到一个比较简洁,识别率较高的 OCR 软件白描APP。他提供了网页和APP,但是没有API,本文讨论如何抓调用API。

  1. 上传图片,打开 Chrome F12 开发者工具抓包
  • 发现 api/perm/singleapi/ocr/image/baidu 两个重要请求
  • 一个 请求是拿到 token,另一个请求把图片转换为 base64 然后上传识别
  1. /api/perm/single 重放模拟

把 /api/perm/single 使用 curl 重放即可,经过测试白描APP的 Cookie 过期时间非常久,用了几个月都不会登出(也可能存放到 localStorage,没深究)

PS: 白描是否调用了百度OCR呢?有 baidu 字样的参数?

  1. /api/ocr/image/baidu 接口逆向

查看该请求的 payload,如下:

json 复制代码
{
  "batchId":"",
  "total":1,
  "token":"07542a06-...",
  "hash":"d16e937e65...",
  "name":"xxxx.jpeg",
  "size":54731,
  "dataUrl":"data:image/jpeg"
}

dataUrl 为图片转base64的结果,token 为上面的接口获取,那 hash 是什么呢?应该是前端某加密函数生成。

  1. hash 生成原理

它的前端代码不算复杂,断点跟踪堆栈信息,可以发现 rawDigest 这个方法, 是用来生成 hash 值的,经过追踪发现是 rusha.js SHA-1 哈希算法。

那么就很好用 python 模拟了

python 复制代码
def calculate_sha1_hash(input_data):
    """
    追踪 https://web.baimiaoapp.com/ 源码
    发现 hash 字段是对bae64图片执行的 rusha.js
    const rusha = new Rusha();
    const hexHash = rusha.digest(t);
    input_data 为 base64 的图片字符串
    """
    # 如果输入是字符串,先编码为字节
    if isinstance(input_data, str):
        input_data = input_data.encode("utf-8")

    # 计算 SHA-1 哈希
    sha1_hash = hashlib.sha1(input_data).hexdigest()
    return sha1_hash
python 复制代码
def start_ocr(token, image_data, image_size, image_name):
    url = "https://web.baimiaoapp.com/api/ocr/image/baidu"
    auth_json = auth()
    headers = {
        "accept": "application/json, text/plain, */*",
        "accept-language": "zh-CN,zh;q=0.9",
        "content-type": "application/json;charset=UTF-8",
        "cookie": "Hm_lvt_da96324d8afb3666d3f016c5f2201546=1735016184; Hm_lpvt_da96324d8afb3666d3f016c5f2201546=1735017008",
        "origin": "https://web.baimiaoapp.com",
        "priority": "u=1, i",
        "referer": "https://web.baimiaoapp.com/",
        "sec-ch-ua": '"Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"',
        "sec-ch-ua-mobile": "?0",
        "sec-ch-ua-platform": '"Windows"',
        "sec-fetch-dest": "empty",
        "sec-fetch-mode": "cors",
        "sec-fetch-site": "same-origin",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",
        "x-auth-token": auth_json["token"],
        "x-auth-uuid": auth_json["uuid"],
    }

    hash = calculate_sha1_hash(image_data)
    payload = {
        "token": token,
        "hash": hash,
        "name": image_name,
        "size": image_size,
        "dataUrl": image_data,
        "result": {},
        "status": "processing",
        "isSuccess": False,
    }

    try:
        res = requests.post(
            url, headers=headers, json=payload, verify=False, timeout=30
        ).json()
        logging.info(res, payload)
        return res["data"]["jobStatusId"]
    except Exception as e:
        logging.error(f"Ocr error: {e}")
  1. 写在最后

获取了 hash 值,就能够使用 API 调用了。不过经过测试发现,调用还是有频率限制的。如果作者能开放 API 那就更好了。

相关推荐
勇哥java实战分享30 分钟前
短信平台 Pro 版本 ,比开源版本更强大
后端
学历真的很重要34 分钟前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn089537 分钟前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪1 小时前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端
韩师傅2 小时前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端
栈与堆2 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥3 小时前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似3 小时前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡3 小时前
Java CompletableFuture 接口与原理详解
后端
神奇小汤圆3 小时前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端