Python利用 ADB工具進(jìn)行手機(jī)自動化控制
教程簡介
本教程將教你使用 Python 和 ADB 工具實(shí)現(xiàn) PC 控制 Android 手機(jī)自動滑動視頻的功能。適合零基礎(chǔ)開發(fā)者,所有步驟可直接跟隨操作。
一、環(huán)境準(zhǔn)備
1.1 系統(tǒng)要求
- Windows 10/11、macOS 或 Linux
- Android 手機(jī)(需開啟開發(fā)者模式)
- USB 數(shù)據(jù)線
1.2 安裝 Python
檢查是否已安裝:
python --version
如果顯示版本號(如 Python 3.x.x),則已安裝,跳到 1.3。
Windows 安裝:
- 訪問 https://www.python.org/downloads/
- 下載 Python 3.8 或更高版本
- 安裝時(shí)勾選 “Add Python to PATH”
- 打開命令提示符(cmd),輸入
python --version驗(yàn)證
macOS 安裝:
# 使用 Homebrew brew install python3
Linux 安裝:
# Ubuntu/Debian sudo apt update sudo apt install python3 python3-pip # CentOS/RHEL sudo yum install python3 python3-pip
1.3 安裝 ADB 工具
方法一:安裝完整 Android SDK Platform-Tools(推薦)
- 訪問 https://developer.android.com/tools/releases/platform-tools
- 下載對應(yīng)系統(tǒng)版本
- 解壓到任意目錄(如
C:\platform-tools) - 添加到系統(tǒng)環(huán)境變量 PATH
Windows 添加環(huán)境變量:
- 右鍵"此電腦" → “屬性” → “高級系統(tǒng)設(shè)置”
- “環(huán)境變量” → 找到 Path → “編輯” → “新建”
- 添加 ADB 工具路徑(如
C:\platform-tools)
macOS/Linux 添加環(huán)境變量:
# 編輯 ~/.bashrc 或 ~/.zshrc echo 'export PATH=$PATH:/path/to/platform-tools' >> ~/.zshrc source ~/.zshrc
驗(yàn)證安裝:
adb version
應(yīng)顯示類似:Android Debug Bridge version 1.0.41
1.4 手機(jī)設(shè)置
開啟開發(fā)者模式:
- 設(shè)置 → 關(guān)于手機(jī)
- 連續(xù)點(diǎn)擊"版本號"7次
- 返回設(shè)置 → 系統(tǒng) → 開發(fā)者選項(xiàng)
- 開啟"USB調(diào)試"
- 用 USB 線連接手機(jī)到電腦
- 手機(jī)上彈出授權(quán)提示,點(diǎn)擊"允許"
驗(yàn)證連接:
adb devices
應(yīng)顯示類似:
List of devices attached ABC123456789 device
如果顯示 unauthorized,檢查手機(jī)授權(quán)提示。
二、安裝 Python 依賴
2.1 安裝 pure-python-adb
打開終端/命令提示符,執(zhí)行:
pip install pure-python-adb
可能遇到的問題:
如果提示 pip: command not found:
# 嘗試使用 pip3 pip3 install pure-python-adb # 或者使用 python -m pip python -m pip install pure-python-adb
如果安裝速度慢,使用國內(nèi)鏡像:
pip install pure-python-adb -i https://pypi.tuna.tsinghua.edu.cn/simple
2.2 驗(yàn)證安裝
python -c "from ppadb.client import Client; print('安裝成功')"
如果沒有報(bào)錯(cuò)且顯示"安裝成功",則安裝完成。
三、編寫自動化腳本
3.1 創(chuàng)建項(xiàng)目目錄
# 創(chuàng)建項(xiàng)目文件夾 mkdir phone-automation cd phone-automation
3.2 測試連接腳本
創(chuàng)建 test_connection.py:
"""
測試手機(jī)連接腳本
功能:驗(yàn)證 ADB 連接是否正常
"""
from ppadb.client import Client
def test_connection():
try:
# 連接 ADB 服務(wù)器
adb = Client(host="127.0.0.1", port=5037)
# 獲取設(shè)備列表
devices = adb.devices()
if len(devices) == 0:
print("? 未檢測到設(shè)備")
print("請檢查:")
print("1. 手機(jī)是否通過 USB 連接")
print("2. 是否開啟 USB 調(diào)試")
print("3. 是否授權(quán)此電腦")
return False
print(f"? 檢測到 {len(devices)} 個(gè)設(shè)備")
for device in devices:
print(f"設(shè)備序列號: {device.serial}")
return True
except Exception as e:
print(f"? 連接失敗: {e}")
print("請確保 ADB 服務(wù)已啟動,執(zhí)行: adb start-server")
return False
if __name__ == "__main__":
test_connection()
運(yùn)行測試:
python test_connection.py
3.3 基礎(chǔ)滑動腳本
創(chuàng)建 basic_swipe.py:
"""
基礎(chǔ)滑動腳本
功能:每隔指定時(shí)間執(zhí)行一次向上滑動
"""
from ppadb.client import Client
import time
def swipe_up(device):
"""
執(zhí)行向上滑動操作
參數(shù)說明:
input swipe x1 y1 x2 y2 duration
x1, y1: 起始坐標(biāo)
x2, y2: 結(jié)束坐標(biāo)
duration: 滑動持續(xù)時(shí)間(毫秒)
常見分辨率的滑動坐標(biāo):
- 1080x2400: swipe 500 1800 500 600 300
- 1080x1920: swipe 500 1500 500 500 300
- 720x1280: swipe 360 1000 360 400 300
"""
# 這里使用通用坐標(biāo),適配大多數(shù)手機(jī)
# 從屏幕下方(80%)滑到上方(20%)
device.shell("input swipe 500 1500 500 500 300")
print("? 執(zhí)行滑動操作")
def main():
try:
# 連接設(shè)備
adb = Client(host="127.0.0.1", port=5037)
devices = adb.devices()
if len(devices) == 0:
print("? 未檢測到設(shè)備,請先連接手機(jī)")
return
# 使用第一個(gè)設(shè)備
device = devices[0]
print(f"?? 已連接設(shè)備: {device.serial}")
# 配置參數(shù)
interval = 5 # 滑動間隔(秒)
count = 0 # 滑動計(jì)數(shù)
print(f"? 每 {interval} 秒滑動一次")
print("按 Ctrl+C 停止\n")
# 持續(xù)滑動
while True:
count += 1
print(f"[{count}] {time.strftime('%H:%M:%S')} ", end="")
swipe_up(device)
time.sleep(interval)
except KeyboardInterrupt:
print(f"\n\n?? 已停止,共執(zhí)行 {count} 次滑動")
except Exception as e:
print(f"\n? 發(fā)生錯(cuò)誤: {e}")
if __name__ == "__main__":
main()
運(yùn)行腳本:
python basic_swipe.py
3.4 完整功能腳本
創(chuàng)建 auto_swipe.py:
"""
完整自動化滑動腳本
功能:
1. 支持自定義滑動間隔和次數(shù)
2. 支持指定應(yīng)用包名(可選啟動應(yīng)用)
3. 記錄滑動日志
4. 異常處理和重連機(jī)制
"""
from ppadb.client import Client
import time
import argparse
from datetime import datetime
class PhoneAutomation:
def __init__(self, interval=5, total_count=None, app_package=None):
"""
初始化自動化控制器
參數(shù):
interval: 滑動間隔(秒)
total_count: 總滑動次數(shù)(None=無限次)
app_package: 應(yīng)用包名(可選)
"""
self.interval = interval
self.total_count = total_count
self.app_package = app_package
self.device = None
self.count = 0
def connect_device(self):
"""連接設(shè)備"""
try:
adb = Client(host="127.0.0.1", port=5037)
devices = adb.devices()
if len(devices) == 0:
print("? 未檢測到設(shè)備")
return False
self.device = devices[0]
print(f"? 已連接設(shè)備: {self.device.serial}")
return True
except Exception as e:
print(f"? 連接失敗: {e}")
return False
def start_app(self):
"""啟動指定應(yīng)用(如果配置了包名)"""
if not self.app_package:
return
try:
# 啟動應(yīng)用
self.device.shell(f"monkey -p {self.app_package} -c android.intent.category.LAUNCHER 1")
print(f"?? 已啟動應(yīng)用: {self.app_package}")
time.sleep(2) # 等待應(yīng)用啟動
except Exception as e:
print(f"?? 啟動應(yīng)用失敗: {e}")
def swipe_up(self):
"""執(zhí)行向上滑動"""
try:
self.device.shell("input swipe 500 1500 500 500 300")
self.count += 1
current_time = datetime.now().strftime('%H:%M:%S')
print(f"[{self.count}] {current_time} ? 滑動成功")
return True
except Exception as e:
print(f"? 滑動失敗: {e}")
return False
def should_continue(self):
"""判斷是否繼續(xù)執(zhí)行"""
if self.total_count is None:
return True
return self.count < self.total_count
def run(self):
"""運(yùn)行自動化任務(wù)"""
if not self.connect_device():
return
self.start_app()
print(f"\n? 滑動間隔: {self.interval} 秒")
if self.total_count:
print(f"?? 目標(biāo)次數(shù): {self.total_count} 次")
else:
print(f"?? 持續(xù)運(yùn)行(按 Ctrl+C 停止)")
print("-" * 50)
try:
while self.should_continue():
if not self.swipe_up():
# 滑動失敗,嘗試重連
print("?? 嘗試重新連接...")
if not self.connect_device():
break
if self.should_continue():
time.sleep(self.interval)
except KeyboardInterrupt:
print("\n\n?? 用戶停止")
finally:
print(f"\n?? 統(tǒng)計(jì)信息:")
print(f" - 總滑動次數(shù): {self.count}")
print(f" - 運(yùn)行時(shí)間: {self.count * self.interval} 秒")
def main():
# 命令行參數(shù)解析
parser = argparse.ArgumentParser(description='手機(jī)自動化滑動腳本')
parser.add_argument('-i', '--interval', type=int, default=5,
help='滑動間隔(秒),默認(rèn)5秒')
parser.add_argument('-n', '--count', type=int, default=None,
help='滑動次數(shù),不指定則無限循環(huán)')
parser.add_argument('-p', '--package', type=str, default=None,
help='應(yīng)用包名,如:com.ss.android.ugc.aweme(抖音)')
args = parser.parse_args()
# 創(chuàng)建并運(yùn)行自動化任務(wù)
automation = PhoneAutomation(
interval=args.interval,
total_count=args.count,
app_package=args.package
)
automation.run()
if __name__ == "__main__":
main()
四、運(yùn)行指南
4.1 基礎(chǔ)運(yùn)行
默認(rèn)配置運(yùn)行(5秒間隔,無限循環(huán)):
python auto_swipe.py
4.2 自定義參數(shù)運(yùn)行
設(shè)置間隔為10秒:
python auto_swipe.py -i 10
設(shè)置滑動20次后自動停止:
python auto_swipe.py -n 20
啟動抖音并自動滑動:
python auto_swipe.py -p com.ss.android.ugc.aweme
組合參數(shù)(每8秒滑動一次,共50次,啟動抖音):
python auto_swipe.py -i 8 -n 50 -p com.ss.android.ugc.aweme
4.3 查看幫助
python auto_swipe.py -h
4.4 停止腳本
運(yùn)行中按 Ctrl + C 即可停止。
五、常見應(yīng)用包名
- 抖音:com.ss.android.ugc.aweme
- 快手:com.smile.gifmaker
- B站:tv.danmaku.bili
- 微信:com.tencent.mm
- QQ:com.tencent.mobileqq
- 微博:com.sina.weibo
查找應(yīng)用包名方法:
# 先打開目標(biāo)應(yīng)用,然后執(zhí)行: adb shell dumpsys window | grep mCurrentFocus
六、調(diào)整滑動坐標(biāo)
如果滑動效果不理想,需要根據(jù)手機(jī)分辨率調(diào)整坐標(biāo)。
查看手機(jī)分辨率:
adb shell wm size
根據(jù)分辨率調(diào)整:
假設(shè)分辨率為 1080x2400:
# 計(jì)算公式:
# x坐標(biāo) = 屏幕寬度 / 2 = 1080 / 2 = 540
# y1坐標(biāo)(起點(diǎn))= 屏幕高度 * 0.8 = 2400 * 0.8 = 1920
# y2坐標(biāo)(終點(diǎn))= 屏幕高度 * 0.2 = 2400 * 0.2 = 480
# 修改 swipe_up 函數(shù)中的命令為:
device.shell("input swipe 540 1920 540 480 300")
七、故障排查
7.1 “未檢測到設(shè)備”
解決方案:
# 1. 檢查設(shè)備連接 adb devices # 2. 重啟 ADB 服務(wù) adb kill-server adb start-server # 3. 檢查驅(qū)動(Windows) # 在設(shè)備管理器中查看是否有黃色感嘆號 # 4. 重新授權(quán) # 拔掉 USB 線重新插入,手機(jī)上重新授權(quán)
7.2 “ModuleNotFoundError: No module named ‘ppadb’”
解決方案:
# 確認(rèn) Python 環(huán)境 python --version # 重新安裝 pip uninstall pure-python-adb pip install pure-python-adb
7.3 滑動無反應(yīng)
解決方案:
- 確認(rèn)應(yīng)用已在前臺運(yùn)行
- 調(diào)整滑動坐標(biāo)(參考第六節(jié))
- 增加滑動時(shí)間:
300改為500 - 檢查手機(jī)是否鎖屏
7.4 腳本運(yùn)行卡住
解決方案:
# 檢查 ADB 進(jìn)程 ps aux | grep adb # 殺掉所有 ADB 進(jìn)程 killall adb # 重啟 ADB adb start-server
八、進(jìn)階功能
8.1 添加隨機(jī)間隔
讓滑動更像人類操作:
import random # 在 auto_swipe.py 的 run 方法中修改: time.sleep(self.interval + random.uniform(-1, 1))
8.2 添加日志文件
import logging
# 在腳本開頭添加:
logging.basicConfig(
filename='swipe_log.txt',
level=logging.INFO,
format='%(asctime)s - %(message)s'
)
# 在 swipe_up 方法中添加:
logging.info(f"滑動第 {self.count} 次")
8.3 多設(shè)備控制
# 修改 connect_device 方法,支持選擇設(shè)備:
devices = adb.devices()
for i, device in enumerate(devices):
print(f"{i}: {device.serial}")
choice = int(input("選擇設(shè)備序號: "))
self.device = devices[choice]
九、完整項(xiàng)目結(jié)構(gòu)
phone-automation/
├── test_connection.py # 測試連接腳本
├── basic_swipe.py # 基礎(chǔ)滑動腳本
├── auto_swipe.py # 完整功能腳本
└── swipe_log.txt # 日志文件(運(yùn)行后生成)
十、總結(jié)
恭喜你完成教程!現(xiàn)在你已經(jīng)掌握:
- Python + ADB 環(huán)境搭建
- 手機(jī)連接和授權(quán)
- 基礎(chǔ)自動化腳本編寫
- 完整功能腳本開發(fā)
- 參數(shù)化配置和異常處理
下一步建議:
- 學(xué)習(xí)更多 ADB 命令(點(diǎn)擊、長按、輸入文本等)
- 探索 uiautomator2 進(jìn)行元素定位
- 研究圖像識別技術(shù)實(shí)現(xiàn)更智能的自動化
以上就是Python利用 ADB工具進(jìn)行手機(jī)自動化控制的詳細(xì)內(nèi)容,更多關(guān)于Python ADB手機(jī)自動化控制的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JSON Web Tokens的實(shí)現(xiàn)原理
本文主要介紹了JSON Web Tokens的實(shí)現(xiàn)原理。具有很好的參考價(jià)值,下面跟著小編一起來看下吧2017-04-04
python 擴(kuò)展print打印文件路徑和當(dāng)前時(shí)間信息的實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了python 擴(kuò)展print打印文件路徑和當(dāng)前時(shí)間信息,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10
python基于watchdog庫全自動化監(jiān)控目錄文件
這篇文章主要介紹了python基于watchdog庫全自動化監(jiān)控目錄文件,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下2021-03-03
pytorch中LN(LayerNorm)及Relu和其變相的輸出操作
這篇文章主要介紹了pytorch中LN(LayerNorm)及Relu和其變相的輸出操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
使用Fastapi打包exe后無限啟動導(dǎo)致死機(jī)的解決辦法
將 fastapi 服務(wù)打包成 exe 后雙擊執(zhí)行,命令行中不斷創(chuàng)建服務(wù)導(dǎo)致cpu吃滿,最后死機(jī),所以本文給大家介紹了Fastapi打包exe后無限啟動導(dǎo)致死機(jī)的解決辦法,需要的朋友可以參考下2024-03-03

