python实现adb辅助点击屏幕工具
#!/usr/bin/env python
# -*- coding: utf-8 -*-import re
import os
import time
import subprocess
import tkinter as tk
from tkinter import messagebox
from PIL import Image, ImageTk# 设置ADB路径(根据你的系统和安装路径进行调整)
ADB_PATH = 'C:/Users/DHY-20210315/AppData/Local/Android/Sdk/platform-tools/adb.exe'
# 设置截屏图片显示比例
scl = 0.7# 创建一个GUI窗口
root = tk.Tk()
root.title("ADB辅助点击助手")
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 设置窗口大小
window_width = 900
window_height = 600
x = (screen_width - window_width) // 2
y = (screen_height - window_height) // 2
root.geometry(f"{window_width}x{window_height}+{x}+{y}")# 函数:通过ADB截屏并显示
def capture_and_display():if r_var.get() == '':messagebox.showinfo(title='提示', message='没有连接设备呀!')return# file = str(round(time.time() * 1000)) + '.png'file = 'screencap.png'scp = '/sdcard/Pictures/' + filecapture_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'screencap', scp])capture_process.wait()lsc = './' + filepull_process = subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'pull', scp, lsc])pull_process.wait()screenshot = Image.open(lsc)width, height = screenshot.sizenew_width = int(width * scl)new_height = int(height * scl)screenshot = screenshot.resize((new_width, new_height), Image.ANTIALIAS)s_w = new_width + 20s_h = new_height + 50root.geometry(f"{s_w}x{s_h}+{(screen_width - s_w) // 2}+{(screen_height - s_h) // 2}")img = ImageTk.PhotoImage(screenshot)img_label.config(image=img)img_label.image = img# 函数:通过ADB点击图片
def click_img(event):if r_var.get() == '':messagebox.showinfo(title='提示', message='没有连接设备呀!')returnif ck_var.get() == 1:for i in range(8):subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])time.sleep(0.01)ck_var.set(0)else:subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'tap', str(event.x / scl), str(event.y / scl)])time.sleep(1)capture_and_display()# 函数:通过ADB发送按键
def send_back_command():if r_var.get() == '':messagebox.showinfo(title='提示', message='没有连接设备呀!')returnsubprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'keyevent', '4'])time.sleep(1)capture_and_display()# 函数:通过ADB发送滑动
def send_slide_command(arg):if r_var.get() == '':messagebox.showinfo(title='提示', message='没有连接设备呀!')returnif arg == 1:subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'swipe', '969 1050 969 800 100'])time.sleep(1)capture_and_display()else:subprocess.Popen([ADB_PATH, '-s', r_var.get(), 'shell', 'input', 'swipe', '969 800 969 1050 100'])time.sleep(1)capture_and_display()# 函数:通过ADB获取设备名
def find_device():dvs = os.popen("adb devices").readlines()dfs = ''for ss in dvs:ss = ss.strip('\n')if 'List of devices' not in ss and len(ss) > 6 and 'offline' not in ss:dv = ss.split('\t')[0]p = subprocess.Popen("adb -s %s shell getprop ro.product.model" % dv, stdout=subprocess.PIPE)result = p.communicate()dn = result[0].decode('utf-8').strip()cold_bev = tk.Radiobutton(button_frame, text=dn, variable=r_var, value=dv)cold_bev.pack(side="left")if dfs == '':dfs = dvif dfs != '':r_var.set(dfs)def find_ip(input_string):ip_pattern = r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b'ip_addresses = re.findall(ip_pattern, input_string)return ip_addresses[0]# 函数:通过ADB wifi连接设备
def wifi_connect():if r_var.get() == '':messagebox.showinfo(title='提示', message='没有连接设备呀!')returndv = r_var.get()if r_var.get().startswith('192.168.'):messagebox.showinfo(title='提示', message='已经是WiFi连接了啊!')returnp = subprocess.Popen("adb -s %s shell ip -f inet addr show wlan0" % dv, stdout=subprocess.PIPE)result = p.communicate()dn = result[0].decode('utf-8').strip()ip = find_ip(dn)subprocess.Popen([ADB_PATH, 'connect', ip])button_frame = tk.Frame(root)
button_frame.pack()capture_button = tk.Button(button_frame, text="截屏", command=capture_and_display)
capture_button.pack(side="left")
tk.Label(button_frame, text=" ").pack(side="left")
back_button = tk.Button(button_frame, text="后退", command=send_back_command)
back_button.pack(side="left")
tk.Label(button_frame, text=" ").pack(side="left")
up_button = tk.Button(button_frame, text="上滑", command=lambda: send_slide_command(1))
up_button.pack(side="left")
tk.Label(button_frame, text=" ").pack(side="left")
down_button = tk.Button(button_frame, text="下滑", command=lambda: send_slide_command(0))
down_button.pack(side="left")
tk.Label(button_frame, text=" ").pack(side="left")
ck_var = tk.IntVar()
c1 = tk.Checkbutton(button_frame, text='8连击', variable=ck_var, onvalue=1, offvalue=0)
c1.pack(side="left")
tk.Label(button_frame, text=" ").pack(side="left")
r_var = tk.StringVar(value='')
find_device()
img_label = tk.Label(root)
img_label.pack()
img_label.bind('<Button-1>', click_img)
wifi_button = tk.Button(button_frame, text="WiFi连接", command=wifi_connect)
wifi_button.pack(side="left")root.mainloop()

相关文章:
python实现adb辅助点击屏幕工具
#!/usr/bin/env python # -*- coding: utf-8 -*-import re import os import time import subprocess import tkinter as tk from tkinter import messagebox from PIL import Image, ImageTk# 设置ADB路径(根据你的系统和安装路径进行调整) ADB_PATH C…...
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击
智能合约安全分析,针对 ERC777 任意调用合约 Hook 攻击 Safful发现了一个有趣的错误,有可能成为一些 DeFi 项目的攻击媒介。这个错误尤其与著名的 ERC777 代币标准有关。此外,它不仅仅是众所周知的黑客中常见的简单的重入问题。 这篇文章对 …...
nodejs 爬虫 axios 异步爬虫 教程 【一】
axios 自定义headers axios.defaults.headers.common["User-Agent"] "Googlebot/2.1 (http://www.google.com/bot.html)"; 运行环境: node :v18 const axios require("axios"); axios.defaults.headers.common["U…...
Swift学习笔记三(Dictionary 篇)
1 Dictionary 概念 字典储存无序的互相关联的同一类型的键和同一类型的值的集合。字典类型的全写方式 Dictionary<Key, Value>,简写方式 [Key: Value],建议使用简写方式。字典的 key 必须是可哈希的。 2 Dictionary创建 2.1 初始器创建方式 2.2 …...
javax.mail 遇到501 mail from address must be same as authorization user 的問題
使用不同的兩個帳戶发送email时,第一个账户可以发送成功,但到第二个账户的时候就报出了501 mail from address must be same as authorization user的错误。 具体代码如下: import java.util.Date; import java.util.List; import java.util.…...
【Python】网络编程
Socket Socket (简称 套接字)是进程之间通信一个工具,进程之间想要进行网络通信需要socket。Socket负责进程之间的网络数据传输,好比数据的搬运工。 客户端和服务端 2个进程之间通过Socket进行相互通讯,就必须有服务端和客户端 Socket服务…...
客户端开发常用框架
在Unity游戏开发中,客户端常用的框架包括以下几种: 1.Unity的网络框架:Unity自带了网络框架,包括Unity Networking、Unity Matchmaker和Unity Remote等。这些框架可以帮助我们进行游戏的联机对战、排行榜、跨平台等功能的设计和实…...
数据分析综述
⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…...
区块链技术与应用 - 学习笔记2【密码学基础】
大家好,我是比特桃。本系列笔记只专注于探讨研究区块链技术原理,不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划,在“加快数字发展 建设数字中国”篇章中,区块链被列为“十四五”七大数字经济重点产业之一&#…...
制作Linux发行版安装镜像:复刻centos镜像安装ISO
制作Linux发行版安装镜像:复刻centos镜像安装ISO 我们平时经常下载Linux各个发行版,下载ISO,安装使用。那么ISO到底是如何制作的?安装过程是什么原理? 近来打算讲镜像制作的过程、原理,通过一个专栏分享一…...
【复习socket】每天40min,我们一起用70天稳扎稳打学完《JavaEE初阶》——29/70 第二十九天
专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮忙 点…...
postgresql-常用数学函数
postgresql-常用数学函数 案例 案例 --求余 1 select 5%2 as t; --绝对值 17.4 select abs(-17.4) as t2; -- 大于等于最小整数 -42 select ceil(-42.8) as t3; -- 小于等于的最大整数 42 select floor(42.3) as t4; -- 四舍五入 44 select round(43.6) as t5; -- 向零取整 12…...
Docker实战技巧(一):常用命令与最佳实践
一、原理 1、Hypervisor是一种运行在物理服务器和操作系统之间的中间软件层,可允许多个操作系统和应用共享一套基础物理硬件,它能直接访问物理设备,会给每一台虚拟机分配内存、CPU、网络、磁盘等资源,也可以确保虚拟机对应的硬…...
使用CUDA计算GPU的理论显存带宽
文章目录 一、显存带宽和理论显存带宽1. 显存带宽2. 理论显存带宽1)计算公式2)举例 二、利用CUDA计算理论显存带宽 一、显存带宽和理论显存带宽 1. 显存带宽 显存带宽是指显存和GPU计算单元之间的数据传输速率。 显存带宽越大,意味着数据传…...
npm install依赖冲突解决办法
今天npm的时候发现报错,原来是依赖冲突了 npm后面加上这个指令就可以顺利的安装依赖了。问题主因就是不同开发用了不同版本node导致依赖版本不同,出现了成功冲突,这是段指令;它告诉npm忽略项目中引入的各个依赖模块之间依赖相同但…...
植物大战僵尸各种僵尸攻略
前言 此文章为“植物大战僵尸”专栏中的009刊(2023年9月第八刊),欢迎订阅。版权所有。 注意: 1.本博客适用于pvz无名版; 2.pvz指植物大战僵尸(Plants VS Zonbies); 3.本文以耗费低做标准&am…...
Scrum敏捷开发企业实战培训
课程简介 Scrum是目前运用最为广泛的敏捷开发方法,是一个轻量级的项目管理和产品研发管理框架。 这是一个两天的实训课程,面向研发管理者、项目经理、产品经理、研发团队等,旨在帮助学员全面系统地学习Scrum和敏捷开发, 帮助企业快速启动敏…...
uniapp 下拉框数据回显的问题
问题 : 现在是下拉框数据回显不了, 绑定的v-model 原因 : uniui 下拉框数据绑定要是 value text 这种格式的 解决办法: 将获取到的后端数据 转换为 需要的格式 ,再进行绑定 下拉框的数据 遍历...
使用php 获取时间今天、明天、昨天时间戳的详解
使用php获取时间今、明天、昨天时间戳 <?php echo "今天:".date("Y-m-d").""; echo "昨天:".date("Y-m-d",strtotime("-1 day")), ""; echo "明天:".date("Y-m-d&qu…...
IIS解析漏洞复现
文章目录 漏洞复现总结 漏洞复现 打开虚拟机,在C:\inetpub\wwwroot\8000_test目录下放一个phpinfo.php文件: 在服务器管理器中打开IIS管理器,选择处理映射程序: 点击添加模块映射: 配置映射模板,php文件…...
pdf2htmlEX高级调试技术:汇编级调试与反汇编
pdf2htmlEX高级调试技术:汇编级调试与反汇编 【免费下载链接】pdf2htmlEX Convert PDF to HTML without losing text or format. 项目地址: https://gitcode.com/gh_mirrors/pd/pdf2htmlEX pdf2htmlEX是一款能够将PDF文件转换为HTML格式同时保持文本和格式完…...
Qwen2.5-VL-7B-Instruct实战教程:如何将截图中的UI设计精准还原为可运行HTML+CSS
Qwen2.5-VL-7B-Instruct实战教程:如何将截图中的UI设计精准还原为可运行HTMLCSS 1. 工具简介与环境准备 Qwen2.5-VL-7B-Instruct是一个专门针对RTX 4090显卡优化的多模态大模型工具,它能看懂图片内容并生成相应的代码。想象一下,你只需要给…...
避坑指南:STM32F411CEU6板载LED不亮的5个常见原因及解决方法
STM32F411CEU6板载LED故障排查实战手册 1. 硬件连接与基础检查 拿到一块STM32F411CEU6开发板(俗称Black Pill),第一件事往往就是测试板载LED。但当你满怀期待地烧录程序后,发现LED毫无反应时,别急着怀疑人生。让我们从…...
收藏!国内大厂大模型人才招聘真相,小白/程序员入门必看
在大模型技术飞速迭代的当下,国内各大互联网大厂对大模型高端人才的投入力度已然拉满,几乎每家头部企业都推出了针对顶尖人才的专项招聘计划,而这些计划的核心共性,就是“高薪兜底”搭配“高门槛筛选”,成为行业内最引…...
Java开发者晋升指南:集成Phi-3-vision构建AI面试题库与评估系统
Java开发者晋升指南:集成Phi-3-vision构建AI面试题库与评估系统 1. 技术招聘的痛点与AI解决方案 技术面试官每天面临重复性劳动:根据JD设计题目、评估代码、写反馈。传统方式存在三大痛点: 题库更新慢:技术栈迭代快,…...
高效解决图表数据提取难题:WebPlotDigitizer全功能解析
高效解决图表数据提取难题:WebPlotDigitizer全功能解析 【免费下载链接】WebPlotDigitizer WebPlotDigitizer: 一个基于 Web 的工具,用于从图形图像中提取数值数据,支持 XY、极地、三角图和地图。 项目地址: https://gitcode.com/gh_mirror…...
VMware安装RHEL9连接Xshell与Linux基础命令vim练习
1、在VMware上创建虚拟机以及安装RHEL9操作系统,使用ssh进行远程连接2、文件管理命令练习: 1(1)在/opt目录下创建一个临时目录tmp;2(2)在临时目录下创建一个文件,文件名为a.txt;3、vi/vim练习:完成如下步骤(1)应用vi命令在/tmp文件夹下创建文…...
Python张量框架选型不是技术问题,而是组织问题:CTO必须在立项前确认的5个战略问题(含人才储备周期、长期维护成本、专利风险审计清单)
第一章:Python张量框架选型不是技术问题,而是组织问题当团队在 PyTorch、TensorFlow 和 JAX 之间反复争论“哪个性能更好”或“哪个 API 更优雅”时,往往已陷入技术决定论的误区。真正制约张量框架落地效果的,是组织内部的协同惯性…...
AI Agent 时代的“将领艺术“:一个人如何指挥一支开发军队
摘要:本文探讨在 AI Agent 时代,开发者如何从"单兵作战"转变为"一人成军",核心在于任务拆分能力、Agent 调度能力和系统集成能力。通过战争将领的类比,提供一套可复用的 Agent 项目管理框架。 关键词&#x…...
JavaScript代码保护实战:用javascript-obfuscator给你的前端穿上防弹衣
JavaScript代码保护实战:用javascript-obfuscator打造坚不可摧的前端防线 1. 为什么前端代码需要保护? 记得去年参与一个电商项目时,团队花三个月开发的核心促销算法,上线一周就被竞争对手完整"借鉴"。检查发现对方直…...
