C#.NET实现网页自动登录的方法

下面我会详细讲解如何使用C#.NET实现网页自动登录的方法。

一、需要用到的工具和技术

  • HttpWebRequest类:C#中提供的Http请求发送类,用于请求Web页面并获取响应数据。
  • CookieContainer类:C#中提供的Cookie容器,用于管理发送和接收的Cookie信息。
  • HtmlAgilityPack类库:第三方类库,用于解析HTML文本,方便我们获取目标页面中的表单信息。

二、实现步骤

1. 获取目标站点的登录表单信息

首先,我们需要分析需要登录的网站的登录表单信息,包括表单的控件名称、控件类型、值等。

我们可以使用浏览器的F12开发者工具来分析目标站点的表单信息。在Network标签下,使用用户名和密码登录后,可以看到一条POST请求。点击进入该请求信息,再进入Headers标签,我们可以在Request Headers中查看到Form Data。

接下来, 我们可以使用HtmlAgilityPack类库来解析HTML代码,获取到目标站点的登录表单信息。示例代码如下:

HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load("https://www.example.com/login.aspx");
HtmlNode form = doc.DocumentNode.SelectSingleNode("//form[@action='/login.aspx']");
string actionUrl = form.Attributes["action"].Value;
string usernameField = form.SelectSingleNode("//input[@name='username']").Attributes["name"].Value;
string passwordField = form.SelectSingleNode("//input[@name='password']").Attributes["name"].Value;

2. 登录并保存Cookie信息

接下来,我们可以使用HttpWebRequest类来发送POST请求,并获取到登录后的Cookie信息。在发送请求时,需要设置请求头部信息,将用户名和密码等信息写入到请求参数中。示例代码如下:

string postData = string.Format("{0}={1}&{2}={3}", usernameField, "your_username", passwordField, "your_password");
byte[] data = Encoding.UTF8.GetBytes(postData);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com" + actionUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (Stream stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    CookieContainer cookieJar = new CookieContainer();
    cookieJar.Add(response.Cookies);

    // do something with the cookies here...
}

在此代码中,我们设置请求的Content-Type为"application/x-www-form-urlencoded",表示请求体的格式为key=value的形式,并将请求参数以字节数组的形式写入到请求流中。接下来,我们可以通过获取到的响应对象来获取到登录后的Cookie信息,并将它们保存在CookieContainer对象中方便后续使用。

3. 发送需要登录的页面请求

最后,我们可以使用保存的Cookie信息,发送需要登录的页面请求,以达到自动登录的目的。发送请求时,需要将CookieContainer对象传递到请求中。示例代码如下:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.example.com/profile.aspx");
request.Method = "GET";
request.CookieContainer = cookieJar;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // do something with the response here...
}

现在,我们已经可以使用C#.NET实现网页自动登录的方法了。

三、示例说明

示例1:使用C#.NET自动登录GitHub

我们以GitHub为例,演示如何使用C#.NET自动登录。

首先,打开GitHub的登录页面,并使用F12开发者工具分析表单控件信息。可以发现,用户名和密码的输入框的name属性值分别为:login、password。

接下来,我们使用下面的代码实现自动登录:

string loginUrl = "https://github.com/login";
string homeUrl = "https://github.com/";
string username = "your_username";
string password = "your_password";

// 获取登录表单信息
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(loginUrl);
HtmlNode form = doc.DocumentNode.SelectSingleNode("//form[contains(@class, 'auth-form')]");

string authenticityToken = form.SelectSingleNode("//input[@name='authenticity_token']")
                            .Attributes["value"].Value;
string timestamp = form.SelectSingleNode("//input[@name='timestamp']")
                            .Attributes["value"].Value;
string timestampSecret = form.SelectSingleNode("//input[@name='timestamp_secret']")
                            .Attributes["value"].Value;
string loginField = form.SelectSingleNode("//input[@name='login']")
                            .Attributes["name"].Value;
string passwordField = form.SelectSingleNode("//input[@name='password']")
                            .Attributes["name"].Value;

// 构造登录POST请求
string postData =
  string.Format("authenticity_token={0}&timestamp={1}&timestamp_secret={2}&login={3}&password={4}",
                authenticityToken, timestamp, timestampSecret, username, password);

byte[] data = Encoding.UTF8.GetBytes(postData);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (Stream stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

// 发送登录请求
CookieContainer cookieJar = new CookieContainer();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    cookieJar.Add(response.Cookies);
}

// 发送需要登录的页面请求
request = (HttpWebRequest)WebRequest.Create(homeUrl);
request.Method = "GET";
request.CookieContainer = cookieJar;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
    // do something with the response here...
}

示例2:使用C#.NET自动登录京东商城

我们以京东商城为例,演示如何使用C#.NET自动登录并获取订单数据。

与示例1相似,我们首先需要使用F12开发者工具分析京东商城登录页面,获取到用户名和密码输入框的name属性值。可以发现,它们的name属性值分别为:loginname和nloginpwd。

接下来,我们使用下面的代码自动登录京东商城,并获取到当前登录用户的订单数据:

string loginUrl = "https://passport.jd.com/new/login.aspx";
string orderUrl = "https://order.jd.com/center/list.action";
string username = "your_username";
string password = "your_password";

// 获取登录表单信息
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(loginUrl);
HtmlNode loginForm = doc.DocumentNode.SelectSingleNode("//form[@name='formlogin']");

string uuid = loginForm.SelectSingleNode("//input[@name='uuid']")
                    .Attributes["value"].Value;
string loginnameField = loginForm.SelectSingleNode("//input[@name='loginname']")
                           .Attributes["name"].Value;
string nloginpwdField = loginForm.SelectSingleNode("//input[@name='nloginpwd']")
                           .Attributes["name"].Value;

// 构造登录POST请求
string postData =
  string.Format("uuid={0}&loginname={1}&nloginpwd={2}&submit=%E7%99%BB%E5%BD%95",
                uuid, username, password);
byte[] data = Encoding.UTF8.GetBytes(postData);

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loginUrl);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;

using (Stream stream = request.GetRequestStream())
{
    stream.Write(data, 0, data.Length);
}

// 发送登录请求
CookieContainer cookieJar = new CookieContainer();
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    cookieJar.Add(response.Cookies);
}

// 发送订单页面请求,获取订单数据
request = (HttpWebRequest)WebRequest.Create(orderUrl);
request.Method = "GET";
request.CookieContainer = cookieJar;

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
    // do something with the response here...
}

这样,我们就成功使用C#.NET实现了京东商城的自动登录,以及获取当前登录用户的订单数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#.NET实现网页自动登录的方法 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • C#实现简单飞行棋小游戏

    首先来讲一下“C#实现简单飞行棋小游戏”的完整攻略。 简介 飞行棋,是一种以飞行为主题的棋类游戏,是一种常见的亲子游戏。游戏规则简单、易于上手,非常适合大众化的群体。 游戏规则 游戏地图共有 100 个格子,分别标记着不同的内容,如酒驾、炸弹、地雷、停机坪、幸福、喜事等等。同时,每个玩家有 4 个棋子,起点和终点不同,各自从起点进入,经过终点,返回起点,先完…

    C# 2023年6月7日
    00
  • C# 实现特殊字符快速转码

    下面是 “C# 实现特殊字符快速转码”的完整攻略。 1. 简介 在我们的开发过程中,经常要用到一些特殊字符如“<”,“>”,“&”等,但是这些字符在 HTML 网页中是有特殊含义的,而我们又不希望这些字符会影响网页的显示。为了解决这一问题,我们可以将这些特殊字符进行转义操作,即将其转化为特定的实体字符,以防止其在 HTML 中的意外转换。…

    C# 2023年5月31日
    00
  • ASP.NET缓存 方法和最佳实践

    当网站面临高并发访问或者数据处理成本太高的时候,ASP.NET缓存就成为了处理这类问题的有效工具。本文将详细讲解ASP.NET缓存的方法和最佳实践,以帮助读者更好的利用ASP.NET缓存提升网站性能。 基础知识 什么是ASP.NET缓存? ASP.NET缓存是一种内存缓存机制,它可以存储和检索各种类型的数据,如数据源、页面输出、分布式应用程序和对象等。使用A…

    C# 2023年6月1日
    00
  • 详解C# Protobuf如何做到0分配内存的序列化

    C# protobuf是Google开发的一种高效的序列化格式。相较于其他序列化方式(比如XML或Json),它所占用的空间更少,同时速度更快,因为它是二进制序列化格式。在进行序列化过程中,内存的分配是一个非常重要的问题,因为大量的内存分配会导致性能下降甚至内存溢出。本文将详细介绍C# protobuf如何实现0分配内存的序列化。 一、使用“MemorySt…

    C# 2023年5月31日
    00
  • Unity报错InvalidOperationException: out of sync的解决

    针对Unity报错InvalidOperationException:outofsync的解决,我们可以采取以下步骤: 步骤1:清理Unity资源和缓存 首先我们可以尝试清理Unity的资源和缓存,方法如下: 关闭Unity编辑器。 在项目文件夹下找到 Library 文件夹,将其删除。 重新启动Unity编辑器,等待它重新构建项目的 Library 文件夹…

    C# 2023年5月14日
    00
  • C#中AutoResetEvent控制线程用法小结

    下面就详细讲解一下C#中AutoResetEvent控制线程用法的完整攻略。 什么是AutoResetEvent? AutoResetEvent是一个同步基元,也是用于多线程编程的一个重要之一,它用于协调多个线程之间的同步。AutoResetEvent主要有两个用途: 线程等待 线程信号 AutoResetEvent是系统提供的,可以定时地向操作系统CPU请…

    C# 2023年6月6日
    00
  • C#语法相比其它语言比较独特的地方(三)

    下面来详细讲解“C#语法相比其它语言比较独特的地方(三)”。 1. Lambda表达式 Lambda表达式是C#语法中相比其它语言比较独特的地方之一。Lambda表达式是一种匿名函数,可以使用简短、清晰的语法编写。它主要用于简化代码,使代码更加易读。以下是一个简单的Lambda表达式的示例: // 普通方式定义函数 delegate int Calculat…

    C# 2023年6月7日
    00
  • ASP.NET两个截取字符串的方法分享

    以下是“ASP.NET两个截取字符串的方法分享”的完整攻略: 1. Substring方法 1.1 简介 Substring方法是.NET Framework框架提供的字符串截取方法之一,可以用于截取字符串中的一部分并返回。 1.2 语法 public string Substring(int startIndex); public string Subst…

    C# 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部