ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-02-04 12:00:55  阅读:187  来源: 互联网

标签:QQ int adb ADB str 自动 KEYCODE def


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小时内务必删除。

标签:QQ,int,adb,ADB,str,自动,KEYCODE,def
来源: https://www.cnblogs.com/SMARKplus/p/15862640.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有