Hacer POST a una URL con los /onlines

#1
Hola! Como algunos sabran, hace rato vengo con el proyecto de https://argentumland.github.io/, el cual recopila los onlines de los servidores que los tienen colgados en sus webs.

El problema es que parsear el HTML muchas veces no resulta bien
  • A veces la pagina esta caida
  • A veces el layout cambia, y hasta que no cambie el regex no funciona
  • Muchas veces tardan en aparecer
  • CloudFlare no me deja acceder a la pagina de forma copada
  • Algunos AO ni siquiera tienen pagina ni saben como publicar los /online
La solucion a todo esto es que en vez de yo obtener la info, que los servers me la manden con un POST.

El problema es que hace como 10 años no toco VB6 y ni siquiera tengo Windows como para usarlo. Entonces queria preguntar si alguien se copa en darme una mano para armar un mini tutorial para los servidores que quieran mostrar sus online.
  • Necesito una funcion en VB6 que mande un HTTP POST a una URL, que en el body tenga la cantidad de /onlines.
  • De ser posible, que el POST tenga un timeout bajo, por las dudas que el servidor este caido (no quisiera bloquear servidores por eso).
  • Una explicacion breve sobre como y donde meter ese codigo
Gracias!
 

CHOTS

Director LapsusAO
#2
Lo tengo hecho con un GET yo,

Código:
Sub ActualizarWebUsuarios(Optional ByVal number As Integer = -1)
On Error GoTo chotserror
Dim baseUrl As String
baseUrl = "http://www.twistao.com/update.php?&param="
Dim enviar As String

enviar = NumUsers & "," & recordusuarios

frmMain.InetUsers.Execute baseUrl & enviar, "GET"
Exit Sub
chotserror:
    Call LogError("Error en ActualizarWebUsuarios " & Err.number & " " & Err.Description)
End Sub
Tengo creado un Inet en el frmMain llamado InteUsers y un timer con un intervalo de 60 segundos que ejecuta esa funcion.
Si necesitas mas info avisa
 

Abhuga2

Newbie Lvl 1
#3
El problema es que parsear el HTML muchas veces no resulta bien
  • A veces la pagina esta caida
  • A veces el layout cambia, y hasta que no cambie el regex no funciona
  • Muchas veces tardan en aparecer
  • CloudFlare no me deja acceder a la pagina de forma copada
  • Algunos AO ni siquiera tienen pagina ni saben como publicar los /online
esto no tiene mucho sentido

tu proyecto entra en categoria web crawler, y todos los problemas que listaste exceptuando el ultimo es responsabilidad tuya resolverlos

te imaginas que google en lugar de indexar paginas con su sistema le pida a los webmasters que hagan un post con las keywords relevantes? total el layout seguramente vaya a cambiar con todas las webs que hay en el mundo, muchas de ellas no tengan un uptime perfecto y asi es mas facil

me gusta este proyecto y lo apoyo, pero esto lo tenes que resolver vos.

si la pagina esta caida, hace un retry a los 5, 10 y 20 minutos. si todavía no podes conectarte considera que los usuarios son 0 en ese momento (server caido). si algun server quiere evitar esa penalización que se preocupe por tener buen uptime en su web.

regex no es la herramienta indicada para parsear html. html no es un lenguaje regular. usa un parser xml para este tipo de cosas. (tambien mira https://es.wikipedia.org/wiki/XPath)

problema 3 y 4 no son muy claros :c
 
Última edición:
#4
esto no tiene mucho sentido

tu proyecto entra en categoria web crawler, y todos los problemas que listaste exceptuando el ultimo es responsabilidad tuya resolverlos
Es justamente dejar de hacer crawling, por los problemas mencionados.

te imaginas que google en lugar de indexar paginas con su sistema le pida a los webmasters que hagan un post con las keywords relevantes? total el layout seguramente vaya a cambiar con todas las webs que hay en el mundo, muchas de ellas no tengan un uptime perfecto y asi es mas facil
Emmm, por mucho tiempo existio el meta keywords, que Google usaba para indexar (https://developer.mozilla.org/en-US/docs/Web/HTML/Element/meta). Facebook tiene OpenGraph (https://developers.facebook.com/docs/sharing/webmasters/#markup). Y ademas, para darte de alta en Google Webmasters, tenes que subir un archivo al host. Eso, ademas de que por ejemplo para Google Analytics (que es basicamente lo que quiero hacer, un sistema de analiticas), tenes que inyectar un snippet en tu sitio.

Google dejo de usar las keywords porque los sitios mandaban fruta, que es tranquilamente lo que puede pasar si mandan un POST con sus onlines, pueden mandar fruta. Pero hoy en dia hay otros sitios que tambien estan poniendo fruta en sus sitios.

me gusta este proyecto y lo apoyo, pero esto lo tenes que resolver vos.

si la pagina esta caida, hace un retry a los 5, 10 y 20 minutos. si todavía no podes conectarte considera que los usuarios son 0 en ese momento (server caido). si algun server quiere evitar esa penalización que se preocupe por tener buen uptime en su web.
No hace falta hacer un retry. Cada x minutos se intenta buscar informacion, y si no esta, se marca como error (que en la UI se traslada como 0 usuarios).

No quiero obligar a los servers a tener un sitio para poder acceder a las estadisticas, y mucho menos requerirles que tengan un buen uptime. Los servers de AO deberian preocuparse de tener un buen server de AO, la pagina es algo secundario.

Lo que SI puedo hacer es, si un server quiere tener informacion sobre sus usuarios, hacer que pongan un modulo en su server (que era la idea de este post). Inclusive asi, podria mandar mas info como por ejemplo los charfiles, y armar un ranking automaticamente.

regex no es la herramienta indicada para parsear html. html no es un lenguaje regular. usa un parser xml para este tipo de cosas. (tambien mira https://es.wikipedia.org/wiki/XPath)
Incorrecto. Justamente HTML no es un lenguaje regular, y un parser XML no va a funcionar (https://stackoverflow.com/a/32573619). Un regex en este caso simple, no tiene problemas. Por mas que use un parser HTML, si el layout cambia, hay que cambiar a que elemento se accede.

problema 3 y 4 no son muy claros :c
3. La forma que tienen de actualizar los online los servers, hace que tarde en aparecer en sus paginas.
4. CloudFlare es la proteccion que usan algunos sitios (como GS-Zone o Tierras del Sur), que impide poder acceder a scapear el sitio desde ciertas IPs. Es imposible poder sacar la info desde un servidor (a menos que lo quiera hacer desde mi router personal, que por obvias razones no voy a hacer).
 

Abhuga2

Newbie Lvl 1
#5
el fin de las meta keywords lo anuncio matt cutts hace mas de 10 años y de todas formas no es la misma comparacion para nada.

lo que hace google webmaster tools / analytics / (pagina random) tampoco tiene relevancia alguna con tu problema. es un simple metodo de validacion de ownership de un dominio/web como lo puede ser un dns record, un meta tag y demas. la mayoría de las paginas que requieren esta validacion usan alguno o una combinacion de esos.

lo que vos propones es que el cliente le pegue a tu servidor dandote la información cuando debería ser al revez. tu trabajo como indice es justamente indexar la información resolviendo ese problema que en este caso es la falta de un indice de ao's con contador. ningun ao tiene la obligacion de darte ni a vos ni a ningun indice esta informacion. i mean, why??

que pasa si mañana yo decido armar mi propio indice y hacerte la competencia?. ok supongamos que mi indice es mejor al tuyo y los ao's dicen meh, para que vamos a usar el indice de jormot si el de abuga es mejor. ya fue, le pegamos al server de abhuga ahora. vos quedaste fuera del negocio, nadie le pega a tus servers, ya no tenes la pagina actualizada y encima hay una mejor. si diseñas las cosas bien como dios manda esto no es un problema, mejoras tu producto, superas al mio y fin de la historia, porque la informacion la recopilas vos (como sea que lo hagas, no importa, resolviste un problema y estas agregando valor).

que pasa si mañana hay 5 indices mas, cada ao debería que pegarle a los 5? o incluso peor, que pasa si mañana hay un indice que no requiere hacer un post como vos sugerís, y lo consume automáticamente? es mejor al tuyo? claro que lo es. para que pegarle al server de jormot y si el otro es automatico? ventaja competitiva se llama esto

logicamente entiendo que no lo haces con fines de lucrar más bien de buena onda, eso esta a la vista, y reconozco que me gusta tu iniciativa, pero la idea es discutir un buen diseño

volviendo al tema ao, cualquier ao que valga la pena listarse en 2018 necesita si o si una pagina donde publicitarse o minimamente una landing que te permita hacer una descarga del cliente. otra cosa contraria a esta es inaceptable en 2018

tema parsers, es logico que un parser xml se queda corto porque html es un superset de xml, pero mas exito que con regex vas a tener seguro. dependiendo el lenguaje que estes usando hay parsers html que cumplen la tarea incluso parseando html malformado sin problemas. parsear html con regex es inaceptable cuando hay mejores opciones.

el failover es fundamental, puede que falle algo en el primer request y es importante volver a intentarlo algunas veces mas antes de considerarlo un fallo (0 usuarios) en ese tiempo. como vos decis no podes exigirles un gran uptime a los muchachitos porque no son google, pero bueno, tenes que resolver este tema vos tambien de la mejor forma que encuentres

el punto 3 no es algo que vos puedas resolver, si ellos actualizan tarde lamentablemente la informacion no estaría actualizada

la limitacion del punto 4, no estoy seguro si es por un tema de ip, o por un tema de challenges en js para determinar si sos un navegador real o no.

tema ip, si la tenes blacklisteada lamentablemente vas a tener que conseguir una nueva. te diría usar proxies rotativos (y hasta residenciales para mejor exito) pero no tiene mucho sentido para el nivel de scraping que vas a hacer.

si es el challenge, podes resolverlo con Selenium y algun headless browser como PhantomJs o todavía mas fácil, usando https://github.com/Anorov/cloudflare-scrape o algo similar.

suerte, yo se que podes hacerlo mejor :D
 

Wolftein

Computer's Scientist
Miembro del equipo
Administrador
Especialista de Tecnología
#6
Código:
Set XmlHTTP = CreateObject("Microsoft.XmlHttp")
XmlHTTP.open "POST", "http://....", False
XmlHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
XmlHTTP.setRequestHeader "User-Agent", "Wolfy Browser"
XmlHTTP.send "online=100"
MsgBox XmlHTTP.responseText
 
Arriba