elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Píldoras formativas en seguridad de la información


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Desglosar un string en partes.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Desglosar un string en partes.  (Leído 808 veces)
**Aincrad**


Desconectado Desconectado

Mensajes: 501



Ver Perfil
Re: Desglosar un string en partes.
« Respuesta #10 en: 27 Diciembre 2018, 02:30 »

Ptamadre si es verdad xd, ya la Solucionado gracias.



« Última modificación: 27 Diciembre 2018, 02:34 por **Aincrad** » En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.730



Ver Perfil
Re: Desglosar un string en partes.
« Respuesta #11 en: 27 Diciembre 2018, 06:03 »

Te respondo por aquí al privado...

en esta parte de tu código obtienes una respuesta con un documento en JSON:

Código
  1. Dim URLDATA As String = cliente.DownloadString(url)
  2. TextBox2.Text = URLDATA

Mediante el ejemplo que te mostré, deserializas ese JSON, tal que así:

Cita de: Elektro
Código
  1.    <Serializable>
  2.    Public NotInheritable Class MyType
  3.        Public Property [Error] As Boolean
  4.        Public Property Title As String
  5.        Public Property Duration As Integer
  6.        Public Property File As String
  7.  
  8.        Public Sub New()
  9.        End Sub
  10.  
  11.        Public Overrides Function ToString() As String
  12.            Return New JavaScriptSerializer().Serialize(Me).ToString
  13.        End Function
  14.    End Class

Código
  1. Dim obj As MyType = New JavaScriptSerializer().Deserialize(Of MyType)(URLDATA)

Y por último, en la propiedad MyType.File tienes la url al archivo .mp3 que puedes descargar, por ejemplo usando la función cliente.DownloadFile().

Código
  1. cliente.DownloadFile(obj.File, IO.Path.GetFileName(obj.File))



No tiene que ver con el tema, pero ya que estás abierto a escuchar críticas, pues acabo de fijarme en esta parte del código donde usas esta expresión regular...

Citar
Código
  1.    Private Function getID(ByVal url As String) As String 'Function by Stack Overflow Forum.
  2.        Try
  3.  
  4.            Dim myMatches As System.Text.RegularExpressions.Match
  5.            Dim MyRegEx As New System.Text.RegularExpressions.Regex("youtu(?:\.be|be\.com )/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)", RegexOptions.IgnoreCase) 'This is where the magic happens/SHOULD work on all normal youtube links including youtu.be
  6.            myMatches = MyRegEx.Match(url)
  7.            If myMatches.Success = True Then
  8.                Return myMatches.Groups(1).Value
  9.            Else
  10.                Return ""
  11.            End If
  12.        Catch ex As Exception
  13.            Return ex.ToString
  14.        End Try
  15.    End Function
  16.  

y... bueno. Me limitaré a decir que copiar cosas publicadas por programadores random de Internet con conocimientos mediocres sobre el lenguaje que están manipulando, conlleva a aprender y acostumbrarse a malas prácticas de programación.

En no pocas ocasiones, el uso de expresiones regulares es un planteamiento totálmente innecesario y con un margen de error (falsos positivos y fallos de captura) que puede llegar a ser excesivamente elevado, y por ende, intolerablemente ineficiente. Aparte, si ya de por sí el motor RegEx de .NET (y de cualquier otro) supone un impacto negativo en el rendimiento de la aplicación, las expresiones regulares complejas son sinónimo de un impacto negativo aun mayor.

(en tu aplicación el impacto será inapreciable, insignificante. No es algo de lo que debas preocuparte, pero yo siempre hablo en términos generales.)

RegEx es el recurso fácil y multi-usos. En muchas ocasiones es tan fácil de aplicar una expresión regular que nos olvidamos de que podemos hacer las cosas de forma más eficiente... aunque no será posible hacerlo mejor en todos los casos, pero en muchos sí, cómo este.

A continuación te mostraré como puedes y deberías obtener la id de un video de Youtube usando los miembros built-in más apropiados disponibles en la librería de clases de .NET Framework sin tener que recurrir al uso de expresiones regulares.

Bueno, primero estas funciones reutilizables que he escrito:

Código
  1. Public Shared Function GetQuery(ByVal url As String) As NameValueCollection
  2.    Return GetQuery(url, Encoding.UTF8)
  3. End Function
  4.  
  5. Public Shared Function GetQuery(ByVal url As String, ByVal enc As Encoding) As NameValueCollection
  6.    Return GetQuery(New Uri(url), enc)
  7. End Function
  8.  
  9. Public Shared Function GetQuery(ByVal uri As Uri) As NameValueCollection
  10.    Return GetQuery(uri, Encoding.UTF8)
  11. End Function
  12.  
  13. Public Shared Function GetQuery(ByVal uri As Uri, ByVal enc As Encoding) As NameValueCollection
  14.    Dim queryString As String = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped)
  15.    Return HttpUtility.ParseQueryString(queryString, enc)
  16. End Function

Y entonces...
Código
  1. Dim query As NameValueCollection = GetQuery("https://www.youtube.com/watch?v=FtcVlSytJF4&feature=em-uploademail")
  2. Dim id As String = query("v")
  3. If String.IsNullOrEmpty(id) Then
  4.    Throw New NullReferenceException()
  5. Else
  6.    ' ...
  7. End If

PD: cabría destacar que, Microsoft, para algunas implementaciones internas hace uso de la clase RegEx, pero usar cualquier miembro de la librería de clases de .NET Framework cuya implementación interna recurra al uso de expresiones regulares, siempre será mejor opción y más seguro que implementar tu propio algoritmo 'home-made' de análisis de string mediante expresiones regulares aleatorias cuya eficacia en no pocas ocasiones es más que cuestionable de lo ofusca que es su sintaxis o los ejemplos de captura (si es que el autor proporciona alguno)...

Saludos.


« Última modificación: 27 Diciembre 2018, 20:21 por Eleкtro (sin pilas) » En línea


**Aincrad**


Desconectado Desconectado

Mensajes: 501



Ver Perfil
Re: Desglosar un string en partes.
« Respuesta #12 en: 28 Diciembre 2018, 02:53 »

Gracias por responder , ya termine la app, pero se blockea un poco al principio cuando esta obteniendo los datos. me puedes ayudar con eso?

otra cosilla >

Código:
'HttpUtility' no está declarado. Puede que esté inaccesible debido a su nivel de protección.

debo importar algo?
En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.730



Ver Perfil
Re: Desglosar un string en partes.
« Respuesta #13 en: 28 Diciembre 2018, 03:35 »

Código:
'HttpUtility' no está declarado. Puede que esté inaccesible debido a su nivel de protección.
debo importar algo?

Sí, debes añadir una referencia el ensamblado System.Web.dll, e importar el espacio de nombres System.Web.

Si colocas el puntero del ratón sobre el nombre "HttpUtility" en esa linea de código que te da error, Visual Studio te dice el ensamblado que debes referenciar. Al menos en Visual Studio 2013, 2015 y 2017; no recuerdo si en VS 2010 también.



se blockea un poco al principio cuando esta obteniendo los datos. me puedes ayudar con eso?

WebClient.DownloadString y WebClient.DownloadFile son métodos sincrónicos, o lo que se conoce como una llamada bloqueante. Debido a que estás llamando a ese método en el thread de la UI, la UI se "bloquea" hasta que el método haya finalizado su ejecución (conectar con el servidor, procesar la query, esperar la respuesta del servidor, etc...) y eso dura un par de segundos... en los que la UI deja de procesar mensajes de ventana.

Para solucionarlo, debes hacer uso de programación asíncrona, y para ello practicamente debes modificar casi todo tu algoritmo. Para empezar, debes usar los métodos asíncronos de la clase WebClient. Puedes recurrir a dos metodologías distintas:

1. Usar los métodos WebClient.DownloadStringAsync() y WebClient.DownloadFileAsync, y suscribirte a los eventos WebClient.DownloadStringCompleted y WebClient.DownloadFileCompleted.

2. Usar las funciones WebClient.DownloadStringTaskAsync() y WebClient.DownloadFileTaskAsync, junto al uso de los operadores Async y Await.

La segunda metodología es más simple/sencilla de aplicar, requiere menos cambios en el código original. Lamentablemente en .NET 4.0 no puedes aplicar dicha metodología, puesto que las funciones mencionadas no están disponibles. Así que estás limitado a tener que recurrir a la primera metodología.

Aquí tienes la documentación oficial del método WebClient.DownloadStringAsync():

Y aquí un ejemplo de código:

PD: el modo de empleo del método WebClient.DownloadFileAsync es practicamente igual que en el ejemplo provisto, solo cambia el nombre del evento al que debes suscribirte, el cual ya mencioné.

Un saludo.



EDITO: bueno, por si al final te resulta dificil el uso de WebClient.DownloadStringAsync(), y cómo alternativa, la opción más sencilla y cutre para resolver el problema con el mínimo de cambios requeridos en tu código actual, sería de la siguiente forma:

Código
  1. Private Sub descarga(ByVal url As String)
  2.  
  3.    Dim isCompleted As Boolean
  4.  
  5.    Dim t As New Task(
  6.        Sub()
  7.            Try
  8.                Dim URLDATA As String = cliente.DownloadString(url)
  9.                Me.Invoke(Sub()
  10.                              TextBox2.Text = URLDATA
  11.                              If TextBox2.Text = "" Then
  12.                                  alert("error", "No response was obtained from the server.")
  13.                              Else
  14.                                  alert("alert", "Data Obtained, Descripting ...")
  15.                              End If
  16.                          End Sub)
  17.            Catch ex As Exception
  18.                Me.Invoke(Sub() alert("error", ex.Message))
  19.  
  20.            Finally
  21.                isCompleted = True
  22.            End Try
  23.        End Sub)
  24.  
  25.    t.Start()
  26.  
  27.    Do Until isCompleted
  28.        Application.DoEvents()
  29.    Loop
  30.  
  31. End Sub

...pero el uso de ese código implica malas prácticas de programación, tenlo en cuenta.
« Última modificación: 28 Diciembre 2018, 03:49 por Eleкtro (sin pilas) » En línea


**Aincrad**


Desconectado Desconectado

Mensajes: 501



Ver Perfil
Re: Desglosar un string en partes.
« Respuesta #14 en: 1 Enero 2019, 17:12 »

Gracias una vez mas!! ya no se congela. te lo envie para que me digas que tal quedo.

ahora buscare una api para descargar en mp4 y 3gp y la agregare al proyecto.
En línea


Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.730



Ver Perfil
Re: Desglosar un string en partes.
« Respuesta #15 en: 1 Enero 2019, 17:40 »

ahora buscare una api para descargar en mp4 y 3gp y la agregare al proyecto.

Hace unos años probé 'libvideo' y me funcionó de maravilla...


Saludos
En línea


Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines