App下載

怎么用python控制安卓手機(jī)?

你是我的所有夢(mèng) 2021-08-17 10:21:32 瀏覽數(shù) (4999)
反饋

想要用電腦控制手機(jī),我們常用的方式是谷歌提供的系統(tǒng)級(jí)命令行工具ADB。ADB調(diào)試工具可以將手機(jī)和電腦連接起來,然后通過在ADB的shell中輸入命令來控制手機(jī),這為我們提供了一種python控制安卓手機(jī)的思路。那么怎么用python控制安卓手機(jī)呢?接下來這篇文檔帶你了解。

一、介紹

ADB(Android調(diào)試橋)是一個(gè)命令行工具(CLI),可用于控制Android設(shè)備并與之通信。您可以執(zhí)行許多操作,例如安裝應(yīng)用程序,調(diào)試應(yīng)用程序,查找隱藏的功能并使用外殼程序直接與設(shè)備連接。要啟用ADB,您的設(shè)備必須首先解鎖開發(fā)者選項(xiàng)并啟用USB調(diào)試。要解鎖開發(fā)人員選項(xiàng),您可以轉(zhuǎn)到設(shè)備設(shè)置,然后向下滾動(dòng)到“關(guān)于”部分,找到設(shè)備上當(dāng)前軟件的內(nèi)部版本號(hào)。單擊內(nèi)部版本號(hào) 7次,將啟用開發(fā)人員選項(xiàng)。然后,您可以轉(zhuǎn)到設(shè)置中的“開發(fā)人員選項(xiàng)”面板,然后從那里啟用USB調(diào)試?,F(xiàn)在,您唯一需要做的另一件事就是將設(shè)備連接到計(jì)算機(jī)的USB電纜。

這是今天的旅程:

1.安裝要求

2.入門

3.編寫腳本的基礎(chǔ)

4.創(chuàng)建自拍計(jì)時(shí)器創(chuàng)

5.建定義搜索器

二、安裝要求

我們需要安裝的兩件事中的第一件事是計(jì)算機(jī)上的ADB工具。它會(huì)自動(dòng)與Android Studio捆綁在一起,因此,如果您已經(jīng)擁有了,那就不用擔(dān)心了。否則,您可以轉(zhuǎn)到[官方文檔](https://developer.android.com/studio/command-line/adb),并且在頁(yè)面頂部應(yīng)有有關(guān)如何安裝它的說明。

安裝ADB工具后,您需要獲取python庫(kù),我們將使用該庫(kù)與ADB和我們的設(shè)備進(jìn)行接口。您可以使用pip install pure-python-adb安裝pure-python-adb庫(kù)。

可選:為使我們?cè)陂_發(fā)腳本時(shí)更輕松,我們可以安裝一個(gè)名為scrcpy的開源程序,該程序允許我們使用鼠標(biāo)和鍵盤在我們的計(jì)算機(jī)上顯示和控制我們的android設(shè)備。要安裝它,您可以轉(zhuǎn)到[Github repo](https://github.com/Genymobile/scrcpy)并下載適用于您的操作系統(tǒng)(Windows,macOS或Linux)的正確版本。如果您使用的是Windows,則將zip文件解壓縮到一個(gè)目錄中,然后將此目錄添加到您的路徑中。這樣一來,我們只需在終端窗口中鍵入scrcpy即可從系統(tǒng)上的任何位置訪問該程序。

三、入門

現(xiàn)在已經(jīng)安裝了所有依賴項(xiàng),我們可以啟動(dòng)ADB并連接設(shè)備。首先,使用USB電纜將設(shè)備連接到PC,如果啟用了USB調(diào)試,則會(huì)彈出一條消息,詢問PC是否可以控制設(shè)備,只需回答是。然后在您的PC上,打開一個(gè)終端窗口,并通過鍵入adb start-server來啟動(dòng)ADB服務(wù)器。這應(yīng)該打印出以下消息:

  • daemon not running; starting now at tcp:5037
  • daemon started successfully

如果您還安裝了scrcpy,則可以通過在終端中鍵入**scrcpy來啟動(dòng)它。但是,這僅在將其添加到路徑時(shí)才有效,否則可以通過將終端目錄更改為安裝scrcpy的目錄并鍵入scrcpy.exe**來打開可執(zhí)行文件。希望一切順利,您應(yīng)該能夠在PC上看到您的設(shè)備,并能夠使用鼠標(biāo)和鍵盤對(duì)其進(jìn)行控制。

現(xiàn)在,我們可以創(chuàng)建一個(gè)新的python文件,并檢查是否可以使用該庫(kù)找到連接的設(shè)備:

rom ppadb.client import Client as AdbClient

if __name__ == '__main__':
    client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037

    devices = client.devices()

    if len(devices) == 0:
        print('No devices')
        quit()

    device = devices[0]

    print(f'Connected to {device}')

在這里,我們導(dǎo)入AdbClient類并使用它創(chuàng)建一個(gè)客戶端對(duì)象。然后,我們可以獲得連接的設(shè)備的列表。最后,我們從列表中獲得第一臺(tái)設(shè)備(如果僅連接了一個(gè)設(shè)備,則通常是唯一的設(shè)備)。

四、編寫腳本的基礎(chǔ)

我們要與設(shè)備連接的主要方式是使用外殼,通過這種方式,我們可以發(fā)送命令以模擬特定位置的觸摸或從A滑動(dòng)到B。要模擬屏幕觸摸(輕擊),我們首先需要工作了解屏幕坐標(biāo)的工作方式。為了幫助解決這些問題,我們可以在開發(fā)人員選項(xiàng)中激活指針位置設(shè)置。激活后,無論您在屏幕上的何處觸摸,都可以看到該點(diǎn)的坐標(biāo)顯示在頂部。坐標(biāo)系的工作方式如下:

坐標(biāo)系

該圖顯示了坐標(biāo)系的工作方式

顯示屏的左上角分別具有* x y 坐標(biāo)(0,0),并且右下角的坐標(biāo)是 x y *的最大可能值。

現(xiàn)在我們知道了坐標(biāo)系的工作原理,我們需要檢查一下可以運(yùn)行的不同命令。我在下面列出了命令列表以及如何使用它們,以供快速參考:

Input tap x y
Input text “hello world!”
Input keyevent eventID
Here is a list of some common eventID's:
3: home button
4: back button
5: call
6: end call
24: volume up
25: volume down
26: turn device on or off
27: open camera
64: open browser
66: enter
67: backspace
207: contacts
220: brightness down
221: brightness up
277: cut
278: copy
279: paste

如果您想找到更多,請(qǐng)?jiān)谶@里找到一長(zhǎng)串清單。https://forum.xda-developers.com/t/q-adb-input-keyevent-for-long-press-on-power- button.2063741 / post-64890206。

五、創(chuàng)建自拍計(jì)時(shí)器

現(xiàn)在我們知道我們能做什么,讓我們開始吧。在第一個(gè)示例中,我將向您展示如何創(chuàng)建一個(gè)快速的自拍計(jì)時(shí)器。首先,我們需要導(dǎo)入我們的庫(kù)并創(chuàng)建一個(gè)connect函數(shù)以連接到我們的設(shè)備:

import time

from ppadb.client import Client as AdbClient

def connect():
    client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037

    devices = client.devices()

    if len(devices) == 0:
        print('No devices')
        quit()

    device = devices[0]

    print(f'Connected to {device}')

    return device, client

您可以看到connect函數(shù)與前面的如何連接到設(shè)備的示例相同,除了這里我們返回設(shè)備和客戶端對(duì)象以供以后使用。

if __name__ == '__main__':
    device, client = connect()

    # open up camera app
    device.shell('input keyevent 27')

    # wait 5 seconds
    time.sleep(5)

    # take a photo with volume up
    device.shell('input keyevent 24')
    print('Taken a photo!')

在我們的主代碼中,我們可以調(diào)用connect函數(shù)來檢索設(shè)備和客戶端對(duì)象。從那里我們可以打開相機(jī)應(yīng)用程序,等待5秒鐘并拍照。真的就是這么簡(jiǎn)單!正如我之前說過的,這只是復(fù)制您通常會(huì)做的事情,因此,如果您首先手動(dòng)進(jìn)行操作并寫下步驟,則思考如何做事情是最好的。

六、創(chuàng)建定義搜索器

現(xiàn)在,我們可以做一些更復(fù)雜的事情,那就是要求瀏覽器找到特定單詞的定義,并截圖以將其保存在我們的計(jì)算機(jī)上。

該程序的基本流程如下:

1.打開瀏覽器

2.單擊搜索欄

3.輸入搜索查詢

4.等待幾秒鐘

5.截圖并保存

但是,在我們開始之前,您需要在默認(rèn)瀏覽器中找到搜索欄的坐標(biāo),您可以使用我之前建議的方法輕松地找到它們。對(duì)我來說,他們是(440,200)。

首先,我們將必須導(dǎo)入與以前相同的庫(kù),并且我們還將具有相同的connect方法。

import time

from ppadb.client import Client as AdbClient

def connect():
    client = AdbClient(host="127.0.0.1", port=5037) # Default is "127.0.0.1" and 5037

    devices = client.devices()

    if len(devices) == 0:
        print('No devices')
        quit()

    device = devices[0]

    print(f'Connected to {device}')

    return device, client

在我們的主要函數(shù)中,我們可以調(diào)用connect函數(shù),并為我們的搜索欄的* x y *坐標(biāo)分配一個(gè)變量。注意這是一個(gè)字符串,而不是列表或元組,這樣我們可以輕松地將坐標(biāo)合并到我們的shell命令中。我們還可以從用戶那里獲取輸入信息,以查看他們想要獲取哪個(gè)單詞的定義:

if __name__ == '__main__':
    device, client = connect()

    search_bar = '440 200' # x y

    query = input('What word do you want to find the definition of: ')
    search_query = f'what is the definition of {query}'

我們會(huì)將查詢添加到完整的句子中,然后對(duì)其進(jìn)行搜索,這樣我們就可以始終獲取定義。之后,我們可以打開瀏覽器,然后將搜索查詢輸入到搜索欄中,如下所示:

device.shell('input keyevent 64')

time.sleep(0.25) # wait for browser to load

device.shell(f'input tap {search_bar}')

device.shell(f'input text "{search_query}"') # make sure you have the quotation marks around your text
device.shell('input keyevent 66')

time.sleep(3) # wait for results to load

在這里,我們使用eventID 66模擬輸入鍵的按下以執(zhí)行搜索。如果需要,可以根據(jù)需要更改等待時(shí)間。

最后,我們將在設(shè)備對(duì)象上使用screencap方法獲取屏幕截圖,然后可以將其另存為* .png *文件:

screenshot = device.screencap()

with open('result.png', 'wb') as f: # save the screenshot as result.png
    f.write(screenshot)
    print('Saved screenshot!')

在這里,我們必須以寫字節(jié)模式打開文件,因?yàn)閟creencap方法返回表示圖像的字節(jié)。

如果一切都按計(jì)劃進(jìn)行,則應(yīng)該有一個(gè)快速腳本來搜索特定單詞。這在我的手機(jī)上正常工作:


運(yùn)行結(jié)果

七、最后的想法

希望您今天學(xué)到了一些新知識(shí),在我對(duì)此進(jìn)行研究之前,我個(gè)人甚至都不知道這是一回事。很酷的事情是,您可以執(zhí)行平??梢宰龅娜魏问虑?,而且還可以做更多的事,因?yàn)樗皇悄M您自己的觸摸和動(dòng)作!

希望您喜歡這篇文章,并感謝您的閱讀! ??

到此這篇怎么用python控制安卓手機(jī)的文章就介紹到這了,希望能給各位小伙伴帶來幫助,也希望大家以后多多支持W3Cschool!



0 人點(diǎn)贊