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

相关推荐
仿生joe会梦见漫天的大雪吗2 分钟前
CTF学习笔记03:密码口令 —— 从弱口令到字典爆破
后端
自进化Agent智能体5 分钟前
从零到一玩转Hermes Agent:VPS部署 × 模型配置 × 记忆架构 × 多Agent协作
后端
用户4682557459135 分钟前
Testcontainers 在 Windows Docker Desktop 上跑不通:协议层不兼容 + 4 种可行环境
java·后端
Tenaryo9 分钟前
「底层系统基石 · 缓存篇」V —— 写策略、Store Buffer 与内存屏障
后端·面试
如烟花的信页1 小时前
加速乐cookie逆向分析
javascript·爬虫·python·js逆向
小刘|1 小时前
Spring WebFlux + AI 流式输出深度解析:Spring AI 与 LangChain4j 效果差异溯源
java·后端·spring
夕除1 小时前
Spring Security 配置类(SecurityConfig)
java·后端·spring
lfwh1 小时前
探针程序技术解析:基于 Spring Boot 非 Web 模式的云服务监控告警系统
前端·spring boot·后端
武子康1 小时前
Java-22 深入浅出 MyBatis - 手写ORM框架3 手写SqlSession、Executor 工作原理
java·后端