如何使用 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
我正在尝试获取路由器上已连接设备的列表。我可以手动完成,但我想要一个 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