260903-Capture du texte sur applications Android vers Joplin
Récupérer le texte affiché par une application Android — un article de presse, typiquement — et le déposer dans Joplin ou dans le coffre Obsidian, depuis le PC.
Mis en place le 2026-09-03 sur le poste julie. Reproductible sur un autre PC, la procédure d'installation figure plus bas.
Le principe
Le script appelle uiautomator dump, un outil livré avec Android, qui exporte l'arbre d'accessibilité de l'écran en XML. On en tire les attributs text et content-desc.
Ce n'est PAS de la reconnaissance optique. On récupère le texte réel de l'application, avec ses accents, sa ponctuation et sa casse exacts. Aucune erreur de lecture possible, contrairement à un OCR sur capture d'écran.
Rien n'est installé sur la tablette. Tout passe par adb, déjà présent avec le SDK Android.
Ce qu'il faut sur le PC
adb
fourni par platform-tools du SDK Android
Un appareil joignable
l'émulateur emulator-5554, ou un vrai téléphone en débogage USB
Le script est dans l'arbre Syncthing, donc déjà présent sur toutes les machines :
Jux-scripts/Android-Texte/capturer_texte.py
Jux-scripts/Android-Texte/README.md
Usage
# ecran courant, affiche dans la console
py -3.12 capturer_texte.py
# vers un fichier / le presse-papiers
py -3.12 capturer_texte.py -o article.txt
py -3.12 capturer_texte.py --presse-papiers
# vers Joplin ou Obsidian
py -3.12 capturer_texte.py --joplin
py -3.12 capturer_texte.py --obsidian
-o, --fichier
—
fichier UTF-8
--presse-papiers
—
copie dans le presse-papiers Windows
--joplin
—
crée une note Joplin
--carnet
Captures Android
carnet Joplin, créé s'il manque
--obsidian
—
dépose un .md dans le coffre
--coffre
D:\Syncthing\Jux_Obsidian
racine du coffre
--dossier
Captures Android
sous-dossier du coffre
--titre
deviné
titre de la note
--defiler
—
fait défiler et accumule
--serie
emulator-5554
identifiant adb
--adb
—
chemin d'adb.exe
--tri-position
—
trier par coordonnées (voir pièges)
Codes de sortie : 0 succès, 1 erreur adb, 2 échec Joplin, 3 échec Obsidian.
Les deux destinations
Obsidian — la plus simple
Écrit un .md dans <coffre>\Captures Android\, avec l'en-tête YAML des notes existantes :
---
title: ...
created: 2026-09-03 04:54:54Z
updated: 2026-09-03 04:54:54Z
source: capture Android
---
Ni jeton, ni application ouverte, ni service à activer. Le coffre étant dans Syncthing, la note part sur tous les appareils par la synchronisation habituelle. Les noms de fichier sont assainis pour Windows et un suffixe (2), (3)… évite d'écraser.
Joplin — via le Web Clipper, en local
Mise en place, une seule fois par PC :
D:\Android\joplin_token.txt
La variable d'environnement JOPLIN_TOKEN est prioritaire si elle existe.
⚠ Le jeton doit être HORS de l'arbre Syncthing. Déposé par erreur dans
D:\Syncthing\Jux_univers\Mes Notepads\le 2026-09-03, il s'est répliqué sur les sept appareils du maillage avant d'être déplacé. Le risque reste modéré — l'API n'écoute que sur127.0.0.1du PC, détenir le jeton ailleurs ne donne aucun accès distant — mais la régénération est immédiate depuis les options de Joplin. Même principe que/home/debian/.komga_scan.envcôté VPS.
Pourquoi pas le Joplin Server du VPS
joplin.juxjux.ovh est un serveur de synchronisation, pas une API de notes : les items y sont sérialisés pour la synchro, on ne peut pas y créer une note proprement. La seule voie praticable est l'API locale du client de bureau, sur http://127.0.0.1:41184.
Corollaire : Joplin doit être ouvert sur le PC au moment de la capture.
Les lanceurs du bureau
Deux fichiers .cmd sur le bureau : Capturer vers Joplin et Capturer vers Obsidian.
Ils vérifient la présence de Python et du script, écrivent une copie du texte dans %TEMP%\derniere_capture.txt, consignent les erreurs dans D:\Android\capture_texte.log et affichent les dernières lignes du journal en cas d'échec.
Pourquoi des
.cmdet pas des raccourcis.lnk: un.lnkcréé depuis Claude Code vers une cible sous%LOCALAPPDATA%fige un chemin virtualisé et ne fait rien du tout (voir page 282, section 6). Un.cmdest du texte brut : ses chemins sont littéraux et fonctionnent depuis l'explorateur.
Pièges rencontrés
⚠ 1. L'ordre du document, pas les coordonnées
Une première version triait les fragments par coordonnées bounds. Faux : dès qu'une partie du contenu est hors écran — le cas courant avec une WebView — ses bounds deviennent aberrants et les paragraphes ressortent mélangés.
L'ordre de l'arbre XML est l'ordre du document, donc l'ordre de lecture. C'est le comportement par défaut. --tri-position rétablit l'ancien, pour de rares interfaces natives dont l'arbre ne suit pas la mise en page.
⚠ 2. --defiler est souvent inutile
Une WebView expose l'intégralité du document chargé à l'accessibilité, pas seulement la partie visible. Un article de presse entier est capturé en un seul appel.
--defiler ne sert vraiment que pour les listes à chargement progressif — fil d'actualité, boîte de réception — où le contenu n'existe pas tant qu'on n'y est pas descendu.
⚠ 3. Le titre est deviné, et pas toujours trouvable
Sans --titre, le script prend la plus longue des huit premières lignes, entre 30 et 120 caractères, en écartant dates, heures, signatures (Par X), Mis à jour, Lire aussi.
Trois versions ont été nécessaires :
Il faut capturer depuis le HAUT de l'article. Une fois qu'on a défilé loin, l'en-tête sort de l'arbre et aucun titre n'est trouvable : la note prend alors la date (Capture Android du 03-09-2026 a 07h18). C'est délibéré — mieux vaut une date qu'un titre faux. Sinon, --titre "...".
⚠ 4. cmd clipboard n'existe pas
Sur les images « Google Play », adb shell cmd clipboard répond No shell command implementation. D'où le passage par clip.exe côté Windows, en UTF-16LE.
⚠ 5. Ne pas faire défiler la tablette par adb à l'aveugle
Sept input swipe enchaînés pour « remonter en haut » ont fait sortir l'application Les Échos de l'article et atterrir sur un écran de recherche. Les gestes longs déclenchent des navigations imprévues.
Laisser l'utilisateur positionner la vue lui-même.
⚠ 6. Vérifier Joplin sur TOUTES les pages
GET /folders est paginé. Avec 106 carnets, une vérification limitée à la première page conclut à tort que le carnet n'existe pas. Le script, lui, suit has_more correctement.
# faux : ne lit que la page 1
Invoke-RestMethod "http://127.0.0.1:41184/folders?token=$j"
Installer sur un autre PC
winget install --id Python.Python.3.12 --scope user
platform-tools — via le SDK Manager d'Android Studio, ou l'archive seule de Google
Adapter ADB_DEFAUT en tête du script, ou passer --adb
Pour Obsidian : adapter COFFRE_DEFAUT, ou passer --coffre
Pour Joplin : activer le Web Clipper et déposer le jeton hors de Syncthing
Recopier les deux .cmd du bureau en corrigeant les chemins en tête de fichier
Le script lui-même n'a rien à installer : stdlib seule.
Limites
tesseract est déjà disponible dans StirlingPDF sur le VPS si le besoin se présente.
Une application déclarant ses vues importantForAccessibility="no" reste muette.
Les fenêtres FLAG_SECURE (applications bancaires, vidéo protégée) ne sont pas exportées.
Vérifié le 2026-09-03
Voir aussi
Jux-scripts/Android-Texte/README.md — documentation technique du script