Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 83
    Points : 46
    Points
    46

    Par défaut mettre un texte dans un nouveau fichier et l'enregistrer

    Bonjour à tous

    J'ai créé un script dans lequel je rapatrie des données et je voudrais les stocker dans un fichier texte et le sauvegarder.

    Je n'ai pas trop l'habitude d'Applescript donc j'aurais besoin d'aide, voila mon script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    set URL_page to "https://www.lesite.com/product-search/xx"
    set debut_texte to "Types de produits"
    set fin_texte to "Politique de confidentialité"
     
    tell application "Safari"
    	activate
    	make new document
    	tell document 1 to set URL to URL_page
    	set x to ""
    	repeat until (x ≠ "")
    		delay 15
    		set x to text of document 1
    	end repeat
    	tell document 1 to close
     
    end tell
     
    set text item delimiters to debut_texte
    set tempun to {} & text items of x
    set chainetemp to last item of tempun
    set text item delimiters to fin_texte
    set tempdeux to {} & text items of chainetemp
    set chaine to item 1 of tempdeux
    set chaine to debut_texte & chaine & fin_texte
    set Aujourdhui to current date
    --display dialog (the minute of Aujourdhui)
    set mes_heures to (time of Aujourdhui) div 3600
    set mes_minutes to ((time of Aujourdhui) mod 3600) div 60
    set HH to (mes_heures as string)
    set MM to (mes_minutes as string)
     
    tell application "Finder" to set Chemin to (home as string) & "Documents:MonDomaine:EssaiEnr-" & HH & MM & ".txt"
    -- HH correspond à l'heure actuelle
    -- MM correspond à la minute actuelle
    c'est un code récupéré sur le Net que j'ai aménagé et que je comprends

    maintenant il faudrait que je puisse enregistrer le résultat (chaine) dans un fichier.

    C'est là que ça pêche.

    a+

  2. #2
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    septembre 2010
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 507
    Points : 1 093
    Points
    1 093

    Par défaut

    Bonjour,
    Ecrire un fichier texte en Applescript se fait avec 3 instructions :
    - open : pour ouvrir le fichier et le créer si il n'existe pas déjà
    - write : pour écrire les données
    - close : pour le fermer

    Dans le script ci-dessous j'ai repris ta variable chaine en lui donnant une valeur à priori :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    set Chaine to "abcedefghij" -- la chaine du site web
    
    set HH to text 1 thru 2 of (time string of (current date))
    set MM to text 4 thru 5 of (time string of (current date))
    
    
    set monFichier to ((path to documents folder) as string) & "MonDomaine:EssaiEnr-" & HH & MM & ".txt"
    
    
    try
    open for access file monFichier with write permission-- ouvre le fichier et le crée si besoin
    write (Chaine) to file monFichier starting at eof-- écrit le message en fin de fichier    
    close access file monFicher
    on error
        try
    close access file monFichier
        end try
    end try
    Quelques commentaires :
    J'ai simplifié en 2 lignes l'extraction des heures et minutes. L'avantage de cette méthode est que l'heure est toujours sur 2 chiffres (exemple "07" au lieu de "7"). Tu verras que c'est bien plus pratique pour trier par nom dans le Finder.

    J'ai entouré les instructions d'écriture du fichier dans un block try / end try. En effet, il peut y avoir des erreurs (nom de fichier non valide, dossier protégé,...) et ce bloc try permet alors de sortir proprement du script en cas d'erreur. Note que en cas d'erreur le script saute sur le dernier "close" qui permet de toujours fermer proprement le fichier. Sinon, tu risques d'avoir un fichier resté ouvert et donc bloqué.

    Enfin, le "starting at eof" permet d'écrire dans un fichier à partir de la fin de celui-ci. Dans ton cas le fichier est nouveau donc sera vide.

    Cordialement

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 83
    Points : 46
    Points
    46

    Par défaut

    PBELL bonjour,

    Matinale ta réponse, elle correspond exactement à ce que je désirais et en plus le cadrage de l'heure.
    Cà aurais été ma deuxième question mais tu m'a devancé

    Comment fait-on pour que çà s'exécute en arrière plan ?

    Autre chose n'étant pas très au fait d'Applescript, tu pourrais m'expliquer où est l'instruction qui sélectionne le texte (seul) dans le code source dans le code qui suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    set text item delimiters to debut_texte
    set tempun to {} & text items of x
    set chainetemp to last item of tempun
    set text item delimiters to fin_texte
    set tempdeux to {} & text items of chainetemp
    set chaine to item 1 of tempdeux
    set chaine to debut_texte & chaine & fin_texte
    A+

  4. #4
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    septembre 2010
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 507
    Points : 1 093
    Points
    1 093

    Par défaut

    Bonjour,
    Citation Envoyé par patyom Voir le message
    Comment fait-on pour que ça s'exécute en arrière plan ?
    Par "arrière plan", je pense que tu veux dire "sans que cela se voit". Le traitement de la chaine et l'écriture du fichier texte n'affiche rien à l'écran. Pendant cette fraction de seconde tu peux faire autre chose avec ton Mac.
    Par contre la première partie de ton script fait appelle à Safari en lui demandant d'ouvrir un document. Cette partie sera visible.
    Si tu veux la rendre non visible à l'utilisateur, il faut plutôt utiliser des instructions de type curl en shell Unix qui vont télécharger le texte de ta page web sans rien montrer.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set Chaine to do shell script "curl https://www.apple.com/fr/"
    Ici, au lieu d'utiliser Safari pour ouvrir la page du site Apple et en télécharger le contenu, l'instruction 'curl' le fait directement.
    Cette instruction est une instruction shell Unix qui est le coeur de Mac OS. On appelle les instructions Unix en Applescript via la commande 'do shell script' qui renvoie le résultat.


    Quant à ta seconde question ne connaissant pas le contenu de ton site, ce n'est pas facile de répondre. Je ne peux que t'expliquer les instructions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set text item delimiters to debut_texte
    Cette instruction permet de couper un texte en morceaux en utilisant un séparateur dans la variable debut_texte. Un exemple très simple est de mettre la variable avec un espace : le texte sera découpé en ...mots : "bonjour je vais bien" sera donc les items text "bonjour", "je", "vais", "bien".
    Mais si la variable séparateur est plus complexe, on peut aller plus loin !
    Par exemple si le séparateur est "on", le texte "bonjour" sera séparé en 2 : "b" et "jour"
    J'ajoute enfin de l'on peut définir une liste de variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set text item delimiters to {" ", ",", ".", ";"}
    Le texte sera séparé en morceaux pris entre chaque signes de ponctuation.

    Pour revenir à ton script initial, ton script coupera le texte de la page web en morceaux compris entre les chaines "Type de produits".
    Pour utiliser un de ces morceaux on utilise "item text I", soit le morceau numéro I (la série commence à 1).

    Enfin l'opérateur & est un opérateur de concaténation : Set A to "bon" & "jour" donne à A la valeur "bonjour".

    Il faut donc analyser le texte de ta page web pour déterminer comment le couper de manière efficace pour en extraire ce qui t'intéresse.
    Selon le contenu, la manipulation comme texte peut être simple ou compliquée. Parfois il faut employer d'autres méthodes (balises html, javascript,...). C'est un autre sujet !!
    Cordialement

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 83
    Points : 46
    Points
    46

    Par défaut

    Bonjour PBELL,

    l'instruction Shell colle parfaitement mais comme dans la page que je veux il y a un tableau qui se charge et avec Shell çà ne le prend pas, peut-être que c'est un peu trop rapide.

    Qu'en penses-tu ?

  6. #6
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    septembre 2010
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 507
    Points : 1 093
    Points
    1 093

    Par défaut

    Bonjour,
    Je ne vois pas en quoi la vitesse intervient. L'instruction curl charge la totalité de la page indiquée par l'URL, que cela soit rapide ou pas.
    Cependant, il est fort probable que ton tableau affiché ne soit pas visible comme un tableau dans le format en texte brut de la page.

    Il faudrait connaître le contenu de la page, sa structure et le tableau recherché pour pouvoir en dire plus.
    Est-ce un site public ? Si oui, peux tu transmettre l'URL ?
    Sans plus d'information, je ne peux t'aider...

    Cordialement

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 83
    Points : 46
    Points
    46

    Par défaut

    C'est un site accessible à tout le monde qui suit les cotations financières.
    Je stocke pas mal de données qui une fois traitées par mes programmes perso m'aide à comprendre un peu mieux ce monde, oh je fais çà par plaisir et surtout pour ne pas trop me faire largeur en programmation, je maintiens mes connaissances.

    çà doit surement être dans le domaine du possible, on y traite des produits comme les warrants en ce qui me concerne :

    URL : "https://www.bourse.commerzbank.com/product-search/turbos/indices%20europ%C3%A9ens/dax%2030?Barrier1Range-Min=11310.36&Barrier1Range-Max=13170.36&PageSize=100"

    https://www.bourse.commerzbank.com/p...turbos/indices européens/dax 30?Barrier1Range-Min=11310.36&Barrier1Range-Max=13170.36&PageSize=100
    Les deux passent bien

    Alors comme tu peux le voir il y a différents critères de recherche inclus dans la "phrase"
    exemple : la barrière mini (11310.36), la maxi (13170.36) et le nombre de produits à afficher (100) etc ...

    Voilà

    Merci et bonsoir

  8. #8
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    septembre 2010
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 507
    Points : 1 093
    Points
    1 093

    Par défaut

    Bonjour,
    Le premier URL fonctionne, pas le second. Cependant je vois sur la page du premier URL qu'il y a un bouton permettant d'exporter le tableau en fichier Excel directement. Il me semble que tes traitements ultérieurs devrait être facilité via cet export.

    En appelant les instructions javascript dans Safari, on peut demander au script de cliquer sur ce bouton. Tu récupères ensuite un fichier Excel dans ton dossier de téléchargement. Le fichier sera avec le nom "Commerzbank Product-Search.xlsx" (si tu télécharges plusieurs fois, Safari ajoute un indice avant le .xlsx).
    Pour cliquer sur ce bouton if faut trouver quel bouton appuyer et lancer un javascript.
    Le bouton "Exporter vers Excel" est le 9ème de la collection de boutons de la page (la série commence à 0). On demande donc à la console javascript de cliquer sur ce bouton dans le document 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tell application "Safari"
    activate
        tell document 1
            set A to do JavaScript "document.getElementsByTagName('button')[8].click()"
        end tell
    end tell
    L'inconvénient de cette méthode est que tout se passe de façon visible pour l'utilisateur, comme dans ton premier script.

    J'ai aussi vérifié via la method curl, mais je ne récupère que les instructions html. Donc j'abandonne.

    Enfin, j'ai aussi essayé via le text de document 1 (comme ton premier script) et il se trouver que le texte est assez simple à interpréter dans ce cas. En voici un extrait :

    x lignes inutiles avant...
    Quanto
    Prix sous-
    jacent
    C504Z DAX 30 Call 100:1 12 150,00
    Points 12 150,00
    Points 20/09/2019 44,3 2,78 2,80 Non 12 399,700
    D310Z DAX 30 Call 100:1 12 250,00
    Points 12 250,00
    Points 20/09/2019 68,1 1,80 1,82 Non 12 399,700
    ......... (n lignes identiques)

    C724Z DAX 30 Call 100:1 12 183,26
    Points 12 183,26
    Points Illimitée 51,7 2,39 2,40 Non 12 399,700
    1
    100
    articles par page

    Politique de confidentialité Avertissement

    Parser cela n'est peut être pas si simple car chaque ligne de produit n'est pas une ligne de text, mais 3 lignes de texte. Il semblerait que les mots "points" soit précédés d'un retour à la ligne. C'est possible avec quelques astuces, mais je continue de penser que l'export Excel offert par le site reste le plus pratique, le fichier Excel permettant le stockage, tous les tris et des calculs ou formule de type "if" pour détecter les variations que tu cherches.

    Cordialement

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2010
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2010
    Messages : 83
    Points : 46
    Points
    46

    Par défaut

    Je peux facilement traiter le texte dans le premier script ce n'est pas la 1ere fois que je le fais. Mon seul soucis était de le faire sans Safari n'apparaisse au 1er plan car je fais autre chose pendant ce temps là mais bon çà ne dure pas trop longtemps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    tell application "Safari"
    activate
        tell document 1
            set A to do JavaScript "document.getElementsByTagName('button')[8].click()"
        end tell
    end tell
    Effectivement j'ai tout ce qu'il me faut dans ses fichiers Excel et comme je suis assez bon en VBA Excel je n'ai aucun mal à faire un amalgame. De plus c'est dans Excel facile à en faire des graphs.

    Dans tous les cas je te remercie, j'ai appris à utiliser Shell et à lancer des JavaScript d'une page Web çà c'est cool,
    çà m'ouvre pas mal de portes.

    Si je bloque en Shell de nouveau je saurai à qui m'adresser.

    Il me suffit maintenant de créer une boucle avec un timer pour que çà s'exécute automatiquement dans un laps de temps donné. As-tu déjà fait çà en AP ?

  10. #10
    Membre éprouvé

    Homme Profil pro
    Directeur de projet
    Inscrit en
    septembre 2010
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : septembre 2010
    Messages : 507
    Points : 1 093
    Points
    1 093

    Par défaut

    Bonsoir,
    Citation Envoyé par patyom Voir le message
    Il me suffit maintenant de créer une boucle avec un timer pour que çà s'exécute automatiquement dans un laps de temps donné. As-tu déjà fait çà en AP ?
    Pour lancer un script de façon répétitive, il y a plusieurs solutions:
    1) le bon view CRONTAB ! Apple n'en veut plus et réduit ses fonctions, mais sur ElCapitain ça fonctionne encore. Je crois aussi sur Mojave.
    2) en utilisant un Launchd : c'est la solution propre préconisée par Apple. Cela utilise les damons Unix. La majorité de tes applications et de ton système utilise cette méthode. Un petit tour sur le net t'en dira plus.
    3) un script appelé par ton calendrier : tu crées un évènement répétitif (par jour, semaine,...) et tu y associes un script.
    4) un script AppleScript avec un handle "idle".

    En pratique, j'utilise le 2) pour des évènement très fréquents, par exemple toutes les secondes, avec des scripts sans interface utilisateur pour ne rien montrer.

    J'utilise le 3) pour des évènements hebdomadaire , voire quotidiens (chaque jour ouvré,...). Attention toutefois, Apple est de plus en plus rigoureux avec la sécurité et lancer un script AS nécessite de l'autoriser...sinon tu auras une demande à chaque tentative de lancement. Il faut donc que ton script soit au moins compilé sous forme application .app, et l'ajouter dans tes préférences de sécurité/Accessibilité. D'autant plus que tu vas demander à ton script de prendre le contrôle de Safari !
    Apple pousse même à ce que TOUTES les application soient certifiées. Microsoft prends le même chemin.... !

    Le 4) sera lancé par toi, donc avec une seule alerte de sécurité, puis il tourne à intervalles réguliers.
    Voici un exemple que tu dois enregistrer dans l'éditeur en mode "ne pas quitter après l'exécution"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    on idle
    -- to mets ton code ici    
        return 10
    end idle
    Tu vas le lancer directement, puis à chaque fois qu'il aura fini, il attendra 10 secondes avant de se lancer de nouveau (10 = paramètre en face du return).
    Il faut cependant prévoir une sortie, sinon, il tourne à l'infini !
    Cette sortie peut être associée à des conditions dans un "if".
    Si la condition est vérifiée, tu peux dans ton code mettre un "tell me to quit". Si la condition n'est pas vérifiée, le script passe par le "return 10" et se relance 10 secondes plus tard.
    A titre d'exemple, j'avais , il y a quelques années, un script idle qui s'arrêtait lorsque j'ouvrai une application précise : le test consistait à tester si un process avec un nom donnée était lancé...si oui, je quittais. Cette application (un autre script) relançait le script idle en quittant !
    Bref , une petite bascule ;-)

    Cordialement

Discussions similaires

  1. Réponses: 3
    Dernier message: 31/08/2010, 18h12
  2. Réponses: 1
    Dernier message: 05/08/2010, 21h37
  3. Réponses: 1
    Dernier message: 03/04/2009, 18h23
  4. Réponses: 2
    Dernier message: 28/11/2006, 21h37
  5. [VB.Net] Comment mettre un texte dans un NotifyIcon ?
    Par Aspic dans le forum Windows Forms
    Réponses: 19
    Dernier message: 25/07/2006, 21h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo