Uiautomator2自动化
小米手机使用注意几点(每次刷机后要修改设置,不然很坑):
1.关闭睡眠模式:发现了手机为什么夜里总是断wifi,场景配置→关闭睡眠模式
2.关闭放误碰,屏幕向下总是不能解锁导致任务没用正常运行,锁屏→关闭防误碰
3.关闭usb安装管理和权应用权限监控:查看方法
4.多个平台注意uiautomator2版本
5.停用 usb授权超时功能(可能不让授权过期,待测试)
需要的库:
UIAutomator2,weditor
注意:linux下载adb,用下面命令
sudo apt-get install adb
①模拟器连接adb
用scrcpy的adb可以连接,模拟器的不行
可以把逍遥模拟器文件夹下adb.exe, AdbWinApi.dll,AdbWinUsbApi.dll三个文件替换最新版adb即可
②手机连接adb方法
一:root后永久打开adb方法
方法1 使用magisk
刷入magic后然后下载ADBWifi
下载gitee:https://gitee.com/yang_yongsheng/adbwifi-magisk
GitHub:https://github.com/ysnows/adbwifi-magisk
下载后压缩成.zip后缀
天翼云下载:https://cloud.189.cn/t/FvIZBjeYv6Rj
放到手机文件夹里然后用magic导zip模块重启手机就可以了
方法2:刷开发板
若想修改build.prop文件要获取完整root,首先要解锁Bootloder和解锁System,才可以保存build.prop文件
1.解锁Bootloder
解锁Bootloder,官网解锁
2.解锁分区System (红米note2 安卓5.02 miui9不需要)
下载syslock解锁2.0.4
注意:第一次解锁System后重启,会显示未解锁,再解锁一次就好了(需要两次解锁分区)
这个时候修改文件,重启后未解锁
3.用Re管理器在 /system/build.prop长按build.prop点右边菜单键,以文本方式编辑
末尾添加以下语句,保存,重启手机即可
service.adb.tcp.port=5555
persist.service.adb.enable=1
重启就可以直接连接wifi adb'了
二:未root
如果第一次连接adb,要插线连接电脑
1.输入用有线连接
adb tcpip 5555
2.然后可以拔了usb线,用wifi连接
adb connect 192.168.31.109:5555
第一次连接勾选“一律允许使用这台计算机进行调试”
注:如果 提示192.168.31.109:5555 offline
adb kill-server
1.1服务器连接adb
方法1: 公网ip端口转发
服务器连接
adb connect 域名(不需要端口号)
方法2:magisk模块frp内网穿透
修改客户端ip就可以,点击查看
2.UIAutomator和weditor安装和使用
UIAutomator安装
pip install --pre -U uiautomator2
控件识别
使用weditor进行元素识别,
安装方法如下:
pip install --pre weditor
使用方法
1.手机连接pc,adb命令保证能正确读取到设备
2.pc终端输入python -m weditor
,浏览器自动打开网页http://atx.open.netease.com
python -m weditor
uiautomator2版本3.0以上用uiautodev
安装Python 3.8+
安装并启动
pip3 install -U uiautodev -i https://pypi.doubanio.com/simple
uiauto.dev
3.网页对应位置输入手机设备ip,点击connect连接手机设备,最后根据需要获取手机/app对应元素
正常启动页面如下:
①如果有线连接设备id输入,如果wifi adb用ip和端口号 /
②Connect连接/
③dump hierarchy 刷新页面
3.脚本编写
UI自动化编写,
其优势是,手机和模拟器大部分通用,不是和找图一样分辨率不同,可能不能用,发现有一些不同,待研究:手机是text="赚金币"模拟器description="赚金币"可能淘宝版本不同
import uiautomator2 as u2
import time
# d = u2.connect('127.0.0.1:21503')
d = u2.connect('192.168.31.109:5555')
# click
d(text="Settings").click()
# timeout设置找图超时时间
d(text="领淘金币").click(timeout=1)
# long click,
d(text="Settings").long_click(timeout=1)
# 等待元素的出现
d(text="Settings").wait(timeout=10.0)
# 输入文字
d(text="Settings").set_text("你好")
# 获取当前屏幕元素
print(d.dump_hierarchy())
print(d(text="领淘金币").info) # 获取信息
(x1, y1, x2, y2) = d(text="领淘金币").bounds() # 获取(x1, y1, x2, y2)坐标
(x1, y1, x2, y2) = d.xpath('//*[@text="领淘金币"]').match().bounds # xpath(获取(x1, y1, x2, y2)坐标
# 正则表达式配合xpath点击
html = self.d.dump_hierarchy()
compare = re.compile('content-desc="购后返 \\d+"', re.S)
r_list = compare.findall(html)
if r_list:
j_elem = r_list[0]
else:
j_elem = ""
self.multiple_find_picture(self.index, [""], 20, "点击", "不返回", [j_elem])
# 打开通知或快速设置(下面两个一样作用)
d.open_notification()
d.open_quick_settings()
拓展:adb也有类似命令, 获取当前屏幕元素(测试安装13可以,安卓10不行)
adb shell uiautomator dump /sdcard/screen.xml
UI hierchary dumped to: /sdcard/screen.xml
更多命令
清空app数据
# 清空app数据
d.app_clear('com.lxcm.taocoupon')
d(descriptionContains="安装").info
d(textContains="安装").info
例如
d.press("home")
目前支持这些密钥名称:
home
back
left
right
up
down
center
menu
search
enter
delete ( or del)
recent (recent apps)
volume_up
volume_down
volume_mute
camera
power
KEYCODE_UNKNOWN=0;
KEYCODE_SOFT_LEFT=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;//*Camera*focus
KEYCODE_PLUS=81;
KEYCODE_MENU=82;
KEYCODE_NOTIFICATION=83;
KEYCODE_SEARCH=84;
KEYCODE_MEDIA_PLAY_PAUSE=85;
KEYCODE_MEDIA_STOP=86;
KEYCODE_MEDIA_NEXT=87;
KEYCODE_MEDIA_PREVIOUS=88;
KEYCODE_MEDIA_REWIND=89;
KEYCODE_MEDIA_FAST_FORWARD=90;
KEYCODE_MUTE=91;
# 选择文本为'Clock'的对象,其className为'android.widget.TextView'd
d(text='Clock', className='android.widget.TextView')
选择器支持以下参数。有关详细信息,请参阅UiSelector Java文档。
text,textContains,textMatches,textStartsWith
className, classNameMatches
description,descriptionContains,descriptionMatches,descriptionStartsWith
checkable,checked,clickable,longClickable
scrollable,enabled,focusable,focused,selected
packageName, packageNameMatches
resourceId, resourceIdMatches
index, instance
Child and siblings
child
# get the children or grandchildren
d(className="android.widget.ListView").child(text="Bluetooth")
siblings
# get siblings
d(text="Google").sibling(className="android.widget.ImageView")
children by text or description or instance
# get the child matching the condition className="android.widget.LinearLayout"
# and also its children or grandchildren with text "Bluetooth"
d(className="android.widget.ListView", resourceId="android:id/list") \
.child_by_text("Bluetooth", className="android.widget.LinearLayout")
# 通过允许滚动搜索来获取子项
d(className="android.widget.ListView", resourceId="android:id/list") \
.child_by_text(
"Bluetooth",
allow_scroll_search=True,
className="android.widget.LinearLayout"
)
child_by_instance是在子层次结构中的任何位置找到具有子UI元素的子元素,该元素位于指定的实例中。它在可见视图上执行而无需滚动.
UiScrollable,getChildByDescription,getChildByText,getChildByInstance
UiCollection,getChildByDescription,getChildByText,getChildByInstance
打开WIFI旁边的ON
要将开关小部件单击到TextView的“Wi-Fi”,我们需要先选择切换小部件。但是,根据UI层次结构,存在多个交换机窗口小部件并且具有几乎相同的属性。通过className选择将不起作用。或者,以下选择策略将有助于:
d(className="android.widget.ListView", resourceId="android:id/list") \
.child_by_text("Wi‑Fi", className="android.widget.LinearLayout") \
.child(className="android.widget.Switch") \
.click()
此外,我们可以使用相对定位方法来获取视图:left,right,top,bottom。
d(A).left(B),选择A左侧的B.
d(A).right(B),选择A右侧的B.
d(A).up(B),选择B以上A.
d(A).down(B),在A下选择B.
因此,对于上述情况,我们可以选择它:
##选择“Wi-Fi”右侧的“开关”
d(text="Wi‑Fi").right(className="android.widget.Switch").click()
以下是一些 uiautomator2
库中 xpath
方法支持的常见 XPath 表达式及其用法,包括父元素、子元素、兄弟元素等:
定位方式 | XPath 表达式 | 例子 |
---|---|---|
元素本身 | . |
d.xpath('.') |
父元素 | /parent::* |
parent_element = d.xpath('/parent::*') |
所有子元素 | /* 或 /child::* |
child_elements = d.xpath('/*') |
第一个子元素 | /child::*[1] |
first_child = d.xpath('/child::*[1]') |
所有兄弟元素 | /following-sibling::* 或 /following::* |
sibling_elements = d.xpath('/following-sibling::*') |
后续第一个兄弟元素 | /following-sibling::*[1] 或 /following::*[1] |
next_sibling = d.xpath('/following-sibling::*[1]') |
所有前兄弟元素 | /preceding-sibling::* 或 /preceding::* |
preceding_sibling_elements = d.xpath('/preceding-sibling::*') |
前兄弟中的第一个元素 | /preceding-sibling::*[1] 或 /preceding::*[1] |
first_preceding_sibling = d.xpath('/preceding-sibling::*[1]') |
按索引选择子元素 | /*[n] |
nth_child = d.xpath('/*[3]') |
按条件选择子元素 | /*[@attribute="value"] |
filtered_child = d.xpath('/*[@id="example_id"]') |
选择位置(相对索引) | [position() = 2] | d.xpath('//*[@text="捉小鸡"]/parent::*/preceding-sibling::*[position() = 2]') |
最后一个 | [last()] | //your/element/xpath[last()] |
请注意,这里的例子仅供参考,具体应用时需要根据应用程序的实际结构进行调整。 XPath 表达式的编写需要对应用的 UI 结构有一定的了解。
有时屏幕可能包含多个具有相同属性的视图,例如文本,那么您必须使用选择器中的“instance”属性来选择一个合格的实例,如下所示:
d(text = “ Add new ”,instance = 0) #表示带有文本“Add new”的第一个实例
另外,uiautomator2提供了类似列表的API(类似于jQuery):
# get the count of views with text "Add new" on current screen
d(text="Add new").count
# same as count property
len(d(text="Add new"))
# get the instance via index
d(text="Add new")[0]
d(text="Add new")[1]
...
# iterator 迭代器
for view in d(text="Add new"):
view.info # ...
注意:以列表方式使用选择器时,必须确保屏幕上的UI元素保持不变。否则,当迭代列表时可能发生Element-Not-Found错误
-
检查特定的UI对象是否存在
d(text="Settings").exists # True if exists, else False
d.exists(text="Settings") # alias of above property.
# advanced usage
d(text="Settings").exists(timeout=3) # wait Settings appear in 3s, same as .wait(3)
- 检索特定UI对象的信息
d(text = “ Settings ”).info
以下是可能的输出:
{ u'contentDescription': u'',
u'checked': False,
u'scrollable': False,
u'text': u'Settings',
u'packageName': u'com.android.launcher',
u'selected': False,
u'enabled': True,
u'bounds': {u'top': 385,
u'right': 360,
u'bottom': 585,
u'left': 200},
u'className': u'android.widget.TextView',
u'focused': False,
u'focusable': True,
u'clickable': True,
u'chileCount': 0,
u'longClickable': True,
u'visibleBounds': {u'top': 385,
u'right': 360,
u'bottom': 585,
u'left': 200},
u'checkable': False
}
- 获取/设置/清除可编辑字段的文本(例如,EditText小部件)
d(text = “ Settings ”).get_text() # get widget text
d(text = “ Settings ”).set_text(“ My text ... ”) #设置文本
d(text = “ Settings ”).clear_text( ) #清除文字
- 获取Widget中心点
x, y = d(text="Settings").center()
3.8 对选定的UI对象执行单击操作
- 执行单击特定对象
# 单击特定ui对象的中心
d(text="Settings").click()
# wait元素最多显示10秒然后单击
d(text="Settings").click(timeout=10)
# 请在10秒时点击,默认的超时0
clicked = d(text='Skip').click_exists(timeout=10.0)
# 点击直到元素不见了,返回布尔
is_gone = d(text="Skip").click_gone(maxretry=10, interval=1.0) # maxretry default 10, interval default 1.0
- 长按特定的UI对象
# 长按特定UI对象的中心
d(text="Settings").long_click()
3.9 adb重启或关机手机命令
如果一台电脑连接一台手机,则使用如下命令
adb reboot
如果一台电脑连接多台手机,具体指定哪台手机重启需要指定设备号
adb -s device1 reboot
下面是关机命令
adb shell reboot -p
d.long_click(567.00, 1490.50, duration=1.8)
1、安卓手机上ATX无法启动,点击启动UIAUTOMATOR按钮,提示not started
解决方法:命令行执行
adb shell
chmod 755 /data/local/tmp/atx-agent
# 查看版本
data/local/tmp/atx-agent version
# 启动atx-agent并切换到后台运行
/data/local/tmp/atx-agent server -d
5.1. atx-agent has something wrong, auto recovering
[W 201030 15:24:17 __init__:203] atx-agent has something wrong, auto recovering
[D 201030 15:24:17 __init__:287] device 534640040.top:5555 is online
[I 201030 15:24:18 init:155] uiautomator2 version: 2.12.0
[I 201030 15:24:18 init:352] Install minicap, minitouch
[I 201030 15:24:29 init:370] Already installed com.github.uiautomator apks
[I 201030 15:24:29 init:340] Install atx-agent 0.9.5
[I 201030 15:27:11 init:377] Check atx-agent version
最后发现不是版本问题,是手机问题,
可能两个平台安了不一样得uiautomator2
我win10和linux都装了uiautomator2控制一台手机,报错
win10查看库版本
pip list | findstr uiautomator2
linux查看库版(如果pip3用pip3)
pip list | grep uiautomator2
版本较低要升级
pip install -U uiautomator2
java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission
at android.os.Parcel.createException(Parcel.java:2074)
at android.os.Parcel.readException(Parcel.java:2042)
at android.os.Parcel.readException(Parcel.java:1990)
at android.hardware.input.IInputManager$Stub$Proxy.injectInputEvent(IInputManager.java:991)
at android.hardware.input.InputManager.injectInputEvent(InputManager.java:886)
at com.android.commands.input.Input.injectKeyEvent(Input.java:386)
at com.android.commands.input.Input.access$100(Input.java:41)
at com.android.commands.input.Input$InputKeyEvent.sendKeyEvent(Input.java:204)
at com.android.commands.input.Input$InputKeyEvent.run(Input.java:191)
at com.android.commands.input.Input.onRun(Input.java:108)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:56)
at com.android.commands.input.Input.main(Input.java:71)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:380)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:752)
at com.android.server.input.InputManagerService.injectInputEvent(InputManagerService.java:726)
at android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:451)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)
解决办法打开usb调试(安全模式)打开
5.3 restart-uiautomator since uiautomator2.GatewayErro
[D 220109 00:21:12 __init__:661] [pid:49226] [192.168.31.41:5555] kill process(ps): uiautomator
[D 220109 00:21:13 __init__:682] [pid:49226] [192.168.31.41:5555] uiautomator-v2 is starting ... left: 40.0s
[D 220109 00:21:14 __init__:682] [pid:49226] [192.168.31.41:5555] uiautomator-v2 is starting ... left: 39.0s
[D 220109 00:21:15 __init__:682] [pid:49226] [192.168.31.41:5555] uiautomator-v2 is starting ... left: 37.9s
[I 220109 00:21:18 __init__:626] [pid:49226] [192.168.31.41:5555] restart-uiautomator since "uiautomator2.GatewayError(gateway error, time used 0.0s)"
[D 220109 00:21:18 __init__:661] [pid:49226] [192.168.31.41:5555] kill process(ps): uiautomator
[D 220109 00:21:19 __init__:738] [pid:49226] [192.168.31.41:5555] grant permissions
[D 220109 00:21:20 __init__:682] [pid:49226] [192.168.31.41:5555] uiautomator-v2 is starting ... left: 40.0s
[D 220109 00:21:21 __init__:682] [pid:49226] [192.168.31.41:5555] uiautomator-v2 is starting ... left: 39.0s
解决方法:小米手机没开usb安装,所以atx和com.github.uiautomator.test都没安装上,在开发者选项中打开 usb安装 ,命令行执行
python -m uiautomator2 init
1.拼多多
"""##################拼多多#####################"""
def open_pin(self):
self.d.app_stop("com.xunmeng.pinduoduo")
time.sleep(1)
self.d.app_start("com.xunmeng.pinduoduo")
[x, y], k = self.multiple_find_picture("", 20, "点击", "返回", ['text="首页"'])
if x > 0 and y > 0:
print("找到首页")
[x1, y1], k = self.multiple_find_picture("", 10, "点击", "不返回", ['text="现金签到"'])
if x1 > 0 and y1 > 0:
print("找到现金签到")
have_qian = read_file.sql_search("content", "拼多多已签到")
[x2, y2], k = self.multiple_find_picture("", 15, "点击", "不返回", ['text="立即签到"'],
["", self.d(textContains="元", index=0)])
if x2 > 0 and y2 > 0:
print("拼多多已签到")
time.sleep(2)
writelog.write_file("拼多多一次open_pin")
if k == 0:
if len(read_file.sql_search("content", "拼多多一次open_pin")) < 3:
self.back()
self.open_pin()
# [x4, y4], k = self.multiple_find_picture("", 15, "点击", "不返回", ['text="提现"'])
# if x4 >0 and y4 >0:
# print("找到微信提现")
# [x5, y5], k = self.multiple_find_picture("", 15, "点击", "不返回", [],[self.d(text="提现", index=7)])
# if x5 >0 and y5 >0:
# print("找到内部提现")
# self.back()
# self.open_pin()
if k == 1:
print("说明签到过了,领取其他任务")
[x3, y3], k = self.multiple_find_picture("", 10, "点击", "不返回", [],
[self.d(text="2jRpLZ0XgAAAABJRU5ErkJggg==")])
if x3 > 0 and y3 > 0:
[x4, y4], k = self.multiple_find_picture("", 10, "点击", "不返回", ['text="定时领现金"'], )
if x4 > 0 and y4 > 0:
print("找到定时领现金")
self.multiple_find_picture("", 10, "点击", "不返回",
['text="daily_bonus_mid_limited_reward_new_btn"'])
try:
open = self.d.xpath(
'//android.webkit.WebView/android.view.View[2]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[1]/android.view.View[3]/android.view.View[1]')
if open:
open.click()
except Exception as e:
pass
writelog.write_file("拼多多已签到")
self.screen("Android/拼多多已签到.jpg")
self.back()
self.multiple_find_picture("", 10, "点击", "不返回", ['text="放弃现金"'])
for i in range(3):
g_j = self.d(text="逛街得现金")
time.sleep(1)
if g_j:
g_j.click()
[x4, y4], k = self.multiple_find_picture("", 10, "点击", "不返回", ['text="立即赚钱"'])
if x4 > 0 and y4 > 0:
print("找到逛街得金币需要等待一分钟")
for j in range(20):
time.sleep(3 + random.uniform(0.1, 0.6))
self.swipe(389, 967 + random.randint(0, 10), 389, 397 + random.randint(0, 10))
writelog.write_file("%s已完成逛街得金币" % self.ip)
self.screen("Android/拼多多已完成逛街得金币.jpg")
else:
print("已经完成")
else:
print("没找找到逛街得金币")
def pin_bu(self):
"""拼多多步数"""
print("拼多多步数程序")
self.d.app_stop("com.xunmeng.pinduoduo")
time.sleep(1)
self.d.app_start("com.xunmeng.pinduoduo")
[x, y], k = self.multiple_find_picture("", 20, "点击", "返回", ['text="个人中心"'])
if x > 0 and y > 0:
print("找到个人中心")
[x1, y1], k = self.multiple_find_picture("", 20, "点击", "不返回",
['resource-id="com.xunmeng.pinduoduo:id/fl8"'])
if x1 > 0 and y1 > 0:
print("找到我的步数")
[x2, y2], k = self.multiple_find_picture("", 20, "点击", "不返回", ['text="可领步数"'])
if x2 > 0 and y2 > 0:
print("找到可领取步数")
writelog.write_file("%s已完成逛街得金币" % self.ip)
self.screen("Android/拼多多已完成逛街得金币.jpg")
[x4, y4], k = self.multiple_find_picture("", 20, "点击", "不返回", ['text="可领取"'])
if x4 > 0 and y4 > 0:
print("找到步数可领取")
self.multiple_find_picture("", 20, "点击", "不返回", ['text="立即兑换成健康金"'])
[x3, y3], k = self.multiple_find_picture("", 20, "点击", "不返回", ['resource-id="gloden-coin"'])
if x3 > 0 and y3 > 0:
print("兑换健康金额")
class Pindd(UiAutomatr):
def __init__(self, ip=note8_ip):
super(Pindd, self).__init__()
self.ip = ip
self.read()
print("拼多多")
self.open_pin()
self.pin_bu()
2.全民养猫
def enter_task(self, flag1, flag2, flag3):
print("进入聚划算或养猫任务中心前提")
[x, y], k = self.multiple_find_picture("", 20, "点击", "不返回",
delem=[self.d(resourceId="com.taobao.taobao:id/indicator_pinned"), self.d(resourceId="com.alipay.mobile.socialwidget:id/topMarkIcon")])
if x > 0 and y > 0:
[x1, y1], k = self.multiple_find_picture("", 20, "点击", "不返回",
delem=[self.d(description=flag1), self.d(text=flag1), self.d(resourceId='com.alipay.mobile.chatapp:id/biz_title')])
if x1 > 0 and y1 > 0:
print(flag1)
time.sleep(1)
[x2, y2], k = self.multiple_find_picture("", 20, "点击", "不返回",
delem=[self.d(text="帮Ta助力"), self.d(text=flag2)])
if x2 > 0 and y2 > 0:
print(flag2)
[x3, y3], k = self.multiple_find_picture("", 20, "点击", "不返回",
delem=[self.d(text=flag3), self.d(text="去喂我的猫猫")])
if x3 > 0 and y3 > 0:
print(flag3)
return True
"""######################全民养猫########################## """
def join_zhan(self):
[x, y], k = self.multiple_find_picture("", 20, "点击", "不返回", [], delem=[self.d(textContains="比拼赢红包,今日奖池")])
if x > 0 and y > 0:
h = datetime.datetime.now().hour
writelog.write_file("%s%s时已完成参战" % (self.tao_user.replace('*', 'X'), h))
[x1, y1], k = self.multiple_find_picture("", 10, "点击", "不返回", ['text="开启比拼"'])
self.multiple_find_picture("", 5, "点击", "不返回", ['text="明天再来"'])
if x1 > 0 and y1 > 0:
time.sleep(0.1)
self.multiple_find_picture("", 10, "点击", "不返回", ['text="开启比拼"'])
self.multiple_find_picture("", 15, "点击", "不返回", ['text="明天再来"'])
try:
yt = self.d.xpath(
'//*[@resource-id="module-container"]/android.view.View[4]/android.view.View[1]/android.view.View[1]')
except Exception as e:
yt = None
if yt:
try:
yt.click()
miss = 0
except Exception as e:
miss = 1
time.sleep(1)
[x2, y2], k = self.multiple_find_picture("", 10, "点击", "不返回", ['text="得游艇+288人气"'])
if x2 > 0 and y2 > 0:
time.sleep(0.1)
if miss == 1:
self.d.click(x2+100, y2)
print("找到游艇")
time.sleep(15)
for i in range(2):
[x4, y4], k = self.multiple_find_picture("", 20, "点击", "不返回", ['content-desc="签到"'])
if x4 > 0 and y4 > 0:
time.sleep(2)
[x6, y6], k = self.multiple_find_picture("", 5, "点击", "不返回", delem=[self.d(descriptionContains="关注店铺"), self.d(descriptionContains="杜蕾斯")])
if x6 > 0 and y6 > 0:
print("进入了,要返回上一层")
time.sleep(3)
self.back()
[x3, y3], k = self.multiple_find_picture("", 10, "点击", "不返回", ['content-desc="去浏览"'], delem=[self.d(descriptionContains="浏览店铺")])
if x3 > 0 and y3 > 0:
print("下滑15秒")
time.sleep(2)
for i in range(13):
self.swipe(389, 967 + random.randint(0, 10), 389, 397 + random.randint(0, 10))
time.sleep(random.randint(2, 3))
# try:
# k1 = self.d.xpath('//*[@text="全部完成啦"]')
# except Exception as e:
# k1 = ""
# if k1:
# break
self.back()
self.multiple_find_picture("", 10, "点击", "不返回", ['content-desc="签到"'])
[x6, y6], k = self.multiple_find_picture("", 15, "点击", "不返回", ['text="领取"'])
if x6 > 0 and y6 > 0:
for i in range(2):
writelog.write_file("%s18时已完成参战" % (self.tao_user.replace('*', 'X')))
writelog.write_file("%s19时已完成参战" % (self.tao_user.replace('*', 'X')))
time.sleep(2)
self.d.app_stop(self.app_name_tz)
self.keep_cat()
return
# d.xpath('//*[@resource-id="module-container"]/android.view.View[4]/android.view.View[1]/android.view.View[1]').click()
# d.xpath('//*[@text="得游艇+288人气"]').click()
# d.xpath('//*[@content-desc="签到"]').click()
def cat_find_elem(self):
print("全民养猫找元素程序")
for k in range(3):
try:
lq = self.d(resourceId="taskBottomSheet").child(text="领取奖励", instance=k)
if lq:
writelog.write_file("%s领取奖励" % self.tao_user)
lq.click()
except Exception as e:
pass
if self.app_name_tz == "com.taobao.taobao":
keyword = ["去浏览", "去完成", '领取', "去搜索", "签到", "去施肥", "逛一逛", '去观看']
else:
keyword = ["逛一逛", "签到", "去施肥"]
for i in keyword:
for count in range(len(self.remove_list) + 1):
try:
if self.app_name_tz == "com.taobao.taobao":
elem = self.d(text=i, instance=count).sibling(className="android.view.View").child(index=0)
else:
elem = self.d(text=i, instance=count).sibling(className="android.view.View")
if elem:
print("找到%s" % i)
if elem.info["text"] in self.remove_list:
print("不需要做了")
continue
return elem
except Exception as e:
print("错误", e)
self.tb_timeout_option("cat_find_elem")
user = self.tao_user.replace('*', 'x')
self.screen("Android/%s全民养猫.jpg" % user)
def close_kind_of(self):
[x1, y1], k = self.multiple_find_picture("", 8, "点击", "不返回", ['text="我知道了,喵~"'])
[x2, y2], k = self.multiple_find_picture("", 5, "点击", "不返回", ['text="选好了,领红包"'])
[x3, y3], k = self.multiple_find_picture("", 5, "点击", "不返回", ['text="开心收下,喵~"'])
[x4, y4], k = self.multiple_find_picture("", 5, "点击", "不返回", ['text="关闭"'])
if x1 > 0 or x2 > 0 or x3 > 0 or x4 > 0:
return True
def keep_cat(self):
print("%s开始全民养猫" % self.tao_user)
# 淘宝无响应
self.multiple_find_picture("", 4, "不点击", "不返回", ['resource-id="android:id/button1'])
if self.z >= 3:
print("keep_cat已经超过最大失败次数")
return
self.open_phone()
self.open_tao()
time.sleep(2)
[x2, y2], k = self.multiple_find_picture("", 1, "不点击", "不返回", ['text = "赚喵币"'])
if x2 > 0 and y2 > 0:
print("找到任务中心")
self.cat_begin_task()
[x, y], k = self.multiple_find_picture("", 20, "点击", "返回", ['content-desc="消息"', 'text="消息"'])
if x > 0 and y > 0:
print("找到全民养猫")
if self.app_name_tz == "com.taobao.taobao":
enter = self.enter_task("拜托拜托帮我助力~你也能分20亿!一起养猫领大大大大大红包~", "帮TA助力", "去喂养猫猫")
else:
enter = self.enter_task("一起抢20亿红包","去喂我的猫猫", "我的猫,点击撸猫")
if enter is True:
self.cat_do_task()
return
else:
print("没找到宝箱聚划算")
self.tb_timeout_option("keep_cat")
self.d.app_stop(self.app_name_tz)
self.keep_cat()
def cat_do_task(self):
print("%s进入全民养猫做任务程序" % self.tao_user)
time.sleep(4)
[x, y], k = self.multiple_find_picture("", 30, "不点击", "不返回",
['text = "赚喵币"'])
if x > 0 and y > 0:
time.sleep(2)
# 领取喵币
[x1, y1], k = self.multiple_find_picture("", 10, "点击", "不返回", [], delem=[self.d(textContains="喵币点击领取")])
if x1 > 0 and y1 > 0:
print("%s找到喵币点击领取" % self.tao_user)
writelog.write_file("%s找到喵币点击领取" % self.tao_user)
time.sleep(random.uniform(0.5, 0.9))
[x2, y2], k = self.multiple_find_picture("", 10, "点击", "不返回", ['text="去喂猫 赚更多喵币"'])
if x2 > 0 and y2 > 0:
print("去喂猫")
time.sleep(1)
# 喂猫领红包
my_miao_bi = self.d(textContains="我的喵币,")
if my_miao_bi and self.canzhan != "yes":
text = my_miao_bi.info['text']
try:
my_money = int(text.split(",")[1])
print(my_money)
if my_money > 60000:
times = int(my_money / 60000)
print("可以升级%s次" % times)
for i in range(times):
[x3, y3], k = self.multiple_find_picture("", 10, "点击", "不返回", [],
delem=[self.d(textContains="每次消耗60000喵币")])
if x3 > 0 and y3 > 0:
print("第%s次找到喂猫升级,每次消耗60000喵币" % i)
self.close_kind_of()
except Exception as e:
print(e)
pass
# 领取红包:立即领取
[x4, y4], k = self.multiple_find_picture("", 5, "点击", "不返回", ['resource-id="_KoNBzG"'])
if x4 > 0 and y4 > 0:
print("找到立即领取")
writelog.write_file("%s找到立即领取" % self.tao_user)
self.multiple_find_picture("", 3, "点击", "不返回", ['text="关闭"'])
[x7, y7], k = self.multiple_find_picture("", 1, "点击", "不返回", ['text="去喂我的猫猫','text="好的,11月11日见', 'text="我知道啦!"', 'text="好的,我知道了"', 'text="帮Ta助力"'])
if x7 > 0 and y7 > 0:
self.multiple_find_picture("", 7, "点击", "不返回", ['text="去喂我的猫猫'])
# 参战
h = datetime.datetime.now().hour
writelog.write_file("%s%s时已完成参战" % (self.tao_user, h))
flag = read_file.sql_search("content", "%s%s时已完成参战" % (self.tao_user.replace('*', 'X'), h))
if self.app_name_tz == "com.taobao.taobao" and len(flag) < 2 and h >= 9:
print("%s满足条件为淘宝软件并且,再规定时间内没参战" % self.tao_user)
writelog.write_file("%s满足条件为淘宝软件并且,再规定时间内没参战" % self.tao_user)
self.join_zhan()
# 判断进入领喵币任务
if self.canzhan == "yes":
print("为yes退出任务")
self.z = 3
return
else:
print("不是yes")
[x1, y1], k = self.multiple_find_picture("", 30, "点击", "不返回",
['text = "赚喵币"'])
if x1 > 0 and y1 > 0:
print("%s找到赚喵币" % self.tao_user)
time.sleep(2)
self.cat_begin_task()
return
if self.close_kind_of() is True:
writelog.write_file("某些页面没有关,并不能安超时计算")
self.cat_do_task()
self.tb_timeout_option("cat_do_task")
self.d.app_stop(self.app_name_tz)
self.keep_cat()
def cat_begin_task(self, count=0):
print("%s 进入开始做任务程序,count = %s" % (self.tao_user, count))
if self.z > 3:
print("keep_cat已经超过最大失败次数")
return "结束"
# elem = self.cat_find_elem()
# if elem:
# print("找到无需再找元素")
# else:
elem = ''
for r in range(5):
if self.app_name_tz == "com.eg.android.AlipayGphone":
# 支付宝才会
self.multiple_find_picture("", 6, "点击", "不返回", ['text="好的,我知道了"'])
[x, y], k = self.multiple_find_picture("", 10, "不点击", "不返回", ['resource-id="taskBottomSheet"', 'text="做任务领喵币"'])
if x > 0 and y > 0:
print("已经打开做任务列表界面,self.remove_list=%s" % self.remove_list)
time.sleep(random.uniform(0.1, 0.5))
elem = self.cat_find_elem()
if elem:
print("确认到元素%s" % elem)
break
else:
self.back()
self.multiple_find_picture(['huidaotaobao'], 1, "点击", "不返回")
print("找做任务好礼,返回一次")
time.sleep(1)
else:
self.d.app_stop(self.app_name_tz)
self.tb_timeout_option("cat_begin_task")
self.keep_cat()
return
# 这几行判断是否元素越界,不然点击不到
if elem:
try:
text = elem.info["text"]
except Exception as e:
print(e)
self.cat_begin_task()
return
# '邀家人一起领喵币', '到店付款一笔(≥2元)'
if text == '开通省钱卡领91元红包(0/1)开通连续包月赚1000星星' \
or text == '浏览U先,赢1分钱试用(0/1)浏览15秒得50星星' \
or text == '玩省钱消消消赢福利(0/1)消除三次得50星星' or text == "登录淘宝特价版送红包(0/1)" \
or text == "邀请好友一起撸猫(0/5)" \
or text == '逛一逛淘宝特价版(0/1)' \
or text == '邀请好友一起撸猫(2/5)' or text == '到店付款一笔(≥2元)' or text == '邀家人一起领喵币':
print("加入移除元素", text)
self.remove_list.append(text)
self.cat_begin_task()
return
try:
y_mobile = self.d.device_info['display']['height']
pos = elem.bounds()[1] / y_mobile # 获取元素y1和手机高相比
print(pos)
if pos > 0.89:
print("需要下滑元素")
self.swipe(389, 0.92 * y_mobile + random.randint(0, 10), 389, 397 + random.randint(0, 10))
time.sleep(1)
elem = self.cat_find_elem()
except Exception as e:
self.cat_begin_task()
return
print("elem存在%s" % elem.info["text"])
self.task_list.append(text)
res = Counter(self.task_list)
if res[text] > 2:
print("超过最大次数")
self.remove_list.append(text)
self.cat_begin_task()
return
print('[%s]%s出现%s次' % (self.tao_user, text, res[text]))
writelog.write_file('%s出现%s次' % (text, res[text]))
title = re.compile("去淘宝成就提升成就点\(0/1\)", re.S).findall(text)
title2 = re.compile("双11开幕直播盛典预热\(0/1\)", re.S).findall(text)
title3 = re.compile("最高可得", re.S).findall(elem.sibling(index=1).info["text"])
title4 = re.compile("浏览15秒", re.S).findall(elem.sibling(index=1).info["text"])
title5 = re.compile("最高可领", re.S).findall(elem.sibling(index=1).info["text"])
title6 = ""
try:
if self.app_name_tz == "com.eg.android.AlipayGphone":
title6 = re.compile("逛", re.S).findall(elem.sibling(className="android.widget.Button").info["text"])
except Exception as e:
pass
if title:
print("找到淘宝成就任务")
elem.click()
[x8, y8], k = self.multiple_find_picture("", 30, "不点击", "不返回", ['text="总成就点"'])
if x8 > 0 and y8 > 0:
print("找到总成就点")
for j in range(3):
for i in range(8):
try:
c_elem = self.d.xpath('//android.widget.ListView/android.view.View[%s]/android.view.View[1]/android.widget.Button[1]' % i).wait(0.1)
if c_elem:
print("找到")
c_elem = self.d.xpath('//android.widget.ListView/android.view.View[%s]/android.view.View[1]/android.widget.Button[1]' % i)
if c_elem.info["text"] != "去完成 返回":
c_elem.click()
except Exception as e:
pass
time.sleep(random.randint(1, 2))
print("下滑一次")
self.swipe(389, 967 + random.randint(0, 10), 389, 397 + random.randint(0, 10))
if text == "签到":
print("%s签到成功" % self.tao_user)
elem.click()
writelog.write_file("%s%s" % (self.tao_user, text))
if self.app_name_tz == "com.eg.android.AlipayGphone":
self.multiple_find_picture("", 10, "点击", "不返回", ['text="好的,我知道了"'])
self.cat_begin_task()
if title3 or title4 or title5 or title2 or title6:
if text == "每日签到领喵币(0/1)" or text == "领惊喜喵币礼包(0/1)":
print("%s签到成功" % self.tao_user)
elem.click()
writelog.write_file("%s%s" % (self.tao_user, text))
self.cat_begin_task()
if text == '去芭芭农场施肥1次(0/1)':
print("进金币农场")
try:
elem.click()
except Exception as e:
pass
[x, y], k = self.multiple_find_picture(["shifei"], 50, "不点击", "不返回")
if x > 0 and y > 0:
self.d.click(x, y)
print("去施肥")
self.back()
time.sleep(random.uniform(1, 2))
self.cat_begin_task()
return
if text == '参与组队领红包(0/1)':
elem.click()
self.cat_begin_task()
return
print("%s需要下滑15秒" % self.tao_user)
writelog.write_file("%s需要下滑15秒" % self.tao_user)
try:
elem.click()
except Exception as e:
self.cat_begin_task()
return
time.sleep(random.randint(1, 2))
for i in range(12):
if text != '看一看双11官方直播(0/1)':
self.swipe(389, 967 + random.randint(0, 10), 389, 397 + random.randint(0, 10))
time.sleep(random.randint(1, 2))
if i < 2:
self.multiple_find_picture("", 1, "点击", "不返回",
['text="仅在使用中允许"',
'text="允许"',
'text="始终允许"'])
[x1, y1], k = self.multiple_find_picture("", 1, "不点击", "不返回",
delem=[
self.d(descriptionContains="任务完成"),
self.d(textContains="任务完成"),
self.d(descriptionContains="任务已完成"),
self.d(textContains="任务已完成"),
self.d(textContains="今日已达上限"),
self.d(textContains="全部完成啦"),
self.d(descriptionContains="全部完成啦"),
self.d(descriptionContains="今日已达上限")
])
try:
xp = self.d.xpath('//*[@resource-id="app"]/android.view.View[1]/android.view.View[2]').wait(0.1)
if xp:
print("等待10秒")
time.sleep(random.uniform(12, 14))
except Exception as e:
xp = ''
if x1 > 0 or xp:
print("%stitle3任务完成" % self.tao_user)
self.back()
time.sleep(2)
break
else:
print("%s循环完整后的任务完成" % self.tao_user)
self.back()
time.sleep(random.uniform(2, 2.3))
else:
print("不明标题%s" % text)
writelog.write_file("不明标题%s" % text)
self.cat_begin_task()
else:
print("找元素超时")
self.tb_timeout_option("cat_search_element")
self.d.app_stop(self.app_name_tz)
if self.z >= 3:
writelog.write_file("%s已完成全民养猫任务" % self.tao_user)
self.keep_cat()
# 支付宝
class TaoKeepCat(UiAutomatr):
def __init__(self, ip=note8_ip, pos=0):
super(TaoKeepCat, self).__init__()
self.ip = ip
self.use_lis = ['534***@qq.com', '189******75', '133******79', '177******65', '177******89', '150******56']
self.read()
self.app_name_tz = "com.eg.android.AlipayGphone"
# appname = self.get_app_name()
# print(appname)
self.console_input('shell settings put system screen_brightness 0') # 亮度最暗
# 两次
# print("等待120秒")
for i in range(pos, len(self.use_lis)):
self.d.app_stop(self.app_name_tz)
print("开始程序%s" % i)
writelog.write_file("开始程序%s" % i)
self.task_list = []
self.remove_list = []
self.z = 0
self.tao_user = self.use_lis[i]
# %s已完成聚划算任务
# print('content', '%s已完成聚划算任务' % self.tao_user)
if self.ip == note8_ip and i > 2:
print("大于2停止")
continue
self.switch_user('text="我的"', 'resource-id="com.alipay.mobile.antui:id/right_text"', 'text="换账号登录"')
# 养猫
self.keep_cat()
3.苏宁人人皆可播
def open_su(self):
self.d.app_start(package_name='com.suning.mobile.ebuy') # 启动苏宁易购
[x, y], k = self.multiple_find_picture([], 15, "点击", "不返回", [
'resource-id="android.miui:id/app{}"'.format(self.task_list.index(self.tao_user) + 1)])
if x > 0 and y > 0:
print("定位app")
else:
self.tb_timeout_option("open_su")
self.su_ning()
def su_find_elem(self):
for i in ["去完成", "去浏览"]:
for count in range(len(self.remove_list) + 1):
try:
elem = self.d(text=i, instance=count).sibling(className="android.view.View")
if elem:
print("找到%s" % i)
if elem.info["text"] in self.remove_list:
print("不需要做了")
continue
return elem
except Exception as e:
print("错误", e)
self.tb_timeout_option("find_elem")
def su_ning(self):
if self.z >= 3:
return
self.open_phone()
self.open_su()
[x1, y1], k = self.multiple_find_picture([], 18, "不点击", "返回",
delem=['d(resourceId="com.suning.mobile.ebuy:id/tw_main_status")'
'.child(index=0)'])
if x1 > 0 and y1 > 0:
print("找到首页")
[x2, y2], k = self.multiple_find_picture([], 20, "点击", "不返回",
['resource-id="com.suning.mobile.ebuy:id/'
'home_fragment_search_view_flipper"'])
# [x2, y2], k = self.multiple_find_picture([], 20, "点击", "不返回", ['text="瓜分20亿"'])
if x2 > 0 and y2 > 0:
print("找到人人皆可播")
self.d.send_keys("人人皆可播")
# resource-id="com.suning.mobile.ebuy:id/tv_search_input_btn"
print("输入人人皆可播")
self.multiple_find_picture([], 10, "点击", "不返回",
['resource-id="com.suning.mobile.ebuy:id/tv_search_input_btn"'])
[x3, y3], k = self.multiple_find_picture([], 40, "不点击", "不返回", ['text="领人气"'])
if x3 > 0 and y3 > 0:
try:
text = self.d(textContains="000", index=1).info['text']
# self.screen("Android/%s苏宁人气.jpg" % self.ip)
print(text)
except Exception as e:
print(e)
text = ""
writelog.write_file("%s找到人气[%s]点击" % (self.tao_user, text))
self.d.click(x3, y3)
print("找到领人气")
else:
print("没找到领人气")
try:
red = self.d.xpath(
'//*[@resource-id="app"]/android.view.View[1]/android.view.View[1]/android.view.View[10]').wait(
1)
if red:
red.click()
self.multiple_find_picture([], 20, "点击", "不返回", ['text="立即签到"'])
for i in range(2):
[x3, y3], k = self.multiple_find_picture([], 3, "点击", "不返回", ['text="去签到"'])
if x3 > 0 and y3 > 0:
print("找到签到")
[x4, y4], k = self.multiple_find_picture([], 20, "不点击", "不返回",
['text="今日"', 'description="javascript:void(0)"'])
if x4 > 0 and y4 > 0:
time.sleep(2)
print("签到成功")
if k == 1:
self.d.click(x4, y4)
print("另一种签到情况")
writelog.write_file("另一种签到情况")
self.multiple_find_picture([], 10, "点击", "不返回", ['content-desc="javascript:void(0)"'])
self.swipe(389, 1067 + random.randint(0, 10), 389, 497 + random.randint(0, 10))
time.sleep(0.5)
except Exception as e:
print(e)
else:
self.tb_timeout_option("su_ning")
self.su_ning()
class SuNing(UiAutomatr):
def __init__(self, ip=note8_ip):
super(SuNing, self).__init__()
self.ip = ip
self.separation = separation_phone1
self.read()
# self.console_input('shell settings put system screen_brightness 0') # 亮度最暗
self.task_list = ["18937028075", "13343649079"]
for i in self.task_list:
self.tao_user = i
self.z = 0
print("苏宁易购")
self.d.app_stop(package_name='com.suning.mobile.ebuy')
self.su_ning()
self.d.app_stop(package_name='com.suning.mobile.ebuy')
C:\Users\yys53\OneDrive\python\install\Lib\site-packages\uiautomator2\__init__.py
def screenshot(self, filename: Optional[str] = None, format="pillow"):
"""
Take screenshot of device
Returns:
PIL.Image.Image, np.ndarray (OpenCV format) or None
Args:
filename (str): saved filename, if filename is set then return None
format (str): used when filename is empty. one of ["pillow", "opencv", "raw"]
Raises:
IOError, SyntaxError, ValueError
Examples:
screenshot("saved.jpg")
screenshot().save("saved.png")
cv2.imwrite('saved.jpg', screenshot(format='opencv'))
"""
def yys():
# 自己写一个,安卓11会截不到图片
adb_path = r"C:\Users\yys53\OneDrive\scrcpy"
os.system(adb_path + "/adb -s 192.168.31.109:5555 shell screencap -p /sdcard/screen.png")
path = "C:\\Users\\yys53\\OneDrive\\python\\bestscript\\screen_picture/screen.png"
console = adb_path + "/adb -s 192.168.31.109:5555 pull /sdcard/screen.png %s" % path
os.system(console)
# print(console)
# 打开图片文件获取二进制数据
with open(path, "rb") as f:
# 读取图片的二进制数据
bin_contents = f.read()
# print(type(bin_contents))
return bin_contents
r = self.http.get("/screenshot/0", timeout=10)
# print("结果",type(r.content), r, filename)
if filename:
with open(filename, 'wb') as f:
f.write(r.content)
return filename
elif format == 'pillow':
buff = io.BytesIO(r.content)
try:
return Image.open(buff).convert("RGB")
except IOError as ex:
buff2 = io.BytesIO(yys())
return Image.open(buff2).convert("RGB")
# Always fail in secure page
# 截图失败直接返回一个粉色的图片
# d.settings['default_screenshot'] =
if d.settings['fallback_to_blank_screenshot']:
raise IOError("PIL.Image.open IOError", ex)
return Image.new("RGB", self.window_size(), (220, 120, 100))
elif format == 'opencv':
import cv2
import numpy as np
nparr = np.fromstring(r.content, np.uint8)
return cv2.imdecode(nparr, cv2.IMREAD_COLOR)
elif format == 'raw':
return r.content
else:
raise ValueError("Invalid format {}".format(format))
目前的这个watch_context是用threading启动的,每2s检查一次 目前还只有click这一种触发操作
with d.watch_context() as ctx:
ctx.when("^立即(下载|更新)").when("取消").click() # 当同时出现 (立即安装 或 立即取消)和 取消 按钮的时候,点击取消
ctx.when("同意").click()
ctx.when("确定").click()
# 上面三行代码是立即执行完的,不会有什么等待
ctx.wait_stable() # 开启弹窗监控,并等待界面稳定(两个弹窗检查周期内没有弹窗代表稳定)
# 使用call函数来触发函数回调
# call 支持两个参数,d和el,不区分参数位置,可以不传参,如果传参变量名不能写错
# eg: 当有元素匹配仲夏之夜,点击返回按钮
ctx.when("仲夏之夜").call(lambda d: d.press("back"))
ctx.when("确定").call(lambda el: el.click())
# 其他操作
# 为了方便也可以使用代码中默认的弹窗监控逻辑
# 下面是目前内置的默认逻辑,可以加群at群主,增加新的逻辑,或者直接提pr
# when("继续使用").click()
# when("移入管控").when("取消").click()
# when("^立即(下载|更新)").when("取消").click()
# when("同意").click()
# when("^(好的|确定)").click()
with d.watch_context(builtin=True) as ctx:
# 在已有的基础上增加
ctx.when("@tb:id/jview_view").when('//*[@content-desc="图片"]').click()
# 其他脚本逻辑
另外一种写法
ctx = d.watch_context()
ctx.when("设置").click()
ctx.wait_stable() # 等待界面不在有弹窗了
ctx.close()
#5:最大等待超时。默认值10
#10:缓存时间。如果最近10秒内已经出现toast,则返回cache toast。默认值10(以后可能会更改)
#“default message”:如果最后没有得到toast,则返回。默认无
d.toast.get_message(5, 10, "default message")
如下例子
get_toast = self.d.toast.get_message(3, 2, "default message")
if get_toast.strip() == '任务已完成':
break
# common usage
assert "Short message" in d.toast.get_message(5.0, default="")
清空 toast
d.toast.reset()
刷入方法:(三个任选一种)
下载地址https://cloud.189.cn/t/iiqaIn7FziYz
①先进入fastboot模式
②一键刷入twrp线刷包(一般下载这个即可):TWRP-XXX-CN-wzsx150-fastboot.7z
下载后解压,手机连接电脑,双击运行一键刷入recovery工具.bat文件,按照提示操作,最终通过fastboot模式将rec刷入手机。
Redmi Note 9 5G 一键刷入recovery工具
***********************************************
刷写recovery完成
手机将重启进入TWRP的rec模式
(可能会重启1-2次)
wzsx150感谢您使用本工具
(按任意键关闭此窗口)
***********************************************
Rebooting into recovery OKAY [ 0.003s]
Finished. Total time: 0.006s
③进入rec
高级→关闭AVB2.0校验→两个都是关闭(打勾)→滑动底部确任操作
root系统→滑动底部安装root
recovery-twrp卡刷包:TWRP-XXX-CN-wzsx150.zip
(需要手机内已刷入第三方rec):
在第三方rec里卡刷,既可以替换成该twrp
twrp镜像文件:recovery-TWRP-XXX-CN-wzsx150.img
从以上两个压缩包中都可以解压出该镜像文件,可以通过twrp刷镜像的方式刷入、app刷入或者其他方式刷入。
成功:
红米Redmi Note11 5G miui14.04 安卓13
红米Redmi Note11 5G hyperos 1.0.10 安卓13
miui13 安卓13不行,note10miui12.5安卓11可以,已测试米4可以装,24.1 修复,, note9pro最新卡米(参考联发科芯片手机刷入Magisk boot教程(解决无限重启))
fastboot工具:https://cloud.189.cn/t/FvqiUvYJBnai (访问码:mh9u)
专版面具下载最新版即可github:Releases · topjohnwu/Magisk (github.com)
刷机包下载地址:xiaomirom.com
1.线下载刷机包任意的线刷包
2.images/boot.img 复制到手机
3.手机安装magisk面具,打开:安装→选择并修补一个文件→到手机文件夹选择boot.img→等待修补完成生成download文件夹下.img文件→复制到电脑
4.使用adb命令重启fastboot模式
adb reboot bootloader
5.使用fastboot工具刷入img镜像(测试win11在普通用户cmd才可以)
fastboot.exe flash boot F:\magisk_patched-23000_Ye193.img
Sending 'boot_b' (131072 KB) OKAY [ 3.469s]
Writing 'boot_b' OKAY [ 0.326s]
Finished. Total time: 3.800s
联发科的需要
复制一份vbmeta.imgfastboot --disable-verity --disable-verification flash vbmeta vbmeta.img
然后重启手机
fastboot reboot
出现上面提示,很快刷好了,打开magisk发现有root权限了
都是联发科
成功机型:
1.红米note10 miui13 安卓12(MIUI14 V14.0.8.0.TKPCNXM 安卓14),注意:如果线刷把线刷包放根目录,不要中文路径,这句说和root没关
3.红米9 V13.0.5.0.SJCCNXM 安卓12 (红米9卡刷包没有payload.bin有bo0t.img可以直接刷,跳过步骤3.解压缩payload.bin)
4.红米nopte9 V14.0.6.0.安卓12 (卡刷包没有payload.bin有bo0t.img可以直接刷,跳过步骤3.解压缩payload.bin)
5.小8青春版 V12.5.1.0.安卓10 (卡刷包没有payload.bin有bo0t.img可以直接刷,跳过步骤3.解压缩payload.bin), fastboot可以能需要win10,usb2.0,驱动用miflash安装
在红米Note10 Pro上安装MIUI 13版本的Magisk需要以下步骤:
1.解锁 BootLoader⁵:首先,你需要解锁你的手机的BootLoader。你可以在MIUI的官方解锁地址下载并安装miflash-unlock工具。然后,关机并同时按住音量减和电源键进入fastboot模式,连接电脑。点击解锁(如果是新手机,可能需要等待七天)。
2.安装Magisk(Root权限管理):下载对应机型的完整卡刷包,我选择的是稳定版Recovery卡刷包。下载完成后,你会得到一个几个G大小的压缩包,用解压软件解压缩到文件夹,打开之后的文件夹。
3.解压缩payload.bin:注意到这个payload.bin文件不能直接打开,我们先下载payload_dumper_go⁶⁷。下载完成解压之后将上面的payload.bin文件复制到payload_dumper的目录里面,和payload-dumper-go.exe放在一起。按住鼠标左键不放拖动payload.bin文件到payload-dumper-go.exe文件上面松手,等待几分钟,当窗口关闭说明解包完成,目录下多出一个文件夹。进入新出现的文件夹,找到boot.img文件,将这个文件拖到桌面,便于下次能快速找到。
第3步是解压缩payload.bin文件,详细步骤如下:
下载payload_dumper_go:首先,你需要下载一个叫做payload_dumper_go的工具。这个工具可以帮助你解压缩payload.bin文件。 链接
复制payload.bin文件:下载并解压payload_dumper_go后,你需要将之前得到的payload.bin文件复制到payload_dumper的目录里面,和payload-dumper-go.exe放在一起。
解压缩payload.bin文件:然后,你需要按住鼠标左键不放,拖动payload.bin文件到payload-dumper-go.exe文件上面,然后松手。这个过程可能需要几分钟,当窗口关闭说明解包完成。
4.找到boot.img文件:解包完成后,你会在目录下看到一个新出现的文件夹。进入这个文件夹,你会找到一个叫做boot.img的文件。你需要将这个文件拖到桌面,这样在下一步中你可以快速找到它。
5.连接手机:手机需插入一张SIM卡,登录MIUI账号。开机之后执行以下流程:开启开发者模式,开启USB调试,开启USB安装,开启USB调试(安全设置)。用数据线连接电脑,勾选允许调试,选择模式:传输文件。下载Magisk⁸,将下载好的Magisk.apk文件和上一步的boot.img文件复制到手机的Download文件下。
6.安装Magisk、修补boot:进入手机的文件管理,点击面具图标安装软件。进入软件后,点击安装,之后点击选择并修补一个文件。选择之前的那个boot.img,点击开始。安装完成后会显示一个文件路径。在电脑上查看手机的Download文件夹,多出一个补丁文件。下载下面这个链接的压缩包,解压⁹。复制上面那个补丁文件进入解压后的文件夹。将手机关机,同时按住音量减和电源键进入fastboot模式,连接电脑。根据上面方法输入即可,会出现如下画面。手机自动重启后打开面具,再次点击安装,选择直接安装。出现All done时,点击底部的重启即可。
注意:如果开机没显示成功标志,可以重新安装magisk app软件即可
源: 与必应的对话, 2024/2/3
(1) undefined. http://www.miui.com/unlock/index.html.
(2) undefined. https://github.com/ssut/payload-dumper-go.
(3) undefined. https://github.com/ssut/payload-dumper-go/releases/download/1.2.0/payload-dumper-go_1.2.0_windows_amd64.tar.gz.
(4) undefined. https://magiskmanager.com/.
(5) undefined. https://pan.tuhuowo.com/s/DPcx.
(6) MIUI 13 折腾面具Magisk、Root 保姆级过程分享 - 哔哩哔哩. https://www.bilibili.com/read/cv16207604/.
(7) Magisk安装教程 - Magisk中文网. https://magiskcn.com/.
(8) MIUI 13 折腾面具Magisk、Root 保姆级过程分享 - 哔哩哔哩. https://bing.com/search?q=红米note10+pro+miui13+magisk安装方法.
(9) [整理]MIUI13(安卓12)magisk(面具)安装的一些经验 - 哔哩哔哩. https://www.bilibili.com/read/cv16510317/.
(10) undefined. http://www.miui.com/unlock/index.html安装下载工具.
magisk满足24.2版本以上可以用,安卓8.1以上 可以隐藏工商类银行检测
Shamiko模块下载隐藏root:Releases · LSPosed/LSPosed.github.io 或者https://cloud.189.cn/t/nmuIzqEv632i (访问码:q7bv)
- V24版本以下的magisk需要在magisk设置中,打开“遵守排除列表”(V24+不需要操作)
- 然后在“配置排除列表”中,配置你要对谁隐藏root
- 配置好之后,关闭“遵守排除列表”(不要开启“遵守排除列表”) Magisk如何针对性隐藏Root避免被检测 - 知乎 (zhihu.com)
隐藏magisk本身
通过包名Magisk达到隐藏Magisk的效果,以防止被某些软件检测到。在右上角设置中找到并点击隐藏Magisk应用,随机取个名字就行。
第一次点击去时候设置magisk允许安装应用
方法1:我们打开magisk,点击第一行的“安装”-直接点击“直接安装(推荐)”等待自动
下载magisk,自动刷入,最后重启手机。(由于magisk的源在国外,下载速度可能很
慢,需要等待一会)
使用国源
源使用方式
1.打开 Magisk 软件
2.点击 magisk设置
3.点击 更新通道
4.点击 自定义
http://www.aialbb.com/root.json
5.复制上面的更新源,粘贴进软件
方法2:直接下载ROM乐园下载magisk最新版(无需等待自动缓慢下载):Magisk授权
然后打开面具,点击左上角的【三个横线】-点击【模块】会看的一个黄色的【+】
点击【+】,再点击左上角的【三个横线】-显示文件管理等内容,点击【文件管理】
比如支付宝图案解锁z字形
import uiautomator2 as u2
ip_port = '192.168.31.50:5555'
d = u2.connect(ip_port)
def unlock(*args):
xy = {1: (0.242, 0.337), 2: (0.496, 0.336), 3: (0.756, 0.331), 4: (0.238, 0.449), 5: (0.516, 0.447),
6: (0.752, 0.446),
7: (0.244, 0.568), 8: (0.502, 0.567), 9: (0.744, 0.568)}
lis = []
for num in args:
lis.append(xy.get(num))
print(lis)
d.swipe_points(lis, 0.2)
unlock(1, 2, 3, 5, 7, 8, 9)
以最新的MIUI12 系统为例
关闭USB安装弹窗,其实执行以下几步即可
需要点
应用设置 -> 授权管理 -> 右上角设置按钮 -> USB安装管理 ->关闭
但是很多人会发现,授权管理页面的右上角根本没有设置按钮啊
在开发者选项中 -> 启动MIUI优化 ->关闭
再返回到授权页面,就可以看到 右上角的设置按钮了,关闭USB安装管理后
通过USB安装就不会有确认弹窗了
还有个应用权限监控:关之后安装应该再发打开不会提示允许类的提示了,更方便
最后手机重启就好了
①uiautomator2获取
print(d.device_info)
{'udid': '17bb3890-a4:4b:d5:dd:95:cc-Redmi_Note_8', 'version': '10', 'serial': '17bb3890', 'brand': 'xiaomi', 'model': 'Redmi Note 8', 'hwaddr': 'a4:4b:d5:dd:95:cc', 'port': 7912, 'sdk': 29, 'agentVersion': '0.9.5', 'display': {'width': 1080, 'height': 2340}, 'battery': {'acPowered': True, 'usbPowered': False, 'wirelessPowered': False, 'status': 2, 'health': 2, 'present': True, 'level': 40, 'scale': 100, 'voltage': 4043, 'temperature': 369, 'technology': 'Li-poly'}, 'memory': {'total': 3732864, 'around': '4 GB'}, 'cpu': {'cores': 8, 'hardware': 'Qualcomm Technologies, Inc TRINKET'}, 'arch': '', 'owner': None, 'presenceChangedAt': '0001-01-01T00:00:00Z', 'usingBeganAt': '0001-01-01T00:00:00Z', 'product': None, 'provider': None}
②abd 获取
1、获取手机系统信息( CPU,厂商名称等)
adb shell "cat /system/build.prop | grep "product""
2、获取手机系统版本
adb shell getprop ro.build.version.release
3、获取手机系统api版本
adb shell getprop ro.build.version.sdk
4、获取手机设备型号
adb -d shell getprop ro.product.model
adb -s 192.168.31.109:5555 -d shell getprop ro.product.model
5、获取手机厂商名称
adb -d shell getprop ro.product.brand
6、获取手机的序列号
有两种方式
adb get-serialno
adb shell getprop ro.serialno
7、获取手机的IMEI
有三种方式,由于手机和系统的限制,不一定获取到
adb shell dumpsys iphonesubinfo
其中Device ID即为IMEI号
adb shell getprop gsm.baseband.imei
service call iphonesubinfo 1
此种方式,需要自己处理获取的信息得到
8、获取手机mac地址
adb shell cat /sys/class/net/wlan0/address
9、获取手机内存信息
adb shell cat /proc/meminfo
10、获取手机存储信息
adb shell df
获取手机内部存储信息:
魅族手机: adb shell df /mnt/shell/emulated
其他: adb shell df /data
获取sdcard存储信息:
adb shell df /storage/sdcard
11、获取手机分辨率
adb shell "dumpsys window | grep mUnrestrictedScreen"
12、获取手机物理密度
adb shell wm density
from multiprocessing.pool import ThreadPool
def foo(num):
import os
print(num)
ip = "172.20.132.%s" % num
get_text = os.popen("adb connect %s:5555" % ip).read()
print(get_text)
if "Connection" not in get_text and "No route to host" not in get_text:
print("得到的ip为%s" % ip)
adb_ip = ip
return adb_ip
if __name__ == '__main__':
pool = ThreadPool(256)
res = pool.map(foo, [i for i in range(1, 256)])
res = list(filter(lambda s: s and s.strip(), res))
print(res)
方法一:ATX
设置剪贴板
def set_past_text(self, text):
# 设置剪贴板
try:
# 空格要转义(需要升级)
app_name = self.get_app_name()
text = text.replace(" ", '\\ ')
self.d.app_start("com.github.uiautomator")
for i in range(5):
self.d.set_clipboard(text, 'label')
if self.get_past_text():
break
self.d.app_start(app_name)
except Exception as e:
print("手机没安装此应用", e)
读取剪贴板
def get_past_text(self):
# 读取剪贴板
text = None
try:
app_name = self.get_app_name()
self.d.app_start("com.github.uiautomator")
for i in range(30):
text = self.d.clipboard
if text:
break
else:
time.sleep(0.1)
self.d.app_start(app_name)
except Exception as e:
print("手机没安装此应用", e)
return text
方法二:clipper
1. 手机上需要安装的软件
https://github.com/majido/clipper
2. 启动软件,允许应用权限
每次在软件界面才可以
3. adb 命令
# 写入内容到剪切板
adb shell am broadcast -a clipper.set -e text "this can be pasted now"
# 获取剪切板内容
adb shell am broadcast -a clipper.get
案例
设置剪贴板内容
def set_past_text(self, text):
# 设置剪贴板
try:
# 空格要转义(需要升级)
text = text.replace(" ", '\\ ')
app_name = "ca.zgrs.clipper"
self.d.app_start(app_name)
for i in range(3):
get_ret = self.console_input('shell am broadcast -a clipper.set -e text "%s"' % text, ret=1)
print(get_ret)
if "result=-1" in get_ret:
break
else:
time.sleep(0.5)
self.d.app_stop(app_name)
except Exception as e:
print("手机没安装此应用", e)
读取剪贴板内容
def get_past_text(self):
# 读取剪贴板
text = None
try:
app_name = "ca.zgrs.clipper"
self.d.app_start(app_name)
for i in range(30):
get = self.console_input('shell am broadcast -a clipper.get', ret=1)
re_list = re.compile('data="(.*)"', re.S).findall(get)
if re_list:
text = re_list[0]
if text:
break
else:
time.sleep(0.1)
self.d.app_stop(app_name)
except Exception as e:
print("手机没安装此应用", e)
return text
#查询
adb shell wm size
#修改为指定分辨率
adb shell wm size 1080x2400
#恢复为默认分辨率
adb shell wm size reset
#dpi查询命令
adb wm density
#修改dpi
adb shell wm density 480
#恢复为默认dpi
adb shell wm density reset
https://blog.csdn.net/weixin_42409884/article/details/104512286
源码地址:https://github.com/openstf/minicap,
Airtest IDE,官方网站http://airtest.netease.com/,解压后获得项目源码。
已知:重启后自动关闭
1、打开USB调试开关,同时打开无线调试开关
2、进一步点击无线调试选项,会进入二级菜单页面,里面会显示ip地址及端口号等信息
3、打开命令行,输入
adb pair 192.168.x.xxx:yyyyy
其中的x为第2步中显示的Ip,y为第2步中显示的端口号
4、此时命令行提示要求输入配对码,输入第2步中的配对码即可
5、此时已成功配对,第2步中显示的ip端口等信息可能会发生变化,不用管,在命令行中再次输入
adb connect 192.168.x.xxx:yyyyy
其中的x为当前手机上显示的Ip,y为端口号
6、连接成功,可以开始调试啦!
7、以后再次连接时,只要没有从手机无线调试页面的已配对设备列表中删除配对设备,就可以直接使用adb connect命令进行连接,而不再需要使用adb pair进行配对
https://blog.csdn.net/diaoyinbo1979/article/details/101750891
使用uiautomator2进行webview页面的测试 - 走看看 (zoukankan.com)
20.python adb + opencv 直接获取截屏数据
adb获取图片数据流,cv读取转成图片
https://blog.csdn.net/qinye101/article/details/120000500
21.解决一些应用app_start无法启动:
一、打开应用后先用
以拼多多为例
adb shell dumpsys window | findstr mCurrentFocus
mCurrentFocus=Window{46411ab mode=0 rootTaskId=97632 u0 com.xunmeng.pinduoduo/com.xunmeng.pinduoduo.ui.activity.HomeActivity}
命令找到【当前连接电脑的手机正在运行的APP】的包名
可以用正则匹配
import os
import re
activity_string = os.popen('adb -s 192.168.31.161:5555 shell dumpsys package com.lxcm.taocoupon | findstr \/ |findstr filter').read()
# print(ret)
pattern = r"/(.*?) filter" # 匹配斜杠和"filter"之间的文字
matches = re.findall(pattern, activity_string, re.MULTILINE)
activity_names = [match.strip() for match in matches]
activity_list = []
for activity_name in activity_names:
# print(activity_name)
activity_list.append(activity_name)
print(activity_list)
二、再用
包名= com.xunmeng.pinduoduo
adb shell dumpsys package 包名 | findstr \/ |findstr filter
-
adb shell dumpsys package com.xunmeng.pinduoduo | findstr \/ |findstr filter
会发现很多Activit
命令找到合适的入口Activity。
最终找到拼多多为.share.system.GalleryShareActivit
三、使用
adb shell am start com.xxx.xxx/xxx.xxx.xxx.xxx
-
adb shell am start -n com.xunmeng.pinduoduo/.share.system.GalleryShareActivity
python 获取方法
windows
import os
import re
import time
import uiautomator2 as u2
print("获取能运行的activity,获取到安装安装包名字,先回到桌面,再运行")
packege_name = 'alook.browser'
ip = '192.168.31.161'
d = u2.connect(ip)
# 写入不想遍历的activity
# '.FileIntentReceiverActivity', '.IntentReceiverActivity','.TranslateIntentReceiverActivity', '.LauncherActivity'
dis_contain = []
act_list = []
name = os.popen('adb -s %s shell dumpsys package %s | findstr \/ |findstr filter' % (ip, packege_name)).read()
for i in name.split('\n'):
r_lis = re.compile('/(.*?) ', re.S).findall(i)
if r_lis:
activity = r_lis[0]
if activity in dis_contain or activity in act_list:
continue
print(activity)
d.app_start(packege_name, activity)
time.sleep(1)
text = os.popen('adb -s %s shell dumpsys window | findstr mCurrentFocus' % ip).read()
act_list.append(activity)
if packege_name in text:
print('满足不在桌面的:activity=', activity)
console = input("是否继续,是的话回到桌面输入(y)继续,否的话输入(n)停止:")
console = console.strip()
if console == 'y':
d.app_stop(packege_name)
time.sleep(1)
d.press('home')
continue
else:
break
print('--' * 100)
print('加入dis_contain的act_list', act_list)
linux
import os
import re
import time
import uiautomator2 as u2
print("获取能运行的activity,获取到安装安装包名字,先回到桌面,再运行")
packege_name = 'com.dragon.read'
ip = '192.168.31.182'
d = u2.connect(ip)
# 写入不想遍历的activity
# '.FileIntentReceiverActivity', '.IntentReceiverActivity','.TranslateIntentReceiverActivity', '.LauncherActivity'
dis_contain = []
act_list = []
name = os.popen('adb -s %s shell dumpsys package %s | grep "/" | grep "filter"' % (ip, packege_name)).read()
for i in name.split('\n'):
r_lis = re.compile('/(.*?) ', re.S).findall(i)
if r_lis:
activity = r_lis[0]
if activity in dis_contain or activity in act_list:
continue
print(activity)
d.app_start(packege_name, activity)
time.sleep(1)
text = os.popen('adb -s %s shell dumpsys window | grep mCurrentFocus' % ip).read()
act_list.append(activity)
if packege_name in text:
print('满足不在桌面的:activity=', activity)
console = input("是否继续,是的话回到桌面输入(y)继续,否的话输入(n)停止:")
console = console.strip()
if console == 'y':
d.app_stop(packege_name)
time.sleep(1)
d.press('home')
continue
else:
break
print('--' * 100)
print('加入dis_contain的act_list', act_list)
Invalid version · Issue #906 · openatx/uiautomator2 (github.com)
降低uiautomator2的版本,或者降低packaging版本
pip install packaging==21.3
23.scrcpy或截图安卓 12 及以上版本的设备在登录和支付页面会出现黑屏
如果你的问题是关于在使用 scrcpy 时,安卓 12 及以上版本的设备在登录和支付页面会出现黑屏,但是应用仍在运行,这可能是由于 Android 的 "secure flag" 功能。
在安卓系统中,开发者可以为某些敏感的界面设置一个 "secure flag",这样在进行屏幕录制或截图时,这些界面就会被隐藏,以保护用户的隐私和安全。当你通过 scrcpy 查看这些界面时,由于 scrcpy 本质上是通过录制屏幕的方式来工作的,所以这些设置了 "secure flag" 的界面就会显示为黑屏。
至于为什么在安卓 11 中没有这个问题,可能是因为在这个版本中,开发者没有为这些界面设置 "secure flag",或者是因为这个版本的系统对 "secure flag" 的处理方式不同。
下载 magisk插件Disable Flag Secure 可以解决这个问题
magisk插件Disable Flag Secure下载地址,下载后命名zip格式再安装:https://xdaforums.com/t/module-disable-flag-secure-v9-0-by-mehedi-h-joy.4490475/
天翼云https://cloud.189.cn/t/JBZNju3e2QFr(访问码:hu7z)
nextcloud Disable Flag Secure
注意:安装时间可能过长,可能需要5分钟左右
(装了magisk可能卸载magisk恢复出厂设置才可以)
您可以从GitHub上下载Kitsune Magisk的最新版本。Kitsune Magisk是Magisk的一个自定义版本,它包含了一些额外的工具和功能,适合高级用户使用。请按照以下步骤操作:
- 访问Kitsune Magisk的GitHub页面。
- 在页面上找到“Releases”部分。
- 选择您需要的版本,例如Stable、Canary或Debug¹。
- 点击所需版本旁边的“Assets”来展开下载选项。https://magiskzip.com/kitsune-magisk/
- 下载相应的
.zip
文件以便在Magisk中安装。
24.刷机Fastboot 模式并连接至电脑时,手机屏幕左上角显示 press any key to shutdown
手机:小米8青春版
问题描述
在小米手机进入 Fastboot 模式并连接至电脑时,手机屏幕左上角显示 "press any key to shutdown" 提示,同时电脑未能正确识别设备。
解决方案
-
更换 USB 端口
- 尝试使用电脑上的 USB 2.0 端口连接手机,通常可以解决此问题。
- 如果电脑缺乏 USB 2.0 端口,可以考虑使用 USB 集线器连接。
-
批处理文件方式
- 如果上述方法未能解决问题,请尝试以下步骤:
- 将下面的内容保存为
.bat
批处理文件。 - 以管理员权限运行批处理文件。
- 运行完成后,再次连接手机,问题应当得到解决。
- 将下面的内容保存为
- 如果上述方法未能解决问题,请尝试以下步骤:
批处理文件内容:
@echo off
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\18D1D00D0100" /v "osvc" /t REG_BINARY /d "0000" /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\18D1D00D0100" /v "SkipContainerIdQuery" /t REG_BINARY /d "01000000" /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\usbflags\18D1D00D0100" /v "SkipBOSDescriptorQuery" /t REG_BINARY /d "01000000" /f
pause
按照以上步骤操作后,问题应当得到解决。
禁用随机MAC地址功能
- 打开Wi-Fi设置:进入小米13手机的“设置”应用,选择“Wi-Fi”。
- 选择网络:找到并点击你正在连接的Wi-Fi网络。
- 修改网络设置:点击“修改网络”或“高级选项”。
- 选择隐私设置:在隐私设置中选择“使用设备MAC”而不是“使用随机MAC”。
在路由器上设置静态IP
- 登录路由器管理界面:在浏览器中输入路由器的IP地址(通常是192.168.1.1或192.168.0.1),然后输入管理员用户名和密码登录。
- 找到DHCP设置:在路由器的管理界面中找到DHCP设置,通常在“网络设置”或“高级设置”中。
- 绑定MAC地址和IP地址:在DHCP设置中,找到“静态IP分配”或“IP与MAC地址绑定”选项(路由宽带拨号才可以)。
- 添加设备:输入小米13手机的MAC地址和你希望分配的静态IP地址。
- 保存设置:保存设置并重启路由器以确保更改生效。
这样设置完成后,小米13手机在连接该网络时将使用固定的MAC地址和IP地址,确保网络连接的稳定性和一致性。
1.关闭防误触模式
2.关闭距离感应
miflash:https://miuiver.com/miflash/
28.小米搜索无线调试搜不到
去应用详情清除设置数据(java命令没root没实现,模拟点击)
评论列表 (0 条评论)