AppleScript et Safari

GreensourceGreensource Membre
Bonjour! Je suis tout nouveau dans le monde AppleScript mais je pense que je vais en avoir besoin.
J'ai créer un installeur où à  la fin j'ai besoin de mettre un signet dans Safari (Plustard il me faudra le faire sous Firefox).
Je voulais savoir si AppleScript me permettrais de le faire? A priori je penses que oui car il me semble avoir lu que justement AppleScript permettais de "piloter" les applications Mac.

Et d'autres part j'ai aussi besoin de monter un serveur de fichier (smb://@IP etc) automatiquement dans le petit menu à  gauche dans le Finder. Tout du moins je voudrais au moins que le raccourci reste et que l'utilisateur n'ai qu'à  cliquer dessus, ça demande son mot de passe et ensuite il est connecté.
Idem, vous pensez que c'est faisable avec AppleScript?

Merci

Réponses

  • tabliertablier Membre
    04:29 modifié #2
    AppleScript permet de piloter tout application rendue scriptable par son programmeur. Et Apple fabrique des applications scriptables (généralement).
    Pour piloter les applications scriptables, tu peux utiliser AppleScript ou directement les Apple Events. AppleScript pilote les applications en générant des Apple Events. Les Apple Events sont programmés en C.
    Pour savoir si tu peux créer un signet dans Safari, tu dois ouvrir son dictionnaire, soit dans Xcode, soit dans l'éditeur de Script.
    Je te conseille, pour évaluation, d'utiliser l'éditeur de script et d'ouvrir les scripts qui sont dans le "dossier des scripts de l'ordinateur".
  • GreensourceGreensource Membre
    04:29 modifié #3
    Et zut de zut, j'ai bien peur que ce soit mort dans ce cas. J'ai en effet regarder le dictionnaire, aucune mention de bookmark mise à  part ouvrir les bookmarks.
    C'est trop dommage, il suffirais d'un add bookmark  :-\\

    Une autre idée pour faire ça?
  • tabliertablier Membre
    04:29 modifié #4
    Eh bien Safari et FireFox sont effectivement utilisés sur Mac! de même que "Camino", "iCab", "OmniWeb", "Flock", "Opera", "Shiira", "SeaMonkey" .... etc.  Pour ma part, j'utilise Camino  (viens de Camminare: marcher, se promener en italien)
    Pourquoi se limiter à  Safari et Firefox ? Tu pourrait ouvrir l'URL de la page html qui t'interesse dans le Browser par défaut de l'utilisateur. Charge à  lui d'en garder ou non un signet. Pour cela, NSWorkSpace doit marcher:
    [[NSWorkSpace sharedWorkspace] openURL:(URL_de_la_page)] ;
  • GreensourceGreensource Membre
    04:29 modifié #5
    Oui oui, je ne cherche pas spécialement à  me limiter, je voudrais juste que ça fonctionne au moins pour Safari et Firefox (C'est pas moi qui fixe le cahier des charges ^^)

    Et idem dans mon cahier des charges l'installeur doit avoir mis en place le bookmark tout seul.
  • AliGatorAliGator Membre, Modérateur
    04:29 modifié #6
    ~/Library/Safari/Bookmarks.plist

    A voir si c'est manipulable avec les NSUserDefaults (j'en doute), sinon à  lire via un [NSDictionary dictionaryWithContentsOfFile:...], modifier, et réécrire. Avec la question de savoir ce qui se passe si Safari est lancé pendant la manip, est-ce que quitter Safari ne risque pas (j'en ai peur) de réécrire le fichier...

    Sinon tu peux tenter de creuser la piste javascript, voir si une commande javascript ne permettrait pas de faire ça (quitte ensuite à  appeler la commande "do javascript" en AppleScript avec le code javascript adéquat), mais je crois que pour Safari y'a pas.

    Dernière solution, piloter directement l'UI de Safari, si les préférences d'accessibilité sont réglées pour le permettre bien sûr, pour envoyer des AppleEvents genre "sélectionner le menuitem 'Ajouter un Signet' puis rentrer tel texte puis valider"... mais bon bof.


    La solution la plus propre à  mon avis reste d'ouvrir la page dans Safari (ou autre) avec openURL comme mentionné par tablier, et d'afficher un message (via javascript ou via ton appli) genre "pensez à  ajouter cette page dans vos signets en tapant Pomme-D".
  • GreensourceGreensource Membre
    juin 2009 modifié #7
    Je vais chercher du coté du bookmark.plist merci.

    Sinon ta solution d'ouvrir une page (je le fait déjà  en fin d'install) et puis de faire penser à  l'enregistrer est pas mal, d'autant que ça laisse le choix à  l'utilisateur.

    Merci

    [edit] - Nickel il y a tout ce qu'il faut dans le PList, je vais me faire un petit programme de test pour essayer.

    Sinon est-ce qu'il y a le même genre de fichier pour le menu du Finder? Je parle du petit menu à  gauche avec le Home, Music...
  • tabliertablier Membre
    04:29 modifié #8
    J'avais également pensé au "GUI scripting". C'est un truc qui ne me plait pas vraiment car très dépendant des versions de Mac OSx et des versions des applications. Sans compter que, si le programme doit être multi-langues, il va falloir récupérer toutes les phrases dans toutes les langues, ou utilise des numéros: d'item de menu, de menu, de window... etc. Du genre:
    set content of textfield 2 of window 1 to "le texte à  écrire"
    Pas explicite !!!
  • GreensourceGreensource Membre
    04:29 modifié #9
    Ouais, j'ai essayer déjà  de faire un truc de se style avec Automator, c'est horrible, ça fait pas du tout professionnel ^^
  • GreensourceGreensource Membre
    04:29 modifié #10
    Bien, alors j'ai pas mal avancé! En fait j'ai même quasi fini ce que je voulais faire.
    J'ai donc un programme qui va chargé le fichier Bookmarks.plist qui se trouve dans:
    /Users/pduchene/Library/Safari
    Je le modifie pour ajouter mes bookmarks et hop le tour est joué!

    Sauf que ça ne marche que sous ma session évidemment puisque j'ai configurer le chemin comme ça. ::)
    "Super simple" je me dit, juste à  remplacé "/Users/pduchene" par "~" et hop ça marchera pour tout le monde!
    ...
    Et bas non! Pas moyen!  :-\\ Je ne sais pas trop comment du coup, voiçi le code qui coince:
    /* Get the file&#39;s data */<br />		NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    

    plistPath étant la NSString qui doit contenir le chemin vers mon fichier de bookmarks.
  • AliGatorAliGator Membre, Modérateur
    juin 2009 modifié #11
    Mais si mais si...

    Faut juste utiliser les bonnes méthodes genre la méthode [tt]stringByExpandingTildeInPath[/tt] de NSString. (Et utiliser stringByAppendingPathComponent pour composer ton chemin c'est mieux aussi à  la limite, plus générique)

    Ou sinon partir de NSHomeDirectory() qui te retourne une NSString contenant le chemin vers le home (/Users/pduchene), auquel tu rajoutes ton chemin vers le plist...

    Ou encore mieux, utiliser la méthode NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask,YES) pour récupérer la liste des chemins (typiquement tu n'en n'auras qu'un, "/Users/tonuser/Library/") vers le dossier Library qui sont dans le UserDomain, ce qui est encore plus propre et générique. Il ne te restera plus qu'à  appeler [tt][userLibDirPath stringByAppendingPathComponent:@Safari][/tt] pour récupérer le bon dossier, et encore une fois avec Bookmarks.plist pour obtenir le plistPath.

    --> cf la doc ici (et bien sûr la doc de NSString avec toutes les méthodes pour manipuler les paths)
  • GreensourceGreensource Membre
    04:29 modifié #12
    Super! J'ai choisit ta troisième solution puisque tu dit que c'est plus générique, mais j'avoue ne pas trop savoir pourquoi c'est plus générique?
    Dans quels cas:
    [NSString stringByExpandingTildeInPath:@&quot;~/Library/Safari/Bookmarks.plist&quot;];
    


    Pourrais ne pas fonctionner? C'est juste au cas Apple changerais le nom de "Library" ou  l'endroit ou est mis User?
  • AliGatorAliGator Membre, Modérateur
    04:29 modifié #13
    dans 1244724185:
    C'est juste au cas Apple changerais le nom de "Library" ou  l'endroit ou est mis User?
    Oui, honnêtement la première solution où tu mets le path en dur et demande juste d'expander le tilte y'a pas de raison qu'elle ne marche pas... Disons que c'est juste une autre façon de voir les choses, on cherche le dossier correspondant à  Library dans le domaine du User. Dans l'état actuel des choses, c'est forcément sensé nous retourner ~/Library (avec le tilde remplacé par /Users/tonnom).

    Mais si un jour Apple décide de changer ce dossier de place ou de nom, et de réorganiser ainsi l'arborescence des dossiers de base du système, par exemple de renommer le dossier "Library" en "Settings" et de la mettre dans un dossier "UserSettings/tonuserid" (je dis n'importe quoi), bah la dernière solution continuera de fonctionner.
    Certes, c'est super méga improbable. Et si vraiment Apple le fait un jour dans une future version de OSX, il communiquera massivement dessus. Mais bon au moins t'es à  l'abri.


    Une autre raison d'utiliser cependant ce type de code, c'est si tu souhaites porter ton appli sur iPhone : l'arborescence des fichiers sur iPhone étant différente (chaque appli possède une "sandbox", un espace dans le filesystem qui lui est réservé en fait) et donc les chemins d'accès différents, ce code continuera de faire pointer sur le bon dossier "Library" sur iPhone alors que le chemin en dur ne marchera pas... Mais bon en même temps vu ton cas spécifique, sur iPhone le fichier Bookmarks.plist s'il existe ne se trouve peut-être pas à  cet endroit, et de toute façon c'est pas dit que tu puisses y accéder contrairement à  sous OSX... donc bon.
  • GreensourceGreensource Membre
    04:29 modifié #14
    Tiens bas c'est marrant du coup, je suis tombé sur un os! J'ai pas fait attention mais je suis en root lorsque mon programme va se lancé! Du coup il est pas du tout dans:
    /Users/...
    mais dans
    /var/root/...
    Et là  il y a pas de Safari :(
    Je vais étudier le problème :P
    Il dois y avoir plusieurs path avec
    NSSearchPathForDirectoriesInDomains faut que je trouve le bon

    ps: sais tu comment lancé le debug avec root dans Xcode du coup pour mes tests?
  • GreensourceGreensource Membre
    04:29 modifié #15
    Alors voilà  j'ai créer un solution un peu bâtarde ma foi.
    Dans mon script qui lance le programme j'ai écrit:
    su ${USER} -c /private/tmp/cybervia/bookmark
    


    Mais ce qui est incroyable c'est que quand je lance ce script en ligne de commande, $USER = root, ce qui me semble normal puisque je fait un sudo en lançant le script.
    Là  ou ça deviens franchement bizarre, c'est que quand le script est lancé par l'installeur, là  $USER = pduchene!!! Alors que l'installeur me demande bien mon mot de passe admin!!!
  • GreensourceGreensource Membre
    04:29 modifié #16
    Voilà  voilà , c'est fini pour Safari!  :P Merci bien du coup de main!

    Il va maintenant falloir que je fasse la même chose pour Firefox! Par contre les gros malin utilise le format JSON! Pouvais pas faire comme Apple ^^

    Quelqu'un a une idée de où peut bien être cacher le fichier de bookmark de Firefox? Parce que bizarrement j'ai trouvé toute les sauvegardes (~/Library/Application Support/Firefox/Profiles/trucchelou.default/bookmarksbackups/)
    Mais ya pas celui qui est chargé au lancement on dirait.
    Si je dit ça c'est parce qu'au début je pensais qu'il lisait le plus récent, mais je les ai tous supprimé et il continue de bien les charger!
  • AliGatorAliGator Membre, Modérateur
    04:29 modifié #17
    dans 1244791892:

    Là  ou ça deviens franchement bizarre, c'est que quand le script est lancé par l'installeur, là  $USER = pduchene!!! Alors que l'installeur me demande bien mon mot de passe admin!!!
    Non c'est normal, l'installeur n'utilise pas vraiment "sudo", il utilise le SecurityFramework pour obtenir les droits d'exécution mais ne change pas $USER pour autant.
  • GreensourceGreensource Membre
    04:29 modifié #18
    Bon bas pour Firefox c'est pas du gâteaux dis donc! Non pas que le type JSON soit gênant, je crois avoir trouvé un projet google qui propose une lib Obj-C pour ça.
    Non en fait c'est plus idiot que ça, le fichier qui contient les bookmarks, j'arrive pas à  le trouvé  ::).

    J'ai regarder dans le profile utilisateur:
    \"User"\Library\Application Support\Firefox\Profiles\
    Il y a bien un dossier qui s'appelle bookmarksbackups mais j'ai vérifié en supprimant le contenu, ce n'est pas la dedans que Firefox charge ses bookmarks.

    Le seul fichier qui à  un impact sur les bookmarks lorsqu'on le supprime c'est:
    content-prefs.sqlite
    Et l'effet c'est de remettre à  zéro les bookmarks.

    Ca m'énerve j'ai l'impression que c'est là  sous mon nez! C'est forcément un de ces fichiers qu'il faut modifier!  :why?:
  • AliGatorAliGator Membre, Modérateur
    04:29 modifié #19
    Bah pourquoi tu n'attaques pas content-prefs.sqlite alors ? Avec les libs de SQLite, qui ne sont pas bien méchantes à  utiliser (et puis tu peux télécharger un logiciel pour naviguer dans un fichier de base de données SQLite, ça se trouve en cherchant "SQLite Browser" sur google surement, histoire de voir à  quoi ressemble la base et en déduire le ou les enregistrement à  ajouter à  la ou les tables pour que Firefox le prenne en compte... Je suis sûr que c'est pas méchant, ça doit pas être alambiqué comme base.
  • GreensourceGreensource Membre
    04:29 modifié #20
    Ouais tu as raison avec les libs de SQL ça devrais passé. Mais finalement mon chef de projet ma proposé de passer à  autre choses puisque j'ai déjà  fait la partie Safari.
    J'y reviendrais plus tard si j'ai le temps.
Connectez-vous ou Inscrivez-vous pour répondre.