小米手机使用注意几点(每次刷机后要修改设置,不然很坑):

1.关闭睡眠模式:发现了手机为什么夜里总是断wifi,场景配置→关闭睡眠模式 

2.关闭放误碰,屏幕向下总是不能解锁导致任务没用正常运行,锁屏→关闭防误碰

3.关闭usb安装管理和权应用权限监控:查看方法

4.多个平台注意uiautomator2版本

5.停用 usb授权超时功能(可能不让授权过期,待测试)

需要的库:

UIAutomator2,weditor


1.连接adb

注意: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="赚金币"可能淘宝版本不同

 3.1基础代码

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')

 3.2模糊匹配

d(descriptionContains="安装").info 
d(textContains="安装").info 

3.3 按键操作

例如

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;
 

3.4选择器

# 选择文本为'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()

   

3.5 相对定位

此外,我们可以使用相对定位方法来获取视图: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()


3.5.1 xpath定位

以下是一些 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 结构有一定的了解。

3.6多个实例

有时屏幕可能包含多个具有相同属性的视图,例如文本,那么您必须使用选择器中的“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错误

3.7 .获取所选的ui对象状态及其信息

  • 检查特定的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

3.10 长点击long_click

 

d.long_click(567.00, 1490.50, duration=1.8)

4.ATX-Agent:无法启动

 

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.报错问题

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

5.2 没打开usb调试(安全模式)

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

6.脚本实现

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')

 

7.安卓11的weditor不能截图

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))

 

8.WatchContext

目前的这个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()

9.toast

#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()
 

10 刷入magisk

刷入方法:(三个任选一种)

10.1  方法1

下载地址https://cloud.189.cn/t/iiqaIn7FziYz

先进入fastboot模式

一键刷入twrp线刷包(一般下载这个即可):TWRP-XXX-CN-wzsx150-fastboot.7z

下载后解压,手机连接电脑,双击运行一键刷入recovery工具.bat文件,按照提示操作,最终通过fastboot模式将rec刷入手机。

 

         Redmi Note 9 5G 一键刷入recovery工具

***********************************************

             刷写recovery完成

        手机将重启进入TWRPrec模式

            (可能会重启1-2次)

           wzsx150感谢您使用本工具

           (按任意键关闭此窗口)

***********************************************

Rebooting into recovery                            OKAY [  0.003s]

Finished. Total time: 0.006s

 

进入rec

 

高级关闭AVB2.0校验两个都是关闭(打勾)→滑动底部确任操作

root系统滑动底部安装root

 

10.2方法2

recovery-twrp卡刷包:TWRP-XXX-CN-wzsx150.zip

(需要手机内已刷入第三方rec):

在第三方rec里卡刷,既可以替换成该twrp

 

10.3 方法3

twrp镜像文件:recovery-TWRP-XXX-CN-wzsx150.img

从以上两个压缩包中都可以解压出该镜像文件,可以通过twrp刷镜像的方式刷入、app刷入或者其他方式刷入。

10.4 方法4(note10 pro 刷入)

成功:

红米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.img

fastboot --disable-verity --disable-verification flash vbmeta vbmeta.img

然后重启手机

fastboot reboot

出现上面提示,很快刷好了,打开magisk发现有root权限了

 

10.4.0 payload 卡刷包刷入magisk

都是联发科

成功机型:

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文件,详细步骤如下:

  1. 下载payload_dumper_go:首先,你需要下载一个叫做payload_dumper_go的工具。这个工具可以帮助你解压缩payload.bin文件。 链接

  2. 复制payload.bin文件:下载并解压payload_dumper_go后,你需要将之前得到的payload.bin文件复制到payload_dumper的目录里面,和payload-dumper-go.exe放在一起。

  3. 解压缩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安装下载工具.

 

10.4.1 隐藏root Shamiko

magisk满足24.2版本以上可以用,安卓8.1以上 可以隐藏工商类银行检测

Shamiko模块下载隐藏root:Releases · LSPosed/LSPosed.github.io 或者https://cloud.189.cn/t/nmuIzqEv632i (访问码:q7bv)

  1. V24版本以下的magisk需要在magisk设置中,打开“遵守排除列表”(V24+不需要操作)
  2. 然后在“配置排除列表”中,配置你要对谁隐藏root
  3. 配置好之后,关闭“遵守排除列表”(不要开启“遵守排除列表”) Magisk如何针对性隐藏Root避免被检测 - 知乎 (zhihu.com)

隐藏magisk本身

通过包名Magisk达到隐藏Magisk的效果,以防止被某些软件检测到。在右上角设置中找到并点击隐藏Magisk应用,随机取个名字就行。

第一次点击去时候设置magisk允许安装应用

10.5 magisk升级

 

方法1:我们打开magisk,点击第一行的“安装”-直接点击“直接安装(推荐)”等待自动

下载magisk,自动刷入,最后重启手机。(由于magisk的源在国外,下载速度可能很

慢,需要等待一会)

使用国源

源使用方式
1.打开 Magisk 软件
2.点击 magisk设置
3.点击 更新通道
4.点击 自定义

http://www.aialbb.com/root.json


5.复制上面的更新源,粘贴进软件

 

方法2:直接下载ROM乐园下载magisk最新版(无需等待自动缓慢下载):Magisk授权

然后打开面具,点击左上角的【三个横线】-点击【模块】会看的一个黄色的【+】

点击【+】,再点击左上角的【三个横线】-显示文件管理等内容,点击【文件管理】

 

11.图案解锁

比如支付宝图案解锁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)

 

12.关闭小米手机的USB安装提示弹窗
 

以最新的MIUI12 系统为例

关闭USB安装弹窗,其实执行以下几步即可

需要点

应用设置 -> 授权管理 -> 右上角设置按钮 -> USB安装管理 ->关闭

但是很多人会发现,授权管理页面的右上角根本没有设置按钮啊

在开发者选项中 -> 启动MIUI优化 ->关闭

再返回到授权页面,就可以看到 右上角的设置按钮了,关闭USB安装管理后

通过USB安装就不会有确认弹窗了
 

还有个应用权限监控:关之后安装应该再发打开不会提示允许类的提示了,更方便

最后手机重启就好了 

13.获取手机信息

①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

14.多进程获取ip

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)


15.adb获取剪贴板内容

方法一: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

 

 16.设置手机分辨率和dpi

#查询
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

17.minicap+python快速截图

https://blog.csdn.net/weixin_42409884/article/details/104512286

源码地址:https://github.com/openstf/minicap,
Airtest IDE,官方网站http://airtest.netease.com/,解压后获得项目源码。
 

18.小米无线调试

已知:重启后自动关闭

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进行配对

 

19.webview(h5)界面待研究

https://blog.csdn.net/diaoyinbo1979/article/details/101750891

使用uiautomator2进行webview页面的测试 - 走看看 (zoukankan.com)

https://github.com/android-hacker/VirtualXposed

Releases · android-hacker/VirtualXposed (github.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)

22.报错Invalid version

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分钟左右

24.淘宝频繁出现滑动验证码

(装了magisk可能卸载magisk恢复出厂设置才可以)

您可以从GitHub上下载Kitsune Magisk的最新版本。Kitsune Magisk是Magisk的一个自定义版本,它包含了一些额外的工具和功能,适合高级用户使用。请按照以下步骤操作:

  1. 访问Kitsune Magisk的GitHub页面
  2. 在页面上找到“Releases”部分。
  3. 选择您需要的版本,例如Stable、Canary或Debug¹。
  4. 点击所需版本旁边的“Assets”来展开下载选项。https://magiskzip.com/kitsune-magisk/
  5. 下载相应的.zip文件以便在Magisk中安装。

24.刷机Fastboot 模式并连接至电脑时,手机屏幕左上角显示 press any key to shutdown

手机:小米8青春版

问题描述

在小米手机进入 Fastboot 模式并连接至电脑时,手机屏幕左上角显示 "press any key to shutdown" 提示,同时电脑未能正确识别设备。

解决方案

  1. 更换 USB 端口

    • 尝试使用电脑上的 USB 2.0 端口连接手机,通常可以解决此问题。
    • 如果电脑缺乏 USB 2.0 端口,可以考虑使用 USB 集线器连接。
  2. 批处理文件方式

    • 如果上述方法未能解决问题,请尝试以下步骤:
      1. 将下面的内容保存为 .bat 批处理文件。
      2. 以管理员权限运行批处理文件。
      3. 运行完成后,再次连接手机,问题应当得到解决。

批处理文件内容:

@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

按照以上步骤操作后,问题应当得到解决。

25.固定ip地址

禁用随机MAC地址功能

  1. 打开Wi-Fi设置:进入小米13手机的“设置”应用,选择“Wi-Fi”。
  2. 选择网络:找到并点击你正在连接的Wi-Fi网络。
  3. 修改网络设置:点击“修改网络”或“高级选项”。
  4. 选择隐私设置:在隐私设置中选择“使用设备MAC”而不是“使用随机MAC”。

在路由器上设置静态IP

  1. 登录路由器管理界面:在浏览器中输入路由器的IP地址(通常是192.168.1.1或192.168.0.1),然后输入管理员用户名和密码登录。
  2. 找到DHCP设置:在路由器的管理界面中找到DHCP设置,通常在“网络设置”或“高级设置”中。
  3. 绑定MAC地址和IP地址:在DHCP设置中,找到“静态IP分配”或“IP与MAC地址绑定”选项(路由宽带拨号才可以)。
  4. 添加设备:输入小米13手机的MAC地址和你希望分配的静态IP地址。
  5. 保存设置:保存设置并重启路由器以确保更改生效。

这样设置完成后,小米13手机在连接该网络时将使用固定的MAC地址和IP地址,确保网络连接的稳定性和一致性。

 

26.小米手机提示请勿遮挡听筒区域

 

1.关闭防误触模式

2.关闭距离感应

27.小米线刷

miflash:https://miuiver.com/miflash/

刷机包:https://xiaomirom.com/

28.小米搜索无线调试搜不到
去应用详情清除设置数据(java命令没root没实现,模拟点击)