Hemos dado otro pasito más gracias a la información de foros y ayuda de foreros.
Con el afán de "automatizar" el programa, tal y como se comenta unos mensajes más arriba, tenemos en esta página de JcDecaux una lista con las ciudades que soporta:
Hasta ahora en el programa se había introducido manualmente el listado (y sus URLs). Con la ayuda de los foros y este nuevo "trozo" de código podemos leer dicha página, las ciudades, sus enlaces y crear la URL de una estación en concreto.
La ventaja es que (si no cambian de sistema), el programa, cada vez que arranque, creará una lista con las ciudades que obtenga de la página oficial. Con ello, si se crea instala el sistema en alguna ciudad nueva y figura en la página oficial, el programa también la mostrará.
Este es el código que (tras realizar pruebas) tengo que incluir en el programa original.
Código: Seleccionar todo
#include <Array.au3> ; Para manejo de matrices
$URL_JcDecaux="http://www.jcdecaux.com/en/Innovation-Design/Cyclocity-R"
#cs
En la página $URL_JcDecaux se puede localizar los nombres de las Ciudades y sus URL de enlace:
Ciudad..: target="_self">(.*?)</a>
URL.....: <td style="vertical-align:;"> <a href="(.*?)"
- Algunas ciudades tienen varias palabras. JcDecaux utiliza para formar la URL con los datos sólo la primera palabra.
- Los nombres de las ciudades utilizados en la URL con los datos están en minúsculas y sin acentos/tildes.
#ce
$sFile=InetRead($URL_JcDecaux)
$sFile=BinaryToString($sFile,4) ; 1=ANSI 4= UTF8
;cw($sFile) ; Muestra el texto del archivo HTML
Local $mCiudades=StringRegExp($sFile,'target="_self">(.*?)</a>',3)
;~ _ArrayDisplay($mCiudades)
Dim $mCiudadesMod[UBound($mCiudades)]
; Se modifica la ciudad para utilizarla en la URL de búsqueda de datos
For $a=0 to UBound($mCiudades)-1 ; Para cada ciudad
$mCiudadesMod1=StringSplit($mCiudades[$a]," ") ; Hay ciudades con varias palabras y la URL se forma con la primera. Se parte la ciudad en las palabras que contenga (separadas por espacios)
$mCiudadesMod[$a]=ConvCar($mCiudadesMod1[1]) ; Convierte caracteres con acentos/tildes de la primera palabra de una ciudad
$mCiudadesMod[$a]=StringLower($mCiudadesMod[$a]) ; Convierte a minúsculas
cw("La ciudad: " & $mCiudades[$a] & " se convierte a: " & $mCiudadesMod[$a])
Next
Local $mURLs=StringRegExp($sFile,'<td style="vertical-align:;"> <a href="(.*?)"',3)
;~ _ArrayDisplay($mURLs)
Dim $mURL_Creada[UBound($mCiudades)]
For $a=0 to UBound($mCiudades)-1
$mURL_Creada[$a]=$mURLs[$a]&"service/stationdetails/"&$mCiudadesMod[$a]&"/NumEstacion"
Next
Local $mCiudadURL=UnirMatriz($mCiudades,$mURLs,$mCiudadesMod,$mURL_Creada)
_ArrayDisplay($mCiudadURL) ; Muestra la matriz creada (con todas las columnas)
_ArrayDisplay($mURL_Creada) ; Muestra la matriz creada para la URL de la ciudad/estación
Func ConvCar($sStr)
; Obtenido de: http://www.autoitscript.com/forum/topic/115065-how-to-replace-scpecial-characters-in-a-string/
; Modificado según: http://www.emesn.com/autoitforum/viewtopic.php?p=11821#p11820
Local $aSearch = StringSplit("Š,Œ,Ž,š,œ,ž,Ÿ,¥,µ,À,Á,Â,Ã,Ä,Å,Æ,Ç,È,É,Ê,Ë,Ì,Í,Î,Ï,Ð,Ñ,Ò,Ó,Ô,Õ,Ö,Ø,Ù,Ú,Û,Ü,Ý,ß,à,á,â,ã,ä,å,æ,ç,è,é,ê,ë,ì,í,î,ï,ð,ñ,ò,ó,ô,õ,ö,ø,ù,ú,û,ü,ý,ÿ", ",", 2)
Local $aReplace = StringSplit("S,O,Z,s,o,z,Y,Y,u,A,A,A,A,A,A,A,C,E,E,E,E,I,I,I,I,D,N,O,O,O,O,O,O,U,U,U,U,Y,s,a,a,a,a,a,a,a,c,e,e,e,e,i,i,i,i,o,n,o,o,o,o,o,o,u,u,u,u,y,y", ",", 2)
; Sistema reemplazando todas las letras en la cadena
For $i = 0 To Ubound($aSearch) -1
$sStr = StringReplace($sStr, $aSearch[$i], $aReplace[$i],0,1)
Next
Return $sStr
EndFunc
; ----------------------------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------------------------
; Funciones ya incluidas en MiBiciPublica.au3, pero que se ponen en este código para que funcione
; ----------------------------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------------------------
; ----------------------------------------------------------------------------------------------------
Func UnirMatriz($m1, $m2=0, $m3=0,$m4=0,$m5=0,$m6=0,$m7=0,$m8=0)
; Crea una matriz poniendo en cada columna las matrices que se vana a unir
cw("Haciendo UnirMatriz $m: "& $m1 &"-"&$m2&"-"&$m3&"-"&$m4&"-"&$m5&"-"&$m6&"-"&$m7&"-"&$m8)
cw("Haciendo UnirMatriz Ubound: "&UBound($m1)&"-"&UBound($m2)&"-"&UBound($m3)&"-"&UBound($m4)&"-"&UBound($m5)&"-"&UBound($m6)&"-"&UBound($m7)&"-"&UBound($m8))
Local $re[UBound($m1)][8]
For $i = 0 To UBound($m1) - 1
;For $i = 0 To UBound($m1) - 2
$re[$i][0] = $m1[$i]
if $m2<>0 then $re[$i][1] = $m2[$i]
if $m3<>0 then $re[$i][2] = $m3[$i]
if $m4<>0 then $re[$i][3] = $m4[$i]
if $m5<>0 then $re[$i][4] = $m5[$i]
if $m6<>0 then $re[$i][5] = $m6[$i]
if $m7<>0 then $re[$i][6] = $m7[$i]
if $m8<>0 then $re[$i][7] = $m8[$i]
;cw("Aquí llega " & $i)
Next
Return $re
EndFunc ;==>UnirMatriz
func cw($mensaje,$Debugit=1,$linea=@ScriptLineNumber) ;Abreviatura de ConsoleWrite
if $DebugIt=1 Then
ConsoleWrite("-->Linea(" & StringFormat("%04d", $linea) & "):" & @TAB &$mensaje & @CRLF)
Else
ConsoleWrite($mensaje & @CRLF)
EndIf
EndFunc
La última columna muestra la URL donde cambiando NumEstacion por el número de la estación que se desea comprobar, se muestra el archivo XML que posteriormente el programa utiliza para obtener las bicicletas y bornetas libres.