Oggi vediamo come gestire uno smartphone Android direttamente dal computer usando un pratico script in Python. Nessun programma pesante o software di terze parti che rischia di tracciare i dati: useremo solo ADB, un tool ufficiale rilasciato da Google per mettere in comunicazione il PC e il telefono.
Con questa configurazione potrai automatizzare alcune delle operazioni quotidiane: scaricare foto in galleria, guardare lo schermo in tempo reale sul monitor, leggere i messaggi SMS ricevuti, controllare l'APP musica o regolare i volumi. È un ottimo punto di partenza per iniziare e poi, magari, sviluppare qualcosa di più complesso.
Ammetto che per scrivere questo ambaradan di codice mi sono fatto dare una bella mano dall'intelligenza artificiale (Gemini), altrimenti a quest'ora sarei ancora bloccato ai primi errori di sintassi. In compenso, ci ho perso le ore a testarlo sul mio dispositivo prima di essere certo che tutto filasse liscio.
Per preparare l'ambiente di lavoro ed evitare errori di connessione, bastano tre rapidi passaggi che richiedono meno di cinque minuti.
1. Abilita il debug sullo smartphone
Di fabbrica Android blocca gli accessi esterni. Per aprire la comunicazione con il PC, prendi il telefono, entra in Impostazioni e vai su Informazioni sul dispositivo.
Trova la voce Versione build/Numero build (o Versione MIUI se usi uno Xiaomi) e premici sopra 7 volte consecutive finché non vedi il messaggio: "Ora sei uno sviluppatore".
Torna alla schermata principale delle impostazioni, accedi al nuovo menu Opzioni sviluppatore (potrebbe esere nascosto sotto Impostazioni aggiuntive) e attiva le spunte su Debug USB, Installa tramite USB, Debug USB (Impostazioni sicurezza) e Debug wireless.
2. Configura ADB sul PC
Scarica il pacchetto ufficiale dei platform-tools dal sito Android Developer accettando le condizioni d'uso. Una volta scaricato l'archivio, estrai la cartella in un percorso comodo sul computer (ad esempio dentro Documenti).
Per fare in modo che Windows riconosca i comandi da qualsiasi schermata, digita "Variabili di ambiente" nella barra di ricerca di Start e apri il pannello di controllo corrispondente. Fai clic sul pulsante Variabili d'ambiente... in basso, individua la riga Path nel riquadro delle variabili di sistema e selezionala. Clicca su Modifica, premi su Nuovo, incolla il percorso completo della cartella platform-tools appena estratta e conferma premendo OK su tutte le finestre.
3. Prepariamo Python e le librerie
Prima di proseguire devi essere certo che Python sia installato sul sistema. A questo punto, apri il prompt dei comandi (o il terminale) per scaricare i componenti necessari a far girare lo script. Scrivi il seguente comando e premi Invio:
pip install pure-python-adb
Per maggiori dettagli sul modulo puoi consultare la pagina ufficiale del progetto Python Package Index.
Il codice Python pronto all'uso
Se sei pronto, crea un file sul PC, nominalo controllo_telefono.py e inserisci all'interno il codice completo della variante USB che trovi subito dopo il primo blocco. Una volta salvato con estensione .py, spostalo direttamente nella cartella platform-tools o ci sarà un poblema di percorso.
Variante Wireless (collegamento senza cavo)
Se preferisci usare la connessione Wi-Fi per la gestione remota ed eliminare così i cavi dalla scrivania, la procedura è semplicissima. Prendi lo script di automazione Android (la versione USB) e sostituisci il blocco di codice iniziale che parte con:
def connetti_adb(): e finisce con: return devices[0] con questo:
def connetti_adb():
try:
ip_dispositivo = input("[*] Inserisci l'indirizzo IP del telefono (es. 192.168.1.50:5555): ").strip()
if not ip_dispositivo:
print("[!] Errore: Indirizzo IP non valido.")
input("\nPremi Invio per uscire...")
sys.exit()
client = AdbClient(host="127.0.0.1", port=5037)
print(f"[*] Tentativo di connessione wireless a {ip_dispositivo}...")
os.system(f"adb connect {ip_dispositivo}")
devices = client.devices()
if not devices:
print("[!] Errore: Impossibile stabilire la connessione. Verifica IP e porta.")
input("\nPremi Invio per uscire...")
sys.exit()
print(f"[+] Connesso via Wireless a {ip_dispositivo}\n")
return devices[0]
except Exception as e:
print(f"[!] Errore di connessione ADB Wireless: {e}")
input("\nPremi Invio per uscire...")
sys.exit()
Poi salva il file nuovamente come .py
Codice completo da copiare per la versione con cavo USB
import os
import sys
import subprocess
from ppadb.client import Client as AdbClient
def pulisci_schermo():
os.system("cls" if os.name == "nt" else "clear")
def connetti_adb():
try:
client = AdbClient(host="127.0.0.1", port=5037)
devices = client.devices()
if not devices:
print("[!] Errore: Nessun telefono trovato via USB.")
input("\nPremi Invio per uscire...")
sys.exit()
print("[+] Connesso via USB\n")
return devices[0]
except Exception as e:
print(f"[!] Errore di connessione ADB: {e}")
input("\nPremi Invio per uscire...")
sys.exit()
def mostra_menu():
print("=========================================================")
print(" PANNELLO DI CONTROLLO ")
print("=========================================================")
print(" 1. 📸 Fai uno screenshot")
print(" 2. 📍 Trova la posizione gps")
print(" 3. 📁 Scarica tutte le foto sul pc")
print(" 4. 📤 Invia un file al telefono")
print(" 5. 🌐 Apri un link nel browser")
print(" 6. 🔊 Regola volume")
print(" 7. 🎵 Riproduzione musica (Play/Pausa)")
print(" 8. 🔍 Trova file nel telefono")
print(" 9. 🔒 Accendi o spegni lo schermo")
print("10. 💡 Regola luminosità")
print("11. ⌨️ Scrivi un testo sul telefono")
print("12. 📥 Salva elementi su pc (cerca automaticamente nel telefono e salva in locale)")
print("13. 💬 Leggi gli ultimi sms")
print("14. ✉️ Invia un SMS al telefono")
print("15. 📊 Guarda le app installate")
print("16. 🚀 Apri un'app a distanza")
print("17. 🖥️ Guarda lo schermo in diretta sul pc")
print("18. 🔋 Controlla batteria e memoria")
print("19. 🔄 Opzioni di spegnimento")
print("20. 🔴 Chiudi tutto ed esci")
print("=========================================================")
def main():
device = connetti_adb()
while True:
mostra_menu()
scelta = input("Cosa vuoi fare? Scegli un numero > ").strip()
if scelta == "1":
print("[*] Cattura dello screenshot in corso...")
risultato = device.screencap()
with open("screenshot.png", "wb") as f:
f.write(risultato)
print("[+] Screenshot salvato sul PC come 'screenshot.png'")
elif scelta == "2":
print("[*] Lettura dati GPS...")
geo = device.shell("dumpsys location")
print(f"\n[+] Dati rilevati:\n{geo[:500]}")
elif scelta == "3":
print("[*] Ricerca e download delle foto in corso...")
os.makedirs("Foto_Telefono", exist_ok=True)
files = device.shell("find /sdcard/DCIM/Camera/ -type f").splitlines()
conteggio = 0
for f in files:
percorso_remoto = f.strip()
if percorso_remoto and percorso_remoto.startswith("/sdcard/"):
nome_file = percorso_remoto.split("/")[-1]
if nome_file:
device.pull(percorso_remoto, f"Foto_Telefono/{nome_file}")
conteggio += 1
print(f"[+] Download completato. Scaricate {conteggio} foto in 'Foto_Telefono'.")
elif scelta == "4":
percorso_pc = input("\nInserisci o trascina il percorso del file su PC: ").strip('"')
if os.path.exists(percorso_pc):
nome_f = os.path.basename(percorso_pc)
print("[*] Trasferimento del file...")
device.push(percorso_pc, f"/sdcard/Download/{nome_f}")
print(f"[+] File salvato nella cartella 'Download' del telefono.")
else:
print("[!] Errore: File non trovato sul PC.")
elif scelta == "5":
url = input("\nInserisci il link da aprire: ").strip()
print("[*] Apertura del browser sul telefono...")
device.shell(f"am start -a android.intent.action.VIEW -d {url}")
print("[+] Comando eseguito.")
elif scelta == "6":
pulisci_schermo()
print("=== REGOLAZIONE VOLUME ===")
print("1. Alza volume")
print("2. Abbassa volume")
print("3. Attiva/Disattiva Muto")
print("4. Imposta al massimo")
sub_vol = input("\nScegli un'opzione > ").strip()
if sub_vol == "1":
device.shell("input keyevent 24")
elif sub_vol == "2":
device.shell("input keyevent 25")
elif sub_vol == "3":
device.shell("input keyevent 164")
elif sub_vol == "4":
for _ in range(15):
device.shell("input keyevent 24")
print("[+] Regolazione volume eseguita.")
elif scelta == "7":
pulisci_schermo()
print("=========================================================")
print(" CONTROLLO RIPRODUZIONE MUSICA ")
print("=========================================================")
print(" 1. ▶️ Fai partire il brano (Play)")
print(" 2. ⏸️ Metti in pausa il brano (Pausa)")
print(" 3. ⏭️ Traccia successiva (Avanti)")
print(" 4. ⏮️ Traccia precedente (Indietro)")
print("=========================================================")
sub_musica = input("\nCosa vuoi fare? Scegli un numero > ").strip()
if sub_musica == "1":
print("[*] Invio comando Play...")
device.shell("input keyevent 126")
print("[+] Brano avviato.")
elif sub_musica == "2":
print("[*] Invio comando Pausa...")
device.shell("input keyevent 127")
print("[+] Brano messo in pausa.")
elif sub_musica == "3":
print("[*] Passaggio alla traccia successiva...")
device.shell("input keyevent 87")
print("[+] Traccia modificata (Avanti).")
elif sub_musica == "4":
print("[*] Passaggio alla traccia precedente...")
device.shell("input keyevent 88 && input keyevent 88")
print("[+] Traccia modificata (Indietro).")
elif scelta == "8":
termine = input("\nInserisci il nome del file (o parte di esso) da cercare: ").strip()
print(f"[*] Ricerca di '{termine}' nella memoria in corso...")
risultati = device.shell(f"find /sdcard/ -iname '*{termine}*' 2>/dev/null")
if risultati.strip():
print(f"\n[+] File trovati:\n{risultati}")
else:
print("[!] Nessun file trovato con questo nome.")
elif scelta == "9":
device.shell("input keyevent 26")
print("[+] Stato dello schermo invertito (Acceso/Spento).")
elif scelta == "10":
pulisci_schermo()
print("=== REGOLAZIONE LUMINOSITÀ ===")
print("1. Massima (100%)")
print("2. Media (50%)")
print("3. Minima (5%)")
sub_lum = input("\nScegli un'opzione > ").strip()
device.shell("settings put system screen_brightness_mode 0")
if sub_lum == "1":
device.shell("settings put system screen_brightness 255")
elif sub_lum == "2":
device.shell("settings put system screen_brightness 128")
elif sub_lum == "3":
device.shell("settings put system screen_brightness 12")
print("[+] Luminosità dello schermo aggiornata.")
elif scelta == "11":
testo = input("\nScrivi il testo da digitare sul telefono: ")
print("[*] Digitazione del testo in corso...")
testo_codificato = testo.replace(" ", "%s").replace("&", "\\&")
device.shell(f"input text {testo_codificato}")
print("[+] Testo inserito con successo.")
elif scelta == "12":
pulisci_schermo()
print("=========================================================")
print(" 📥 SALVATAGGIO AUTOMATICO FILE/CARTELLE ")
print("=========================================================")
termine = input("\nCosa vuoi salvare sul PC? (Scrivi il nome di un file o cartella) > ").strip()
if termine:
print(f"[*] Ricerca di '{termine}' sul telefono in corso...")
percorsi_trovati = device.shell(f"find /sdcard/ -iname '*{termine}*' 2>/dev/null").splitlines()
percorsi_trovati = [p.strip() for p in percorsi_trovati if p.strip()]
if not percorsi_trovati:
print("[!] Nessun file o cartella trovato con questo nome.")
else:
print(f"[+] Trovati {len(percorsi_trovati)} elementi. Inizio il salvataggio automatico...")
import os
cartella_pc = os.path.join(os.getcwd(), "File_Salvati_da_Telefono")
if not os.path.exists(cartella_pc):
os.makedirs(cartella_pc)
for percorso in percorsi_trovati:
nome_elemento = percorso.split("/")[-1]
destinazione_finale = os.path.join(cartella_pc, nome_elemento)
print(f"[*] Salvataggio di: {nome_elemento}...")
try:
device.pull(percorso, destinazione_finale)
print(f"[+] '{nome_elemento}' salvato con successo!")
except Exception as e:
print(f"[!] Impossibile salvare {nome_elemento}: {e}")
print(f"\n[📁] I file sono stati salvati qui: {cartella_pc}")
else:
print("[!] Nome non valido.")
elif scelta == "13":
print("[*] Lettura degli SMS in corso...")
sms = device.shell("content query --uri content://sms/inbox --projection address,body --order 'date DESC' --limit 5")
if "Unsupported argument" in sms or "usage:" in sms:
sms = device.shell("content query --uri content://sms/inbox --projection address,body --sort 'date DESC'")
linee = sms.splitlines()[:15]
sms = "\n".join(linee)
print(f"\n[+] Ultimi messaggi ricevuti:\n{sms if sms.strip() else 'Nessun messaggio presente.'}")
elif scelta == "14":
num = input("\nInserisci il numero del destinatario: ").strip()
msg = input("Inserisci il testo del messaggio: ")
print("[*] Apertura app SMS sul telefono...")
device.shell(f"am start -a android.intent.action.SENDTO -d sms:{num} --es sms_body '{msg}'")
print("[+] Campi compilati sul telefono.")
elif scelta == "15":
print("[*] Caricamento elenco applicazioni...")
apps = device.shell("pm list packages -3")
print(f"\n[+] Applicazioni installate dall'utente:\n{apps}")
elif scelta == "16":
pkg = input("\nInserisci il nome del pacchetto dell'app (es. com.whatsapp): ").strip()
print(f"[*] Avvio di {pkg}...")
device.shell(f"monkey -p {pkg} -c android.intent.category.LAUNCHER 1")
print("[+] Richiesta di apertura inviata.")
elif scelta == "17":
print("[*] Connessione allo schermo in corso con scrcpy...")
subprocess.Popen("scrcpy", shell=True)
elif scelta == "18":
print("[*] Analisi hardware in corso...")
batt = device.shell("dumpsys battery")
mem = device.shell("df -h /sdcard")
print(f"\n=== STATO BATTERIA ===\n{batt}\n=== SPAZIO DI ARCHIVIAZIONE ===\n{mem}")
elif scelta == "19":
pulisci_schermo()
print("=== OPZIONI DI SPEGNIMENTO ===")
print("1. Spegni il dispositivo")
print("2. Riavvia il sistema")
print("3. Riavvia in modalità Recovery")
sub_spg = input("\nScegli un'opzione > ").strip()
if sub_spg == "1":
device.shell("reboot -p")
print("[+] Comando spegnimento inviato.")
elif sub_spg == "2":
device.shell("reboot")
print("[+] Riavvio in corso.")
elif sub_spg == "3":
device.shell("reboot recovery")
print("[+] Riavvio in Recovery in corso.")
elif scelta == "20":
print("\n[+] Chiudo il terminale...")
subprocess.run("taskkill /F /PID %d" % os.getppid(), shell=True)
os._exit(0)
input("\nPremi il tasto Invio per continuare...")
pulisci_schermo()
if __name__ == "__main__":
pulisci_schermo()
main()
Guida all'avvio e gestione dei file scaricati
Con il codice salvato in formato .py manca solo l'accensione. L'esecuzione dell'interfaccia richiede due comandi:
1. Apri il terminale, digita cd Documents\platform-tools e premi Invio. Poi lancia python controllo_telefono.py confermando nuovamente con Invio.
Al primo avvio è necessario sbloccare la comunicazione: controlla il display del telefono e accetta la richiesta di autorizzazione spuntando "Consenti sempre". Conferma anche l'avviso di sicurezza su Windows.
2. Tutte le funzioni: Ti viene mostrata la lista numerata delle opzioni. Qui devi digitare la cifra corrispondente all'azione e premere Invio.
Dove finiscono i file salvati: Non c'è bisogno di preparare nessuna cartella prima di scaricare i dati, fa tutto il codice da solo:
La cattura dello screenshot (opzione 1) crea subito il file screenshot.png all'interno della cartella principale del programma.
Il download delle foto (opzione 3) genera sul momento la cartella Foto_Telefono spostando le immagini direttamente lì dentro.
Come funziona il codice (esempi pratici)
Connessione senza cavi
All'avvio riceve l'indirizzo IP digitato a schermo e aggancia il server locale sulla porta standard 5037. Subito dopo, invia l'impulso per accoppiare il dispositivo mobile via Wi-Fi sulla frequenza 5555. Una volta stabilito il contatto si genera un canale di comunicazione diretto che elabora tutti i comandi ADB Android successivi.
Cattura di schermate e galleria
Le opzioni per salvare file o scaricare immagini inviano istruzioni dirette al sistema operativo dello smartphone. Viene ordinato di catturare il display e memorizzare il file temporaneamente. Poi una funzione di trasferimento scarica il contenuto (o l'intera directory DCIM) in locale, ripulendo la memoria del cellulare per non sprecare spazio.
Analisi di posizione e batteria
Android annota lo stato dell'hardware in un registro interno. Noi andiamo a interrogare questo archivio in tempo reale, estrapolando le ultime coordinate GPS rilevate e i parametri energetici (temperatura, percentuale e tensione) mostrando a schermo i dettagli aggregati.
Gestione SMS, tasti e applicazioni
L'OS riconosce gli input fisici tramite codici numerici (KeyEvent). Per automatizzare azioni a distanza basta replicare questi impulsi. Ad esempio: il valore 26 simula il tasto di accensione, il 24 regola il volume verso l'alto e l'85 gestisce il player musicale. Per la lettura dei messaggi interrogghiamo direttamente il database degli SMS ricevuti e ne estraiamo i testi.
Condivisione schermo in tempo reale
In questo caso, la trasmissione video usa invece scrcpy, un tool open source leggerissimo che intercetta il flusso della scheda grafica dello smartphone e lo proietta in una finestra indipendente sul monitor, permettendoti di muoverti tra i menu utilizzando direttamente il mouse.
Risoluzione dei problemi frequenti
A volte la comunicazione tra PC e Android può non funzionare. Facciamo qualche esempio delle situazioni più comuni e dei passaggi rapidi per sbloccare la situazione:
Mancato rilevamento dello smartphone
Si verifica quasi sempre quando i due terminali non si trovano sulla stessa rete Wi-Fi. Per risolvere il problema verifica che il dispositivo mobile non stia usando la connessione dati e che il computer non sia agganciato a una rete per gli ospiti, altrimenti risulteranno invisibili l'un l'altro.
Il programma si blocca all'avvio
Se si tratta del primo accoppiamento, serve un'autorizzazione. Collega temporaneamente lo smartphone tramite cavetto, apri il terminale e digita adb devices. Sul display del telefono comparirà un avviso di sicurezza: seleziona la casella Consenti sempre da questo computer e conferma con un tocco. Fatto questo, scollega pure il cavo e se vuoi lancia la variante wireless.
La trasmissione video (opzione 17) non si avvia
Come detto poco fa, la visualizzazione remota richiede la presenza di scrcpy. Devi essere sicuro di aver scaricato l'archivio ufficiale da GitHub, estratto tutti i file e inseriti nella directory principale insieme a quelli di ADB (ad esempio dentro Documents\platform-tools) in modo che il codice Python possa trovarli ed eseguirli.
Errore di connessione [WinError 10061] (Rifiuto persistente)
Questo messaggio indica che il server di ADB in background sul PC è spento e non riceve i comandi inviati dallo script.
Per rimediare basta premere Invio, digitare nel prompt adb start-server e confermare. La riga di comando ti restituirà la notifica di avvio avvenuto con successo (* daemon started successfully). A questo punto lancia di nuovo python controllo_telefono.py.
Come controllare e aggiornare le librerie
I programmi e i pacchetti Python cambiano spesso, quindi ogni tanto è una buona idea controllare se è uscito qualcosa di nuovo. Per farlo non devi rimetterti a cercare su internet o scaricare file a mano, si fa tutto dal prompt dei comandi.
1. Vedere che versione hai installata
Per sapere quale versione stai usando in questo preciso momento, apri il terminale e scrivi:
pip show pure-python-adb
Tra le varie scritte che saltano fuori, dai un'occhiata alla voce Version: per leggere il numeretto della release che hai su disco.
2. Controllare se ci sono novità
Se vuoi solo chiedere a Python se c'è un aggiornamento pronto, senza però installare ancora nulla, lancia questo comando:
pip list --outdated
Se il nostro pacchetto compare nell'elenco che esce fuori, significa che è "vecchio" e c'è una nuova versione da installare.
3. Aggiornare
Lancia il comando specifico in base a cosa vuoi aggiornare:
pip install --upgrade pure-python-adb solo la libreria.
Nessun commento:
Posta un commento