13
2018-02

使用Python自动领不思议迷宫的密令

偶然间下载了不思议迷宫这个游戏,游戏里输入密令也就是一些字符串就可以领取奖励。

网上一搜,竟然有好多密令可领:http://bbs.leiting.com/thread-417833-1-1.html

序号

密令

奖励

1

poweroverwhelming

2虫族女王碎片(需修复飞艇)

2

howdoyouturnthison

5冈布奥飞船碎片(需修复飞艇)

3

iamyourfather

5宇宙大帝碎片(需修复飞艇)

4

whatisbestinlife

5大和丸飞船碎片(需修复飞艇)

5

whorunbartertown

5000遗迹碎片(需修复飞艇)

6

tooktheredpill

10光子核心(需修复飞艇)

7

iamironman

5亚空间核心(需修复飞艇)

8

pentakill

5彩虹契约(需修复飞艇)

9

aneyeforaneye

3星辰の契约(需修复飞艇)

10

我要你的秘宝

间谍密宝(需修复飞艇)

11

我的舅舅在9C工作

5000遗迹碎片(需修复飞艇)


... ...

将近三百个,不领白不领,全领了手累的疼。经过一番摸索,采用Python、adb和夜神安卓模拟器完成了自动领取。

在夜神安卓模拟器进入游戏,打开设置窗口,重复以下过程:

  1. 点击密令 ,进入密令输入窗口

  2. 点击密令输入位置,使文本框成为焦点

  3. 传递密令字符串给安卓模拟器

  4. 点击确定,弹出奖励物品

  5. 点击确定,收取奖品

  6. 点击返回,回到设置窗口

主要用到以下ADB命令:

adb shell input tap x y #在屏幕x,y坐标点击
adb shell input text "string" #将string输入文本框

 

第一步,收集密令

采用最简单的方法,把密令粘贴到Excel里,然后构建成list字符串。

 

第二步,获取在屏幕上点击位置的坐标。

利用手机开发者选项,得到游戏中几个点击位置的坐标。参考https://jingyan.baidu.com/article/adc815139c0cc5f722bf7369.html

我手机分辨率是1920*1080,得到的具体坐标如下。使用安卓模拟器时,可将模拟器的分辨率也设成1920*1080 。

 # 打开密令窗口
 'adb shell input tap  858 1123'
 # 点击输入框
 'adb shell input tap  460 1300'
 # 点击返回键取消键盘显示
 'adb shell input keyevent 4'
 # 输入密令
 'adb shell input text "key"'
 # 输入确定
 'adb shell input tap  236 1815'
 # 领取确认
 'adb shell input tap  595 1211'
 # 返回设置窗口
 'adb shell input tap  860 1815'


 

第三步,用Python重复发送以上命令

for key in keys:    
  cmds = get_cmds(key)
  for i in range(len(cmds)):        
    cmd = cmds[i]print('  %s. %s' % (i, cmd))        
    os.system(cmd)        
    time.sleep(random.uniform(1, 2))

 

在输入英文密令的时候,上述方法是有效的。当密令是中文时,如 adb shell input text "密令" ,中文字符无法传递到模拟器文本框。

解决这个问题首先要在模拟器安装 ADBKeyBoard.apk ,参考http://blog.csdn.net/u011068616/article/details/47945927

ADBKeyBoard的源码在这里:https://github.com/senzhk/ADBKeyBoard  。不过这里下载的ADBKeyBoard.apk是160k,安装时会报错。可以到 历史页面下载,这里是地址:https://github.com/senzhk/ADBKeyBoard/blob/758dab32cb220ffbf4bd1a2a58338c8948c86a63/bin/ADBKeyBoard.apk


将ADBKeyBoard.apk安装到模拟器,设置为默认输入法,有两个地方需要设置,如下图:

设置完成后,当文本框获得焦点时,会有如下显示:

然后使用 adb shell am broadcast -a ADB_INPUT_TEXT --es msg "密令"  传递字符。


实际使用中,模拟器收到的中文字符是乱码,所以还需要用支持中文的adb.exe。这里下载:http://download.csdn.net/download/wanliaixie/6286541


整理一下,用到的资源:

  1. ADBKeyBoard.apk   ADBKeyBoard.rar

  2. ADB.exe  ADB.rar

  3. AutoADB.py 

    import random
    import re
    import sys
    import time
    import os
    
    # 所有密令构建一个列表
    keys = [
        '89757',
        '呵呵',
        '龙虾护手']
    
    
    # 点击坐标随机偏移,整的跟真人似的
    def ran_int(num):
        return random.randint(-30, 30) + num
    
    
    # ADB 指令
    def get_cmds(key):
        cmds = [
            # 打开密令窗口
            'adb shell input tap %s %s' % (ran_int(860), ran_int(1120)),
            # 打开输入框
            'adb shell input tap %s %s' % (ran_int(460), ran_int(1300)),
            # 取消键盘
            # 'adb shell input keyevent 4',
            # 输入密令
            # 'adb shell input text "%s"' % key,
            'adb shell am broadcast -a ADB_INPUT_TEXT --es msg "%s"' % key,
            # 确定输入
            'adb shell input tap %s %s' % (ran_int(240), ran_int(1800)),
            # 领取确认
            'adb shell input tap %s %s' % (ran_int(600), ran_int(1200)),
            # 返回
            'adb shell input tap %s %s' % (ran_int(860), ran_int(1800))]
        return cmds
    
    
    # 一个密令
    def put_key(key):
        print('尝试 %s :' % key)
        cmds = get_cmds(key)
        for i in range(len(cmds)):
            cmd = cmds[i]
            print('  %s. %s' % (i, cmd))
            os.system(cmd)
            time.sleep(random.uniform(1, 2))
        print('-' * 40)
    
    
    # 检查模拟器是否连接
    def is_device_conn():
        size_str = os.popen('adb shell wm size').read()
        if not size_str:
            print('请安装 ADB 及驱动并配置环境变量')
            return False
        m = re.search(r'(\d+)x(\d+)', size_str)
        if m:
            print("手机屏幕为: {height}x{width}\n".format(height=m.group(2), width=m.group(1)))
            return True
        return False
    
    
    if __name__ == '__main__':
        if not is_device_conn():
            sys.exit()
    
        for key in keys:
            put_key(key)
    
        print("%s 个密令处理完毕" % len(keys))


« 上一篇下一篇 »

相关文章:

Python保存文件时中文乱码  (2018-2-10 17:3:5)

留言列表:

1.awer  2018-3-11 22:18:05 回复该留言
1 让全世界充满梦想 钻石*5
2 未来猫 未来猫碎片*5,1黄金之罐*1
3 大井 金币*50K
4 我是女装大佬 小红帽碎片*3,撒旦秘药*3,钻石*3
5 我是小公举 冰霜女王碎片*3、梦幻果*3、钻石*3
6 我是女生 小美碎片*3、奶油浆果*3、钻石*3
7 hodor 神塔花*5
8 耗油根 破坏神碎片*3
9 小仙女大米粒 仙女龙碎片*5
10 弥勒不是真咸鱼 熊猫碎片*5
11 正月十五乐团圆 黄金之罐*1
12 正月十五月儿圆 冈布奥之罐*2、金币*30K
13 正月十五元宵甜 钻石*3、金币*30K
14 琪啾啾200斤 啾啾碎片*3
15 18排8号 钻石*3
16 14排4号 地穴领主碎片*3
17 5排9号 亚历山大碎片*3
18 心有所觉亦做不解 联盟币*2500
19 一本正经胡说八道 匹诺曹碎片*5

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。