Actualización de Adsl.au3

y programas personales para otros como tu, puede que te corrijan ;)
Responder
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Actualización de Adsl.au3

Mensaje por Jonny »

Hola

Gracias a la manita que me echó Chefito en este post:
http://www.emesn.com/autoitforum/viewto ... f=3&t=1543
He escrito una función para actualizar Adsl.au3.

Se trata de una función, que en principio devolvería el operador de un teléfono móvil dado, pero debido a que la página donde se hace la consulta devuelve más información sobre dicho número pensé que podía ser interesante contemplar toda esa información en la función, pues si puede no resultar de interés para nadie, resulta almenos curioso.

¿Para que puede servir ésta función?

Puede serle útil a aquellos, que como yo realicen alguna aplicación relacionada con telefonía móvil o en la que se requiera rellenar un formulario para crear la ficha de un usuario en la que se requiera el teléfono (móvil).
También puede resultar de interés para saber cuanto nos va a costar la llamada a un número de tele´fono móvil de ámbito español, pues con la portabilidad de hoy en día nunca sabemos a que compañía estamos llamando

Aquí pongo el código de la función, pero también adjunto la librería actualizada por si alguien quiere descargar la colección de funciones actualizada.

Código: Seleccionar todo

#Include <Array.au3>
#Include <File.au3>
#Include <Ie.au3>
#Include <String.au3>

#cs

;Nombre de la función:
;_AdslGetMobileOperator.

;Descripción:
;Muestra información sobre un número de teléfono móvil.

;Parámetro(s):
;$XNumber: (Número de móvil).
;Número de teléfono móvil del que se desea obtener la información.

;Valor(es) retornado(s):
;Si se obtuvo la información solicitada: @Error=0 (Devuelve un array con la información solicitada, dónde la posición 0 es el prefijo, 1 es la tecnología del servicio, 2 es el estado, 3 es la fecha de asignación, 4 es el operador y 5 es la marca comercial).
;Si no se obtuvo la información solicitada: @Error=1 (Devuelve descripción del error).

;Nota(s):
;-Funciona únicamente con teléfonos móviles de españa.
;-Debido a la conservación de numeración(portabilidad) esta información puede ser incorrecta.

;Autor(es):
;Jonathan López Mendoza.

#ce

Func _AdslGetMobileOperator($XNumber)
Local $Info[6]
If $XNumber=="" Then
SetError(1)
Return "Debe especificarse un número de teléfono móvil válido"
EndIf
$NumDiv=StringSplit($XNumber, "")
If (Not IsArray($NumDiv) Or $NumDiv[0]==0) Then
SetError(1)
Return "Debe especificarse un número de teléfono móvil válido"
EndIf
If ($NumDiv[0]<>9 Or $NumDiv[1]<>"6") Then
SetError(1)
Return $XNumber&" no es válido"
EndIf
$IeObj=_IECreate("http://www.gsmspain.com/prefijos/", 0, 0)
If @Error<>0 Then
SetError(1)
Return "Ocurrió un error al conectar con la base de datos"
EndIf
$IeForm=_IEFormGetCollection($IeObj, 1)
$InpNum=_IEGetObjByName($IeForm, "num")
_IeFormElementSetValue($InpNum, $XNumber)
_IEFormSubmit($IeForm)
_IeLoadWait($IeObj)
$Result=_IeBodyReadText($IeObj)
_IeQuit($IeObj)
If stringInStr($Result, "No se puede mostrar la página")<>0 Then
SetError(1)
Return "La base de datos no está disponible en éste momento"
EndIf
$Result=StringReplace($Result, @CRLF&@CRLF&@CRLF, @CRLF)
$Result=StringReplace($Result, @CRLF&@CRLF, @CRLF)
If StringInStr($Result, "Prefijo:")==0 Then
SetError(1)
If StringInStr($Result, "El numero "&$XNumber&" no es de ningun operador español o es de nueva adjudicación")<>0 Then
Return "El número "&$XNumber&" no es de ningún operador móvil español o es de nueva adjudicación"
Else
SetError(1)
Return "Error al consultar "&$XNumber
EndIf
EndIf
$Result=StringReplace($Result, "Prefijo:"&@CRLF, "Prefijo: ")
$Result=StringReplace($Result, "Tecnología servicio:"&@CRLF, "Tecnología servicio: ")
$Result=StringReplace($Result, "Estado:"&@CRLF, "Estado: ")
$Result=StringReplace($Result, "Fecha asignación:"&@CRLF, "Fecha asignación: ")
$Result=StringReplace($Result, "Operador:"&@CRLF, "Operador: ")
$Result=StringReplace($Result, "Marca comercial:"&@CRLF, "Marca comercial: ")
$ResultDiv=StringSplit($Result, @CRLF)
If (Not IsArray($ResultDiv) Or $ResultDiv[0]==0) Then
SetError(1)
Return "Error al consultar "&$XNumber
EndIf
For $I=1 To $ResultDiv[0] Step +1
If ($ResultDiv[$I]==@CRLF Or $ResultDiv[$I]=="" Or $ResultDiv[$I]==" " Or $ResultDiv[$I]==@Tab) Then ContinueLoop
Select
Case StringInStr($ResultDiv[$I], "Prefijo: ")<>0
$Info[0]=StringReplace($ResultDiv[$I], "Prefijo: ", "")
Case StringInStr($ResultDiv[$I], "Tecnología servicio: ")<>0
$Info[1]=StringReplace($ResultDiv[$I], "Tecnología servicio: ", "")
Case StringInStr($ResultDiv[$I], "Estado: ")<>0
$Info[2]=StringReplace($ResultDiv[$I], "Estado: ", "")
Case StringInStr($ResultDiv[$I], "Fecha asignación: ")<>0
$Info[3]=StringReplace($ResultDiv[$I], "Fecha asignación: ", "")
Case StringInStr($ResultDiv[$I], "Operador: ")<>0
$Info[4]=StringReplace($ResultDiv[$I], "Operador: ", "")
Case StringInStr($ResultDiv[$I], "Marca comercial: ")<>0
$Info[5]=StringReplace($ResultDiv[$I], "Marca comercial: ", "")
EndSelect
Next
SetError(0)
Return $Info
EndFunc

;aquí un ejemplo de uso:

$Operator=_AdslGetMobileOperator("aqui_el_numero_a_consultar")
For $I=0 To 5 Step +1
MsgBox(0, "", $Operator[$I])
Next
El único inconveniente que para mí tiene esta función, es la limitación que impone la propia página donde se realiza la consulta, que consiste en que únicamente pueden consultarse números del territorio español. Pero esque, no encontré ninguna página donde pudiera consultar números de cualquier país, excepto una que hayé tras mucho googlear, pero que imponía otra limitación, que consiste en no poder realizar más de 4 o 5 consultas al día.

Si alguien conoce alguna página donde pueda realizarse este tipo de consultas y que no imponga limitaciones de este tipo que la postee y modificaré la función.
De igual forma si alguien encuentra algún fallo en la función (pese a que he implementado el máximo de control de errores que se me ha ocurrido) que lo diga y corregiré la función.

Espero que os guste.

Que la disfruteis!

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Actualización de Adsl.au3

Mensaje por Jonny »

Hola

Disculpad, no adjunté bien la librería en el post anterior:
aquí va.

Salu2!
Adjuntos
Adsl.rar
(15.29 KiB) Descargado 248 veces
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: Actualización de Adsl.au3

Mensaje por Chefito »

Esta chula la función. Te estás volviendo un experto en programación :smt024 .
Lo que me extraña es que saques los datos desde la página y no intentes acceder a ellos directamente (post) :smt002 .

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 ;).
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Actualización de Adsl.au3

Mensaje por Jonny »

Hola

Muchas gracias, es el fruto de gustarme tanto este mundillo jeje. Pero, el mérito es para tí también, que mayormmente has solucionado muchas de las líneas que hay en esa librería xd

calla, calla...
veo que me vas conociendo!
je je je
pero es imposible, prácticamente.

He estado todo el día intentándolo, con el código de la función _AdslGetIpLocation() que lo hace precisamente así, pero la página que utilizo en ésta función es muy diferente.
así como la variable en la que hay que poner el número de teléfono a consultar ("telefono") creo que era tiene un nombre muy intuitivo (no es así en todas las páginas) parece que han pensado mucho en que alguien pudiera hacer algo así...

en la web
http://www.gsmspain.com/prefijos/
hay un apartado, para los webmasters que quieran incluir el servicio en su página.
pero te hacen incluir un baner en la web con el campo para poner el número y el botón (con su imágen etc).
Según leí en las instrucciones de implementación tienes que hacer como si hicieras una consulta y se abre una página que dice que no estás autorizado para acceder a la página y te da un código (la web desde la que llamas a la página) para que lo insertes en no se que formulario y te den de alta como referer (digo no se qe formulario porque por más que he rebuscado y probado no he dado con él jejejej)
osea:
que para hacerlo enviando con funciones de sockets el número mediante post hay que estar dado de alta como referer en ese servidor.

Ahora bien. Si sabeis como indicar el referer mediante post (si esque se puede) decídmelo y lo modifico, me gusta mucho más que llamando a la página con las funciones de ie.au3.

Yo imagino que será con algo como:

Referer=http://www.web.com
pero ni idea...
¿puede hacerse?
De ser posible, habría que engañar al servidor, diciéndole que provenimos de http://www.gsmspain.com/prefijos/
para evitar eso de darse de alta ... etc
porqe creo, que aunqe nos diéramos de alta como es debido no nos autorizaría el servidor el uso del servicio, al tratarse de una aplicación diferente a la página web desde la que hemos realizado el alta como referer.

Me alegro que te haya gustado la función, seguiré pensando algunas más para incluir a la librería, aunque se me agotan las ideas! jejejeje.

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Actualización de Adsl.au3

Mensaje por Jonny »

Hola

He hecho una actualización más a la librería "Adsl.au3".
En esta ocasión, no se trata de nuevas funciones, sinó de mejoras en (de momento) una de ellas.

He reescrito la función _AdslGetIpLocation() para que sea compatible con aplicaciones basadas en la multi-tarea, o que la simulen.

¿Porqué?

Como sabreis, me encanta hacer aplicaciones multihilo (ha tenido que notarse por aquí xd) creo, que eso hace más ágiles y eficientes los programas (cuestiones de gustos). Ocurría, que con esta función aunque la aplicación donde la usara estubiera basada en hilos o timers qe los emularan, el programa se quedaba bloqueado el tiempo que tardara en ejecutarse _AdslGetIpLocation(), que se demoraba más en el punto en que debía recoger la información que devuelve el servidor donde se conecta para consultar la hubicación de una dirección ip, por la sencilla razón, que lo hacía mediante un while...

En mi opinión, esto no quedaba bien, pues las aplicaciones como dije quedaban suspendidas hasta el punto de no poder cerrarse siquiera...

Con las modificaciones que hice en el código conseguí que la recogida de la hubicación o cualquier error por parte del servidor se realice de forma independiente al transcurso del programa, lo que vendría a ser un thread (Hilo) en este caso simulado por un timer.
Así, si la función se demora 4 segundos por ejemplo, no se verá afectado el resto del programa en ese tiempo, pudiéndose interactuar perfectamente con él.

Además, aproveché para incluir un nuevo parámetro a la función, que nos permite si queremos, fijar el tiempo máximo de espera por la respuesta del servidor, pudiéndo así evitar bucles o temporizadores que se ejecuten excesivamente.

La forma de implementar la función cambia un poco (fuerzas mayores) pero lo teneis todo bien explicado en la documentación de la función que por cierto, dió trabajo solo pensar como hacerla la condená.... Pero al final salió como esperaba.

Si alguien utiliza la librería y concretamente ésta función le va a tocar cambiar la forma de implementarla en sus aplicaciones pero no es especialmente difícil. debe emplearse un algoritmo similar al que se necesitaba en la antigua versión de la función para recoger correctamente el resultado.
En la documentación de la función hay ejemplos de implementación con éstos algoritmos, aunque hay alguna forma más de implementarla.

En principio actualicé ésta función pero mi idea es actualizar todas aquellas que se conecten a servidores externos o puedan relentizar las aplicaciones que las invoquen.

Espero que os guste la nueva función.

Salu2!
Adjuntos
Adsl.rar
(16.78 KiB) Descargado 224 veces
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Actualización de Adsl.au3

Mensaje por Jonny »

Hola

Aquí teneis otra actualización, para quien le interese, de Adsl.au3.

No implementé la simulación multihilo en todas las funciones que lo requieren, sólo en una más que en la última versión que subí (creo) (Poco a poco lo hiré haciendo).

Actualmente está implementado en _AdslGetIpLocation y en _AdslGetIsp, además de en las dos nuevas funciones que he añadido.

Se trata de una nueva sección de la librería: "Configuración de red", en la que hay (por el momento) dos funciones:
-AdslSetSpeedAcelerator()
-AdslDeleteSpeedAcelerator()

La primera, se encarga de aumentar la velocidad de la conexión a internet mediante un método que afirman funcionar en barias páginas.

La segunda función se encarga de eliminar los cambios realizados para aumentar la velocidad de internet, por lo que podríamos decir, que restaura ésta configuración.

En el apartado de "Funciones internas", hay una función nueva, que está relacionada con estas dos funciones, cuyo cometido es cancelar el reinicio del pc, si se requiere por algún motivo (se recomienda un reinicio tras la ejecución de estas funciones) ya que se modifican valores del regedit.

Todo esto, podeis verlo mejor explicado en la documentación de las funciones _AdslSetSpeedacelerator() y _AdslDeletespeedAcelerator).

Por último, otro cambio que hice en la librería, está relacionado con la simulación multihilo que estoy implementando en ella. Ahora, las funciones que la poseen (y las que lo hagan en un futuro) son independientes de la ejecución del programa que las ejecute, puesto que no deben asociarse al identificador de la ventana actual del programa como ocurría en la versión que subí hace algunos días, sinó que las funciones utilizan el sistema de timers interno de la librería, que no requiere de handles de ventana.
Esto hace que la ejecución de las funciones que simulen el multihilo esté garantizada, no siendo así con el uso de la librería "Timers.au3", ya que si el programa que ejecutaba las funciones cambiaba de ventana los timers dejaban de funcionar.

Así pues, el parámetro $XHandleWindow de las funciones ha sido eliminado. Lo vereis también en la documentación.
Ya a nivel de código, he renombrado algunas variables y funciones (internas) para seguir la línea de código que llevaba hasta ahora la librería. Estos cambios son mínimos y seguramente no afecten a los que usen la librería.

Por el momento es todo.

¡Que la disfruteis!

Salu2!
Adjuntos
Adsl.rar
(18.27 KiB) Descargado 285 veces
Responder