Foros del Web » Programación para mayores de 30 ;) » Programación General »

Sockets en C# , Problemita para acceder a paginas web

Estas en el tema de Sockets en C# , Problemita para acceder a paginas web en el foro de Programación General en Foros del Web. Hola. Estoy haciendome un simple programa en C# que, usando sockets, mando un GET para obtener el codigo de la pagina web correspondiente. Luego recibo ...
  #1 (permalink)  
Antiguo 25/06/2008, 10:30
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Sockets en C# , Problemita para acceder a paginas web

Hola.
Estoy haciendome un simple programa en C# que, usando sockets, mando un GET para obtener el codigo de la pagina web correspondiente.
Luego recibo la informacion en un string para posteriormente mostrarlo.

El tema es el siguiente, el programa anda unicamente para algunas webs, no para todas, y no entiendo el porque.
Por dar 2 ejemplos nada mas: me conecto (obviamente port 80 estamos hablando) a google.com, puedo ver el codigo html de la pagina perfectamente. Pero si lo hago a fotolog.com me dice invalid URL.

Mi sospecha es que haya redirecciones de por medio que requiera conectar mas sockets, pero no tengo forma de detectarlo porque el unico codigo que veo es el HTML diciendome Invalid URL.

Alguien sabe como se puede detectar si hay redirecciones? Como puedo hacer ante estos problemas?

Saludos
  #2 (permalink)  
Antiguo 25/06/2008, 15:48
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 17 años, 2 meses
Puntos: 87
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Como esta tu header de tu socket

get URL HTTP/1.0

si es asi prueba hacer

GET / HTTP/1.1\nHost: url\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\n\n

en tu header de tu socket
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #3 (permalink)  
Antiguo 25/06/2008, 20:11
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Sigue sin funcionar. Ahora me muestra un codigo html que dice redirect, y hay un Location a url.com :S.... osea, sigo sin entender como decirle que entre a fotolog.com, por que redireccion tiene que pasar.. etc.

Pego todo el codigo:

Código:
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

using System.Net;
using System.Net.Sockets;
using System.IO;

namespace test
{
    class Program
    {
      static void Main(string[] args)
      {
  
        string cabecera = "GET / HTTP/1.1\nHost: url\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\n\n";
        string respuesta;

        Byte[] SendBytes = Encoding.ASCII.GetBytes(cabecera);
        Byte[] RecvBytes = new Byte[255];
        int bytes;

        try
        {
          IPHostEntry direc = Dns.GetHostEntry("www.fotolog.com");
          IPEndPoint Ep = new IPEndPoint(direc.AddressList[0], 80);
       
          Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

          try
          {
            socket.Connect(Ep); //Conectamos
            socket.Send(SendBytes, SendBytes.Length, SocketFlags.None); //Enviamos la cabecera
            bytes = socket.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None); //Recibimos la respuesta en bloques de 255 bytes

            while (bytes > 0)
            {
              respuesta = Encoding.ASCII.GetString(RecvBytes, 0, bytes); //Codificamos la respuesta y la guardamos en respuesta.
              Console.WriteLine(respuesta);
              bytes = socket.Receive(RecvBytes, RecvBytes.Length, SocketFlags.None); //Recibimos la respuesta en bloques de 255 bytes
            }   
          }
          catch (Exception) //Si durante el procedimiento hay error salta aqui.
          {
            Console.WriteLine("Se produció un error al recibir bytes.");
            Console.Read();
          }
      }
      catch (Exception)
      {
        Console.WriteLine("Host no encontrado (lo mas probable).");
      }

      Console.Read(); //getch
      }
 }
  #4 (permalink)  
Antiguo 25/06/2008, 22:16
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 17 años, 2 meses
Puntos: 87
Respuesta: Sockets en C# , Problemita para acceder a paginas web

GET / HTTP/1.1\nHost: url\nUser-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3\n\n

esto cambialo por tu dominio
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #5 (permalink)  
Antiguo 26/06/2008, 11:39
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Listo ahi funciona, muchas gracias. Vamos a ver si ahora hacer un login es sencillo ...... :)
  #6 (permalink)  
Antiguo 26/06/2008, 11:41
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Se haria con POST esto no? me voy a poner a averiguar :)
uhh.. y hay que "apretar" el boton! que divertido :D

searching help....

Última edición por razer; 26/06/2008 a las 12:09
  #7 (permalink)  
Antiguo 26/06/2008, 12:47
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 17 años, 2 meses
Puntos: 87
Respuesta: Sockets en C# , Problemita para acceder a paginas web

eso es simple el hacer un login con un bot es simple

solo revisa las variables de tu formuario y las acciones y el metodo post y considera q puede haber redirecciones forzadas tambien revisa todos los codigos de respuesta y considera un timeout alto hay paginas q hacen delays para evitar robots q logean.

y el formato para enviar esas variables depende dle metodo

application/x-www-form-urlencoded (creo q va mas por este porq no subes archivos)
multipart/form-data

Content-Disposition: form-data; name=variable1

valor1

etcl etc

revisa bien el tema del protocolo para el envio de datos mas porq lo haces con sockets si usaras httpwebrequests y webresponses seria mucho mas simple pero es lo mismo.


un saludo
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5

Última edición por Peterpay; 26/06/2008 a las 12:54
  #8 (permalink)  
Antiguo 26/06/2008, 14:29
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Yo el login lo quiero hacer de la misma manera que hice el get de la pagina, osea: declarando un string con el string correspondiente ("POST ... LOGIN USER ETC.."), y luego usando el socket Send para enviarlo.

No se puede hacer asi ?
Lo que necesito saber es como es el string a mandar, le tengo que especificar el nombre del form, el nombre del input user, del input pass, los campos que debe completar ahi, y luego que haga clic en el nombre del login.
  #9 (permalink)  
Antiguo 26/06/2008, 14:48
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 17 años, 2 meses
Puntos: 87
Respuesta: Sockets en C# , Problemita para acceder a paginas web

si usas

application/x-www-form-urlencoded

campo1=valor1&campo2=valor2&campo3=valor3&campo4=v alor4
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #10 (permalink)  
Antiguo 26/06/2008, 14:51
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Logre hacer esto, ire bien??

Código:
            ////////////////////////////////////////////////////////
            Uri myUri = new Uri("http://www.fotolog.com");
            WebRequest webRequest = WebRequest.Create(myUri);
            webRequest.ContentType = "application/x-www-form-urlencoded"; 
            webRequest.Method = "POST";
            byte[] bytessend = Encoding.ASCII.GetBytes("u_name=test&p_word=password");
            Stream os = null;

            try
            { // send the Post
              webRequest.ContentLength = bytessend.Length;   //Count bytes to send
              os = webRequest.GetRequestStream(); // ??
              os.Write(bytessend, 0, bytessend.Length);         //Send it
            }
            catch (Exception)
            {
              Console.WriteLine("ERROR al mandar data login");
            }

            try
            { // get the response
              WebResponse webResponse = webRequest.GetResponse();
              if (webResponse == null)
              {
                Console.WriteLine("no te respondio un carajo al login que le diste...");
              }

              StreamReader sr = new StreamReader(webResponse.GetResponseStream());

              string rtalogin = sr.ReadToEnd().Trim();
              Console.WriteLine(rtalogin);
            }
            catch
            {
              Console.WriteLine("not response......");
            }

            /////////////////////////////////////////////////////////
le puse un login con usuario y password cualquiera, para probar, y no me imprime nada........
Lo que me sorprende es que le mando la data, pero en ningun momento le digo el id del form.... estoy haciendo algo y mal seguramente.

Última edición por razer; 26/06/2008 a las 15:09
  #11 (permalink)  
Antiguo 26/06/2008, 15:16
Avatar de Peterpay
Colaborador
 
Fecha de Ingreso: septiembre-2007
Ubicación: San Francisco, United States
Mensajes: 3.858
Antigüedad: 17 años, 2 meses
Puntos: 87
Respuesta: Sockets en C# , Problemita para acceder a paginas web

HttpWebRequest request;
HttpWebResponse response;
CookieContainer cookies;

#region Login Request;

string url = "https://www.tudominio.com";
string data = string.Format("parametrosdelform");
byte[] encodeddata = Encoding.ASCII.GetBytes(data);
request = (HttpWebRequest)WebRequest.Create(url);
request.AllowAutoRedirect = true;
request.CookieContainer = new CookieContainer();
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = encodeddata.Length;
Stream datawriter = request.GetRequestStream();

datawriter.Write(encodeddata, 0, encodeddata.Length);
datawriter.Close();

response = null;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}

if (response.StatusCode != HttpStatusCode.Found) // si falla el login
{
Console.WriteLine("Server Unreachable");
response.Close();
request.KeepAlive = false;
return string.Empty;
}
__________________
Curso WF4
http://cursos.gurudotnet.com/ DF
Aprende HTML5
  #12 (permalink)  
Antiguo 26/06/2008, 19:19
 
Fecha de Ingreso: marzo-2008
Mensajes: 237
Antigüedad: 16 años, 8 meses
Puntos: 6
Respuesta: Sockets en C# , Problemita para acceder a paginas web

Que raro.... me tira
The remote server returned an error: (500) Internal Server Error

en la var data puse esto:
string data = string.Format("u_name=usuario&p_word=clave"); el u_name y p_word son los nombres de los campos input.
le cambie el dominio, y deje todo igual........

estuve fijandome, y cuando entra a la linea response la hace y entra al catch, osea.. response sigue quedando en null, nunca me respondio nada..... :S
probe con esta url = http://account.fotolog.com/login y me termina diciendo The operation has timed out

si ademas estoy logeado y quiero hacer cosas, tengo que mantener una cookie, osea, la que me da. ufffff.... tengo que hacer muchas cosas pero no me queria centrar en esto, no pense que era complicado :z

h e l p

Última edición por razer; 26/06/2008 a las 23:23
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:00.