 | |  |  | 速识别验证码识别平台 AIWROK 接入示例
- // 速识别验证码识别平台 AIWROK 接入示例
- // API文档: https://www.sushibie.com/demo.html
- // 全局配置
- var G = {
- running: true,
- token: "b5KL6hTyLfzDk84413CZZHE00pBLES2zxbE9G8",
- apiUrl: "https://api.sushibie.com/api/YmServer/customApi",
- userInfoUrl: "https://api.sushibie.com/api/YmServer/getUserInfoApi",
- refundUrl: "https://api.sushibie.com/api/YmServer/refundApi",
- captchaType: "2001" // 验证码类型ID,根据实际需求修改
- };
- // 导入必要的 Java 类
- importClass(java.net.HttpURLConnection);
- importClass(java.net.URL);
- importClass(java.io.BufferedReader);
- importClass(java.io.InputStreamReader);
- importClass(java.io.OutputStream);
- importClass(java.lang.StringBuilder);
- importClass(android.util.Base64);
- importClass(java.io.FileInputStream);
- importClass(java.io.File);
- /**
- * 将图片文件转换为 Base64 字符串
- * @param {string} imagePath - 图片文件的绝对路径
- * @returns {string} Base64 编码的字符串
- */
- function imageToBase64(imagePath) {
- try {
- var file = new File(imagePath);
- if (!file.exists()) {
- printl("[ERROR] 图片文件不存在: " + imagePath);
- return null;
- }
-
- var fis = new FileInputStream(file);
- var bytes = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, file.length());
- fis.read(bytes);
- fis.close();
-
- var base64 = Base64.encodeToString(bytes, Base64.NO_WRAP);
- printl("[INFO] 图片转Base64成功,大小: " + base64.length() + " 字符");
- return base64;
- } catch (e) {
- printl("[ERROR] 图片转Base64失败: " + e.message);
- return null;
- }
- }
- /**
- * 手动构建 JSON 字符串(Rhino 环境下 JSON.stringify 可能不可用)
- * @param {object} obj - 要转换的对象
- * @returns {string} JSON 字符串
- */
- function toJson(obj) {
- var parts = [];
- for (var key in obj) {
- if (obj.hasOwnProperty(key)) {
- var val = obj[key];
- // 统一转成 JS 字符串(兼容 Java String 对象)
- var strVal = "" + val;
- if (typeof val === "string" || val instanceof java.lang.String || typeof val === "object" && val.getClass) {
- // 转义特殊字符
- strVal = strVal.replace(/\\/g, "\\\\").replace(/"/g, '\\"').replace(/\n/g, "\\n").replace(/\r/g, "\\r");
- parts.push('"' + key + '":"' + strVal + '"');
- } else {
- parts.push('"' + key + '":' + strVal);
- }
- }
- }
- return "{" + parts.join(",") + "}";
- }
- /**
- * 发送 HTTP POST 请求
- * @param {string} url - 请求地址
- * @param {object} postData - POST 数据对象
- * @returns {object} 响应结果对象
- */
- function httpPost(url, postData) {
- try {
- var urlObj = new URL(url);
- var conn = urlObj.openConnection();
- conn.setRequestMethod("POST");
- conn.setDoOutput(true);
- conn.setDoInput(true);
- conn.setUseCaches(false);
- conn.setConnectTimeout(10000);
- conn.setReadTimeout(30000);
- conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
- // 不要显式调用 connect(),让 getOutputStream 自动连接
- // 手动构建 JSON 字符串
- var jsonStr = toJson(postData);
- var logStr = jsonStr;
- if (logStr.length > 200) {
- logStr = logStr.substring(0, 200) + "...";
- }
- printl("[DEBUG] 请求数据: " + logStr);
- // 发送请求数据
- var bodyBytes = new java.lang.String(jsonStr).getBytes("UTF-8");
- conn.setRequestProperty("Content-Length", "" + bodyBytes.length);
- var os = conn.getOutputStream();
- if (os == null) {
- printl("[ERROR] 无法获取输出流");
- return null;
- }
- os.write(bodyBytes);
- os.flush();
- os.close();
- // 读取响应
- var responseCode = conn.getResponseCode();
- printl("[DEBUG] 响应状态码: " + responseCode);
- var is;
- if (responseCode >= 200 && responseCode < 300) {
- is = conn.getInputStream();
- } else {
- is = conn.getErrorStream();
- }
- if (is == null) {
- printl("[ERROR] 无法获取输入流");
- conn.disconnect();
- return null;
- }
- var reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
- var sb = new StringBuilder();
- var line;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
- reader.close();
- conn.disconnect();
- var responseText = sb.toString();
- printl("[DEBUG] 响应内容: " + responseText);
- // 手动解析 JSON 响应
- return parseJson(responseText);
- } catch (e) {
- printl("[ERROR] HTTP请求失败: " + e.message);
- return null;
- }
- }
- /**
- * 简单 JSON 解析(Rhino 环境下可能没有原生 JSON.parse)
- * 使用 org.json.JSONObject 解析
- */
- function parseJson(jsonStr) {
- try {
- var jsonObj = new org.json.JSONObject(jsonStr);
- return {
- code: jsonObj.optInt("code", -1),
- msg: jsonObj.optString("msg", ""),
- data: parseJsonData(jsonObj)
- };
- } catch (e) {
- printl("[ERROR] JSON解析失败: " + e.message);
- return null;
- }
- }
- /**
- * 解析 data 字段
- */
- function parseJsonData(jsonObj) {
- try {
- if (jsonObj.isNull("data")) return null;
- var dataObj = jsonObj.optJSONObject("data");
- if (dataObj != null) {
- return {
- code: dataObj.optInt("code", -1),
- data: dataObj.optString("data", ""),
- time: dataObj.optString("time", ""),
- score: dataObj.optString("score", ""),
- unique_code: dataObj.optString("unique_code", "")
- };
- }
- return null;
- } catch (e) {
- return null;
- }
- }
- /**
- * 识别验证码
- * @param {string} imagePath - 图片文件路径
- * @param {string} type - 验证码类型ID
- * @returns {object} 识别结果 {success: boolean, data: string, time: string, msg: string}
- */
- function recognizeCaptcha(imagePath, type) {
- printl("[INFO] 开始识别验证码,类型: " + type);
-
- // 1. 图片转 Base64
- var imageBase64 = imageToBase64(imagePath);
- if (!imageBase64) {
- return { success: false, msg: "图片转Base64失败" };
- }
-
- // 2. 构建请求参数
- var postData = {
- token: G.token,
- type: type,
- image: imageBase64
- };
-
- // 3. 发送请求
- printl("[INFO] 正在调用寿司验证码API...");
- var response = httpPost(G.apiUrl, postData);
-
- if (!response) {
- return { success: false, msg: "API请求失败" };
- }
-
- // 4. 解析响应
- var code = response.code;
- var msg = response.msg || "未知错误";
-
- printl("[INFO] API响应码: " + code + ", 消息: " + msg);
-
- if (code === 10000) {
- // 识别成功
- var result = response.data.data;
- var time = response.data.time;
- printl("[SUCCESS] 识别成功!结果: " + result + ", 耗时: " + time + "秒");
- return { success: true, data: result, time: time, msg: msg };
- } else if (code === 10009) {
- // 结果准备中
- printl("[WARN] 结果准备中,请稍后重试");
- return { success: false, msg: "结果准备中" };
- } else {
- // 其他错误
- printl("[ERROR] 识别失败: " + msg);
- return { success: false, msg: msg };
- }
- }
- /**
- * 获取账户余额
- * @returns {object} {success: boolean, score: number, msg: string}
- */
- function getBalance() {
- printl("[INFO] 查询账户余额...");
-
- var postData = {
- token: G.token,
- type: "score"
- };
-
- var response = httpPost(G.userInfoUrl, postData);
-
- if (!response) {
- return { success: false, msg: "查询失败" };
- }
-
- if (response.code === 10001) {
- var score = response.data.score;
- printl("[INFO] 账户余额: " + score + " 积分");
- return { success: true, score: parseFloat(score), msg: "查询成功" };
- } else {
- printl("[ERROR] 查询失败: " + response.msg);
- return { success: false, msg: response.msg };
- }
- }
- /**
- * 报错返分
- * @param {string} uniqueCode - 打码返回的 uniqueCode
- * @returns {object} {success: boolean, msg: string}
- */
- function reportError(uniqueCode) {
- printl("[INFO] 提交报错,uniqueCode: " + uniqueCode);
-
- var postData = {
- token: G.token,
- uniqueCode: uniqueCode
- };
-
- var response = httpPost(G.refundUrl, postData);
-
- if (!response) {
- return { success: false, msg: "报错请求失败" };
- }
-
- if (response.code === 200) {
- printl("[SUCCESS] 报错成功,积分已退还");
- return { success: true, msg: "报错成功" };
- } else {
- printl("[ERROR] 报错失败: " + response.msg);
- return { success: false, msg: response.msg };
- }
- }
- // ============ 主程序 ============
- function main() {
- printl("========================================");
- printl("[INFO] 寿司验证码识别 AIWROK 接入示例");
- printl("========================================");
- // 1. 查询余额
- var balanceResult = getBalance();
- if (balanceResult.success) {
- printl("[INFO] 当前可用积分: " + balanceResult.score);
- } else {
- printl("[WARN] 余额查询失败: " + balanceResult.msg);
- }
- // 2. 截图测试
- printl("[INFO] 开始截图测试...");
- try {
- // 全屏截图,获取图片对象
- var img = screen.screenShotFull();
- if (!img) {
- printl("[ERROR] 截图失败,返回为空");
- return;
- }
- printl("[INFO] 截图成功");
- // 直接将图片转 base64 发送给 API
- var imageBase64 = img.toBase64();
- printl("[INFO] 图片转Base64成功,大小: " + imageBase64.length() + " 字符");
- // 3. 执行识别
- printl("[INFO] 验证码类型: " + G.captchaType);
- printl("[INFO] 正在调用寿司验证码API...");
- var postData = {
- token: G.token,
- type: G.captchaType,
- image: imageBase64
- };
- var response = httpPost(G.apiUrl, postData);
- img.recycle();
- if (!response) {
- printl("[ERROR] API请求失败");
- return;
- }
- var code = response.code;
- var msg = response.msg || "未知错误";
- printl("[INFO] API响应码: " + code + ", 消息: " + msg);
- if (code === 10000 && response.data) {
- printl("========================================");
- printl("[SUCCESS] 识别成功!");
- printl("[INFO] 识别结果: " + response.data.data);
- printl("[INFO] 识别耗时: " + response.data.time + " 秒");
- printl("========================================");
- } else {
- printl("========================================");
- printl("[FAILED] 识别失败");
- printl("[INFO] 失败原因: " + msg);
- printl("========================================");
- }
- } catch (e) {
- printl("[ERROR] 截图异常: " + e.message);
- printl("[ERROR] 异常堆栈: " + e.stack);
- return;
- }
- }
- // 启动主程序
- try {
- main();
- } catch (e) {
- printl("[FATAL] 程序执行异常: " + e.message);
- printl("[FATAL] 堆栈: " + e.stack);
- }
- printl("[INFO] 程序执行完毕");
复制代码
| |  | |  |
|