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

相关推荐
南玖yy23 分钟前
Python网络爬虫:从入门到实践
爬虫·python
Asthenia041225 分钟前
由浅入深解析Redis事务机制及其业务应用-电商场景解决超卖
后端
Asthenia041227 分钟前
Redis详解:从内存一致性到持久化策略的思维链条
后端
Asthenia041227 分钟前
深入剖析 Redis 持久化:RDB 与 AOF 的全景解析
后端
Apifox37 分钟前
如何在 Apifox 中通过 CLI 运行包含云端数据库连接配置的测试场景
前端·后端·程序员
掘金一周1 小时前
金石焕新程 >> 瓜分万元现金大奖征文活动即将回归 | 掘金一周 4.3
前端·人工智能·后端
uhakadotcom1 小时前
构建高效自动翻译工作流:技术与实践
后端·面试·github
Asthenia04121 小时前
深入分析Java中的AQS:从应用到原理的思维链条
后端
Asthenia04121 小时前
如何设计实现一个定时任务执行器 - SpringBoot环境下的最佳实践
后端
兔子的洋葱圈2 小时前
【django】1-2 django项目的请求处理流程(详细)
后端·python·django