用python控制您的安卓手機


image.png

介紹

不久前,我在思考如何通過向好友發送幾分鍾的垃圾郵件來惹惱我的朋友,而在做一些研究的過程中,我遇到了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。要模擬屏幕觸摸(輕擊),我們首先需要工作了解屏幕坐標的工作方式。為了幫助解決這些問題,我們可以在開發人員選項中激活指針位置設置。激活后,無論您在屏幕上的何處觸摸,都可以看到該點的坐標顯示在頂部。坐標系的工作方式如下:

image.png

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

顯示屏的左上角分別具有* 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方法返回表示圖像的字節。

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

最后的想法

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM