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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  enviar datos con WebRequest
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: enviar datos con WebRequest  (Leído 9,390 veces)
s_azazel

Desconectado Desconectado

Mensajes: 98



Ver Perfil
enviar datos con WebRequest
« en: 9 Marzo 2014, 15:21 pm »

Buenas tardes!!! estoy intentando automatizar un registro. tengo algo en phyton pero me gustaria pasarlo a vb.net porque me siento mas comodo

en phyton pido info de una url enviandole unos datos:

Citar
a=requests.get(url) data={'idDepartamento':'1','idServicio':'1','idTramite':'22','idAsunto':'42'}

e=requests.post(url,data=data)

Y en vb.net tengo algo asi:

Citar
Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create("URL")
     
       
        request.CookieContainer = New CookieContainer()
        Dim response As System.Net.HttpWebResponse = request.GetResponse()

El codigo de la pagina me lo devuelve perfectamente pero no encuento la forma de enviar con el request los datos ({'idDepartamento':'1','idServicio':'1','idTramite':'22','idAsunto':'42'})
Que envio con phyton


Gracias!!!



En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #1 en: 9 Marzo 2014, 22:53 pm »

Buenas s_azazel,

por lo que veo quieres enviar una ristra de parámetros por POST a un apartado de registro específico en un servidor web.

En Python parece bastante intuitivo, en .NET también lo es, sin necesidad de tener que lidiar con APIs molestas, ya que el Framework (conjunto de clases, librerias etc) nos aporta un nivel aceptable de abstración.

Si tienes FireFox con la extensión de FireBug podrás analizar las cabeceras de los paquetes que envias en todo momento, pudiendo analizar el paquete que envias a dicho apartado de registro. Ahí lo dejo caer...

Te dejo un ejemplo de como enviar datos por POST, puede que haya algo mal ya que lo he escrito del tirón:

Código
  1. Dim request As HttpWebRequest = CType(HttpWebRequest.Create(URL), HttpWebRequest)
  2. With request
  3. 'El UserAgent es el que utiliza mi navegador, pon aqui uno cualquiera
  4. .UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:22.0) Gecko/20130315 Firefox/22.0"
  5. .Proxy = Nothing
  6. .Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
  7. .Method = "POST"
  8. .ContentType = "application/x-www-form-urlencoded"
  9. .ContentLength = Data.Length 'Donde data son los datos que quieres enviar IdDepartamento, IdServicio...
  10. End With
  11. 'Llegados a este punto ya hemos configurado las cabeceras del paquete Http que vamos a enviar por POST
  12. 'Ahora solo falta escribir esos datos en el paquete que queremos enviar
  13. Using requestStream As Stream = req.GetRequestStream()
  14.  requestStream.Write(data, 0, data.Length)
  15.  requestStream.Close()
  16. End Using
  17. 'Hemos terminado de escribir los datos en el paquete, ahora solo falta enviarlo y recibir la respuesta
  18. Dim response As HttpWebResponse = req.GetResponse()
  19. '...... y aquí lo que necesites

Un saludo!


En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.878



Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #2 en: 10 Marzo 2014, 00:51 am »

Kubox, tengo la sensación de que el código lo escribiste al vuelo (porque no tiene indentación), te equivocaste al escribir un par de cosas, el nombre del objeto que usas es 'request', pero luego lo escribes como 'req', también el Stream espera un array de bytes pero le estás pasando un String a secas (Data) :P, pero vamos, creo que se entiende perféctamente lo que quisiste explicar, son cosas sin importancia pero... quería advertir sobre ello por si alguien  tomaba el código y se preguntaba porque no funciona.

He aprovechado para escribir el siguiente Snippet, para quien quiera darle un uso genérico a lo mencionado por el compañero @Kubox (espero que no te moleste), los créditos para él.

Código
  1.    ''' <summary>
  2.    ''' Sends a POST method petition and returns the server response.
  3.    ''' </summary>
  4.    ''' <param name="URL">Indicates the URL.</param>
  5.    ''' <param name="PostData">Indicates the post data.</param>
  6.    ''' <returns>The response.</returns>
  7.    Public Function SendPOST(ByVal URL As String,
  8.                             ByVal PostData As Dictionary(Of String, String)) As String
  9.  
  10.        Dim Data As New System.Text.StringBuilder ' PostData to send, formated.
  11.        Dim Request As Net.HttpWebRequest = HttpWebRequest.Create(URL) ' HTTP Request.
  12.        Dim Response As HttpWebResponse ' Server response.
  13.        Dim ResponseContent As String ' Server response result.
  14.  
  15.        ' Set and format the post data of the query.
  16.        For Each Item As KeyValuePair(Of String, String) In PostData
  17.            Data.AppendFormat("{0}={1}&", Item.Key, Item.Value)
  18.        Next Item
  19.  
  20.        ' Set the Request properties.
  21.        With Request
  22.            .Method = "POST"
  23.            .ContentType = "application/x-www-form-urlencoded"
  24.            .ContentLength = Data.ToString.Length
  25.            .Proxy = Nothing
  26.            ' .UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0"
  27.        End With
  28.  
  29.        ' Write the POST data bytes into the Stream.
  30.        Using RequestStream As IO.Stream = Request.GetRequestStream()
  31.            RequestStream.Write(System.Text.Encoding.UTF8.GetBytes(Data.ToString), 0, Data.ToString.Length)
  32.        End Using
  33.  
  34.        ' Get the response.
  35.        Response = Request.GetResponse()
  36.  
  37.        ' Get the response content.
  38.        Using Reader As New System.IO.StreamReader(Request.GetResponse().GetResponseStream)
  39.            ResponseContent = Reader.ReadToEnd
  40.            Response.Close()
  41.        End Using
  42.  
  43.        ' Return the response content.
  44.        Return ResponseContent
  45.  
  46.    End Function

Ejemplo de uso:

Código
  1.    Private Sub Test() Handles MyBase.Shown
  2.  
  3.        Dim Url As New Uri("http://es.wikipedia.org/wiki/Special:Search?")
  4.  
  5.        Dim PostData As New Dictionary(Of String, String) From
  6.            {
  7.                {"search", "Petición+POST"},
  8.                {"sourceid", "Mozilla-search"}
  9.            } ' Formated Result: "search=Petición+POST&sourceid=Mozilla-search"
  10.  
  11.        Dim Response As String =
  12.            SendPOST(Url.AbsoluteUri, PostData)
  13.  
  14.        Clipboard.SetText(Response) ' Copy to clipboard.
  15.        MessageBox.Show(Response)
  16.  
  17.    End Sub

Saludos!
« Última modificación: 10 Marzo 2014, 01:18 am por Eleкtro » En línea



s_azazel

Desconectado Desconectado

Mensajes: 98



Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #3 en: 10 Marzo 2014, 05:36 am »

Mil gracias a los dos!!!
Me ha funcionado perfectamente  :D :D :D
En línea

s_azazel

Desconectado Desconectado

Mensajes: 98



Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #4 en: 10 Marzo 2014, 12:28 pm »

No se si esto lo deberia de preguntar aqui...

La idea de le programa es porque en la web que me quiero registrar solo abren los registros una vez cada 15 dias y se acaban en unos 5 o 10 minutos

Durante este tiempo el server se cae varias veces e incluso me ha tardado en cargar una pagina mas de 5 minutos

Asi que habia pensado poner un timeout con un retry cada 10 seg o asi

La pregunta es: ¿se podria hacer mediante HttpWebRequest  mas de una peticion de vez para asegurarme que al menos acepte una??

Gracias!!!
En línea

Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.878



Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #5 en: 10 Marzo 2014, 14:41 pm »

Kubox sabe más sobre este tema que yo, pero si la página no te carga... creo que sería una tontería hacer peticiones simultaneas desde la misma IP ya que ninguna te cargaría, creo.

De todas formas, poder se puede, puedes usar el método HttpWebRequest.BeginGetResponse, que es asíncrono, pero también podrías enviar una única petición y esperar hasta que se realice corréctamente con un Do Until/While Not

El siguiente Snippet lo escribí hace mucho tiempo, se puede mejorar, pero siempre me ha funcionado bien, pruébalo.

Código
  1.    ''' <summary>
  2.    ''' Determines whether a connectivity to an URL is avaliable.
  3.    ''' </summary>
  4.    ''' <param name="url">Indicates the URL.</param>
  5.    ''' <param name="RetryInterval">
  6.    ''' Indicates the retry interval, in seconds.
  7.    ''' Use "-1" to any interval.</param>
  8.    ''' <param name="StatusControl">
  9.    ''' Indicates the status control.
  10.    ''' If any control is specified, the status will be shown in Debug console.
  11.    ''' </param>
  12.    ''' <returns><c>true</c> if connectivity avaliable; otherwise, <c>false</c>.</returns>
  13.    Private Function IsConnectivityAvaliable(ByVal url As String,
  14.                                             Optional ByVal RetryInterval As Integer = -1,
  15.                                             Optional ByVal StatusControl As Control = Nothing) As Boolean
  16.  
  17.        Dim NoNetworkMessage As String = "Network connection is not avaliable."
  18.        Dim NoWebsiteMessage As String = "WebSite is not avaliable."
  19.        Dim NoNetworkRetryMessage As String = "Network connection is not avaliable, retrying in {0} seconds..."
  20.        Dim NoWebsiteRetryMessage As String = "WebSite is not avaliable, retrying in {0} seconds..."
  21.        Dim YesNetworkMessage As String = "Network connection established."
  22.        Dim YesWebsiteMessage As String = "WebSite connection established."
  23.  
  24.        Select Case My.Computer.Network.IsAvailable
  25.  
  26.            Case False ' No network device avaliable
  27.  
  28.                If RetryInterval = -1 Then ' Do not retry
  29.                    PrintNetworkStatus(NoNetworkMessage, StatusControl)
  30.                    Return False
  31.  
  32.                Else ' Retry
  33.  
  34.                    For X As Integer = 0 To RetryInterval
  35.                        WaitNetworkStatus()
  36.                        PrintNetworkStatus(String.Format(NoNetworkRetryMessage, RetryInterval - X), StatusControl)
  37.                    Next X
  38.  
  39.                    IsConnectivityAvaliable(url, RetryInterval, StatusControl)
  40.  
  41.                End If ' RetryInterval
  42.  
  43.            Case True ' Network device is avaliable
  44.  
  45.                ' Inform that network device is avaliable.
  46.                PrintNetworkStatus(YesNetworkMessage, StatusControl)
  47.  
  48.                Try ' Try connect to the given url
  49.                    My.Computer.Network.Ping(url)
  50.  
  51.                    ' Inform that Website connection is avaliable.
  52.                    PrintNetworkStatus(YesWebsiteMessage, StatusControl)
  53.                    Return True
  54.  
  55.                Catch ex As Net.NetworkInformation.PingException
  56.  
  57.                    If RetryInterval = -1 Then ' Do not retry
  58.                        PrintNetworkStatus(NoWebsiteMessage, StatusControl)
  59.                        Return False
  60.  
  61.                    Else ' Retry
  62.  
  63.                        For X As Integer = 0 To RetryInterval
  64.                            WaitNetworkStatus()
  65.                            PrintNetworkStatus(String.Format(NoWebsiteRetryMessage, RetryInterval - X), StatusControl)
  66.                        Next X
  67.  
  68.                        IsConnectivityAvaliable(url, RetryInterval, StatusControl)
  69.  
  70.                    End If ' RetryInterval
  71.  
  72.                Catch ex As InvalidOperationException
  73.  
  74.                    If RetryInterval = -1 Then ' Do not retry
  75.                        PrintNetworkStatus(NoNetworkMessage, StatusControl)
  76.                        Return False
  77.  
  78.                    Else ' Retry
  79.  
  80.                        For X As Integer = 0 To RetryInterval
  81.                            WaitNetworkStatus()
  82.                            PrintNetworkStatus(String.Format(NoNetworkRetryMessage, RetryInterval - X), StatusControl)
  83.                        Next
  84.  
  85.                        IsConnectivityAvaliable(url, RetryInterval, StatusControl)
  86.  
  87.                    End If ' RetryInterval
  88.  
  89.                End Try
  90.  
  91.        End Select
  92.  
  93.    End Function
  94.  
  95.    ''' <summary>
  96.    ''' Prints the network status.
  97.    ''' </summary>
  98.    ''' <param name="Message">Indicates the Status message.</param>
  99.    ''' <param name="StatusControl">Indicates the control to print the connection Status.</param>
  100.    Private Sub PrintNetworkStatus(ByVal Message As String,
  101.                                   Optional ByVal StatusControl As Control = Nothing)
  102.  
  103.        If StatusControl IsNot Nothing Then
  104.            StatusControl.Invoke(Sub() StatusControl.Text = Message)
  105.        Else
  106.            Debug.WriteLine(Message)
  107.        End If
  108.  
  109.    End Sub
  110.  
  111.    ''' <summary>
  112.    ''' Waits an interval before trying to reconnect.
  113.    ''' </summary>
  114.    ''' <param name="WaitPeriod">Indicates the wait interval, in ms.</param>
  115.    Private Sub WaitNetworkStatus(Optional ByVal WaitPeriod As Integer = 1000)
  116.        Threading.Thread.Sleep(WaitPeriod)
  117.    End Sub

Ejemplo de uso:

Código
  1.    Private Sub Test() Handles MyBase.Load
  2.  
  3.        Dim t As New Threading.Thread(AddressOf CheckConnectivity)
  4.        t.Start()
  5.  
  6.    End Sub
  7.  
  8.    Private Sub CheckConnectivity()
  9.  
  10.        Do Until IsConnectivityAvaliable("sqwertyqwertyqwerty.com", 10, Label1)
  11.            Application.DoEvents()
  12.        Loop
  13.  
  14.        ' Enviar POST aquí...
  15.  
  16.    End Sub

Saludos
En línea



s_azazel

Desconectado Desconectado

Mensajes: 98



Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #6 en: 10 Marzo 2014, 18:22 pm »

Muchas gracias!!! lo tengo ya preparado y con varias el intento de varias conexiones simultaneas

Cuando lo ahaci con el navegador se quedaba colgado hasta 5 minutos o mas hasta que abria la pagina en el momento de el colapso

¿Sabeis si es mejor poner un timeout bajo y refrescar o dejarlo que acabe de cargar (no se si todo ese rato esta cargado algo.La verdad es que es ligerisima la pagina)

El mayor problema es ese pues las citas disponibles se acaban enseguida

Gracias
En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #7 en: 12 Marzo 2014, 16:36 pm »

Si no sabes que día ni a que hora exacta va a ser abierto el servidor de registro entonces te recomiendo que montes una aplicación que realice checkeos a la dirección de dicho servidor cada poco tiempo. Cuando detecte que el servidor está activo entonces debería de enviar la petición, siendo uno de los primeros en realizarla. No sé si habrá más bots en juego en dicho momento, ya que no conozco la página contra la que intentas autenticarte, puede que no tengas problemas, o puede que sí.

Para poner el timeout debes pensar en cuanto tiempo tarda el servidor de la página en procesar tu registro, ya que si pones un timeout más bajo cortará la conexión.

Hay varías formas de enviar peticiones a servidores web, una es haciendo uso de hilos, otra es utilizando Tasks (.NET Framework 4.5 creo) y la mejor para mí es haciendo uso de CallBacks, que es uno de los fuertes de .NET. No es más que programación asíncrona, bellísima por cierto.

Cuidado no acabes haciendo un DDoS jajajajajaja, suerte!

Saludos!
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

s_azazel

Desconectado Desconectado

Mensajes: 98



Ver Perfil
Re: enviar datos con WebRequest
« Respuesta #8 en: 12 Marzo 2014, 21:06 pm »

Muchas gracias!!! Lo he hecho a traves de hilos.
Se que abre un viernes de cada dos a las 9 am
Tengo ya mas o menos acabado tiene que pasar por dos paginas por temas de cookies, finalmente hace un get a la captcha y envia los datos al formulario

intentare cunado lo abran crear unos 20 hilos a ver si lo agunata

Muchas Gracias!!!!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Como enviar los datos a la Base de Datos « 1 2 »
PHP
giagete 17 7,839 Último mensaje 7 Septiembre 2007, 16:06 pm
por JUCA
¿Qué es un HTTPWEBREQUEST / WEBREQUEST?
.NET (C#, VB.NET, ASP)
avmiitxe 4 5,071 Último mensaje 18 Abril 2012, 17:31 pm
por avmiitxe
Enviar y Solicitar datos en Base de Datos mediante Winsock?
Programación Visual Basic
Brian1511 0 2,367 Último mensaje 25 Noviembre 2012, 18:42 pm
por Brian1511
Ayuda p listar datos de base de datos y usar el valor para enviar a otra pagina
PHP
daciocco 1 2,988 Último mensaje 31 Diciembre 2013, 16:26 pm
por #!drvy
problema con split y webrequest
.NET (C#, VB.NET, ASP)
snakeboy8 4 3,105 Último mensaje 4 Marzo 2015, 12:13 pm
por snakeboy8
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines