• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

发新话题 回复该主题

安卓游戏实战之自动切换账号 [复制链接]

1#
大家好,我是今天的课程讲师,今天给大家带来的是一个H5小游戏的自动换号
这也是常见的游戏自动化功能

现在我们可以看到这是游戏登录了的一个状态,我们就先从怎么退出游戏再到怎么去登录游戏吧
这个游戏的个人中心是一个悬浮框,你单纯的想去找图找色可能是比较麻烦的,因为它这个是不固定位置的,而且容易被背景干扰到
像这种悬浮框多数是由元素界面组成的,我们可以通过抓取这个元素去定位它,这样不管它在哪个位置,我们都能精准的点击到它
好,我们话不多说,直接开干,先打开按键助手的抓抓工具,把这个游戏界面的元素抓取一下看看

经过我们的抓取可以确认到这个悬浮球的元素,然后我们需要用到一个专门针对元素使用的插件去帮助我们更好更快的编写代码

这个元素插件叫 "ElementEx.luae" 是采用Lua编写的一个加密插件
下面我们用导入插件命令来引用这个插件
  1. Import "ElementEx.luae"
复制代码
找到这个插件的查找元素功能 "ElementEx.Find(匹配模式[,下标,查找超时])"一共有三个参数,我们目前只需要关注第一个匹配模式
这个匹配模式根据插件介绍是有两种模式的,一种是键值对,一种是table表
  1. //匹配模式1:一个属性对应一个值,不能落单,支持多个属性,所有命令的匹配模式均使用以下格式
  2. Dim 元素 = ElementEx.Find("text","按键精灵","desc","按键精灵","class","xxxx","desc","xxxxx")

  3. //匹配模式2:table表
  4. Dim 元素 = ElementEx.Find({"text":"按键精灵","desc":"按键精灵","class":"xxxx","desc":"xxxxx"})
复制代码
使用那一种都是可以的,我们这里就采用第一种
先定义一个变量[悬浮球]来存放游戏悬浮球的元素内容
  1. Dim 悬浮球 = ElementEx.Find("class","android.widget.LinearLayout","pkg","com.ylwl.res.common","focused",False,"long-clickable",False,"clickable",False,"checkable",False,"checked",False)
复制代码
然后判断一下返回的值是不是已经找到了这个悬浮球
  1. If 悬浮球 Then
  2.     TracePrint "找到了悬浮球~"
  3. End If
复制代码
根据实际的调试结果,我们已经是调试输出找到了悬浮球,但是我们现在还不确定是不是找正确了,我们采用元素点击让它多点几次看看
  1. Do
  2.     Delay 1000
  3.     TracePrint "点击悬浮球 = " & CStr(ElementEx.Click(悬浮球))
  4. Loop
复制代码
诶,现在出新问题了,游戏的个人中心出现了它还在点这个悬浮球,那我们就要做一个判断
在出现用户中心的情况下,我们要停止点击悬浮球,先把游戏的个人中心打开,我们抓取一下界面元素
然后定义一个变量[我的界面模式]来存放游戏的个人中心的元素
  1. Dim 我的界面模式 = {"text":"我的","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}


  2. Do
  3.     Delay 1000
  4.     If ElementEx.Find(我的界面模式) Then
  5.         TracePrint "打开我的界面 = " & CStr(True)
  6.         Exit Do
  7.     Else
  8.         TracePrint "点击悬浮球 = " & CStr(ElementEx.Click(悬浮球))
  9.     End If
  10. Loop
复制代码
现在我们已经能顺利打开了游戏个人中心,接下来也是抓取需要点击的元素,这里就不再细说了,开干~
  1. Dim 我的界面模式 = {"text":"我的","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  2. Dim 切换账号模式 = {"text":"切换账号","class":"android.widget.Button","pkg":"com.ylwl.res.common"}
  3. Dim 确认切换账号 = {"text":"确认切换账号","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  4. Dim 确定 = {"text":"确定","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
复制代码
现在代码多了起来,我们就需要把代码封装成功能,这样阅读代码也方便,后期也更好的维护
有些同学可能就要提问了,老师你函数里面有Do Loop 万一游戏闪退了怎么办?
这是一个好问题,那我们就需要在死循环的代码里带上限制条件
一种是,如果出现了问题,我就重启你
一种是,如果出现了问题,我就退出你
  1. Dim 游戏包名 = "com.tianmu.webshell.dldl.tmjh.xuanzang431"
  2. Function 切换账号()
  3.     切换账号 = False
  4.     Dim 我的界面模式 = {"text":"我的","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  5.     Dim 切换账号模式 = {"text":"切换账号","class":"android.widget.Button","pkg":"com.ylwl.res.common"}
  6.     Dim 确认切换账号 = {"text":"确认切换账号","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  7.     Dim 确定 = {"text":"确定","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  8.     If Sys.AppIsFront(游戏包名) = True Then
  9.         If 打开礼包中心() = True Then
  10.             Do
  11.                 Delay 200
  12.                 If ElementEx.Find(切换账号模式) Then
  13.                     TracePrint "点击切换账号模式 = " & CStr(ElementEx.Click(切换账号模式))
  14.                 Else
  15.                     If ElementEx.Find(我的界面模式) Then
  16.                         TracePrint "点击我的界面模式 = " & CStr(ElementEx.Click(我的界面模式))
  17.                     End If
  18.                     Delay 1000
  19.                 End If
  20.                 If ElementEx.Find(确认切换账号) Then
  21.                     TracePrint "是否在确认切换账号页面 = " & CStr(True)
  22.                     If ElementEx.Click(确定) Then
  23.                         TracePrint "点击确认按钮 = " & CStr(True)
  24.                         切换账号 = True
  25.                         Exit Function
  26.                         Delay 1000
  27.                     End If
  28.                 End If
  29.                 If Sys.AppIsFront(游戏包名) <> True Then
  30.                     Exit Do
  31.                 End If
  32.             Loop
  33.         Else
  34.             TracePrint "打开账号界面 = " & CStr(False)
  35.         End If
  36.     Else
  37. TracePrint "应用是否在前台 = " & CStr(False)
  38.     End If
  39. End Function

  40. Function 打开礼包中心()
  41.     打开礼包中心 = False
  42.     Dim 悬浮球 = ElementEx.Find("class","android.widget.LinearLayout","pkg","com.ylwl.res.common","focused",False,"long-clickable",False,"clickable",False,"checkable",False,"checked",False)
  43.     Dim 我的界面模式 = {"text":"我的","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  44.     Do
  45.         Delay 200
  46.         If Sys.AppIsFront(游戏包名) <> True Then
  47.     TracePrint "应用是否在前台 = " & CStr(False)
  48.     Exit Do
  49.         End If
  50.         If ElementEx.Find(我的界面模式) Then
  51.             TracePrint "打开我的界面 = " & CStr(True)
  52.             打开礼包中心 = True
  53.             Exit Function
  54.         Else
  55.             TracePrint "点击悬浮球 = " & CStr(ElementEx.Click(悬浮球))
  56.             Delay 1000
  57.         End If
  58.     Loop
  59. End Function
复制代码
现在让我们来看一下实际的测试效果吧!
  1. TracePrint "是否退出账号 = " & CStr(切换账号())
复制代码

可以看到,我们已经退出了游戏账号,那我们继续开始编写登录的函数吧

登录需要注意的点
1.编辑框里面的账号是旧的账号还是新的账号?
2.编辑框的密码元素text全是??????不好判断?
3.什么时候才合适点击登录按钮?


我们先把需要的元素数据取出来
  1. Dim 登录界面 = {"text":"仅对年满18周岁成年人提供游戏服务","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  2. Dim 登录按钮 = {"text":"登录","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
  3. Dim 账号输入框未输入 = {"res":"com.ylwl.res.common:id/mixsdk_login_et_account","class":"android.widget.EditText","pkg":"com.ylwl.res.common"}
  4. Dim 密码输入框未输入 = {"res":"com.ylwl.res.common:id/mixsdk_login_et_passwd","class":"android.widget.EditText","pkg":"com.ylwl.res.common"}
复制代码
经过实际的测试,我们发现账号输入了密码框可以通过元素text来确定这个账号是不是我们输入的账号
  1. Dim 账号输入框已输入 = {"text":账号,"res":"com.ylwl.res.common:id/mixsdk_login_et_account","class":"android.widget.EditText"}
复制代码
但是密码的text?????并不能找到,那我们就换一个思路,先清空输入框,确定是空的输入框再输入密码,确定账号密码都输入了,就点击登录按钮
  1. Dim 密码输入框已输入 = {"text":"请输入密码","res":"com.ylwl.res.common:id/mixsdk_login_et_passwd","class":"android.widget.EditText"}
复制代码
接下来就是逻辑方面,思路是先判断账号输入框的账号是否符合,然后清空密码框,并且确定了就输入密码,两个步骤都做完了就可以点击登录了
  1. Dim 账号是否输入 = False, 密码是否输入 = False
  2. If ElementEx.Find(登录界面) Then
  3.     TracePrint "是否在登录界面 = " & CStr(True)
  4.     If 账号是否输入 = False Then
  5.         If ElementEx.Find(账号输入框已输入) Then
  6.             账号是否输入 = True
  7.         Else
  8.             If ElementEx.Find(账号输入框未输入) Then
  9.                 TracePrint "点击账号输入框 = " & CStr(ElementEx.Click(账号输入框未输入))
  10.                 Call 清空输入框()
  11.                 Delay 200
  12.                 InputText 账号
  13.                 Delay 500
  14.             End If
  15.         End If
  16.     End If
  17.     If 密码是否输入 = False Then
  18.         If ElementEx.Find(密码输入框已输入) Then
  19.             InputText 密码
  20.             Delay 500
  21.             密码是否输入 = True
  22.         Else
  23.             If ElementEx.Find(密码输入框未输入) Then
  24.                 TracePrint "点击密码输入框 = " & CStr(ElementEx.Click(密码输入框未输入))
  25.                 Call 清空输入框()
  26.                 KeyPress "del"
  27.                 Delay 200
  28.             End If
  29.         End If
  30.     End If
  31.     If 账号是否输入 = True And 密码是否输入 = True Then
  32.         If ElementEx.Find(登录按钮) Then
  33.             TracePrint "点击登录按钮 = " & CStr(ElementEx.Click(登录按钮))
  34.             Delay 1000
  35.         End If
  36.     End If
  37. End If
  38. Sub 清空输入框()
  39. For 10
  40. Keypress "PageUp"
  41. Next
  42. Keydown 114
  43. keydown 60
  44. For 10
  45. Keydown "PageDown"
  46. Next
  47. Keyup 114
  48. Keyup 60
  49. Keyup "PageDown"
  50. End Sub
复制代码
点击登录之后,有一个登录中的状态,我们也把它写出来,这样方便客户观看脚本的运行状态
  1. Dim 登录中 = {"textC":"登录中","class":"android.widget.TextView"}
  2. If ElementEx.Find(登录中) Then
  3.     TracePrint "正在登录中……"
  4. End If
复制代码
登录完了游戏还有悬浮球的公告
  1. Dim 公告 = {"text":"公告","class":"android.widget.TextView"}
  2. Dim 公告关闭按钮 = {"res":"com.ylwl.res.common:id/mixsdk_img_right","class":"android.widget.ImageView","pkg":"com.ylwl.res.common"}
  3. If ElementEx.Find(公告关闭按钮) Then
  4.     TracePrint "是否登录成功 = " & CStr(True)
  5.     TracePrint "点击公告关闭按钮 = " & CStr(ElementEx.Click(公告关闭按钮))
  6. End If
复制代码
关闭了悬浮球的公告再出来一个游戏公告,由于游戏公告已经不属于元素,所以我们用到了图色插件
这里请出我们的GK插件
  1. Import "GK.luae"

  2. If GK.Full(308,1199,415,1232, "Attachment:公告_点击返回.png", 0.9, True) Then
  3.     TracePrint "公告页面点击返回 = " & CStr(True)
  4.     Delay 200
  5. End If
  6. If GK.Full(623,43,709,902, "Attachment:公告_点击关闭.png", 0.9, True) Then
  7.     TracePrint "公告页面点击关闭 = " & CStr(True)
  8.     Delay 200
  9. End If
  10. If GK.Full(289,904,435,947, "Attachment:进入游戏.png", 0.9, True) Then
  11.     TracePrint "点击进入游戏 = " & CStr(True)
  12.     Delay 200
  13. End If
  14. If GK.Full(261,1180,350,1270, "Attachment:主界面_背包.png", 0.9) Then
  15.     TracePrint "进入游戏 = " & CStr(True)
  16.     Delay 200
  17. End If
复制代码

到进去游戏界面看到背包我们就判断登录成功了,接下来把零碎的代码用函数封装起来,最终代码如下~
Import "ElementEx.luae"
Import "GK.luae"

Dim 游戏包名 = "com.tianmu.webshell.dldl.tmjh.xuanzang431"

'到进去游戏界面看到背包我们就判断登录成功了,接下来把零碎的代码用函数封装起来

Function 登录(账号, 密码)
    登录 = False
    Dim 账号是否输入 = False, 密码是否输入 = False
    Dim 登录界面 = {"text":"仅对年满18周岁成年人提供游戏服务","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    Dim 登录按钮 = {"text":"登录","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    Dim 账号输入框未输入 = {"res":"com.ylwl.res.common:id/mixsdk_login_et_account","class":"android.widget.EditText","pkg":"com.ylwl.res.common"}
    Dim 密码输入框未输入 = {"res":"com.ylwl.res.common:id/mixsdk_login_et_passwd","class":"android.widget.EditText","pkg":"com.ylwl.res.common"}
    Dim 账号输入框已输入 = {"text":账号,"res":"com.ylwl.res.common:id/mixsdk_login_et_account","class":"android.widget.EditText"}
    Dim 密码输入框已输入 = {"text":"请输入密码","res":"com.ylwl.res.common:id/mixsdk_login_et_passwd","class":"android.widget.EditText"}
    Dim 登录中 = {"textC":"登录中","class":"android.widget.TextView"}
    Dim 公告 = {"text":"公告","class":"android.widget.TextView"}
    Dim 公告关闭按钮 = {"res":"com.ylwl.res.common:id/mixsdk_img_right","class":"android.widget.ImageView","pkg":"com.ylwl.res.common"}
    If Sys.AppIsFront(游戏包名) = True Then
        Do
            Delay 200
            If ElementEx.Find(登录界面) Then
                TracePrint "是否在登录界面 = " & CStr(True)
                If 账号是否输入 = False Then
                    If ElementEx.Find(账号输入框已输入) Then
                        账号是否输入 = True
                    Else
                        If ElementEx.Find(账号输入框未输入) Then
                            TracePrint "点击账号输入框 = " & CStr(ElementEx.Click(账号输入框未输入))
                            Call 清空输入框()
                            Delay 200
                            InputText 账号
                            Delay 500
                        End If
                    End If
                End If
                If 密码是否输入 = False Then
                    If ElementEx.Find(密码输入框已输入) Then
                        InputText 密码
                        Delay 500
                        密码是否输入 = True
                    Else
                        If ElementEx.Find(密码输入框未输入) Then
                            TracePrint "点击密码输入框 = " & CStr(ElementEx.Click(密码输入框未输入))
                            Call 清空输入框()
                            KeyPress "del"
                            Delay 200
                        End If
                    End If
                End If
                
                If 账号是否输入 = True And 密码是否输入 = True Then
                    If ElementEx.Find(登录按钮) Then
                        TracePrint "点击登录按钮 = " & CStr(ElementEx.Click(登录按钮))
                        Delay 1000
                    End If
                End If
                
            End If
            If ElementEx.Find(登录中) Then
                TracePrint "正在登录中……"
            End If
            If ElementEx.Find(公告关闭按钮) Then
                TracePrint "是否登录成功 = " & CStr(True)
                TracePrint "点击公告关闭按钮 = " & CStr(ElementEx.Click(公告关闭按钮))
            End If
            If GK.Full(308,1199,415,1232, "Attachment:公告_点击返回.png", 0.9, True) Then
                TracePrint "公告页面点击返回 = " & CStr(True)
                Delay 200
            End If
            If GK.Full(623,43,709,902, "Attachment:公告_点击关闭.png", 0.9, True) Then
                TracePrint "公告页面点击关闭 = " & CStr(True)
                Delay 200
            End If
            If GK.Full(289,904,435,947, "Attachment:进入游戏.png", 0.9, True) Then
                TracePrint "点击进入游戏 = " & CStr(True)
                Delay 200
            End If
            If GK.Full(261,1180,350,1270, "Attachment:主界面_背包.png", 0.9) Then
                TracePrint "进入游戏 = " & CStr(True)
                登录 = True
                Delay 200
                Exit Function
            End If
        Loop
    Else
TracePrint "应用是否在前台 = " & CStr(False)
    End If
End Function

Function 切换账号()
    切换账号 = False
    Dim 我的界面模式 = {"text":"我的","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    Dim 切换账号模式 = {"text":"切换账号","class":"android.widget.Button","pkg":"com.ylwl.res.common"}
    Dim 确认切换账号 = {"text":"确认切换账号","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    Dim 确定 = {"text":"确定","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    If Sys.AppIsFront(游戏包名) = True Then
        If 打开礼包中心() = True Then
            Do
                Delay 200
                If ElementEx.Find(切换账号模式) Then
                    TracePrint "点击切换账号模式 = " & CStr(ElementEx.Click(切换账号模式))
                Else
                    If ElementEx.Find(我的界面模式) Then
                        TracePrint "点击我的界面模式 = " & CStr(ElementEx.Click(我的界面模式))
                    End If
                    Delay 1000
                End If
                If ElementEx.Find(确认切换账号) Then
                    TracePrint "是否在确认切换账号页面 = " & CStr(True)
                    If ElementEx.Click(确定) Then
                        TracePrint "点击确认按钮 = " & CStr(True)
                        切换账号 = True
                        Exit Function
                        Delay 1000
                    End If
                End If
            Loop
        Else
            TracePrint "打开账号界面 = " & CStr(False)
        End If
    Else
TracePrint "应用是否在前台 = " & CStr(False)
    End If
End Function

Function 打开礼包中心()
    打开礼包中心 = False
    Dim 悬浮球 = ElementEx.Find("class","android.widget.LinearLayout","pkg","com.ylwl.res.common","focused",False,"long-clickable",False,"clickable",False,"checkable",False,"checked",False)
    Dim 我的界面模式 = {"text":"我的","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    Dim 登录界面 = {"text":"仅对年满18周岁成年人提供游戏服务","class":"android.widget.TextView","pkg":"com.ylwl.res.common"}
    Do
        Delay 200
        If Sys.AppIsFront(游戏包名) <> True Then
    TracePrint "应用是否在前台 = " & CStr(False)
    Exit Do
        End If
        If ElementEx.Find(登录界面) Then
            TracePrint "打开礼包中心错误,处于未登录状态~"
            Exit Function
        End If
        If ElementEx.Find(我的界面模式) Then
            TracePrint "打开我的界面 = " & CStr(True)
            打开礼包中心 = True
            Exit Function
        Else
            TracePrint "点击悬浮球 = " & CStr(ElementEx.Click(悬浮球))
            Delay 1000
        End If
    Loop
End Function

Sub 清空输入框()
For 10
Keypress "ageUp"
Next
Keydown 114
keydown 60
For 10
Keydown "ageDown"
Next
Keyup 114
Keyup 60
Keyup "ageDown"
End Sub

TracePrint "是否退出账号 = " & CStr(切换账号())
Delay 5000
Call 登录("账号", "密码")

这节课到这里就结束啦,下节课给大家带来日常任务的讲解,谢谢~

2#

学习1!谢谢

3#

1111111111111

发新话题 回复该主题