admin管理员组

文章数量:1654385

        当你想抢王者聊天频道的皮肤碎片红包,或者想和小姐姐(小哥哥)开游戏的时候。可以使用python自动化工具,进行自动化加入开黑房间(一般小姐姐开黑会开语音,然后就会有大佬带,然后就容易上分,哈哈哈)。然后可以喝个奶茶,看个电影~一边等待,加入上分的队伍(所需工具下载链接详见文章尾部)

        B站视频传送门:攻城狮晚的个人空间_哔哩哔哩_Bilibili

        如何快速和小姐姐五排开黑~_哔哩哔哩_bilibili

       

目录

1、下载安装ADB工具包和驱动

2、下载安装Andriod SDK

3、UiAutoMatorViewer下载安装

4、测试

5、最终具体Python代码实现

6、参考文献


1、下载安装ADB工具包和驱动

 Android Debug Bridge 是一种允许模拟器或已连接的 Android 设备进行通信的命令行工具

下载工具包后,解压到英文路径后,添加系统环境变量

下载驱动之后,点击安装驱动

2、下载安装Andriod SDK

AndroidDevTools - Android开发工具 Android SDK下载 Android Studio下载 Gradle下载 SDK Tools下载

我是win10系统,所以下载了这个

下载装好之后,会自动运行 SDK Manager。如果没有的话,开始菜单或者安装目录找一下,运行就好。

 

测试了一下安装还挺快的,我安装的是这几个

3、UiAutoMatorViewer下载安装

1、下载jdk1.8安装(据说其他版本使用UiAutoMatorViewer有问题):

可以先查看jdk(Java Development Kit——Java开发工具包)版本。开始菜单输入cmd,打开命令行窗口,输入java -version查看:

如果没有jdk的话,可以从如下网址下载安装

https://docs.oracle/javase/8/docs/technotes/guides/install/install_overview.html

2、下载UiAutoMatorViewer

https://dfenghuoyunji.jb51/201904/tools/uiautomatorviewer.rar

下载后,将里面的uiautomatorviewer.jar文件复制到之前安装的sdk的 tools/lib目录下

如果不放心的话,可以将之前的uiautomatorviewer.jar 备份一下

Sdk目录下的tools目录中,uiautomatorviewer.bat可以备份下,然后最后一行Dcom.android.uiautomator.bindir=后接adb实际存放路径。

我放在了D:\program files\Android\abd下

此时即可双击运行uiautomatorviewer.bat,打开uiautomatorviewer

 

4、测试

1、使用获取截图png和uix文件,保存到当前文件夹:

adb shell screencap -p /sdcard/sc.png

adb pull /sdcard/sc.png

adb shell uiautomator dump /sdcard/sc.uix

adb pull /sdcard/sc.uix

2、使用uiautomatorviewer工具查看能否解析成功

经过测试,手机桌面是可以解析的

但是王者游戏界面无法解析

所以准备使用百度文字识别api,进行操作,大致思路如下:

可以免费领取百度文字识别api的额度,如下网址:

https://cloud.baidu/doc/OCR/s/9k3h7xuv6#通用文字识别(高精度含位置版)

如果没有申请的话,默认是收费的,含位置信息的,最便宜的大概0.01元/次调用

里面有相应的调用方式参考代码示例

         

Token的话,可以参考这个文档,需要先创建应用

https://ai.baidu/ai-doc/REFERENCE/Bkru0l60m

        作者还试用了iOCR通用版,就是你可以选择需要识别的位置,指定参考点。但是经过测试,无法满足需求。

Adb调试,使用的是华为的鸿蒙手机(百度了一下,鸿蒙系统居然不是安卓了,不过应该是为了通用,adb工具还是可以进行调试的)。

连接手机后,电脑端会跳出华为手机助手,验证过后。Cmd中使用adb截图。如果截图不了的话,华为手机助手会提示再次验证。验证通过后,即可使用adb命令

Cmd中截图,查看没问题后,使用python脚本进行测试。其中点击屏幕命令如下:

adb shell input tap 522 1120(x y)


5、最终具体Python代码实现

import os
import time
import base64
import shutil
import requests
from PIL import Image


def Myexec(Tstr):
    # 自定义执行命令函数,方便调试
    os.system(Tstr)



# client_id 为官网获取的AppKey, client_secret 为官网获取的SecretKey
host = 'https://aip.baidubce/oauth/2.0/token?grant_type=client_credentials&client_id=【你的AppKey】&client_secret=【你的SecretKey】'
response = requests.get(host)
if response:
    response = response.json()
    token = response["access_token"]
    print(response)
    print(token)
# 可以将token保存为文件,需要的时候再取出来,这里不保存也能用,所以先不保存。
# 默认过期时间30天["expires_in"]


# 网络图片文字识别(含位置版)0.03一次,无折扣。能否检测,暂未尝试
# 通用文字识别(高精度版)0.03一次,多了有折扣
# request_url = "https://aip.baidubce/rest/2.0/ocr/v1/accurate_basic" # 可以检测出♀

# 通用文字识别(高精度含位置版)0.04一次,多了有折扣
# request_url = "https://aip.baidubce/rest/2.0/ocr/v1/accurate" # 可以检测出♀

# 通用文字识别(标准版含位置)0.01一次,多了有折扣
request_url = "https://aip.baidubce/rest/2.0/ocr/v1/general" # 可以检测出♀
# 通用文字识别,不含位置的0.005一次,多了有折扣。总结了一下,还是需要位置比较好,不包含位置的,不方便点击。


spic = 'sc.png'
dpic = "tmp.png"

abd1 = 'adb shell screencap -p /sdcard/'+spic
abd2 = 'adb pull /sdcard/'+spic
# adb shell screencap -p /sdcard/sc.png
# adb pull /sdcard/sc.png

testCount = 100 # 多少次循环没有找到合适的队伍及停止
testN = 0 # 当前截屏识别次数
clickOk = 0 # 进入队伍的标志

while testN<testCount:
    testN+=1
    time.sleep(2) # 经过2秒获取一次截屏(5秒以内都行)。因为王者聊天频道刷新时间大概是5秒
    Myexec(abd1) # 获取截屏
    Myexec(abd2) # 从手机拉(复制)到本地
    im = Image.open(spic)#返回一个Image对象:[宽,高]
    spicW = im.size[0]
    spicH = im.size[1]
    DpicW = spicW/2
    print('第%d次尝试,截屏的宽:%d,高:%d'%(testN,spicW,spicH))
    # 裁剪一半、保存。增加响应速度。对于王者进入队伍的需求来说,只需要左半部分进行图片识别即可
    cropped = im.crop((0, 0, DpicW, spicH)) # (left, upper, right, lower)
    cropped.save(dpic)
    t = time.time()
    tmpName = "sc"+str(t)+".png"
    shutil.copy(dpic,"tmp/"+tmpName) # 保存到临时文件夹

    # 二进制方式打开图片文件,base64编码后,发送给百度api
    f = open(dpic, 'rb')
    img = base64.b64encode(f.read())
    params = {"image":img}
    access_token = token
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers) # 获取百度翻译api的返回值
    if response:
        response = response.json() # 解析返回值为json格式
        wres = response["words_result"]
        thisGhw = 0
        print (wres)
        for w in wres:
            # if "皮肤碎片红包" in w["words"]: # 也可以判断是否有红包,然后点击。哈哈哈,这个就留给大家自己去尝试了
            tWords = w["words"] 
            if "♀" in tWords: # 男生的这个符号♂,经过测试,百度api识别不出来
                thisGhw = w["location"]["top"] # 文字距离屏幕截图顶部的距离 70-80,78
                thisGww = w["location"]["left"] # 文字距离屏幕截图左边的距离 110-120,116
                print("girl",thisGhw,thisGww)
            # if ("五人排位" in tWords or "无限乱斗" in tWords) and ("3/5" in tWords or "4/5" in tWords or "35)" in tWords or "45)" in tWords):
            if "排位" in tWords or "无限乱斗" in tWords: # 测试条件
                thisPhw = w["location"]["top"] # 70-80,78
                thisPww = w["location"]["left"] # 110-120,116
                print("五排或乱斗",thisPhw,thisPww)

                if thisGhw != 0:
                    exY = int(thisPhw)-int(thisGhw)
                    exX = int(thisPww)-int(thisGww)
                    if exY>70 and exY<90 and exX>110 and exX<128: # 如果满足条件,则点击,进入房间。
                        # 不同手机分辨率下,有可能不一样。这个需要具体测试 (我的是2340*1080px)
                        print("点击位置,x:%s,y:%s"%(thisPww,thisPhw))
                        # adb shell input tap 540 1104
                        Myexec("adb shell input tap "+str(thisPww)+" "+str(thisPhw))
                        break
            if "全队" in tWords or "召集" in tWords: # 判断是否已经进入房间
                clickOk = 1 
                print("进入房间成功")

    if clickOk == 1:
        # 如果已经进入房间,退出循环
        break

经过测试,一般等待几分钟,就会进入想要的房间啦~再也不用一直盯着屏幕啦~其实还有很多功能,比如自动抢皮肤碎片啦、做任务啦,这些就需要大家自己去实现啦~

所用工具下载地址:链接:https://pan.baidu/s/1ckE8mj_eWhVatAFoV8E3Mg 
提取码:lkkz


6、参考文献

  1. 《ADB 操作命令详解及用法大全》ADB 操作命令详解及用法大全 - 掘金
  2. 《Android自动化测试应用<一>《uiautomatorviewer工具的安装与使用》》https://wwwblogs/corsacsherry/p/10609339.html
  3. 《Android SDK的下载与安装》https://wwwblogs/nebie/p/9145627.html
  4. 《OSError: cannot write mode RGBA as JPEG》https://blog.csdn/weixin_39777626/article/details/82774270
  5. 《Python读取图片尺寸、图片格式》https://wwwblogs/d0main/p/7613296.html
  6. 《Python实现图片裁剪的两种方式(Pillow和OpenCV)》https://www.jb51/article/173183.htm
  7. 《Uiautomatorviewer报错Unexpected error while obtaining UI hierarchy java.lang.reflect.InvocationTargetE》https://blog.csdn/qq_41714308/article/details/113886433
  8. 《UI Automator Viewer工具的使用》https://wwwblogs/lhx0827/p/9577575.html
  9. 《用Python实现自动化操作Android手机》https://wwwblogs/xakzp/articles/9662770.html
  10. 《python 控制手机滑屏_如何使用python控制手机(以微信游戏跳一跳为例)》https://blog.csdn/weixin_26757939/article/details/113642335
  11. 《android adb 模拟点击、滑动、输入、按键》https://blog.csdn/liukang325/article/details/79268173

本文标签: 手机Python五排上分