【python】QQ虎年春节活动ADB助手项目开发过程(opencv,ADB)(自动开星星,自动红包雨下拉,自动团圆饭,自动一笔连)

QQ虎年春节活动ADB助手(自动开星星,自动红包雨下拉,自动团圆饭,自动一笔连)

程序及代码背景介绍

运行环境

  • 语言环境:python3.6
  • 应用的库:opencv-python,numpy,matplotlib等

设计思路

  • 合成团圆饭程序采用ADB库进行操作,外加可选策略的机械式点击组成。
  • 星星一笔连程序利用ADB库进行图像采集,经过opencv识别点与线,并转换为图的形式,再利用dfs进行搜索,最终经过ADB操作输出。

个人代码格式规范约定

  • 函数输入变量统一以In_做前缀
  • 运行中的临时储存变量统一以tmp_为前缀
  • 字典数据统一以DICT_为前缀

工程具体开发与实现过程

最先写出来的文件————ADB基础操作库:ADB_Basic.py

为了方便具体操作,同时也没有找到网上现成的ADB于python中的操作库,于是自己造*写了一个库。。。

首先,便于测试,写了一个利用管道符可以输出cmd返回文本的一个函数,代码如下:

def Command(In_command):  # 支持返回的command执行
    tmp_r = os.popen(In_command)
    tmp_text = tmp_r.read()
    tmp_r.close()
    return tmp_text

然后,便照着ADB的基础操作命令写了其设备显示、点击、滑动、截图及拉取函数

其中,模拟按键的键值对应字典数据如下:

DICT_KEYCODE = {"KEYCODE_UNKNOWN": 0, "KEYCODE_MENU": 1, "KEYCODE_SOFT_RIGHT": 2, "KEYCODE_HOME": 3, "KEYCODE_BACK": 4, "KEYCODE_CALL": 5, "KEYCODE_ENDCALL": 6, "KEYCODE_0": 7, "KEYCODE_1": 8, "KEYCODE_2": 9, "KEYCODE_3": 10, "KEYCODE_4": 11, "KEYCODE_5": 12, "KEYCODE_6": 13, "KEYCODE_7": 14, "KEYCODE_8": 15, "KEYCODE_9": 16, "KEYCODE_STAR": 17, "KEYCODE_POUND": 18, "KEYCODE_DPAD_UP": 19, "KEYCODE_DPAD_DOWN": 20, "KEYCODE_DPAD_LEFT": 21, "KEYCODE_DPAD_RIGHT": 22, "KEYCODE_DPAD_CENTER": 23, "KEYCODE_VOLUME_UP": 24, "KEYCODE_VOLUME_DOWN": 25, "KEYCODE_POWER": 26, "KEYCODE_CAMERA": 27, "KEYCODE_CLEAR": 28, "KEYCODE_A": 29, "KEYCODE_B": 30, "KEYCODE_C": 31, "KEYCODE_D": 32, "KEYCODE_E": 33, "KEYCODE_F": 34, "KEYCODE_G": 35, "KEYCODE_H": 36, "KEYCODE_I": 37, "KEYCODE_J": 38, "KEYCODE_K": 39, "KEYCODE_L": 40, "KEYCODE_M": 41, "KEYCODE_N": 42, "KEYCODE_O": 43, "KEYCODE_P": 44,
                "KEYCODE_Q": 45, "KEYCODE_R": 46, "KEYCODE_S": 47, "KEYCODE_T": 48, "KEYCODE_U": 49, "KEYCODE_V": 50, "KEYCODE_W": 51, "KEYCODE_X": 52, "KEYCODE_Y": 53, "KEYCODE_Z": 54, "KEYCODE_COMMA": 55, "KEYCODE_PERIOD": 56, "KEYCODE_ALT_LEFT": 57, "KEYCODE_ALT_RIGHT": 58, "KEYCODE_SHIFT_LEFT": 59, "KEYCODE_SHIFT_RIGHT": 60, "KEYCODE_TAB": 61, "KEYCODE_SPACE": 62, "KEYCODE_SYM": 63, "KEYCODE_EXPLORER": 64, "KEYCODE_ENVELOPE": 65, "KEYCODE_ENTER": 66, "KEYCODE_DEL": 67, "KEYCODE_GRAVE": 68, "KEYCODE_MINUS": 69, "KEYCODE_EQUALS": 70, "KEYCODE_LEFT_BRACKET": 71, "KEYCODE_RIGHT_BRACKET": 72, "KEYCODE_BACKSLASH": 73, "KEYCODE_SEMICOLON": 74, "KEYCODE_APOSTROPHE": 75, "KEYCODE_SLASH": 76, "KEYCODE_AT": 77, "KEYCODE_NUM": 78, "KEYCODE_HEADSETHOOK": 79, "KEYCODE_FOCUS": 80, "KEYCODE_PLUS": 81, "KEYCODE_MENU": 82, "KEYCODE_NOTIFICATION": 83, "KEYCODE_SEARCH": 84, "TAG_LAST_KEYCODE": 85}

以及相应的ADB操作函数:

def ADB_screen_size():
    '获取手机屏幕大小'
    size_str = Command('adb shell wm size')
    m = re.search(r'(\d+)x(\d+)', size_str)
    if m:
        return (m.group(2), m.group(1))
    return (0,0)

def ADB_devices_re():  # 显示ADBdevices(非列表)re后缀为有返回值
    return Command("adb devices")


def ADB_tap(In_x: int, In_y: int):  # 模拟点击操作 无返回值
    os.system("adb shell input tap "+str(In_x)+" "+str(In_y))


def ADB_key(In_keycode: int):  # 模拟按键
    os.system("adb shell input keyevent "+str(In_keycode))


def ADB_swipe(In_startX: int, In_startY: int, In_endX: int, In_endY: int, In_timems: int):  # 模拟滑动
    os.system("adb shell input swipe "+str(In_startX)+" " +
              str(In_startY)+" "+str(In_endX)+" "+str(In_endY)+" "+str(In_timems))

同时,当时为了兼顾可能的调试,还写了最终版暂时没有用到的代码部分:

from Output_Basic import *  # 本操作可注释掉 (不需要显示的话,以下均可注释)
import threading
# 本函数可注释掉
def ADB_tap_re(In_x: int, In_y: int):  # 模拟点击操作 re为有返回值
    return Command("adb shell input tap "+str(In_x)+" "+str(In_y))

# 本函数可注释掉
def ADB_key_re(In_keycode: int):  # 模拟按键
    return Command("adb shell input keyevent "+str(In_keycode))

# 本函数可注释掉
def ADB_swipe_re(In_startX: int, In_startY: int, In_endX: int, In_endY: int, In_timems: int):  # 模拟滑动
    return Command("adb shell input swipe "+str(In_startX)+" " +
                   str(In_startY)+" "+str(In_endX)+" "+str(In_endY)+" "+str(In_timems))

# 本函数可注释掉
def ADB_text(In_text: str):  # 发送文本
    return Command("adb shell input "+In_text)

# 本函数可注释掉
TMP_flash = False  # 是否刷新
def Img_cv2_monitor(In_imgpath: str, In_delayms: int = 1000, In_Windowtitle: str = "ADB_Img"):  # 必须已经有图像进行初始化
    cv2.namedWindow(In_Windowtitle, 0)  # 此处有别于使用Output库的方式(因为需要持续输出显示)
    global TMP_flash
    try:
        while True:
            if TMP_flash:
                img = cv2.imread(In_imgpath)
                cv2.imshow(In_Windowtitle, img)
                TMP_flash = False
            cv2.waitKey(In_delayms)
    except KeyboardInterrupt:
        return "Stop Now..."

# 本函数可注释掉
def ADB_screen_show(In_phonepath: str = "/sdcard/ADB01.png", In_pcpath: str = "D:\\ADB01.png"):  # 显示屏幕
    Command("adb shell screencap -p "+In_phonepath)
    tmp = Command("adb pull \""+In_phonepath+"\" \""+In_pcpath+"\"")
    Out_img_cv2(In_pcpath)
    return tmp


# 本函数可注释掉
# 监视屏幕,因长时间显示图片,所以用了threading+opencv显示,但是还是速度一般。。希望有大佬指教
def ADB_screen_monitor(In_phonepath: str = "/sdcard/ADB01.png", In_pcpath: str = "D:\\ADB01.png", In_delayms: int = 1000):
    tmp_cv2 = threading.Thread(
        target=Img_cv2_monitor, args=(In_pcpath, In_delayms))
    tmp_cv2.start()
    global TMP_flash
    try:
        while True:
            if TMP_flash == False:
                Command("adb shell screencap -p "+In_phonepath)
                Command("adb pull \""+In_phonepath+"\" \""+In_pcpath+"\"")
                TMP_flash = True
                time.sleep(In_delayms/1000)
    except KeyboardInterrupt:
        return "Stop Now..."

README文档

  • 自动团圆饭:本ADB助手采用了简易的策略,主要是对屏幕进行机械式点击操作 (没有AI) ,这样可以均衡并且利用碰撞原理分离大小不同的“饭”(1=两侧放置, 2=*放置, 3=左侧放置)
  • 自动一笔连:采用图像识别 + dfs的欧拉路取路径操作,并自动点击连线

文件名及内容:

  • ADB_Main.py: 一个调用内部在下写的库(Apply, Basic)的外接入口,(输入操作已写好)直接运行即可
  • ADB_Apply.py: 在下根据ADB主库外加的相关操作接口,可以实现相关的腾讯春节应用操作
  • ADB_Apply_draw.py: 由 @fmq03 开发(感谢大佬!),在下辅助的根据ADB主库外加的相关操作接口,可以实现相关的一笔连操作
  • ADB_Basic.py: 在下自己封装的ADB主库,具体函数请看内部(不多,就几十行)
  • Output_Basic.py: 利用cv2/PIL/matplotlib的库写的截图显示用的库(函数都封装好了,ADB_Basic.py调用上了)

配置及运行方法:

  • 请安装好ADB、python并全部配置好环境变量
  • 安装所有需要的库文件“pip install ”+库名(opencv-python) (matplotlib,pillow可选,不需要即可直接在Basic.py中注释掉,已经默认注释掉)
  • 打开手机开发者选项(网上百度),并开启USB调试选项
  • 同时在电脑上安装相应品牌的“手机助手”以获取ADB驱动(实践中,安装之后在ADB中能连上手机了,手机管家/助手软件也就可以卸载了)
  • 打开春节相关活动界面,并尽量保持初始化的状态不要手动操作,运行“ADB_Main.py”中的相关操作,开始享受吧!

Tips:

  • 运行过程中,如果手机运行较卡或丢失操作,可以手动设置延长操作时间(查找及修改方法不再赘述)

免责声明:

  1. 本程序仅供学习与交流用途,且仅模拟人的机械性重复操作,减少无聊的机械性操作,未修改腾讯软件、客户端相应代码。
  2. 非盈利谨慎使用,保护QQ,珍惜腾讯!!!造成的一切处理和后果与开发者本人无关,切勿沉迷及滥用,请在下载之后24小时内务必删除。
上一篇:C#实现电脑控制


下一篇:通过学习数据结构,我们可以学到 什么?