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

相关推荐
Victor3562 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor3563 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术4 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo8165 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang5 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐6 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
搂着猫睡的小鱼鱼7 小时前
Ozon 商品页数据解析与提取 API
爬虫·php
野犬寒鸦7 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德8 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
深蓝电商API8 小时前
住宅代理与数据中心代理在爬虫中的选择
爬虫·python