Aller au contenu
Retour aux docs

Écrire un script en Python

Les règles d'un script AppsMobs : fonctions déjà disponibles, images à côté du script, log, input, finish, garde-fou de sécurité et bonnes habitudes.

Dernière relecture 2 novembre 2026

À la fin de cette page, tu sauras écrire un script Python robuste pour AppsMobs : où poser les images, comment afficher et demander des choses, ce que le garde-fou refuse, et comment éviter les scripts qui plantent la nuit. ⏱ 15 minutes de lecture.

Avant de commencer

  • Tu as lancé un premier script : Ton premier script en 10 minutes.
  • Pas besoin de savoir programmer : la section « Python en deux minutes » plus bas donne le minimum.

Les trois règles d'un script AppsMobs

  1. Un script est un fichier .py ordinaire. Tu l'écris dans le mode Code du Playground et il est enregistré dans Documents\AppsMobs\Scripts.
  2. Aucun import pour les fonctions AppsMobs. tap, tap_image, wait_text, log… sont déjà là. N'écris pas from appsmobs import ... : ça n'existe pas.
  3. Le téléphone est fourni automatiquement. Les fonctions agissent sur l'appareil choisi dans Lancer sur. On écrit tap(540, 1200), pas tap(client, 540, 1200).

Toutes les fonctions sont listées dans la référence des fonctions. En tapant dans l'éditeur, les noms de fonctions te sont aussi proposés, et le panneau Référence des fonctions (Plus d'actions, groupe Outils) affiche leurs fiches sans quitter l'éditeur.

Un exemple complet

log("Début")

if tap_image("jouer.png", timeout=20):
    random_wait(1, 2)
    if wait_text("Bienvenue", timeout=15):
        log("Écran de bienvenue atteint")
    else:
        log("Pas d'écran de bienvenue", "WARNING")
else:
    log("Bouton Jouer introuvable", "ERROR")

press_home()

Lecture ligne par ligne : on cherche et touche jouer.png (20 secondes maximum), on attend un peu au hasard, on attend le texte « Bienvenue », on écrit ce qui s'est passé, puis on revient à l'accueil.

Où mettre les images

Une image est un fichier .png : la capture d'un bouton, d'une icône. Pour la fabriquer, suis l'étape « Capture l'écran du téléphone » de Ton premier script (Capture de l'appareil, découpe dans Paint).

AppsMobs cherche le fichier, dans cet ordre :

  1. si tu donnes un chemin complet, tel quel ;
  2. le dossier du script ;
  3. Documents\AppsMobs\Scripts\img.

Tu écris donc juste le nom : tap_image("jouer.png"). Un script non enregistré n'a pas de dossier : enregistre-le d'abord, ou mets l'image dans Scripts\img.

Si le fichier est introuvable, le script s'arrête avec :

image introuvable : jouer.png (cherchée dans le dossier du script et dans Scripts/img)

Bien choisir ses images

Découpe le bouton au plus près, évite les zones qui changent (compteurs, dates) et prends la capture sur un appareil de même résolution que celui qui lancera le script. Si la reconnaissance échoue, baisse un peu conf (conf=0.7) ou limite la zone cherchée avec region.

Afficher, demander, terminer

log : écrire dans la Sortie

log("Étape 1 terminée")
log("Attention, c'est lent", "WARNING")
log("Impossible de continuer", "ERROR")

log(message, level='INFO') écrit une ligne horodatée dans le panneau Sortie du Playground et dans la Console. Le niveau (INFO, WARNING, ERROR…) sert à filtrer dans la Console. C'est ton outil de diagnostic numéro un : mets un log avant et après chaque étape importante.

input : poser une question

nom = input("Quel nom pour la sauvegarde ?")
log(f"Je vais utiliser {nom}")

Le script s'arrête et attend. Dans le Playground, la question s'affiche dans la Sortie, avec un champ Tape ta réponse… et un bouton Envoyer ; depuis une autre source, elle apparaît dans la Console, où tu tapes la réponse puis Entrée. N'utilise input que si quelqu'un est là pour répondre : un script lancé par une tâche planifiée attendrait indéfiniment.

finish : arrêter proprement

if not wait_image("accueil.png", timeout=30):
    log("Accueil jamais atteint, j'arrête", "ERROR")
    finish()

finish() termine le script tout de suite et le marque comme terminé. Sans lui, le script se termine de lui-même à sa dernière ligne.

Python en deux minutes

compteur = 0                      # une variable
nom = "Bouton"                    # du texte, entre guillemets

for i in range(3):                # répéter 3 fois (i vaut 0, 1, 2)
    compteur = compteur + 1
    log(f"Tour {compteur}")       # f"..." insère des valeurs dans le texte

while compteur < 5:               # répéter tant que la condition est vraie
    compteur += 1

if compteur >= 5:                 # décider
    log("Au moins cinq")
else:
    log("Moins de cinq")

def toucher_deux_fois(x, y):      # ta propre fonction
    tap(x, y)
    wait(0.5)
    tap(x, y)

toucher_deux_fois(540, 1200)

Deux pièges de débutant : les lignes décalées de 4 espaces sous for, if, while, def forment le contenu du bloc (ne mélange pas espaces et tabulations), et wait(2) attend 2 secondes, pas 2 millisecondes.

Le garde-fou de sécurité

En mode Code, AppsMobs analyse ton script avant chaque lancement. Il refuse notamment :

  • les import de modules système : os, subprocess, sys, shutil, socket, ctypes, pickle, marshal, multiprocessing, threading ;
  • les appels à eval(...), exec(...), compile(...) et à os.system, subprocess.run… ;
  • les astuces d'obfuscation (__import__, getattr(__builtins__, ...), décodage base64 pour exécuter du code…).

Les modules « inoffensifs » (time, random, math, re, json, datetime) passent. Pour le reste, tu vois la fenêtre Exécution bloquée :

Pour votre sécurité, ce script ne peut pas être exécuté.
Utilisez le mode Blocs (No-Code) pour plus de sécurité.

suivie d'un motif (Analyse AST: Code dangereux ou obfusqué détecté) et du détail, par exemple le numéro de ligne.

Comment s'en sortir :

  1. Lis le détail : il dit quelle ligne pose problème.
  2. Supprime l'import ou l'appel. Les fonctions AppsMobs n'en ont pas besoin, et la plupart des besoins (attendre, répéter, décider) se font en Python pur.
  3. Si la fenêtre s'affiche alors que ton code est « innocent », cherche une faute de syntaxe : le détail contient alors Erreur de syntaxe.

Le Mode développeur (Plus d'actions, Mode développeur) assouplit certaines restrictions et affiche Mode développeur activé - Les restrictions sont assouplies. Il est réservé à ceux qui savent ce qu'ils lancent ; n'exécute jamais un code dont tu ne connais pas l'origine.

Ce que le garde-fou ne garantit pas

C'est un filet de sécurité, pas une garantie. Il ne remplace pas la relecture : ne lance pas un script trouvé ou généré par une IA sans l'avoir lu. Le mode Blocs est plus strict : il n'accepte que des fonctions AppsMobs.

Les bonnes habitudes

1. Attends une condition, pas un délai

# Fragile : si le chargement dure 6 secondes, ça casse
tap_image("jouer.png")
wait(5)
tap_image("niveau1.png")

# Solide : on attend ce qui compte
tap_image("jouer.png")
if wait_image("niveau1.png", timeout=30):
    tap_image("niveau1.png")

wait_image et wait_text rendent la main dès que la condition est vraie, et abandonnent après timeout secondes sans planter.

2. Teste toujours le résultat d'une attente

wait_image, wait_text et tap_image n'arrêtent pas le script quand ils échouent : ils rendent None ou False. Si la suite en dépend, vérifie avec if, et arrête-toi avec finish() ou une autre branche.

3. Varie les pauses

random_wait(1, 3)    # entre 1 et 3 secondes, au hasard

Un rythme parfaitement régulier est plus fragile qu'un rythme un peu variable, et il laisse à l'appli le temps de réagir. random_wait() sans valeur attend entre 0,35 et 0,8 seconde.

4. Ne boucle jamais sans fin sans le dire

essais = 0
while essais < 50:
    essais += 1
    if tap_image("suite.png", timeout=5):
        break
    swipe_up()
else:
    log("Bouton jamais trouvé après 50 essais", "ERROR")

Une boucle while True sans sortie tourne jusqu'à ce que tu cliques sur Arrêter. Borne toujours le nombre de tours, ou le temps.

5. Laisse l'appareil dans un état propre

Ferme ce que tu as ouvert et reviens à l'accueil, pour que le lancement suivant parte d'une situation connue :

close_app("com.android.chrome")
press_home()

6. Relance ce qui peut planter

for essai in range(3):
    open_app("com.android.chrome")
    if wait_text("Chrome", timeout=20):
        break
    log(f"Essai {essai + 1} raté, je relance", "WARNING")
    restart_app("com.android.chrome")

7. Plusieurs appareils : une copie par appareil

Quand tu lances un script sur plusieurs appareils, chacun exécute sa propre copie : les variables ne sont pas partagées. Pour répéter un script à heure fixe ou sur plusieurs appareils, passe par l'Automatisation.

Gérer ses scripts

Dans le Playground, le menu Plus d'actions regroupe :

  • Fichier : Nouveau script (Ctrl + N), Ouvrir un script… (Ctrl + O), Enregistrer sous…, Historique des versions, Exporter le script.
  • Édition : Annuler (Ctrl + Z), Rétablir (Ctrl + Y), Rechercher / remplacer (Ctrl + F), Ranger le code.
  • Outils : Capture de l'appareil, Référence des fonctions, Raccourcis clavier, Mode développeur.
  • Affichage : Panneau Sortie, Panneau latéral, Barre d'icônes, Plein écran.

La barre d'icônes de gauche donne accès à Fichiers, Blocs, Docs, Assistant et Générer.

Si tu as besoin d'un autre Python que celui d'AppsMobs, le Chemin Python personnalisé se règle dans les Paramètres, section Avancé.

Ça ne marche pas ?

Ce que tu voisCauseQue faire
Pour votre sécurité, ce script ne peut pas être exécuté.Garde-fou : import ou appel interdit, ou faute de syntaxe.Lis le détail, supprime l'import ; voir plus haut.
Aucun appareil branché : branche un téléphone (débogage USB activé) ou démarre un émulateur, puis relance.Aucun appareil.Brancher un téléphone ou un émulateur.
image introuvable : x.png (cherchée dans le dossier du script et dans Scripts/img)Fichier mal placé ou mal nommé.Voir « Où mettre les images ».
NameError: name 'x' is not definedFonction inexistante ou faute de frappe.Compare avec la référence. Les noms sont anglais et en minuscules.
IndentationErrorEspaces décalés de façon irrégulière.Utilise 4 espaces partout ; Ranger le code aide.
SyntaxErrorParenthèse, guillemet ou deux-points oublié.Relis la ligne indiquée.
Arrêté sur une erreur après …Le script a planté.Lis la fin de la Sortie et la Console.
Le script attend sans rien faireinput(), ou une attente longue.Réponds dans la Sortie / la Console, ou clique sur Arrêter (Maj + F5).

Et ensuite

Bloqué sur une étape ? Demande sur Discord, quelqu'un l'a sûrement déjà croisée.Demander sur Discord