08/07/07

AppleScript Météo-France pour GeekTool

AppleScript (météo pour GeekTool)

Un AppleScript destiné à parser les cartes de prévisions météorologiques départementales[1], sur le site de Meteo France.

Le script utilise la commande curl deux fois successivement, une première fois pour récupérer le code source de la page HTML, et, une deuxième fois pour récupérer l'image GIF et la télécharger vers le dossier renseigné par la propriété myfolder. C'est d'ailleurs le seul résultat (utile) de ce script que de finalement télécharger une image.

weather.scpt

(*    
    weather.scpt
    HP <http://blogosx.jupiterii.com>
 
    updated Jul. 18, 2007
*)
 
property dpt : "75"
property myfolder : "/Users/path/to/folder"
property line2parse : "7"
--debug
property debug : false
 
on run
	if debug is true then
		set scriptname to string2get("/", (POSIX path of (path to me)) as string, "last")
		set begin to timestamp("begin of " & scriptname) & return
	end if
	
	set page to "http://www.meteofrance.com/FR/mameteo/prevDept_iframe.jsp?LIEUID=DEPT" & dpt
	set m to curl4content(page, "<img src=\"/img/picto/cte/moy/")
	
	if first word of m is not "curlbug" then
		try
			--parse the result of curl4content
			set m to string2get(return, m, line2parse)
			set m to string2get("<img src=\"", m, 2)
			set m to string2get("\"", m, 1)
			
			--wURL is partially based on 'page' variable (declared above)
			set wURL to "http://" & (string2get("/", page, 3)) & m
			
			--remove old pic and curl the new one (no string returned if property debug is false)
			return rm2curl(myfolder, wURL)
		on error bug
			beep
			--error displayed with some useful information
			return timestamp(((POSIX path of (path to me)) as string) & space & bug)
		end try
	else
		return timestamp(((POSIX path of (path to me)) as string) & space & m)
		return
	end if
end run
 
--functions
 
on curl4content(page, delim)
	try
		if delim is not "" then
			return do shell script "curl " & page & " | grep " & quoted form of delim
		else
			return do shell script "curl " & page
		end if
	on error bug
		beep
		return "curlbug:" & return & bug
	end try
end curl4content
 
on replaceString(theText, oldString, newString)
	set text item delimiters to oldString
	set tempList to every text item of theText
	set text item delimiters to newString
	set theText to the tempList as string
	set text item delimiters to ""
	return theText
end replaceString
 
on string2get(delim, istring, pos)
	set text item delimiters to delim
	set temp to every text item of istring
	set text item delimiters to ""
	if pos is "last" then
		return ((last item) of temp)
	else if pos is "first" then
		return ((first item) of temp)
	else
		return ((item pos) of temp)
	end if
end string2get
 
on rm2curl(myfolder, wURL)
	global begin, scriptname
	try
		--remove old pic (try because no verification before)
		do shell script "rm " & quoted form of ((myfolder) & "/weather.gif")
	end try
	do shell script "curl " & quoted form of wURL & " >" & quoted form of ((myfolder) & "/weather.gif")
	if debug is true then
		return (begin) & timestamp("end of " & scriptname)
	end if
end rm2curl
 
on timestamp(output)
	return (do shell script "date '+%d/%m/%y'") & space & (time string of (current date)) & " : " & output
end timestamp

La propriété line2parse doit être renseignée après avoir lu le code source de la page pour y repérer l'emplacement de la localité pour laquelle on veut obtenir la météo, dépendamment de sa position dans le code source ; il faut, alors, compter manuellement les occurrences de cette chaîne : <img src="/img/picto/cte/moy/ (par exemple).

Le résultat est : le téléchargement de l'image correspondant aux prévisions à 08h, 14h ou 20h ; selon l'heure à laquelle le script s'exécute.

Si le (mini)mode débug est activé (property debug : true), la date et l'heure de démarrage et de fin de l'exécution du script peuvent être affichés si tout se passe bien ; sinon on a l'affichage de l'erreur rencontrée, et ce, que debug soit activé ou non. Pour l'utilisation avec Geektool, prévoir un emplacement, au cas où… on peut s'aider de property debug : true pour obtenir une sortie même si le script se déroule sans erreur ; pour avoir ainsi tout loisir de régler les dimensions de la zone de texte, la couleur et la police de caractères, etc.

Utilisation avec GeekTool

Cet AppleScript est destiné à être utilisé avec GeekTool, qui permettra d'une part d'exécuter le script à intervalles réguliers et d'autre part d'afficher l'image obtenue. Il faudra donc configurer GeekTool pour qu'il exécute le script :

osascript /path/to/weather.scpt

et pour qu'il affiche l'image[2].

Qualités, défauts (surtout), éventuels développements (???)

Les 3 variables les plus nécessaires à la configuration du script sont donc déclarées sous forme de propriétés et placées au début du script (dpt, myfolder, line2parse). Au pire des cas, une petite imprécision lors du renseignement de la propriété line2parse ne doit pas être réellement gênant en comparaison de ce que l'on doit pouvoir obtenir comme précision en utilisant, par exemple, weather.com ; ceci dit, une meilleur utilisation de grep pourrait peut être améliorer ce défaut en évitant de devoir compter les lignes en se basant plutôt sur le nom de la localité… pour le moment, je n'ai pas réussi à faire mieux.

Les images de meteofrance.com ne sont pas trop moches et, de plus, elles sont bien détourées, ce qui n'est pas le cas d'autres sites.

La rapidité d'exécution du script est satisfaisante (de l'ordre de la seconde). Je regrette cependant de ne pas avoir réussi, avec une seule commande curl (la première) associée à grep, à réussir un meilleur parsage et ainsi récupérer plus d'information, comme la température et le reste de cette chaîne texte. Peut-être pour une prochaine fois, en réglant aussi le souci décrit en 1er paragraphe… pour pourquoi pas, faire un petit script utilisant le système de notifications Growl[3] ?

Notes

[1] exemple de carte départementale de prévisions : Paris et Petite Couronne

[2] voir la documentation de Geektool

[3] AppleScript Support for Growl

RSS commentaires

  1. 4
  2. 3
  3. E
  4. N
  5. 2
  6. U

Pour valider le formulaire, saisissez les 3 derniers caractères de la série

  • caca
  • confused
  • cry
  • dizzy
  • happy
  • lol
  • neutral
  • omg
  • sad
  • smile
  • tongue
  • wink