Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: rigorvzla en 23 Mayo 2019, 04:59 am



Título: Llenar campos en pagina web
Publicado por: rigorvzla en 23 Mayo 2019, 04:59 am
Hola a todos, realmente estoy lelo con esto y no se como empezar y ni si es posible, quiero crear una aplicacion en wpf donde al apretar un boton se abra una ventana de google y en el cuadro de busqueda automaticamente se escriba "Hola", y luego de manera automatica empiece la busqueda de eso.

No tengo la menor idea de como llenar, buscar el campo a llenar y bueno es algo que me gustaria aprender hacer para aplicarlo a otras webs ideas.

O si es necesario crear en la misma aplicacion un webbrowser con el que busque en la web lo deseado?.

espero puedan ayudarme.


Título: Re: Llenar campos en pagina web
Publicado por: ThunderCls en 23 Mayo 2019, 05:30 am
Lo que necesitas es Selenium

http://executeautomation.com/blog/simple-code-with-selenium-c/
https://www.guru99.com/selenium-csharp-tutorial.html

Suerte


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 23 Mayo 2019, 07:08 am
hombre, me ha servido tremendamente, el unico limitante es que se debe tener el google chrome instalado, sacando eso esta de perlas jajaja muuchas gracias compa, aunque si existe otra alternativa a mi problema seria perfecta leerla. Muchas gracias nuevamente


Título: Re: Llenar campos en pagina web
Publicado por: ThunderCls en 23 Mayo 2019, 07:14 am
IWebDriver es simplemente una interfaz, puedes crear la instancia del navegador que desees:

Código
  1. // NuGet: Selenium.WebDriver.ChromeDriver
  2. using OpenQA.Selenium.Chrome;
  3. IWebDriver driver = new ChromeDriver();
  4. // NuGet: Selenium.Mozilla.Firefox.Webdriver
  5. using OpenQA.Selenium.Firefox;
  6. IWebDriver driver = new FirefoxDriver();
  7. // NuGet: Selenium.WebDriver.PhantomJS
  8. using OpenQA.Selenium.PhantomJS;
  9. IWebDriver driver = new PhantomJSDriver();
  10. // NuGet: Selenium.WebDriver.IEDriver
  11. using OpenQA.Selenium.IE;
  12. IWebDriver driver = new InternetExplorerDriver();
  13. // NuGet: Selenium.WebDriver.EdgeDriver
  14. using OpenQA.Selenium.Edge;
  15. IWebDriver driver = new EdgeDriver();

https://www.automatetheplanet.com/selenium-webdriver-csharp-cheat-sheet/


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 23 Mayo 2019, 07:19 am
GUAOOOOOO eres un moustruo jajaja ahora todo mi paisaje cambia!!! muchas gracias hombre!! genialisimoooo


Título: Re: Llenar campos en pagina web
Publicado por: Eleкtro en 23 Mayo 2019, 12:48 pm
al apretar un boton se abra una ventana de google y en el cuadro de busqueda automaticamente se escriba "Hola", y luego de manera automatica empiece la busqueda de eso.

No tengo la menor idea de como llenar, buscar el campo a llenar y bueno es algo que me gustaria aprender hacer para aplicarlo a otras webs ideas.

Ese problema parece estar mal planteado, ya que por lo que comentas no parece que realmente quieras automatizar de forma visual/interactiva el navegador, es decir, enviar pulsaciones del teclado para rellenar los campos del form, y pulsar el botón de buscar. Todo eso me resulta completamente innecesario (mal planteado) para lograr lo que parece ser tu objetivo real: mostrar el resultado de una búsqueda de Google en el navegador, y para eso sería suficiente con construir la query de búsqueda de Google y abrir la url en el navegador...

Código
  1. Dim uriBuilder As New UriBuilder With {
  2.    .Scheme = "https",
  3.    .Host = "www.google.com",
  4.    .Path = "search",
  5.    .Query = HttpUtility.ParseQueryString("lr=lang_en&q=Hello World", Encoding.UTF8).ToString()
  6. }
  7.  
  8. WebBrowser1.Navigate(uriBuilder.Uri)

O expresado de forma más simple: https://www.google.com/search?lr=lang_en&q=Hello+World (https://www.google.com/search?lr=lang_en&q=Hello+World)

Tan simple como eso.



De todas formas, y en caso de que por alguna razón que no hayas mencionado realmente necesites automatizar el navegador, en ese caso no necesitas dependencias externas como Selenium o iMacros. Eso es un overkill para lo que pretendes hacer. Es suficiente con lo siguiente:

Código
  1. Dim doc As HtmlDocument = WebBrowser1.Document
  2. Dim searchForm As HtmlElement = doc.Forms(0)
  3. Dim queryTextBox As HtmlElement = doc.GetElementById("q")
  4.  
  5. queryTextBox.SetAttribute("value", "Hello World")
  6. searchForm.InvokeMember("submit")

Nota: el código lo insertarías en el evento DocumentCompleted de la instancia del componente WebBrowser, por ejemplo.

Saludos.


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 23 Mayo 2019, 15:45 pm
esto me ha gustado elektro  y bueno en realidad lo necesito para loguear por ejemplo una cuenta ya sea de correo electronico twitter , o cualquier otra pagina web.

coloque google como ejemplo pero al parecer fue muy simple para el problema planteado jeje, por ejemplo  probe el selenium antes de ver tu respuesta y resulto lo que queria con google, mas si de otra manera es posible, seria muy interesante saber, y no eh probado aun con hotmail  por ejemploo twitter o gmail


Título: Re: Llenar campos en pagina web
Publicado por: Eleкtro en 24 Mayo 2019, 01:23 am
probe el selenium antes de ver tu respuesta y resulto lo que queria con google, mas si de otra manera es posible, seria muy interesante saber

Te acabo de mostrar como sería la forma de hacerlo sin Selenium.

En caso de que te estés refiriendo a lo de loguearte, entonces te respondo en la siguiente cita...



en realidad lo necesito para loguear por ejemplo una cuenta ya sea de correo electronico twitter , o cualquier otra pagina web.

De nuevo eso me resulta otro mal planteamiento.

A ver, escúchame bien, por que no se si no lo entiendes, o lo entiendes pero te da igual. El caso es que, siempre y cuando tu NO TENGAS NECESIDAD/PROPÓSITO REAL de abrir el navegador y mostrarle al usuario lo que haces en él, entonces no lo hagas. Es simple, NO PIENSES EN HACERLO ASÍ, por que es una manera innecesaria (y mediocre) de hacer las cosas.

La automatización de navegadores por lo general se usa para fines de pruebas en páginas web. Igual que la tecnología Coded-UI se usa para automatizar aplicaciones con fines de depuración visual.

Otra cosa distinta es que hayan personas y/o programadores que, por no tener conocimiento (o las ganas) de como hacer las cosas de forma apropiada, como sería por ejemplo efectuar una búsqueda en Google, o loguearse en X página, pues recurren a algún framework de automatización como Selenium por que es capaz de hacer estas cosas de forma simple y sencilla. Pero ya te digo, ES INNECESARIO (y cutre, insisto). Donde si que te lo aceptaría, es si estuviesemos hablando de una necesidad real de automatizar, visualmente/interactivamente hablando, un navegador.

¿Quieres hacer las cosas de forma óptima/apropiada, o prefieres quedarte con lo primero que pillas y que ves que te es sencillo y simple de usar?. Tu decides, pero yo solo te diré que para loguearte en un sitio web no necesitas automatizar el navegador para hacer click en "el botón de login". Lo que necesitas es llevar a cabo una petición POST, y hacer uso de cookies. Nada más. Y si quieres algo realmente sencillo entonces puedes usar la clase WebClient, eso sí, despues de haberle implementado el manejo de cookies como en el siguiente ejemplo que te muestro a continuación, el cual es un código extraido de mi librería comercial DevCase for .NET Framework (https://codecanyon.net/item/elektrokit-class-library-for-net/19260282):

Código
  1. ' ***********************************************************************
  2. ' Author   : ElektroStudios
  3. ' Modified : 28-February-2018
  4. ' ***********************************************************************
  5.  
  6. #Region " Public Members Summary "
  7.  
  8. #Region " Constructors "
  9.  
  10. ' New()
  11.  
  12. #End Region
  13.  
  14. #Region " Properties "
  15.  
  16. ' CookiesEnabled As Boolean
  17. ' Cookies As CookieContainer
  18. ' Timeout As Integer
  19.  
  20. #End Region
  21.  
  22. #End Region
  23.  
  24. #Region " Option Statements "
  25.  
  26. Option Strict On
  27. Option Explicit On
  28. Option Infer Off
  29.  
  30. #End Region
  31.  
  32. #Region " Imports "
  33.  
  34. Imports System.ComponentModel
  35. Imports System.Drawing
  36. Imports System.Net
  37. Imports System.Runtime.InteropServices
  38.  
  39. #End Region
  40.  
  41. #Region " DevWebClient "
  42.  
  43. Namespace DevCase.Core.NET
  44.  
  45.    ''' ----------------------------------------------------------------------------------------------------
  46.    ''' <summary>
  47.    ''' A extended <see cref="WebClient"/> component, with support for cookies and requests timeout.
  48.    ''' </summary>
  49.    ''' ----------------------------------------------------------------------------------------------------
  50.    ''' <remarks>
  51.    ''' Original idea taken from: http://www.codingvision.net/tips-and-tricks/c-webclient-with-cookies
  52.    ''' </remarks>
  53.    ''' ----------------------------------------------------------------------------------------------------
  54.    <DisplayName(NameOf(DevWebClient))>
  55.    <Description("A extended WebClient component, with support for cookies and requests timeout.")>
  56.    <DesignTimeVisible(False)>
  57.    <DesignerCategory(NameOf(DesignerCategoryAttribute.Component))>
  58.    <ToolboxBitmap(GetType(Component), "Component.bmp")>
  59.    <ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow)>
  60.    <ComVisible(True)>
  61.    Public Class DevWebClient : Inherits WebClient
  62.  
  63. #Region " Properties "
  64.  
  65.        ''' ----------------------------------------------------------------------------------------------------
  66.        ''' <summary>
  67.        ''' Gets or sets a value indicating whether cookies are enabled.
  68.        ''' <para></para>
  69.        ''' Default value is <see langword="False"/>.
  70.        ''' </summary>
  71.        ''' ----------------------------------------------------------------------------------------------------
  72.        ''' <value>
  73.        ''' <see langword="True"/> if cookies are enabled; otherwise, <see langword="False"/>.
  74.        ''' </value>
  75.        ''' ----------------------------------------------------------------------------------------------------
  76.        Public Property CookiesEnabled As Boolean
  77.  
  78.        ''' ----------------------------------------------------------------------------------------------------
  79.        ''' <summary>
  80.        ''' Gets or sets the cookies associated with this <see cref="DevWebClient"/>.
  81.        ''' </summary>
  82.        ''' ----------------------------------------------------------------------------------------------------
  83.        ''' <value>
  84.        ''' The cookies associated with this <see cref="DevWebClient"/>.
  85.        ''' </value>
  86.        ''' ----------------------------------------------------------------------------------------------------
  87.        Public Property Cookies As CookieContainer
  88.  
  89.        ''' ----------------------------------------------------------------------------------------------------
  90.        ''' <summary>
  91.        ''' Gets or sets the time interval, in milliseconds, until the
  92.        ''' requests made by this <see cref="DevWebClient"/> times out.
  93.        ''' </summary>
  94.        ''' ----------------------------------------------------------------------------------------------------
  95.        ''' <value>
  96.        ''' The time interval, in milliseconds, until the
  97.        ''' requests made by this <see cref="DevWebClient"/> times out,
  98.        ''' or <see cref="Global.System.Threading.Timeout.Infinite"/> to indicate that the
  99.        ''' request does not time out.
  100.        ''' </value>
  101.        ''' ----------------------------------------------------------------------------------------------------
  102.        Public Property Timeout As Integer = Global.System.Threading.Timeout.Infinite
  103.  
  104. #End Region
  105.  
  106. #Region " Constructors "
  107.  
  108.        ''' ----------------------------------------------------------------------------------------------------
  109.        ''' <summary>
  110.        ''' Initializes a new instance of the <see cref="DevWebClient"/> class.
  111.        ''' </summary>
  112.        ''' ----------------------------------------------------------------------------------------------------
  113.        Public Sub New()
  114.            Me.Cookies = New CookieContainer()
  115.        End Sub
  116.  
  117. #End Region
  118.  
  119. #Region " Protected Methods "
  120.  
  121.        ''' ----------------------------------------------------------------------------------------------------
  122.        ''' <summary>
  123.        ''' Returns a <see cref="WebRequest"/> object for the specified resource.
  124.        ''' </summary>
  125.        ''' ----------------------------------------------------------------------------------------------------
  126.        ''' <param name="address">
  127.        ''' A <see cref="Uri"/> that identifies the resource to request.
  128.        ''' </param>
  129.        ''' ----------------------------------------------------------------------------------------------------
  130.        ''' <returns>
  131.        ''' A new <see cref="WebRequest"/> object for the specified resource.
  132.        ''' </returns>
  133.        ''' ----------------------------------------------------------------------------------------------------
  134.        Protected Overrides Function GetWebRequest(ByVal address As Uri) As WebRequest
  135.  
  136.            Dim request As WebRequest = MyBase.GetWebRequest(address)
  137.            request.Timeout = Me.Timeout
  138.  
  139.            If (Me.CookiesEnabled) AndAlso (TypeOf request Is HttpWebRequest) Then
  140.                DirectCast(request, HttpWebRequest).CookieContainer = Me.Cookies
  141.            End If
  142.  
  143.            Return request
  144.  
  145.        End Function
  146.  
  147. #End Region
  148.  
  149.    End Class
  150.  
  151. End Namespace
  152.  
  153. #End Region

Un ejemplo para loguearse en el foro de elhacker.net:
Código
  1. Dim uri As New Uri("https://foro.elhacker.net/index.php?action=login2", UriKind.Absolute)
  2. Dim cred As New NetworkCredential("NOMBRE", "CONTRASEÑA")
  3. Dim query As String = HttpUtility.ParseQueryString($"cookielength=90&user={cred.UserName}&passwrd={cred.Password}").ToString()
  4.  
  5. Using client As New DevWebClient() With {.CookiesEnabled = True}
  6.    client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded")
  7.  
  8.    Dim response As String = client.UploadString(uri, "POST", query)
  9.    Console.WriteLine(response)
  10. End Using

La alternativa practicamente equivalente, sería el uso de la clase HttpWebRequest / WebRequest.



y no eh probado aun con hotmail  por ejemploo twitter o gmail

Los servicios más populares proveen una API / librería para .NET Framework, como son casi todos los servicios de Google, y los de Microsoft, incluyendo Outlook / Live. Los de Twitter no tengo ni idea por que nunca he usado esa plataforma...

Así que para loguearte en Gmail y Hotmail es suficiente con usar las librerías para .NET framework de Google y de Microsoft, con los que se puede administrar e-mails y contactos de forma automatizada. Puedes hacer lo que desees, sin tener que lidiar visualmente con la interfaz de un navegador para automatizarlo...

Cabe mencionar que en el caso de Google, algunos servicios son de pago.

PD: por si te lo estás preguntando, si, tengo implementados clientes para loguearse en Live/Hotmail, Gmail y Youtube usando las librerías oficiales para .NET, capaces de llevar a cabo diversas operaciones útiles. Pero eso ya no lo voy a compartir de gratis, que al final nadie me comprará mi duro trabajo. xD

Saludos.


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 24 Mayo 2019, 01:37 am
ELEKTROOO!!! fantastico hombre y no lo habia hecho , no por q me daba igual, es q no lo entiendo (no es q entienda al 100 el codigo q dejastes) pero lo veo un poco mas claro, si entiendo tu punto y es muy cierto y claro, gracias que cone sto ya tengo madera para cortar.

Gracias!!

Una pregunta es posible que mi planteamiento est mal, pero lo q quiero lograr es , crear una aplicacion donde igrese el correo la contraseña y abra el explorador mostrandome la bandeja de entrada.

Basandome en esto use selenium aparte que fue lo unico que encontre y me recomendaron para lograr mi cometido, por otro lado quede a la espera de una solucion diferente y aqui tu gran explicacion. que no es necesario tal cosa, buscare una web para convertir tu codigo a wpf C# y me pondre a estudiar todo lo que explicastes gracias como siempre dando en el clavo. jeje


Título: Re: Llenar campos en pagina web
Publicado por: Eleкtro en 24 Mayo 2019, 02:06 am
Una pregunta es posible que mi planteamiento est mal, pero lo q quiero lograr es , crear una aplicacion donde igrese el correo la contraseña y abra el explorador mostrandome la bandeja de entrada.

Asumiré que hablas de live.com o gmail. ¿Pero te refieres a que el usuario inserte su mail y contraseña en alguna caja de texto de la UI de tu programa?. ¿Y por que no simplemente abrir la página de login en el navegador y dejar que el usuario introduzca allí sus datos de login?. ¿Por que complicar este paso?, si el usuario va a tener que escribir el nombre y contraseña de cualquiera de las dos formas, solo que con una te complicarías la vida automatizando el navegador para rellenar el form de login, y con la otra no.

Como ya mencioné, para iniciar sesión en gmail o microsoft live/hotmail con la intención de llevar a cabo operaciones en segundo plano, sin renderizar visualmente nada en el navegador, lo más conveniente es usar la API oficial para .NET framework.

Pero para lo que tu quieres hacer, es suficiente con usar un webbrowser. La idea sería dejar que el usuario rellene el form de login en el webbrowser la primera vez, y en los próximos reinicios de la aplicacion no haya necesidad de volver a rellenar dicho form. ¿O no te sirve así para lo que pretendas hacer?.

Aquí tienes un ejemplo en C# y con una implementación similar a la clase WebClient que te mostré en VB.NET:
  • https://stackoverflow.com/a/13795159/1248295

Saludos.


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 24 Mayo 2019, 02:27 am
listo muuuchas gracias, a probar jeje


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 29 Mayo 2019, 18:36 pm
Hola de nuevo, estoy de nuevo por aqui , buscando una ayuda a lo siguiente, como menciono el amigo elektro Selenium a grandes escalas es un overkill rotundo, viendo eso empece a buscar informacion sobre su recomendacion,  
clase HttpWebRequest / WebRequest.

resulta que encontre gran cantidad de ejemplos los cuales empiezo apenas a entender, trate de recrear en c# el codigo de elektro y no pude hacerlo funcionar para loguearme aqui.

mi pregunta es, deacuerdo a los ejemplos que consegui, como puedo obtener el enlace web para que con un Process.Start() lo pueda ejecutar?

Ejemplo 1:
Código:
       private static void Metodo1()
        {
            const string baseurl = "https://foro.elhacker.net/index.php?action=login2";
            string user = "Usuario";
            string password = "Clave";
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(baseurl);
            CookieContainer cookie;
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            string login = string.Format("go=&Fuser={0}&Fpass={1}", user, password);
            byte[] postbuf = Encoding.ASCII.GetBytes(login);
            req.ContentLength = postbuf.Length;
            Stream rs = req.GetRequestStream();
            rs.Write(postbuf, 0, postbuf.Length);
            rs.Close();

            cookie = req.CookieContainer = new CookieContainer();

            WebResponse resp = req.GetResponse();
            resp.Close();
        }

Ejemplo 2:
Código:
public class CookieAwareWebClient : WebClient
    {
        public void Login(string loginPageAddress, NameValueCollection loginData)
        {
            CookieContainer container;

            var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";

            var query = string.Join("&",
              loginData.Cast<string>().Select(key => $"{key}={loginData[key]}"));

            var buffer = Encoding.ASCII.GetBytes(query);
            request.ContentLength = buffer.Length;
            var requestStream = request.GetRequestStream();
            requestStream.Write(buffer, 0, buffer.Length);
            requestStream.Close();

            container = request.CookieContainer = new CookieContainer();

            var response = request.GetResponse();
            response.Close();
            CookieContainer = container;
        }

        public CookieAwareWebClient(CookieContainer container)
        {
            CookieContainer = container;
        }

        public CookieAwareWebClient()
          : this(new CookieContainer())
        { }

        public CookieContainer CookieContainer { get; private set; }

        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = (HttpWebRequest)base.GetWebRequest(address);
            request.CookieContainer = CookieContainer;
            return request;
        }

        public static void Start()
        {
            var loginAddress = "https://foro.elhacker.net/index.php?action=login2";
            var loginData = new NameValueCollection
            {
              { "username", "Usuario" },
              { "password", "Clave" }
            };

            var client = new CookieAwareWebClient();
            client.Login(loginAddress, loginData);
        }
    }

Ejemplo 3:
Código:
 public static CookieContainer Login()
        {
            string userName = "Usuario";
            string password = "Clave";

            ASCIIEncoding encoding = new ASCIIEncoding();
            string postData = "Username=" + userName + "&Password=" + password;
            byte[] postDataBytes = encoding.GetBytes(postData);

            HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("https://foro.elhacker.net/index.php?action=login2");

            httpWebRequest.Method = "POST";
            httpWebRequest.ContentType = "application/x-www-form-urlencoded";
            httpWebRequest.ContentLength = postDataBytes.Length;
            httpWebRequest.AllowAutoRedirect = false;

            using (var stream = httpWebRequest.GetRequestStream())
            {
                stream.Write(postDataBytes, 0, postDataBytes.Length);
                stream.Close();
            }

            var cookieContainer = new CookieContainer();

            using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
            {
                using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream()))
                {
                    foreach (Cookie cookie in httpWebResponse.Cookies)
                    {
                        cookieContainer.Add(cookie);
                    }
                }
            }

            return cookieContainer;
        }

Ejemplo 4:
Código:
   public class CookieAwareWebClient : WebClient
    {
        public CookieContainer CookieContainer { get; private set; }

        public CookieAwareWebClient()
          : this(new CookieContainer())
        { }

        public CookieAwareWebClient(CookieContainer container)
        {
            CookieContainer = container;
        }


        public bool Login(string loginPageAddress, NameValueCollection loginData)
        {
            var request = (HttpWebRequest)WebRequest.Create(loginPageAddress);

            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36";

            var parameters = new StringBuilder();
            foreach (string key in loginData.Keys)
            {
                parameters.AppendFormat("{0}={1}&",
                    HttpUtility.UrlEncode(key),
                    HttpUtility.UrlEncode(loginData[key]));
            }
            parameters.Length -= 1;

            var buffer = Encoding.ASCII.GetBytes(parameters.ToString());
            request.ContentLength = buffer.Length;

            var requestStream = request.GetRequestStream();
            requestStream.Write(buffer, 0, buffer.Length);
            requestStream.Close();

            request.CookieContainer = new CookieContainer();

            var response = (HttpWebResponse)request.GetResponse();
            response.Close();

            CookieContainer = request.CookieContainer;
            return response.StatusCode == HttpStatusCode.OK;
        }

        Add cookies to WebRequest
        protected override WebRequest GetWebRequest(Uri address)
        {
            var request = (HttpWebRequest)base.GetWebRequest(address);
            request.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.69 Safari/537.36";
            request.CookieContainer = CookieContainer;
            return request;
        }
    }
    public class FacebookClient : CookieAwareWebClient
    {
        public bool Login(string email, string password)
        {
            var loginResult = this.Login("https://foro.elhacker.net/index.php?action=login2",
            new NameValueCollection
            {
          { "Usuario", email },
          { "Clave", password }
            });

            return loginResult;
        }

        public void GetHomePage()
        {
            Here's the magic.. Cookies are injected via an overriden
            var webRequest = GetWebRequest(new Uri("http://elhacker.net/"));

            string src = "";
            using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
            {
                src = new StreamReader(webResponse.GetResponseStream()).ReadToEnd();
            }
        }
    }

Ejemplo Elektro C#:
Código:
// ***********************************************************************
// Author   : ElektroStudios
// Modified : 28-February-2018
// ***********************************************************************



// New()



// CookiesEnabled As Boolean
// Cookies As CookieContainer
// Timeout As Integer




using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Security;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;
using System.ComponentModel;
using System.Drawing;
using System.Net;
using System.Runtime.InteropServices;
using System.Web;

namespace TestProject.DevCase.Core.NET
{

    /// ----------------------------------------------------------------------------------------------------
    ///         ''' <summary>
    ///         ''' A extended <see cref="WebClient"/> component, with support for cookies and requests timeout.
    ///         ''' </summary>
    ///         ''' ----------------------------------------------------------------------------------------------------
    ///         ''' <remarks>
    ///         ''' Original idea taken from: http://www.codingvision.net/tips-and-tricks/c-webclient-with-cookies
    ///         ''' </remarks>
    ///         ''' ----------------------------------------------------------------------------------------------------
    [DisplayName(nameof(DevWebClient))]
    [Description("A extended WebClient component, with support for cookies and requests timeout.")]
    [DesignTimeVisible(false)]
    [DesignerCategory(nameof(DesignerCategoryAttribute.Component))]
    //[ToolboxBitmap(typeof(Component), "Component.bmp")]
    [ToolboxItemFilter("System.Windows.Forms", ToolboxItemFilterType.Allow)]
    [ComVisible(true)]
    public class DevWebClient : WebClient
    {


        /// ----------------------------------------------------------------------------------------------------
        ///             ''' <summary>
        ///             ''' Gets or sets a value indicating whether cookies are enabled.
        ///             ''' <para></para>
        ///             ''' Default value is <see langword="False"/>.
        ///             ''' </summary>
        ///             ''' ----------------------------------------------------------------------------------------------------
        ///             ''' <value>
        ///             ''' <see langword="True"/> if cookies are enabled; otherwise, <see langword="False"/>.
        ///             ''' </value>
        ///             ''' ----------------------------------------------------------------------------------------------------
        public bool CookiesEnabled { get; set; }

        /// ----------------------------------------------------------------------------------------------------
        ///             ''' <summary>
        ///             ''' Gets or sets the cookies associated with this <see cref="DevWebClient"/>.
        ///             ''' </summary>
        ///             ''' ----------------------------------------------------------------------------------------------------
        ///             ''' <value>
        ///             ''' The cookies associated with this <see cref="DevWebClient"/>.
        ///             ''' </value>
        ///             ''' ----------------------------------------------------------------------------------------------------
        public CookieContainer Cookies { get; set; }

        /// ----------------------------------------------------------------------------------------------------
        ///             ''' <summary>
        ///             ''' Gets or sets the time interval, in milliseconds, until the
        ///             ''' requests made by this <see cref="DevWebClient"/> times out.
        ///             ''' </summary>
        ///             ''' ----------------------------------------------------------------------------------------------------
        ///             ''' <value>
        ///             ''' The time interval, in milliseconds, until the
        ///             ''' requests made by this <see cref="DevWebClient"/> times out,
        ///             ''' or <see cref="Global.System.Threading.Timeout.Infinite"/> to indicate that the
        ///             ''' request does not time out.
        ///             ''' </value>
        ///             ''' ----------------------------------------------------------------------------------------------------
        public int Timeout { get; set; } = global::System.Threading.Timeout.Infinite;



        /// ----------------------------------------------------------------------------------------------------
        ///             ''' <summary>
        ///             ''' Initializes a new instance of the <see cref="DevWebClient"/> class.
        ///             ''' </summary>
        ///             ''' ----------------------------------------------------------------------------------------------------
        public DevWebClient()
        {
            this.Cookies = new CookieContainer();
        }



        /// ----------------------------------------------------------------------------------------------------
        ///             ''' <summary>
        ///             ''' Returns a <see cref="WebRequest"/> object for the specified resource.
        ///             ''' </summary>
        ///             ''' ----------------------------------------------------------------------------------------------------
        ///             ''' <param name="address">
        ///             ''' A <see cref="Uri"/> that identifies the resource to request.
        ///             ''' </param>
        ///             ''' ----------------------------------------------------------------------------------------------------
        ///             ''' <returns>
        ///             ''' A new <see cref="WebRequest"/> object for the specified resource.
        ///             ''' </returns>
        ///             ''' ----------------------------------------------------------------------------------------------------
        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            request.Timeout = this.Timeout;

            if ((this.CookiesEnabled) && (request is HttpWebRequest))
                (HttpWebRequest)request.CookieContainer = this.Cookies;

            return request;
        }
        public static void start()
        {
            Uri uri = new Uri("https://foro.elhacker.net/index.php?action=login2", UriKind.Absolute);
            NetworkCredential cred = new NetworkCredential("NOMBRE", "CONTRASEÑA");
            string query = HttpUtility.ParseQueryString($"cookielength=90&user={cred.UserName}&password={cred.Password}").ToString();

            using (DevWebClient client = new DevWebClient() { CookiesEnabled = true })
            {
                client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded");

                string response = client.UploadString(uri, "POST", query);
                Console.WriteLine(response);
            }
        }
    }
}



Siento que ahi tengo la respuesta, mas no la logro ver por no saber que busco realmente, espero puedan explicarme y ayudarme aprender y poder resolver este problema.

Replanteo lo que quiero lograr, quiero que en la pagina de login ya sea: facebook, elhacker, hotmail etc... (cualquier web con login)
pueda ingresar los datos (usuario y clave) para que al abrir el navegador solo dirija a la pagina luego del login osea : bandeja de entrada, pagina de inicio de facebook o lo que siga luego del login.

Entendi lo que me explicastes inicialmente elektro de q el usuario no debe ver si no es necesario lo q se hace, solamente se debe mostrar el resultado, en este caso lo siguiente a la pagina de login.

Agradezco la ayuda que puedan darme


Título: Re: Llenar campos en pagina web
Publicado por: Eleкtro en 30 Mayo 2019, 01:03 am
quiero que en la pagina de login ya sea: facebook, elhacker, hotmail etc... (cualquier web con login)
pueda ingresar los datos (usuario y clave) para que al abrir el navegador solo dirija a la pagina luego del login osea : bandeja de entrada, pagina de inicio de facebook o lo que siga luego del login.

Entendi lo que me explicastes inicialmente elektro de q el usuario no debe ver si no es necesario lo q se hace, solamente se debe mostrar el resultado, en este caso lo siguiente a la pagina de login.

Imagino que con alguno de esos ejemplos ya eres capaz de logearte en la página deseada y obtener la cookie?.

Luego, tan solo tienes que llamar a la función de Windows InternetSetCookieEx para "registrar" dicha cookie de manera temporal durante el tiempo de vida de tu programa (o de manera persistente también puedes, según quieras), y por último llamar al método WebBrowser.Navigate para mostrar la página post-login.

Cualquier conversor de VB.NET a C# debería ser capaz de traducir el siguiente código sin problemas...

Código
  1. public class DevWebBrowser : inherits webbrowser
  2.  
  3.        ''' ----------------------------------------------------------------------------------------------------
  4.        ''' <summary>
  5.        ''' Navigates to the specified url.
  6.        ''' </summary>
  7.        ''' ----------------------------------------------------------------------------------------------------
  8.        ''' <param name="url">
  9.        ''' The url to navigate.
  10.        ''' </param>
  11.        '''
  12.        ''' <param name="newWindow">
  13.        ''' Indicates whether the url should be open into a new browser window.
  14.        ''' </param>
  15.        '''
  16.        ''' <param name="cookies">
  17.        ''' The cookies to set for the specified url.
  18.        ''' </param>
  19.        ''' ----------------------------------------------------------------------------------------------------
  20.        <DebuggerStepThrough>
  21.        <EditorBrowsable(EditorBrowsableState.Always)>
  22.        Public Overloads Sub Navigate(ByVal url As String, ByVal newWindow As Boolean, ByVal cookies As CookieCollection)
  23.  
  24.            WebUtil.SetCookies(url, False, cookies)
  25.            MyBase.Navigate(url, newWindow)
  26.  
  27.        End Sub
  28.  
  29. end class
  30.  

+

Código
  1. public notinheritable class WebUtil
  2.  
  3. private sub new()
  4. end sub
  5.  
  6. ''' ----------------------------------------------------------------------------------------------------
  7.    ''' <summary>
  8.    ''' Sets one or more cookies for the specified URL.
  9.    ''' </summary>
  10.    ''' ----------------------------------------------------------------------------------------------------
  11.    ''' <param name="url">
  12.    ''' The URL.
  13.    ''' </param>
  14.    '''
  15.    ''' <param name="persistent">
  16.    ''' A value that indicates the cookie persistance.
  17.    ''' <para></para>
  18.    ''' If set to <see langword="True"/> (persistent), the cookie is set in the operating system cache.
  19.    ''' <para></para>
  20.    ''' If set to <see langword="False"/> (non-persistent), the cookie is only set for the life-time of the current process.
  21.    ''' </param>
  22.    '''
  23.    ''' <param name="cookies">
  24.    ''' The cookies to set.
  25.    ''' </param>
  26.    ''' ----------------------------------------------------------------------------------------------------
  27.    <DebuggerStepThrough>
  28.    Public Shared Sub SetCookies(ByVal url As String, ByVal persistent As Boolean, ByVal cookies As CookieCollection)
  29.  
  30.        For Each cookie As Cookie In cookies
  31.            If (persistent) Then
  32.                Dim cookieData As String = $"{cookie.ToString()}; expires = {cookie.Expires.ToUniversalTime().ToString("ddd, dd-MMM-yyyy HH:mm:ss", CultureInfo.InvariantCulture.DateTimeFormat)} GMT"
  33.                If (NativeMethods.InternetSetCookieEx(url, Nothing, cookieData, 0, IntPtr.Zero) = 0) Then
  34.                    Throw New Win32Exception(Marshal.GetLastWin32Error())
  35.                End If
  36.  
  37.            Else
  38.                If (NativeMethods.InternetSetCookieEx(url, cookie.Name, cookie.Value, 0, IntPtr.Zero) = 0) Then
  39.                    Throw New Win32Exception(Marshal.GetLastWin32Error())
  40.                End If
  41.  
  42.            End If
  43.  
  44.        Next cookie
  45.  
  46.    End Sub
  47.  
  48. end class
  49.  

+

Código
  1. friend notinheritable class NativeMethods
  2.  
  3. private sub new()
  4. end sub
  5.  
  6.    ''' ----------------------------------------------------------------------------------------------------
  7.    ''' <summary>
  8.    ''' Creates a cookie with a specified name that is associated with a specified URL.
  9.    ''' <para></para>
  10.    ''' This function differs from the <see cref="NativeMethods.InternetSetCookie"/> function by being able to create third-party cookies
  11.    ''' </summary>
  12.    ''' ----------------------------------------------------------------------------------------------------
  13.    ''' <remarks>
  14.    ''' <see href="https://docs.microsoft.com/en-us/windows/desktop/api/wininet/nf-wininet-internetsetcookiea"/>
  15.    ''' </remarks>
  16.    ''' ----------------------------------------------------------------------------------------------------
  17.    ''' <param name="urlName">
  18.    ''' The URL for which the cookie should be set.
  19.    ''' </param>
  20.    '''
  21.    ''' <param name="cookieName">
  22.    ''' The name to be associated with the cookie data. If this parameter is <see langword="Nothing"/>, no name is associated with the cookie.
  23.    ''' </param>
  24.    '''
  25.    ''' <param name="cookieData">
  26.    ''' Actual data to be associated with the URL.
  27.    ''' </param>
  28.    '''
  29.    ''' <param name="flags">
  30.    ''' Flags that control how the function retrieves cookie data:.
  31.    ''' </param>
  32.    '''
  33.    ''' <param name="reserved">
  34.    ''' <see cref="IntPtr.Zero"/>, or contains a pointer to a Platform-for-Privacy-Protection (P3P) header to be associated with the cookie.
  35.    ''' </param>
  36.    ''' ----------------------------------------------------------------------------------------------------
  37.    ''' <returns>
  38.    ''' Returns a member of the InternetCookieState enumeration if successful, or zero (0) otherwise.
  39.    ''' </returns>
  40.    ''' ----------------------------------------------------------------------------------------------------
  41.    <DllImport("WinINET.dll", SetLastError:=True, CharSet:=CharSet.Auto, BestFitMapping:=False, ThrowOnUnmappableChar:=True)>
  42.    friend Shared Function InternetSetCookieEx(ByVal urlName As String,
  43.                                               ByVal cookieName As String,
  44.                                               ByVal cookieData As String,
  45.                                               ByVal flags As Integer,
  46.                                               ByVal reserved As IntPtr
  47.    ) As <MarshalAs(UnmanagedType.I4)> Integer
  48.    End Function
  49.  
  50. end class

Ejemplo de como usar todo eso:

Código
  1. 'This is a code example that demonstrates how to login to a website,
  2. 'and navigate to the page using the cookie that contains the login data.
  3.  
  4. Dim uri As New Uri("https://foro.elhacker.net/index.php?action=login2", UriKind.Absolute)
  5. Dim cred As New NetworkCredential("USERNAME", "PASSWORD")
  6. Dim query As String = HttpUtility.ParseQueryString($"cookielength=90&amp;user={cred.UserName}&amp;passwrd={cred.Password}").ToString()
  7.  
  8. Using client As New DevWebClient() With {.CookiesEnabled = True}
  9.    client.Headers.Add(HttpRequestHeader.ContentType, "application/x-www-form-urlencoded")
  10.  
  11.    Dim response As String = client.UploadString(uri, "POST", query)
  12.    Console.WriteLine(response)
  13.  
  14.    Dim cookies As CookieCollection = client.CookieContainer.GetCookies(uri)
  15.    DevWebBrowser1.Navigate("https://foro.elhacker.net", cookies)
  16. End Using

...creo que no me faltó por compartir ningún miembro. La clase DevWebClient la compartí en un comentario de la primera página.



EDITO:

He visto muy de reojo los ejemplos que has puesto con la url de foro.elhacker.net, y los nombres de los parámetros están mal. Se llaman "user" y "passwrd" (sin la "o") tal y como puse en mis ejemplos. No "username", ni "usuario", ni "pass" ni "password" ni "clave" ni... en fin. No se hasta que punto entiendes lo que estás haciendo mal.

Saludos.


Título: Re: Llenar campos en pagina web
Publicado por: rigorvzla en 7 Abril 2020, 01:04 am
Hola nuevamente , estoy por aqui , por lo siguiente, ya ha pasado bastante tiempo desde el post y eh logrado y a aprender un poco mas, del uso de esta clase.
tanto asi que ya obtengo el dato que necesito para poder loguearme en esta web, lo que un no se donde sacar o buscar es lo siguiente.

1.-La pagina de login de otras webs, por ejemplo (facebook) por ejemplo
2.-como puedo convertir ese resultado en un "algo" para poder ejecutar como un process, y asi abrirlo en cualquier explorador web (firefox) por ejemplo.

el codigo implementado es este

Código:
  private static readonly HttpClient client = new HttpClient();
        public static async System.Threading.Tasks.Task Main()
        {
            var values = new Dictionary<string, string>
            {
               { "user", "miusuario" },
              { "passwrd", "miclave" }
            };

            var content = new FormUrlEncodedContent(values);

            var response = await client.PostAsync("https://foro.elhacker.net/index.php?action=login2", content);

            var responseString = await response.Content.ReadAsStringAsync();

            responseString = await client.GetStringAsync("https://foro.elhacker.net/index.php?action=login2");

           * Process.Start(responseString); //no sirve

        }

ahora como logre saber que si funciona, de la siguiente manera.
puse un punto de interrupcion en process.start y al llegar ahi, observe los datos del responseString, lo abri o visualice como HTML y WALLA!!! ahi estaba en la pagina logeada mas no se ahora como hacerlo en un explorador web ,externo.

Espero puedan ayudarme con esto y agradezco la ayuda prestada.


Título: Re: Llenar campos en pagina web
Publicado por: ThunderCls en 8 Abril 2020, 03:40 am
observe los datos del responseString, lo abri o visualice como HTML y WALLA!!! ahi estaba en la pagina logeada mas no se ahora como hacerlo en un explorador web ,externo.

Lo que obtienes en el responseString es simplemente el HTML que te ha retornado el servidor, no se que pretendes que suceda al hacer un Proces.Start("HTML"), pero estoy seguro que no es lo que piensas, que imagino sea ejecutar un navegador web con el HTML renderizado. A ver, lo que te explico Eleкtro en su ultimo post es lo que debes hacer si quieres "abrir" dicho html con la sesion iniciada en un navegador dentro de tu aplicacion. Una vez has hecho las peticiones de inicio de sesion y estas dentro necesitas insertar las cookies obtenidas dentro del componente y lanzar la URL, es todo.
Por otra parte si lo que buscas es lanzar una instancia de un navegador externo como firefox o chrome entonces vas a necesitar hacer el mismo procedimiento lo que en este caso no se me ocurre otra opcion para inyectar las cookies que no sea a traves de un WebDriver/Selenium

Saludos