"白描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 那就更好了。

相关推荐
葫芦和十三7 小时前
图解 MongoDB 23|两地三中心:跨可用区部署怎么扛机房故障
后端·mongodb·agent
勇哥java实战分享9 小时前
PaddleOCR 太慢?我换成 RapidOCR 后,速度直接起飞
后端
苏三说技术14 小时前
LangChain4j 和 LangGraph4j,哪个更好?
后端
ServBay15 小时前
7 个AI开发中真正用得上的 MCP Server,配合Claude Code食用效果更佳
后端·claude·mcp
妙码生花15 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(十五):优化细节、网络请求封装
前端·后端·ai编程
用户67570498850216 小时前
Go 语言里判断字符串为空,90% 的人都写错了!
后端·go
用户67570498850216 小时前
Go 进阶必修:90% 的人都没用对的“表驱动法”
后端·go
小兔崽子去哪了16 小时前
Java 生成二维码解决方案
java·后端
苍何16 小时前
懂事的 Agent 已经开始自己看屏幕干活了,效率起飞!
后端