注册 登录
发贴工具
查看: 5|回复: 0
打印 上一主题 下一主题

[24小时收录超级好的网站] 本地调试版原生websocket版

[复制链接]

2608

主题

2656

帖子

1万

积分

积分
15826
跳转到指定楼层
楼主

本地调试版原生websocket版


本地调试版原生websocket版 群发软件发帖工具
本地调试版原生websocket版 群发软件发帖工具
本地调试版原生websocket版 群发软件发帖工具


  1. /**
  2. * WebSocket 屏幕截图传输 - 本地调试版(AIWROK 原生 websocket 版)
  3. *
  4. * 👉 参考 AIWROK IDE 文档,5 个原生 API 正确签名:
  5. *    void setSocketID(String arg0)
  6. *    void event(Function arg0=连接成功, Function arg1=接收消息,
  7. *               Function arg2=连接失败, Function arg3=断开连接)
  8. *    void connet(String wsUrl)      ← 注意拼写:connet(双n少c,不是 connect)
  9. *    void send(Object msg)
  10. *    void close()
  11. *
  12. * 配合 WebSocket测试服务器 使用
  13. */


  14. print.log("===== WebSocket 屏幕截图传输(AIWROK 原生版)开始 =====");

  15. // ========== 配置 ==========
  16. var config = {
  17.     serverUrl: "192.168.10.103:8886",   // ← 改成 PC 的局域网 IP:端口
  18.     screenshotInterval: 5000,            // 截图间隔(毫秒)
  19.     reconnectInterval: 2500,             // 重连间隔(毫秒)
  20.     maxReconnectAttempts: 10,            // 最大重连次数
  21.     connectWaitSec: 15,                  // 单次连接等待秒数
  22.     runDuration: 30000                   // 总运行时长(毫秒)
  23. };

  24. // ========== 连接状态 ==========
  25. var ws = null;          // websocket 实例
  26. var state = {
  27.     connected: false,
  28.     err: null,
  29.     closed: false,
  30.     saveDir: "",
  31.     saveUrlPrefix: "",
  32.     imgCount: 0,
  33.     reconnectAttempts: 0,
  34.     totalSent: 0
  35. };
  36. var screenshotTimer = null;

  37. // ========== 服务器消息解析 ==========
  38. function parseServerMessage(raw) {
  39.     if (typeof raw !== "string") {
  40.         try { raw = String(raw); } catch (e) { raw = "" + raw; }
  41.     }
  42.     var out = { type: "UNKNOWN", raw: raw };
  43.     if (raw.indexOf("WELCOME|") === 0) {
  44.         out.type = "WELCOME";
  45.         var parts = raw.split("|");
  46.         out.id = parts[1] || "";
  47.         for (var i = 2; i < parts.length; i++) {
  48.             var eqIdx = parts[i].indexOf("=");
  49.             if (eqIdx > 0) out[parts[i].substring(0, eqIdx)] = parts[i].substring(eqIdx + 1);
  50.         }
  51.     } else if (raw.indexOf("IMG_SAVED|") === 0) {
  52.         out.type = "IMG_SAVED";
  53.         var p = raw.split("|");
  54.         out.seq = p[1] || "";
  55.         out.sizeTxt = p[2] || "";
  56.         out.absPath = p[3] || "";
  57.         out.fileUrl = p[4] || "";
  58.     } else if (raw.indexOf("IMG_FAIL|") === 0) {
  59.         out.type = "IMG_FAIL";
  60.     } else if (raw.indexOf("ECHO|") === 0) {
  61.         out.type = "ECHO";
  62.         out.text = raw.substring("ECHO|".length);
  63.     }
  64.     return out;
  65. }

  66. // ========== 核心:用 AIWROK 原生 5 API 建立连接 ==========
  67. function initWebSocket() {
  68.     // 重置状态
  69.     state.connected = false;
  70.     state.err = null;
  71.     state.closed = false;

  72.     // ① 创建
  73.     ws = new websocket();

  74.     // ② setSocketID
  75.     try { ws.setSocketID("screen_" + (new Date().getTime())); }
  76.     catch (e) { printl("  ⚠️  setSocketID 忽略异常: " + e.message); }

  77.     // ③ event(4 个位置回调,顺序不能错!)
  78.     //   arg0 = 连接成功   arg1 = 接收消息   arg2 = 连接失败   arg3 = 断开
  79.     try {
  80.         ws.event(
  81.             function () {                              // arg0 连接成功
  82.                 state.connected = true;
  83.                 state.err = null;
  84.                 state.reconnectAttempts = 0;
  85.                 print.log("WS: onopen");
  86.                 printl("✅ 连接成功(onopen)");
  87.                 startScreenshotTimer();
  88.             },
  89.             function (msg) {                           // arg1 接收消息
  90.                 var raw;
  91.                 try { raw = String(msg); } catch (e) { raw = ""; }
  92.                 print.log("WS: onmessage len=" + raw.length);
  93.                 var parsed = parseServerMessage(raw);

  94.                 if (parsed.type === "WELCOME") {
  95.                     state.saveDir = parsed.save_dir || "";
  96.                     state.saveUrlPrefix = parsed.save_file_url || "";
  97.                     printl("&#128233; WELCOME " + parsed.id);
  98.                     if (state.saveDir) {
  99.                         printl("&#128193; 保存目录: " + state.saveDir);
  100.                         printl("&#128279; 目录URL: " + state.saveUrlPrefix);
  101.                     }
  102.                 } else if (parsed.type === "IMG_SAVED") {
  103.                     printl("&#128190; PC 已保存图片 " + parsed.seq);
  104.                     printl("    大小: " + parsed.sizeTxt);
  105.                     printl("    路径: " + parsed.absPath);
  106.                     printl("    � " + parsed.fileUrl);
  107.                 } else if (parsed.type === "IMG_FAIL") {
  108.                     printl("&#128308; 服务器保存失败: " + raw);
  109.                 } else if (parsed.type === "ECHO") {
  110.                     printl("&#128233; 回显: " + parsed.text.substring(0, 150));
  111.                 } else {
  112.                     printl("&#128233; 收到: " + raw.substring(0, 200) + (raw.length > 200 ? "..." : ""));
  113.                 }
  114.             },
  115.             function (err) {                           // arg2 连接失败
  116.                 var msg = "";
  117.                 try { msg = String(err); } catch (e) {}
  118.                 state.err = msg || "连接失败";
  119.                 state.connected = false;
  120.                 print.log("WS: onerror " + msg);
  121.                 printl("❌ 连接失败(onerror): " + msg);
  122.                 stopScreenshotTimer();
  123.                 reconnectWebSocket();
  124.             },
  125.             function () {                              // arg3 断开
  126.                 state.closed = true;
  127.                 state.connected = false;
  128.                 print.log("WS: onclose");
  129.                 printl("⚪ 连接断开(onclose)");
  130.                 stopScreenshotTimer();
  131.                 reconnectWebSocket();
  132.             }
  133.         );
  134.     } catch (e) {
  135.         printl("❌ event(4回调) 注册失败: " + e.message);
  136.         reconnectWebSocket();
  137.         return;
  138.     }

  139.     // ④ connet(双 n 少 c,千万别写成 connect)
  140.     try {
  141.         var url = "ws://" + config.serverUrl;
  142.         printl("正在连接: " + url + "(" + config.connectWaitSec + " 秒超时)");
  143.         print.log("调用 connet(" + url + ")");
  144.         ws.connet(url);
  145.     } catch (e) {
  146.         printl("❌ connet 抛异常: " + e.message);
  147.         state.err = e.message;
  148.         reconnectWebSocket();
  149.         return;
  150.     }

  151.     // 同步等待:如果在 connectWaitSec 秒内既没触发 onopen 也没 onerror,就当作失败
  152.     var waited = 0;
  153.     while (!state.connected && !state.err && waited < config.connectWaitSec * 1000) {
  154.         sleep.millisecond(100);
  155.         waited += 100;
  156.     }
  157.     if (!state.connected && !state.err) {
  158.         state.err = "连接超时(" + config.connectWaitSec + " 秒内没有 onopen/onerror)";
  159.         printl("❌ " + state.err);
  160.         reconnectWebSocket();
  161.     }
  162. }

  163. // ========== 断线重连 ==========
  164. function reconnectWebSocket() {
  165.     if (state.reconnectAttempts >= config.maxReconnectAttempts) {
  166.         printl("&#128721; 已达到最大重连次数 " + config.maxReconnectAttempts + ",停止重连");
  167.         return;
  168.     }
  169.     state.reconnectAttempts++;
  170.     printl("⏱️  重连 " + state.reconnectAttempts + "/" + config.maxReconnectAttempts + "," + (config.reconnectInterval / 1000) + " 秒后重试...");
  171.     printl("重连 " + state.reconnectAttempts + "/" + config.maxReconnectAttempts);

  172.     // 先关旧连接
  173.     try { if (ws) ws.close(); } catch (e) {}
  174.     ws = null;

  175.     setTimeout(function () {
  176.         initWebSocket();
  177.     }, config.reconnectInterval);
  178. }

  179. // ========== 截图并发送 ==========
  180. function sendScreenshot() {
  181.     if (!ws || !state.connected) {
  182.         print.log("跳过截图:未连接");
  183.         return;
  184.     }
  185.     try {
  186.         print.log("&#128248; 截取屏幕...");
  187.         printl("&#128248; 截图中...");

  188.         var screenshot = screen.screenShotFull();
  189.         if (!screenshot) { printl("❌ 截图失败"); return; }

  190.         print.log("&#128260; 转 Base64...");
  191.         var base64Data = "" + screenshot.toBase64();   // 强转成 JS 字符串

  192.         var sizeChars = base64Data.length;
  193.         var sizeKB = Math.round((sizeChars * 0.75) / 1024);   // 粗略估算真实字节
  194.         printl("&#128230; 图片大小: " + sizeChars + " 字符(约 " + sizeKB + " KB)");

  195.         try { screenshot.recycle(); } catch (e) {}   // 释放 Java Bitmap 内存

  196.         state.totalSent++;
  197.         printl("&#128228; 发送图片 #" + state.totalSent + " ...");
  198.         ws.send(base64Data);
  199.         state.imgCount++;
  200.         printl("✅ 已发送图片 #" + state.totalSent + "(" + sizeKB + " KB)");

  201.     } catch (e) {
  202.         printl("❌ 发送截图出错: " + e.message);
  203.         print.log("sendScreenshot 异常: " + e.message);
  204.     }
  205. }

  206. // ========== 定时截图定时器 ==========
  207. function startScreenshotTimer() {
  208.     if (screenshotTimer) { try { clearInterval(screenshotTimer); } catch (e) {} }

  209.     print.log("启动定时截图,间隔 " + config.screenshotInterval + " 毫秒");
  210.     printl("⏰ 定时截图已启动(间隔 " + (config.screenshotInterval / 1000) + " 秒)");

  211.     // 立即发第一张
  212.     setTimeout(function () { sendScreenshot(); }, 300);

  213.     screenshotTimer = setInterval(function () {
  214.         if (state.connected) sendScreenshot();
  215.     }, config.screenshotInterval);
  216. }

  217. function stopScreenshotTimer() {
  218.     if (screenshotTimer) {
  219.         try { clearInterval(screenshotTimer); } catch (e) {}
  220.         screenshotTimer = null;
  221.         print.log("停止定时截图");
  222.     }
  223. }

  224. // ========== 关闭连接 ==========
  225. function disconnectWebSocket() {
  226.     stopScreenshotTimer();
  227.     if (ws) {
  228.         try { ws.close(); } catch (e) {}
  229.         ws = null;
  230.     }
  231.     state.connected = false;
  232.     state.closed = true;
  233.     printl("&#128268; 已关闭连接");
  234. }

  235. // ========== 主程序入口 ==========
  236. function main() {
  237.     try {
  238.         printl("========================================");
  239.         printl("  WebSocket 屏幕截图传输 - 原生版");
  240.         printl("  服务器: " + config.serverUrl);
  241.         printl("  总运行: " + (config.runDuration / 1000) + " 秒    截图间隔: " + (config.screenshotInterval / 1000) + " 秒");
  242.         printl("  连接API: setSocketID → event(4回调) → connet → send → close");
  243.         printl("========================================");
  244.         printl("ℹ️ 确保 PC 已运行: python WebSocket测试服务器");

  245.         // 启动连接(带异步重试)
  246.         initWebSocket();

  247.         // 总运行时长倒计时
  248.         print.log("运行 " + (config.runDuration / 1000) + " 秒后自动结束");
  249.         printl("⏳ 运行 " + (config.runDuration / 1000) + " 秒后自动结束");
  250.         sleep.millisecond(config.runDuration);

  251.         // 结束
  252.         disconnectWebSocket();

  253.         printl("");
  254.         printl("===== 执行结束 =====");
  255.         printl("  尝试发送: " + state.totalSent + " 张");
  256.         printl("  计数显示: " + state.imgCount + " 张");
  257.         if (state.saveDir) printl("  PC 保存目录: " + state.saveDir);
  258.         print.log("===== 屏幕截图传输结束,发送 " + state.totalSent + " 张 =====");

  259.     } catch (e) {
  260.         print.log("主程序异常: " + e.message);
  261.         printl("❌ 程序错误: " + e.message);
  262.         try { disconnectWebSocket(); } catch (e2) {}
  263.     }
  264. }

  265. main();
复制代码



unto无障碍方式双指向中间滑动放大缩小完整示例nextnocontent
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读了
    采集亚马逊正版群发工具有没有?
    Apr.20旅行X心语今天来说说YYPOST新功能的一个灵活用法,采集亚马逊商品信息,并且获得排名的软件,亚马逊现在越来越多客户做,淘宝的水是越来越清了,以前做电商的客户,现在都转战到外国,最赚钱的要数一些客户往亚马逊里堆了吧,拿我这个YYPOST的客户,最多的是采集,分析排名,刷价格,刷数量,改价,刷访问量等等技术

    企业发展B2B网站有什么东东软件可以发呢
    标题企业发展网B2B软件,现在虽然B2B网站收录不错,可愁的是心急的人们,他们太想一口吃撑胖子了,发帖宣传虽然不能像佛系那样淡定,但也不能像跑火车那般急躁对待,自己内容不收录,完全是自己操作内容问题,可以参考一下别人的内容是怎么弄的,然后自己要试着转变,而且收录这个内容,常常会变化的,不是一种规则就吃到老

    搜房天下房聊软件哪一个好呢
    本帖最后由 发帖软件 于 2019-5-22 16:15 编辑 2搜房天下群发房聊信息软件,开始本来打算做58同城的,但发一个就要一次点触验证码,这就让人没有感觉到存在的价值了吧,都是卖二手房和新房的搜房天下倒是可以发即时聊天信息,也没有发现他这个网站有啥子限制,登陆一个搜房天下账号,然后采集回来分类列表的网址,然后就一

    大家坛有没有好用的群发工具下载呢
    当你的笑容给我礼貌的招呼,大家坛全自动发帖软件,宣传推广是一场持久战,总是有一些人把软件用了一天,或是几个小时,就觉得自己付出太多了,那加进来的粉丝,或是流量,应该是和宣传多少成正比的,其实没有这么便宜的事,就像很多阅读量超过一百万的视频,或是电影,真正会在屏幕打赏的人不会超过三千,真正大额打赏给主

    群发正版软件中国塑料网
    中国塑料网群发软件YYPOST脚本下载地址,这个网站会有一个很奇怪的问题就是你在首页登陆无半个验证码,但在登陆网址登陆就会有一个验证码,所以我们灵活一些,在首页登陆就不用输入验证码了哈。网站秒收录比较高,但发的都是五金和建筑行业,先前有很多人都是发土建工程的大公司操作的,现在这个网站专为那个行业诞生的吧。

    OpenStreetMap网站正版2019年发帖工具下载
    本帖最后由 发帖软件 于 2019-5-21 11:13 编辑 OpenStreetMap网站全自动群发,OpenStreetMapOpenStreetMap(简称OSM,中文是公开地图)是一个网上地图协作计划,目标是创造一个内容自由且能让所有人编辑的世界地图。有的人编辑地图然后等收录,有的人发日志等收录,我们这里也是利用地图日志做为宣传的目标,简单的脚本理

    搜房天下全自动收短信全自动识别验证码注册账号软件
    房天下自动注册机,这个脚本是前几天发房聊的脚本廷伸品种,这个脚本能做到自动注册账号,自动保存账号,自动发房聊的效果,不过今天我们主要说一说怎么注册账号写脚本吧,这个搜房天天下的账号,可以发提问,可以发房聊,发论坛,发博客,还有发个人中心页都是有秒收的效果的,这样就省去了去买号,去乱花钱的效果了吧,而

    企业邮箱安卓端有什么APP软件可以发的呢
    请输入标题企业邮箱安卓发发送邮箱脚本,这个脚本是利用企业邮箱进行群发的,全程是一种模拟手工操作的过程,所以封号是很少的,而且企业邮箱群发到普通QQ邮箱不容易进垃圾箱中的,所以这个脚本也是这样的原理,不过最好是利用一些多开器,登陆多点的QQ邮箱账号会比较流畅一些,然后用软件一个一个的切换APP进行群发邮件会

    头条留评论软件有没有好用的呢?
    今天整一个今日头条留言软件,对于留言YYPOST是优势是比较大的存在,因为他往往专注一些下拉定位的优点,像今日头条这样,还是需要一些特殊下拉定位的,因为他新闻有长有短,有图有视频的,所以综合起来定位是比较难的,如果用POST也不是很轻松可以破解他的加密参数。这个脚本也是有一个不好的地方就是换号会比较麻烦,您电

    单网页生成神器
    最近新技术,网页生成机占领了整个网络的半壁江山,效果很疯狂,虽然不知道能持续多久,作为开发软件的领头者,一直在找收录的方法,一直在努力创新着,一直被人模仿,却从没有被超越过,这个网页生成机,已经出来有一段时间了,一直没有拿出来分享,醉过醉过,它是利用的一些小小收录漏洞整的,您最好用一些老站域名,进行

关闭
快速回复 返回列表 返回顶部
本站自动发贴软件,是现在最流行的做脚本软件,这种发贴工具,不但发贴收录快,而且抢占好的先机,完全自由编辑,实现针对性群发模拟操作,软件可以顶贴,也可以发贴,可以兼容支持Discuz、PHPWind、Dvbbs三大主流论坛,有手机验证码收件,邮件收发的功能,支持验证码识别,注册问题识别,多线程任务,自动上传头像,自动激活注册邮件,兼容防注册插件,本站软件原创正版,更新效率最快的原创软件。 『网络推广软件』『自动发帖软件』『 自动发帖