信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1|回复: 0
打印 上一主题 下一主题

[宣传软件网站动态] 整点抢购倒计时倒计时悬浮卡片

[复制链接]

810

主题

894

帖子

5722

积分

积分
5722

资讯缩略图:

资讯发布日期:2026-10-13

资讯发布简介:整点抢购倒计时倒计时悬浮卡片

资讯关键词:整点抢购倒计时倒计时悬浮卡片

资讯所属分类:IT资讯 

联系:

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件网站分类目录 网址:http://www.postbbs.com/

资讯详细描述
整点抢购倒计时倒计时悬浮卡片
整点抢购倒计时倒计时悬浮卡片 b2b软件

整点抢购倒计时倒计时悬浮卡片 b2b软件

整点抢购倒计时倒计时悬浮卡片 b2b软件

  1. /**
  2. * ╔══════════════════════════════════════════════════════════╗
  3. * ║   案例 7:整点抢购倒计时倒计时悬浮卡片
  4. * ║   知识点:高精度定时(分段等待 + 提前量)、              ║
  5. * ║          倒计时悬浮卡片、uiPost 线程调度、               ║
  6. * ║          安全点击封装(touch/无障碍降级)、              ║
  7. * ║          命中误差统计、event.onStopBtnEvent              ║
  8. * ╚══════════════════════════════════════════════════════════╝
  9. *
  10. * 目标:全网最经典的"抢购/抢茅台/抢优惠券"套路——
  11. *       1. 屏幕上挂一个倒计时大字卡片
  12. *       2. 粗等 → 细等 → 自旋,三段式逼近目标时间
  13. *       3. 提前 LEAD_MS 毫秒出手(补偿点击本身的耗时)
  14. *       4. 到点连点 3 下,统计实际命中误差
  15. * 难度:★★★☆☆
  16. * 运行:无障碍服务即可;USE_DEMO=true 不用改时间直接看效果
  17. */

  18. // ==================== 第 0 步:配置区(改这里)====================
  19. var USE_DEMO = true;    // true:10 秒后开抢(演示用);false:按下面的整点时间
  20. var DEMO_SECONDS = 10;  // 演示模式:多少秒后开抢
  21. var BUY_HOUR = 10, BUY_MIN = 0, BUY_SEC = 0;  // 真实模式:每天 10:00:00 抢
  22. var LEAD_MS = 80;       // 提前量:点击动作本身约耗时 60~100ms,提前出手才准
  23. var CLICK_TIMES = 3;    // 到点连点几下(抢购页面经常要点多次才进)
  24. var DEMO_KEY_FEEDBACK = true;  // 出手后模拟按一次 HOME 键,让演示肉眼可见(真实用设 false)

  25. // ==================== 顶部:全局变量声明 ====================
  26. var gWin = null;        // 悬浮窗对象
  27. var gTvTitle = null;    // 标题(目标时刻)
  28. var gTvCount = null;    // 倒计时大字
  29. var gTvStatus = null;   // 状态行
  30. var gTvResult = null;   // 结果行(命中误差)
  31. var gTargetTs = 0;      // 目标时间戳(毫秒)
  32. var gStruck = false;    // 是否已出手
  33. var gStopTick = false;  // 倒计时线程退出标志

  34. // ==================== 调色板 ====================
  35. var C_BG = "#CC0B1220";   // 卡片底(深蓝黑)
  36. var C_HEAD = "#F43F5E";   // 标题栏(玫红,抢购氛围)
  37. var C_PANEL = "#0F172A";  // 面板
  38. var C_TEXT = "#E2E8F0";   // 正文
  39. var C_OK = "#4ADE80";     // 成功(绿)
  40. var C_WARN = "#FBBF24";   // 提醒(黄)
  41. var C_ERR = "#F87171";    // 失败(红)
  42. var C_DIM = "#64748B";    // 暗灰

  43. // ==================== 工具函数(先定义,后使用)====================

  44. function doSleep(ms) {
  45.     try { java.lang.Thread.sleep(ms); } catch (e) {}
  46. }

  47. function now() { return new Date().getTime(); }

  48. function pad2(n) { return (n < 10 ? "0" : "") + n; }

  49. // 时间戳 → "10:00:00.000"(毫秒也要,抢购看得清)
  50. function formatMs(ts) {
  51.     var d = new Date(ts);
  52.     return pad2(d.getHours()) + ":" + pad2(d.getMinutes()) + ":" +
  53.            pad2(d.getSeconds()) + "." +
  54.            (d.getMilliseconds() < 100 ? (d.getMilliseconds() < 10 ? "00" : "0") : "") +
  55.            d.getMilliseconds();
  56. }

  57. // 安全点击:touch.tap(无障碍)优先,失败兜底 auto.clickPoint
  58. function safeClick(x, y) {
  59.     try { touch.tap(x, y); }
  60.     catch (e) { auto.clickPoint(x, y); }
  61. }

  62. // ==================== UI 线程调度(案例6 的教训,直接复用)====================
  63. // 从脚本线程 setText 不会触发重新测量,大字倒计时会卡住不刷新,必须 post 到 UI 线程
  64. function uiPost(view, fn) {
  65.     if (view && view.post) {
  66.         try { view.post(fn); return; } catch (e) {}
  67.     }
  68.     try { fn(); } catch (e2) {}
  69. }

  70. function setCountdown(text, color) {
  71.     var c = color;
  72.     uiPost(gTvCount, function () {
  73.         try {
  74.             gTvCount.setText(text);
  75.             gTvCount.setTextColor(android.graphics.Color.parseColor(c));
  76.         } catch (e) {}
  77.     });
  78. }

  79. function setStatus(text, color) {
  80.     var shown = "⏳ " + text, c = color;
  81.     uiPost(gTvStatus, function () {
  82.         try {
  83.             gTvStatus.setText(shown);
  84.             gTvStatus.setTextColor(android.graphics.Color.parseColor(c));
  85.         } catch (e) {}
  86.     });
  87. }

  88. function setResult(text, color) {
  89.     var shown = text, c = color;
  90.     uiPost(gTvResult, function () {
  91.         try {
  92.             gTvResult.setText(shown);
  93.             gTvResult.setTextColor(android.graphics.Color.parseColor(c));
  94.         } catch (e) {}
  95.     });
  96. }

  97. // ==================== 第 1 步:创建倒计时卡片 ====================
  98. function initFloatWindow() {
  99.     var sw = screen.getScreenWidth();
  100.     var sh = screen.getScreenHeight();
  101.     var w = Math.floor(sw * 0.62);   // 宽 62%
  102.     var h = Math.floor(sh * 0.20);   // 高 20%
  103.     var x = Math.floor((sw - w) / 2);        // 水平居中
  104.     var y = Math.floor(sh * 0.30);           // 距顶部 30%

  105.     // 结构:标题栏 → 大字倒计时 → 状态行 → 结果行
  106.     var xml =
  107.         '<LinearLayout orientation="vertical" w="' + w + '" h="' + h +
  108.         '" background="' + C_BG + '" padding="4">' +

  109.         '<LinearLayout orientation="horizontal" w="fill_parent" h="wrap_content" ' +
  110.         'background="' + C_HEAD + '" padding="6">' +
  111.         '  <TextView text="⚡ 整点抢购" textColor="#FFFFFF" textSize="13" textStyle="bold"/>' +
  112.         '  <TextView id="target" text="" textColor="#FFE4E6" textSize="11" ' +
  113.         'w="fill_parent" gravity="right"/>' +
  114.         '</LinearLayout>' +

  115.         '<LinearLayout orientation="vertical" w="fill_parent" h="fill_parent" ' +
  116.         'background="' + C_PANEL + '" padding="8">' +
  117.         '  <TextView id="countdown" text="00:00" textColor="' + C_WARN + '" ' +
  118.         'textSize="34" textStyle="bold" gravity="center" w="fill_parent"/>' +
  119.         '  <TextView id="statusLine" text="⏳ 准备中..." textColor="' + C_DIM + '" ' +
  120.         'textSize="12" gravity="center" w="fill_parent" padding="4"/>' +
  121.         '  <TextView id="resultLine" text="" textColor="' + C_OK + '" ' +
  122.         'textSize="12" gravity="center" w="fill_parent"/>' +
  123.         '</LinearLayout>' +

  124.         '</LinearLayout>';

  125.     try {
  126.         gWin = new floatUI();
  127.         gWin.loadXML(xml);
  128.         gWin.setPosition(x, y);   // loadXML 成功后再调用
  129.         gTvTitle  = gWin.findViewById("target");
  130.         gTvCount  = gWin.findViewById("countdown");
  131.         gTvStatus = gWin.findViewById("statusLine");
  132.         gTvResult = gWin.findViewById("resultLine");
  133.         printl("[卡片] 创建成功 pos=(" + x + "," + y + ") size=" + w + "x" + h);
  134.         return true;
  135.     } catch (e) {
  136.         printl("[卡片] 创建失败: " + e);
  137.         return false;
  138.     }
  139. }

  140. // ==================== 第 2 步:算目标时间 ====================
  141. // 演示模式:现在 + N 秒;真实模式:今天的整点,已过则顺延到明天
  142. function calcTargetTime() {
  143.     if (USE_DEMO) {
  144.         uiPost(gTvTitle, function () { try { gTvTitle.setText("演示模式"); } catch (e) {} });
  145.         return now() + DEMO_SECONDS * 1000;
  146.     }
  147.     var t = new Date();
  148.     t.setHours(BUY_HOUR, BUY_MIN, BUY_SEC, 0);
  149.     if (t.getTime() <= now()) t.setDate(t.getDate() + 1);   // 过点了就等明天
  150.     var label = BUY_HOUR + ":" + pad2(BUY_MIN) + ":" + pad2(BUY_SEC);
  151.     uiPost(gTvTitle, function () {
  152.         try { gTvTitle.setText("目标 " + label); } catch (e) {}
  153.     });
  154.     return t.getTime();
  155. }

  156. // ==================== 第 3 步:倒计时线程 ====================
  157. // 每 100ms 刷一次大字,直到出手为止(gStopTick 控制退出)
  158. function startCountdownThread() {
  159.     new thread().runJsCode(function () {
  160.         while (!gStopTick) {
  161.             if (gStruck) break;
  162.             var remain = gTargetTs - now();
  163.             if (remain <= 0) {
  164.                 setCountdown("抢!", C_ERR);
  165.                 break;
  166.             }
  167.             // 剩 1 秒内显示毫秒,最后阶段更有紧张感
  168.             if (remain < 1000) {
  169.                 setCountdown(remain + "ms", C_ERR);
  170.             } else {
  171.                 var s = Math.ceil(remain / 1000);
  172.                 setCountdown(pad2(Math.floor(s / 60)) + ":" + pad2(s % 60), C_WARN);
  173.             }
  174.             doSleep(100);
  175.         }
  176.     }, "倒计时线程");
  177.     printl("[线程] 倒计时线程已启动");
  178. }

  179. // ==================== 第 4 步:三段式高精度等待 ====================
  180. // 粗等:每次睡 100ms,到目标前 500ms 停(避免睡过头)
  181. // 细等:每次睡 10ms,到目标前 LEAD_MS 停
  182. // 自旋:busy-wait 精确到 1ms,保证出手时刻精准
  183. // 为什么要提前 LEAD_MS:从"判断到点"到"点击落到屏幕"本身要几十毫秒,
  184. //                      提前出手,点击动作才正好压在目标时刻上
  185. function preciseWait(targetTs) {
  186.     // 段 1:粗等
  187.     while (targetTs - now() > 500) {
  188.         doSleep(Math.min(100, targetTs - now() - 500));
  189.     }
  190.     // 段 2:细等
  191.     while (targetTs - now() > LEAD_MS + 20) {
  192.         doSleep(10);
  193.     }
  194.     // 段 3:自旋到出手时刻
  195.     var fireAt = targetTs - LEAD_MS;
  196.     while (now() < fireAt) {
  197.         // busy-wait,不睡,精确咬住毫秒
  198.     }
  199. }

  200. // ==================== 第 5 步:出手(到点连点)====================
  201. function strike() {
  202.     var sw = screen.getScreenWidth();
  203.     var sh = screen.getScreenHeight();
  204.     // 演示:点屏幕中央;真实场景改成抢购按钮的坐标(用识图/找字定位)
  205.     var cx = Math.floor(sw * 0.5);
  206.     var cy = Math.floor(sh * 0.5);

  207.     gStruck = true;
  208.     setStatus("出手!", C_ERR);

  209.     var fireTs = now();
  210.     for (var i = 0; i < CLICK_TIMES; i++) {
  211.         safeClick(cx + rand(-6, 6), cy + rand(-6, 6));   // 随机偏移防检测
  212.         doSleep(40);   // 连点间隔 40ms,太快会被系统吞掉
  213.     }

  214.     // 误差 = 实际出手 - 目标(负数 = 提前,正数 = 迟到)
  215.     var error = fireTs - gTargetTs;
  216.     var line = "✅ 出手于 " + formatMs(fireTs) + " 误差 " +
  217.                (error >= 0 ? "+" : "") + error + "ms(提前量 " + LEAD_MS + "ms)";
  218.     setResult(line, Math.abs(error) <= 30 ? C_OK : C_WARN);
  219.     setStatus("抢购完成,3 秒后自动收起", C_OK);
  220.     printl(line);

  221.     // ---- 演示反馈:出手动作要肉眼可见 ----
  222.     // toast 提示出手时刻和误差(放在点击之后,不能占用出手时机的时间)
  223.     try { toast.show("⚡ 已出手!连点 " + CLICK_TIMES + " 次,误差 " +
  224.                      (error >= 0 ? "+" : "") + error + "ms"); } catch (e) {}
  225.     // 模拟按键反馈:出手后按一次 HOME 键,屏幕会明显回到桌面
  226.     if (DEMO_KEY_FEEDBACK) {
  227.         doSleep(300);
  228.         try {
  229.             auto.home();
  230.             printl("[反馈] 已模拟按 HOME 键");
  231.         } catch (e) { printl("[反馈] 按键模拟失败: " + e); }
  232.     }
  233. }

  234. function rand(a, b) { return a + Math.floor(Math.random() * (b - a + 1)); }

  235. // ==================== 第 6 步:优雅停止 ====================
  236. // 清理动作放前面,runTime.stopAllRuning() 必须放最后
  237. function cleanup() {
  238.     gStopTick = true;
  239.     setStatus("已手动停止", C_DIM);
  240.     doSleep(300);
  241.     try { if (gWin) { gWin.close(); gWin = null; } } catch (e) {}
  242.     printl("[清理] 倒计时卡片已关闭");
  243.     runTime.stopAllRuning();   // 最后才停所有线程
  244.     stop();
  245. }

  246. event.onStopBtnEvent(function () {
  247.     cleanup();
  248. });

  249. // ==================== 第 7 步:主流程 ====================
  250. function runMain() {
  251.     printl("╔══════════════════════════════════════════╗");
  252.     printl("║  案例7:整点抢购倒计时(精准定时)        ║");
  253.     printl("╚══════════════════════════════════════════╝");

  254.     if (!initFloatWindow()) {
  255.         printl("悬浮卡片创建失败,脚本退出");
  256.         return;
  257.     }

  258.     gTargetTs = calcTargetTime();
  259.     printl("[目标] " + formatMs(gTargetTs) + "(" +
  260.            (gTargetTs - now()) + "ms 后)");
  261.     setStatus("等待开抢,提前量 " + LEAD_MS + "ms", C_WARN);
  262.     try {
  263.         toast.show("⚡ 倒计时开始:" + Math.round((gTargetTs - now()) / 1000) +
  264.                    " 秒后出手,注意看悬浮卡片");
  265.     } catch (e) {}

  266.     startCountdownThread();
  267.     doSleep(500);

  268.     // 三段式逼近目标时刻
  269.     preciseWait(gTargetTs);

  270.     // 到点出手
  271.     strike();

  272.     // 让观众看清结果,再收尾
  273.     doSleep(3000);
  274.     cleanup();
  275. }

  276. runMain();
复制代码




untofloatUI深色控制台风格悬浮窗日志nextnocontent
回复

使用道具 举报

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

本版积分规则

相关导读
信息发布软件整点抢购倒计时倒计时悬浮卡片
整点抢购倒计时倒计时悬浮卡片
信息发布软件floatUI深色控制台风格悬浮窗日志
floatUI深色控制台风格悬浮窗日志
信息发布软件FTP单文件运行例子
FTP单文件运行例子
信息发布软件短信验证码中心AIWROK万能调用端
短信验证码中心AIWROK万能调用端
信息发布软件小红书养号脚本真实项目架
小红书养号脚本真实项目架
信息发布软件OCR智能识别找字点击
OCR智能识别找字点击
信息发布软件自定义悬浮操作球可拖动小球点按展开
自定义悬浮操作球可拖动小球点按展开
信息发布软件后台子线程runJsFile和runOnUiThread实时反馈
后台子线程runJsFile和runOnUiThread实时反馈 https://www.yuque.com/aiwork/nba2pr/emximr9gu1eui3tp
信息发布软件AIWROK软件双窗口悬浮日志系统
AIWROK软件双窗口悬浮日志系统
信息发布软件多线程GET下载轮询等待工具
多线程GET下载轮询等待工具
信息发布软件AIWROK软件JSON请求完整示例
AIWROK软件JSON请求完整示例
群发软件触摸手势识别悬浮画板自动执行助手
触摸手势识别悬浮画板自动执行助手
群发软件AIWROK 屏幕触摸事件监听工具
AIWROK 屏幕触摸事件监听工具
群发软件AIWROK 日志打印方法完整集合
AIWROK 日志打印方法完整集合
群发软件AIWROK软件的Base64工具集
AIWROK软件的Base64工具集
群发软件速识别验证码识别平台 AIWROK 接入示例
速识别验证码识别平台 AIWROK 接入示例
群发软件悬浮窗控制台floatUI 可拖动悬浮窗 + 按钮控制
悬浮窗控制台floatUI 可拖动悬浮窗 + 按钮控制
群发软件日志分级落盘配置持久化任务调度
日志分级落盘配置持久化任务调度
群发软件贝塞尔曲线滑动的实际演示
贝塞尔曲线滑动的实际演示
群发软件通用找图OCR点字完整脚本骨架
通用找图OCR点字完整脚本骨架
群发软件AIWROK函数没定义就调用脚本直接崩
AIWROK函数没定义就调用脚本直接崩
群发软件本地部署局域网内YOLO自动识别快手图标
本地部署局域网内YOLO自动识别快手图标
群发软件MQTT远程本地局域网OCR例子
MQTT远程本地局域网OCR例子
群发软件AIWROK手机指挥台停止与开始执行器
AIWROK手机指挥台停止与开始执行器 https://www.yuque.com/aiwork/nba2pr/ssiowosqrnpscnef
群发软件AIWROK手机执行器MQTT浏览器控端
AIWROK手机执行器MQTT浏览器控端 https://www.yuque.com/aiwork/nba2pr/lalkm8cfnhswdrx8
群发软件MQTT协议示例AIWROK版
MQTT协议示例AIWROK版 https://www.yuque.com/aiwork/nba2pr/gw970kaylsvz7eyl
群发软件WSS协议示例 AIWROK 版websocket
WSS协议示例 AIWROK 版websocket
群发软件本地电脑部署YOLO找图服务器识别
本地电脑部署YOLO找图服务器识别 YOLO-Server.exe 下载服务器中转
群发软件AIWROK软件关闭/点赞场景 YOLOv5 检测示例
AIWROK软件关闭/点赞场景 YOLOv5 检测示例 https://www.yuque.com/aiwork/nba2pr/cx3tzty1qm0xeg7u
群发软件⛓️WebSocket带截图/点击/滑屏/按键/跑脚本/状态查询
⛓️WebSocket带截图/点击/滑屏/按键/跑脚本/状态查询
群发软件七猫阅读赚钱自动刷框架
七猫阅读赚钱自动刷框架
群发软件websocket远程停止手机接收器
websocket远程停止手机接收器
群发软件AIWROK软件本地搭建OCR找字服务器
AIWROK软件本地搭建OCR找字服务器
群发软件本地调试版原生websocket版
本地调试版原生websocket版
群发软件无障碍方式双指向中间滑动放大缩小完整示例
无障碍方式双指向中间滑动放大缩小完整示例
群发软件AIWROK双指向中间滑动捏合手势完整示例
AIWROK双指向中间滑动捏合手势完整示例
群发软件实战使用桌面控制WebSocket
实战使用桌面控制WebSocket
群发软件WebSocket调试okhttp版
WebSocket调试okhttp版
群发软件快手极速版自动刷视频
快手极速版自动刷视频
群发软件极速视频APP刷金币
极速视频APP刷金币
群发软件语音合成核心模块AIWROK 单文件版
语音合成核心模块AIWROK 单文件版
群发软件AIWROK软件自动文字转语音例子
AIWROK软件自动文字转语音例子
群发软件AIWROK adb.exec() 实用工具库 —— 常用功能直接调用版
AIWROK adb.exec() 实用工具库 —— 常用功能直接调用版
群发软件安卓AIWROK获取包名所有方法汇总
安卓AIWROK获取包名所有方法汇总
群发软件AIWROK软件番茄小说自动阅读刷金币示例
AIWROK软件番茄小说自动阅读刷金币示例
信息发布软件AIWROK软件无碍模式一键删除所有APP版示例
AIWROK软件无碍模式一键删除所有APP版示例
信息发布软件AIWROK软件无碍模式auto模块抖音极速版滑动刷视频
AIWROK软件无碍模式auto模块抖音极速版滑动刷视频
信息发布软件快手极速版自动刷视频无障碍模式
快手极速版自动刷视频无障碍模式
信息发布软件AIWROK软件代理模式一键删除桌面所有APP版示例
AIWROK软件代理模式一键删除桌面所有APP版示例
信息发布软件AIWROK软件自动找图利用agent代理模式删除应用版示例
AIWROK软件自动找图利用agent代理模式删除应用版示例
信息发布软件解析Kimi返回的拖动距离示例
解析Kimi返回的拖动距离示例
信息发布软件自动截图并发送给DEEPSEEK识别示例过程
自动截图并发送给DEEPSEEK识别示例过程
信息发布软件AIWROK软件测试文心识别识别验证码示例
AIWROK软件测试文心识别识别验证码示例
信息发布软件元宝截图B站验证码示例测试
元宝截图B站验证码示例测试
信息发布软件示例千问自动采集文章保存记事本
示例千问自动采集文章保存记事本
信息发布软件豆包识别验证码加拖动验证码示例
豆包识别验证码加拖动验证码示例
信息发布软件豆包对话采集示例
豆包对话采集示例
信息发布软件启动自动百度贴吧发图片
启动自动百度贴吧发图片
信息发布软件自动百度贴吧示例
自动百度贴吧示例
信息发布软件代理模式简书自动流程
代理模式简书自动流程
信息发布软件启动极速版任务页看小说赚钱自动阅读
启动极速版任务页看小说赚钱自动阅读
信息发布软件agent代理模式功能小结
agent代理模式功能小结
信息发布软件完整苹果IOS小脚本文本输入与粘贴流程
完整苹果IOS小脚本文本输入与粘贴流程
信息发布软件AIWROK使用activity列表开关与进度条的协同交互
AIWROK使用activity列表开关与进度条的协同交互
群发软件苹果脚本找图后Detect对象各种方法演示
苹果脚本找图后Detect对象各种方法演示

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2026-10-13 08:31 , Processed in 0.115877 second(s), 51 queries .

宣传软件--信息发布软件--b2b软件【广告发布软件】

快速回复 返回顶部 返回列表