FlanChanXwO/phpwind-captcha-ocr
111
1#!/usr/bin/env python32"""单图验证码识别,走 pie-xian command-a-vision。输出格式兼容 harness 的 recognize()。3用法: vision_ocr.py file.png ... -> {"file.png": {"vision": "code"}}4"""5import base646import json7import re8import ssl9import sys10import urllib.request11 12API = "https://api.pie-xian.com/v1/chat/completions"13KEY = "sk-Rel8iERHrmu9NDbvQhnhwTowEUnGqVvCFXMatASH8q5O4gGP"14MODEL = "command-a-vision-07-2025"15UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/126.0.0.0 Safari/537.36"16PROMPT = "识别这张验证码图片中的字符。只输出字符本身,不要任何解释或标点。这是登录验证码,可能包含1-4个数字。"17 18_CTX = ssl.create_default_context()19_CTX.check_hostname = False20_CTX.verify_mode = ssl.CERT_NONE21 22 23def read(path):24 b64 = base64.b64encode(open(path, "rb").read()).decode()25 body = json.dumps({"model": MODEL, "messages": [{"role": "user", "content": [26 {"type": "text", "text": PROMPT},27 {"type": "image_url", "image_url": {"url": "data:image/png;base64," + b64}}]}],28 "max_tokens": 20, "temperature": 0}).encode()29 req = urllib.request.Request(API, data=body, headers={30 "Authorization": "Bearer " + KEY, "Content-Type": "application/json", "User-Agent": UA})31 d = json.loads(urllib.request.urlopen(req, timeout=90, context=_CTX).read())32 return re.sub(r"[^0-9A-Za-z]", "", d["choices"][0]["message"]["content"])33 34 35def main():36 out = {}37 for f in sys.argv[1:]:38 try:39 # 2 次读取,一致才返回;不一致返回空(harness 跳过登录)40 r1, r2 = read(f), read(f)41 code = r1 if r1 == r2 else ""42 out[f] = {"vision": code}43 except Exception as e:44 out[f] = {"vision": "", "err": str(e)}45 print(json.dumps(out, ensure_ascii=False))46 47 48if __name__ == "__main__":49 main()50 