[AutoHotkey]clickable.ahk

本文介绍了AutoHotkey脚本clickable.ahk,依赖findtext.ahk, exsleep.ahk和exmath.ahk。主要内容包括findtext.ahk的主要接口,以及exsleep.ahk和exmath.ahk的简单封装功能。" 104431300,5608928,使用Kali Linux模拟钓鱼网站进行社会工程学攻击学习,"['网络安全', '渗透测试', '社会工程', 'Kali Linux工具', 'Web安全']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

此类依赖findtext.ahk,exsleep.ahk,exmath.ahk

声明:

  1. 所贴出的代码纯属个人原创
  2. 所有代码经过测试才贴,但不保证所有功能最终完成,可能后续会有更新,欢迎随时回顾
  3. 所有非原创的代码,会声明,尽量给出引用出处

主要接口

win := new Clickable("ahk_pid 12345", 0.5, true)
win.GetRect()
win.Act()
win.SetPath(exepath)
win.SetSize(width,height)
win.DoClick()
win.DoClick(x:=123,y:=456)
win.FindPic(Text)
win.ClickPic(Text)
win.SimClickPics(0,Text1,Text2...)
win.ClickPics(Text1,Text2...)
;//其中Text由抓图控件(中文版软件某版本自带)自动生成

findtext.ahk

本类由网络下载

exsleep.ahk, exmath.ahk

简单的封装了随机数和随机睡眠

clickable.ahk代码

#Include findtext.ahk
;// #Include exmath.ahk
#Include exSleep.ahk
; @author essdy@csdn
; @version 1.00
CNPID(n)
{
  return "ahk_pid " n
}
Class Clickable
{

  __New(CN, Indent = 0.5, PIDMOD = false, width = 0, height = 0)
  {
    this.CN := CN
    this.PIDMOD := PIDMOD
    if(Indent>0)
    this.Indent := Indent
    this.BackMode := false
    this.Trys := 1
    if(width != 0)
    {
      this.SetSize(width, height)
    }
  }
  SetTrys(n)
  {
    if(n >= 1)
    {
      this.Trys := ceil(n)     
    }
  }
  UnsetTrys()
  {
    this.Trys := 1
  }
  SetBgMode()
  {
    this.BackMode := true
  }
  UnsetBgMode()
  {
    this.BackMode := false
  }
  SetSize(w,h)
  {
    SRSleep(this.Indent)
    t := this.CN
    WinMove,%t%,,,,%w%,%h%
  }
  GetRect()
  {
    RTitle :=
    RWidth :=
    RHeight :=
    RX:=
    RY:=
    WinGetPos, RX, RY, RWidth, RHeight, % this.CN

    ; WinGetActiveStats, RTitle, RWidth, RHeight, RX, RY
    ; SRSleep(this.Indent)
    RRect := {x:RX,y:RY,width:RWidth,height:RHeight}
    return RRect
  }
  SetPath(exepath, reopenindent = 3)
  {
    if(exepath == "")
    {
      this.reopenindent := reopenindent
      return
    }
    if(!FileExist(exepath))
      throw Not Found File %exepath%
    this.exepath :=  exepath
    this.exepath_set :=  true
    this.reopenindent :=  reopenindent
  }
  Act(open = false)
  {
    CN:=this.CN
    SRSleep(this.Indent)
    if(!WinExist(CN))
    {
      if(!open)
        throw Not open %CN%
      if(!this.exepath_set)
        throw Not Exist App %CN%
      RunWait % this.exepath
      SRSleep(this.reopenindent)
    }
    if(WinActive(CN))return true
    WinActivate % CN
    return true
  }
  DoClick(params*)
  {
    l := params.Length()
    x:=
    y:=
     SRSleep(this.Indent)
    if(l == 2)
    {
      x:=params[1]
      y:=params[2]
      
      if(this.BackMode)
      {
         pt=x%x% y%y%
         SetControlDelay -1
          ControlClick, %pt%, % this.CN,,,1,NA Pos
      }
      else 
      {
        Click,%x% %y% 
      }
    }   
  }
  FindPic(Text, sim = 0)
  {
    this.Act()
    RWidth :=
    RHeight :=
    RX:=
    RY:=
    WinGetPos, RX, RY, RWidth, RHeight, % this.CN
    return FindText(RX, RY,RWidth, RHeight, sim, sim, Text)
  }
  ClickPic(Text, sim = 0)
  {
    MsgBox D
    this.Act()
    if( ok:= this.FindPic(Text, sim))
    {      
      CoordMode, Mouse
      X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
      this.DoClick(X,Y)
      return true
    }
  }
  SimClickPics(sim, params*)
  {
    RWidth :=
    RHeight :=
    RX:=
    RY:=
    WinGetPos, RX, RY, RWidth, RHeight, % this.CN
    For index, param in params
    {
      CL := param[1]
      Failed = 0
      if(!(param[1]>0))
        continue
      
      loop, % CL
      {
        TY := this.Trys
        loop, % TY
        if(ok := findtext(RX, RY, RWidth, RHeight,sim,sim, param[2]))
        {
          CoordMode, Mouse
          X:=ok.1.x, Y:=ok.1.y, Comment:=ok.1.id
          this.DoClick(X,Y)
          break
        }
      }      
    }
  }
  ClickPics(params*)
  {
    this.SimClickPics(0, params*)
  }
}
LC(s)
{
  ls := 
  StringLower,ls,s
  return ls
}
UC(s)
{
  us := 
  StringLower,us,s
  return us
}
LoadScript(s)
{
  if(!InStr(s,"#"))
  {
    return
  }
  A_Array := StrSplit(s, "#")
  Exists :=  FileExist(A_Array[1])
  if(Exists)
  { 
    R := 
    IniRead R, % A_Array[1], % A_Array[2]
    RA := {}
    loop,Parse,R,`n,`r
    {
      B_Array := StrSplit(A_LoopField, "=")
      Key := LC(Trim(B_Array[1]))
      Val := LC(Trim(B_Array[2]))
      if(Key == "textx")
      {
        Val := StrSplit(Val, ",")
        for i, v in Val 
        {
          Val[i] := Trim(v)
        }
      }
      RA[Key]:=Val
    }
    return RA
  }  
}
ReadIniKey(f, s, k)
{
  R:=
  IniRead, R, %f%, %s%, %k%
  return R
}
<think>好的,用户想了解如何使用AutoX.js实现抢票的方法或教程。首先,我需要整理已有的信息。根据提供的引用内容,有几个资源提到了基于AutoX.js的抢票脚本,特别是猫眼演唱会门票的抢购。引用[3]和[4]提到有最新的脚本和打包的APK,但用户可能需要具体的步骤和实现方法。 首先,我应该先介绍AutoX.js的基本环境配置,因为这是基础。用户需要安装AutoX.js并开启无障碍服务,这在引用[2]中提到的B站教程可能有帮助。然后,编写脚本的基本步骤包括界面元素的定位和操作,比如点击按钮、输入文本等,这些在自动化脚本中很常见。 接下来,抢票流程需要分解成几个步骤,比如进入应用、处理预约页面、自动点击下单等。引用[3]提到自动点击预约页面的等待和下单,所以需要详细说明如何通过选择器定位元素,并添加点击事件。同时,需要考虑定时任务和循环检测,确保在抢票开始时能够及时触发操作。 另外,性能优化和异常处理也是关键点,比如降低CPU占用、增加重试机制,这在引用[3]和[4]中可能涉及。用户可能需要知道如何处理页面加载延迟或元素未找到的情况,避免脚本失败。 生成相关问题部分,需要涵盖环境配置、定位元素的方法、定时任务、性能优化、与其他工具对比以及常见错误处理。这些问题能帮助用户更全面地理解和应用AutoX.js进行抢票开发。 最后,确保回答结构清晰,分步骤说明,并引用提供的资料,比如提到参考B站教程和打包APK的准备工作。同时,提醒用户遵守平台规则,避免法律风险,这也是负责任的做法。</think>以下是为您整理的AutoX.js抢票脚本实现方法及步骤: ### 一、AutoX.js抢票实现原理 1. 基于Android系统的UI自动化操作,通过元素选择器定位目标控件 2. 使用定时任务监控抢票时间节点[^3] 3. 通过坐标点击/控件点击实现自动下单[^4] 4. 加入异常处理机制提升成功率[^3] ### 二、实现步骤详解 #### 1. 环境准备 ```javascript // 启用无障碍服务 auto.waitFor(); // 设置屏幕分辨率适配 setScreenMetrics(1080, 2340); ``` #### 2. 应用启动与界面跳转 ```javascript // 启动猫眼APP app.launch("com.sankuai.movie"); // 等待主界面加载 sleep(3000); // 跳转演唱会页面 click(descContains("演唱会").findOne()); ``` #### 3. 抢票核心逻辑 ```javascript function rushTicket() { // 定位购票按钮 let buyBtn = textContains("立即购买").findOne(); // 循环点击直到成功 while (true) { if (buyBtn.clickable()) { buyBtn.click(); // 处理下单确认弹窗 handleConfirmDialog(); break; } sleep(100); } } ``` #### 4. 异常处理机制 ```javascript function errorRetry() { // 检测网络异常提示 if (text("网络异常").exists()) { back(); sleep(1000); rushTicket(); } // 处理售罄提示 if (text("已售罄").exists()) { toast("监控补票机会"); setInterval(checkStock, 5000); } } ``` ### 三、关键优化点 1. 使用`selector()`精确匹配控件属性[^4] 2. 添加随机延迟避免被检测:`sleep(random(50,200))` 3. 多账号切换功能(需配合设备分身功能) 4. 部署定时任务实现预售监控: ```javascript // 设置开抢前30秒启动 setTimeout(rushTicket, getRemainTime() - 30000); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值