Cotillea Autoit.es

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Cotillea Autoit.es

Mensaje 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
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2086
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Cotillea Autoit.es

Mensaje 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:)
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Cotillea Autoit.es

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: Cotillea Autoit.es

Mensaje 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.
Responder