天天看點

用python控制您的安卓手機

介紹

不久前,我在思考如何通過向好友發送幾分鐘的垃圾郵件來惹惱我的朋友,而在做一些研究的過程中,我遇到了Android調試橋。在本快速指南中,我将向您展示如何使用Python與之互動以及如何建立2個快速腳本。

ADB(Android調試橋)是一個指令行工具(CLI),可用于控制Android裝置并與之通信。您可以執行許多操作,例如安裝應用程式,調試應用程式,查找隐藏的功能并使用外殼程式直接與裝置連接配接。要啟用ADB,您的裝置必須首先解鎖開發者選項并啟用USB調試。要解鎖開發人員選項,您可以轉到裝置設定,然後向下滾動到“關于”部分,找到裝置上目前軟體的内部版本号。單擊内部版本号 7次,将啟用開發人員選項。然後,您可以轉到設定中的“開發人員選項”面闆,然後從那裡啟用USB調試。現在,您唯一需要做的另一件事就是将裝置連接配接到計算機的USB電纜。

這是今天的旅程:

  1. 安裝要求
  2. 入門
  3. 編寫腳本的基礎
  4. 建立自拍計時器
  5. 建立定義搜尋器

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

安裝ADB工具後,您需要擷取python庫,我們将使用該庫與ADB和我們的裝置進行接口。您可以使用pip install pure-python-adb安裝pure-python-adb庫。

可選:為使我們在開發腳本時更輕松,我們可以安裝一個名為scrcpy的開源程式,該程式允許我們使用滑鼠和鍵盤在我們的計算機上顯示和控制我們的android裝置。要安裝它,您可以轉到[Github repo](https://github.com/Genymobile/scrcpy)并下載下傳适用于您的作業系統(Windows,macOS或Linux)的正确版本。如果您使用的是Windows,則将zip檔案解壓縮到一個目錄中,然後将此目錄添加到您的路徑中。這樣一來,我們隻需在終端視窗中鍵入scrcpy即可從系統上的任何位置通路該程式。

現在已經安裝了所有依賴項,我們可以啟動ADB并連接配接裝置。首先,使用USB電纜将裝置連接配接到PC,如果啟用了USB調試,則會彈出一條消息,詢問PC是否可以控制裝置,隻需回答是。然後在您的PC上,打開一個終端視窗,并通過鍵入adb start-server來啟動ADB伺服器。這應該列印出以下消息:

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

如果您還安裝了scrcpy,則可以通過在終端中鍵入

scrcpy

來啟動它。但是,這僅在将其添加到路徑時才有效,否則可以通過将終端目錄更改為安裝scrcpy的目錄并鍵入scrcpy.exe來打開可執行檔案。希望一切順利,您應該能夠在PC上看到您的裝置,并能夠使用滑鼠和鍵盤對其進行控制。

現在,我們可以建立一個新的python檔案,并檢查是否可以使用該庫找到連接配接的裝置:

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

在這裡,我們導入AdbClient類并使用它建立一個用戶端對象。然後,我們可以獲得連接配接的裝置的清單。最後,我們從清單中獲得第一台裝置(如果僅連接配接了一個裝置,則通常是唯一的裝置)。

我們要與裝置連接配接的主要方式是使用外殼,通過這種方式,我們可以發送指令以模拟特定位置的觸摸或從A滑動到B。要模拟螢幕觸摸(輕擊),我們首先需要工作了解螢幕坐标的工作方式。為了幫助解決這些問題,我們可以在開發人員選項中激活指針位置設定。激活後,無論您在螢幕上的何處觸摸,都可以看到該點的坐标顯示在頂部。坐标系的工作方式如下:

該圖顯示了坐标系的工作方式

顯示屏的左上角分别具有* x 和 y 坐标(0,0),并且右下角的坐标是 x 和 y *的最大可能值。

現在我們知道了坐标系的工作原理,我們需要檢查一下可以運作的不同指令。我在下面列出了指令清單以及如何使用它們,以供快速參考:

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
           

如果您想找到更多,請在這裡找到一長串清單。https://forum.xda-developers.com/t/q-adb-input-keyevent-for-long-press-on-power- button.2063741 / post-64890206。

現在我們知道我們能做什麼,讓我們開始吧。在第一個示例中,我将向您展示如何建立一個快速的自拍計時器。首先,我們需要導入我們的庫并建立一個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
           

您可以看到connect函數與前面的如何連接配接到裝置的示例相同,除了這裡我們傳回裝置和用戶端對象以供以後使用。

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

在我們的主代碼中,我們可以調用connect函數來檢索裝置和用戶端對象。從那裡我們可以打開相機應用程式,等待5秒鐘并拍照。真的就是這麼簡單!正如我之前說過的,這隻是複制您通常會做的事情,是以,如果您首先手動進行操作并寫下步驟,則思考如何做事情是最好的。

現在,我們可以做一些更複雜的事情,那就是要求浏覽器找到特定單詞的定義,并截圖以将其儲存在我們的計算機上。

該程式的基本流程如下:

  1. 打開浏覽器
  2. 單擊搜尋欄
  3. 輸入搜尋查詢
  4. 等待幾秒鐘5
  5. 截圖并儲存

但是,在我們開始之前,您需要在預設浏覽器中找到搜尋欄的坐标,您可以使用我之前建議的方法輕松地找到它們。對我來說,他們是(440,200)。

首先,我們将必須導入與以前相同的庫,并且我們還将具有相同的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
           

在我們的主要函數中,我們可以調用connect函數,并為我們的搜尋欄的* x 和 y *坐标配置設定一個變量。注意這是一個字元串,而不是清單或元組,這樣我們可以輕松地将坐标合并到我們的shell指令中。我們還可以從使用者那裡擷取輸入資訊,以檢視他們想要擷取哪個單詞的定義:

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

我們會将查詢添加到完整的句子中,然後對其進行搜尋,這樣我們就可以始終擷取定義。之後,我們可以打開浏覽器,然後将搜尋查詢輸入到搜尋欄中,如下所示:

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模拟輸入鍵的按下以執行搜尋。如果需要,可以根據需要更改等待時間。

最後,我們将在裝置對象上使用screencap方法擷取螢幕截圖,然後可以将其另存為* .png *檔案:

screenshot = device.screencap()

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

在這裡,我們必須以寫位元組模式打開檔案,因為screencap方法傳回表示圖像的位元組。

如果一切都按計劃進行,則應該有一個快速腳本來搜尋特定單詞。這在我的手機上正常工作:

最後的想法

希望您今天學到了一些新知識,在我對此進行研究之前,我個人甚至都不知道這是一回事。很酷的事情是,您可以執行平常可以做的任何事情,而且還可以做更多的事,因為它隻是模拟您自己的觸摸和動作!

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

愛技術的程式員,在職上岸非全研究所學生;技術興趣廣泛:架構、java、python、nodejs、性能優化、工具、大資料、AI等技術分享!