偶然间下载了不思议迷宫这个游戏,游戏里输入密令也就是一些字符串就可以领取奖励。
网上一搜,竟然有好多密令可领: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和夜神安卓模拟器完成了自动领取。
在夜神安卓模拟器进入游戏,打开设置窗口,重复以下过程:
点击密令 ,进入密令输入窗口
点击密令输入位置,使文本框成为焦点
传递密令字符串给安卓模拟器
点击确定,弹出奖励物品
点击确定,收取奖品
点击返回,回到设置窗口
主要用到以下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
整理一下,用到的资源:
ADBKeyBoard.apk ADBKeyBoard.rar
ADB.exe ADB.rar
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))
留言列表:
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