Página 1 de 1

Cotillea Autoit.es

Publicado: 29 Mar 2011, 22:09
por jamaro
Hola de nuevo:

Esto de Autoit es un vicio, y cuando uno está trabajando en una cosa, busca información, y acaba liándose con otra. :smt040

Después de estar trabajando en obtención de datos de las páginas web, leyendo este y otros foros, viendo el uso de StringRegExp (¡me sorprende su potencia! :smt038 ) y algunos ejemplo de su uso, me hice este "Cotilleador", que lo que hace es, simplemente, mostrar los últimos mensajes que se lista en la parte inferior de la página principal de este foro (http://www.emesn.com/autoitforum/index.php), justo bajo el título "ÚLTIMAS NOVEDADES POR POSTS"

¿Utilidad? Poca, salvo que me ha servido para practicar con Autoit y acceso a datos de webs, y bueno, que de un vistazo tengo esa información, sin necesidad de abrir el navegador.

Un saludo ;-)

Código: Seleccionar todo

#include <Array.au3>
#include <String.au3>

$httpdir="http://www.emesn.com/autoitforum/"

Global $sData = InetRead($httpdir)
Global $nBytesRead = @extended
Global $DatosLeidos=BinaryToString($sData,4)	; flag = 4, binary data is taken to be UTF8
;msgbox(0,"Aviso",$DatosLeidos)


Local $cadini="<dl>"
Local $cadfin="</dl>"
Local $DatosAutoit=BuscaCadena($datosleidos,$cadini,$cadfin)
;MsgBox(0,"Aviso",$DatosAutoit)

StringRegExpReplace($DatosAutoit,' style="color: #.*?;" class="username-coloured"',"") ; Elimina la parte que cambia los atributos del autor del mensaje

Local $DatosAutoitMens[35][3]

for $i=0 to 34
		;Título del mensaje
	Local $cadini='class="forumtitle">'
	Local $cadfin="</a>"
	$DatosAutoitMens[$i][0]=BuscaCadena($datosautoit,$cadini,$cadfin,$i+1)

		; Autor del mensaje
	;Local $cadini=StringRegExp($datosautoit,'./memberlist.php\?mode\=viewprofile\&u=.*?([[:alnum:]]+)">',3) ; Se ha puesto \ delante de los carácteres que deben estar tal cual (? = &)
	Local $cadini=StringRegExp($DatosAutoit,'(?i)memberlist.php\?mode\=viewprofile\&u=.*?"\>([[:word:][:punct:]]+)</a\>',3) ;Word porque hay nombres con _ y punct porque hay nombres con .
	;_ArrayDisplay($cadini)
	;ConsoleWrite($cadini[$i]&@CRLF)
	Local $cadfin="</a>"
	$DatosAutoitMens[$i][1]=BuscaCadena($datosautoit,$cadini,$cadfin,$i+1)
	;$DatosAutoitMens[$i][1]=stringright($DatosAutoitMens[$i][1],stringlen($DatosAutoitMens[$i][1])-StringInStr($DatosAutoitMens[$i][1],">",1))

	$DatosAutoitMens[$i][1]=$cadini[$i]

		; Fecha del mensaje
	Local $cadini="</a>"
	Local $cadfin="<br>"
	$DatosAutoitMens[$i][2]=BuscaCadena($datosautoit,$cadini,$cadfin,3*($i+1))	; 3 porque es la tercera vez que aparace en cada línea
	$DatosAutoitMens[$i][2]=stringright($DatosAutoitMens[$i][2],stringlen($DatosAutoitMens[$i][2])-StringInStr($DatosAutoitMens[$i][2],"- ",1))

Next



_ArrayDisplay($DatosAutoitMens,"DatosAutoitMens")

Func BuscaCadena($datos,$cadini,$cadfin,$vez=1)

	; Busca la cadena <strong id="price">
	Local $datosleidos=$datos
	Local $cadenabuscada1=$cadini
	Local $cadenabuscada2=$cadfin

	local $poscadenainicio=StringInStr($DatosLeidos,$cadenabuscada1,0,$vez)
	local $poscadenafin=StringInStr($DatosLeidos,$cadenabuscada2,0,1,$poscadenainicio)

	Local $cadenaleida=stringmid($DatosLeidos,$poscadenainicio+stringlen($cadenabuscada1),$poscadenafin-stringlen($cadenabuscada1)-$poscadenainicio)

	Return EliminaRepetidos($cadenaleida,"	")

EndFunc

func EliminaRepetidos($cadena,$caracter)
	;	While StringInStr($cadena, $caracter&$caracter) ;mientras encuentre repetidos
	While StringInStr($cadena, $caracter) ;mientras encuentre
		ConsoleWrite("x")
		;$cadena= stringreplace($cadena, $caracter&$caracter, $caracter) ;reemplaza dos caracteres por un caracter
		$cadena= stringreplace($cadena, $caracter,"") ;reemplaza un caracter por nada
	WEnd

	;msgbox(0,"Aviso","*"& $cadena &"*")
	return $cadena
EndFunc

Re: Cotillea Autoit.es

Publicado: 29 Mar 2011, 22:30
por BasicOs
Gracias por el Aporte, :smt031 :smt031 :smt031 Muy bueno, como un RSS reader sencillo de ultimos posts :smt034 :smt034 :smt038
Lee desde $datosleidos que es el html de la página:

Código: Seleccionar todo

Local $cadini="<dl>"
Local $cadfin="</dl>"
Local $DatosAutoit=BuscaCadena($datosleidos,$cadini,$cadfin)
Salu22:)

Re: Cotillea Autoit.es

Publicado: 29 Mar 2011, 23:24
por Chefito
Está bien que investiges :smt023 . Así es como verdaderamente se aprende en muchos casos.

Muy bien el programa.

Te informo que existe ya hecha una función para encontrar una cadena string que se haya entre dos cadenas substring. Esta es _StringBetween.
También te recomiendo que te mires mejor los parámetros de la función stringreplace. Por defecto reemplaza todas las coincidencias que tenga en el texto pasado. No hace falta comprobarlas con un bucle. También puedes decirle cuantas veces quieres que reemplace. Esto se hace con el parámetro occurrence, que como he dicho antes por defecto está en 0 (sustituye todas las ocurrencias).

Saludos.

Re: Cotillea Autoit.es

Publicado: 30 Mar 2011, 09:27
por jamaro
Chefito: Efectivamente existe la función _StringBetween, que descubrí después de utilizar en otro programas el método artesano de formar las cadenas teniendo en cuenta su longitud, recortando por la izquierda, por la derecha,... y en este que expuse simplemente aproveché parte del código que tenía con anterioridad, pero tienes razón, se eliminan algunas líneas de código con esa función.

En cuanto a los parámetros de StringRegExpReplace también echaré un vistazo, porque es cierto que, aunque el bucle lo necesito para pasar los tres datos (mensaje, autor y fecha) a una matriz, se repite innecesariamente el proceso de "Buscacadena".

Depuraré el código con tus observaciones. Gracias.