如何使用 C# 应用程序登录到我的路由器

How to login to my router using c# application

我正在尝试获取路由器上已连接设备的列表。我可以手动完成,但我想要一个 c# 应用程序为我完成,这样我就可以自动监控我的网络。

我已经尝试过向包含设备的路由器页面的 URL 发出 WebRequest,代码如下:

string url = @"http://192.168.1.1/ui/dboard/homenet";
WebRequest request = WebRequest.Create(url);
request.Method = "GET";
request.ContentType= "application/x-www-form-urlencoded";
request.Headers["Authorization"] = "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes("admin:admin"));

Stream stream = request.GetResponse().GetResponseStream();
StreamReader reader1 = new StreamReader(stream);
string response = reader1.ReadToEnd();

foreach (string el in response.Split('\n'))
{
    Console.WriteLine(el);
}

但我得到的响应是重定向到路由器的登录页面:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <meta http-equiv="Cache-Control" content="no-cache" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="Expires" content="-1" />
    <link rel="SHORTCUT ICON" href="/images/shortcut.ico" />

    <meta name="viewport" content="width=device-width, initial-scale=1" />

    <title>Residential Gateway - D-Link</title>

    <link rel="stylesheet" href="/css/common.css" />
    <link rel="stylesheet" href="/css/theme.css" />

    <script type="text/javascript" src="/js/jquery.tools.min.js"></script>
    <script type="text/javascript" src="/js/common.js"></script>
    <script type="text/javascript" src="/js/headerMobile.js"></script>
    <script type="text/javascript">detectMobile();</script>

    <link rel='stylesheet' type='text/css' href='/css/login.css'/>
    <link rel='stylesheet' href='/css/custom.css'/>
    <script type='text/javascript'>detectMobile('login_m.css');</script>
    <script type='text/javascript'>detectMobile('custom_m.css');</script>
    <script type='text/javascript' src='/js/hmac-sha256.js'></script>
    <script type='text/javascript' src='/js/md5.js'></script>
    <script type='text/javascript' src='/js/md5_crypt.js'></script>
</head>
<body onresize="resize()" onscroll="resize()" onmouseup="resize()">
<div id="header">

<div id='btnClose'><button type='button' class='close' onclick='link_onclick(this); history.back()'/></div>

<img id="logo" src="/images/logo.png" />
</div>

<!--START content-->
<div id="content">

<form name="form" action="/ui/login" method="post" onsubmit="login_onsubmit();" autocomplete="off">
<div id="loginPanelBox">
<div id="navigationBarMobile">
        <ul>
<li>Login</li>
        </ul>
</div>


<div id="panelLogin" class="panel">
<label class="panel">
Login
</label>
<img class="panel" src="/images/Login16.png" />
<hr class="panel" />

<fieldset class="form">


<div class="formField" id="userName" help_tooltip="off">
        <label for="userName">Nome Utente:</label>
        <input type="text" name="userName" value="" />

</div>

<div class="formField" id="origUserPwd">
        <label for="origUserPwd">Password:</label>
        <div class="passwordField">

<input type="password" autocomplete="off" name="origUserPwd" value="" />

        </div>
</div>

我用 POST 请求得到相同的结果,将用户名和密码设置为凭证,如下所示:

request.Credentials = new NetworkCredential("admin", "admin");

但是,none 有用的结果。 我确定用户名和密码是正确的。

如何才能成功登录并获得我想要的页面? 路由器标签为 D-Link.

感谢 iSR5 建议使用浏览器调试器,帮助很大。

我的问题的核心是对路由器如何管理 Web 请求的理解不完整。 从网页(如登录页面)提示的网络请求由路由器上的 cgi 服务 运行 处理。特别是一个服务直接用http请求调用。

例如,在登录路由器时,单击“登录按钮”会触发对 cgi 服务的调用,在我的情况下(我不知道它是否适用于每个路由器标签)用户名和密码作为 url 个参数传递。浏览器调试器显示精确的 url.

为了避免管理网页,c# 应用程序必须直接向 cgi 服务发出请求。

除此之外,还需要管理 cookie: 成功登录后(连接到 cgi),响应 headers 包含 session cookie,对于 c# 应用程序发出的每个进一步请求,都需要在请求 headers.

中添加这些 cookie