当我试图从我的银行网站解析一些数据时,我遇到了一些困难。基本上,我想每天自动导出我的交易历史记录,但网上银行本身没有任何自动化功能。我目前正在试验如何模拟填写表格和点击进入下载页面并获取可用于解析的 CSV 文件。
我尝试了不同的方法,但没有成功,请引导我到正确的路径。
public static void getNABLogin()
{
try
{
Console.WriteLine("ENTER to begin");
//Console.ReadLine();
System.Net.HttpWebRequest wr = (System.Net.HttpWebRequest)System.Net.WebRequest.Create("https://ib.nab.com.au/nabib/index.jsp");
wr.Timeout = 1000;
wr.Method = "GET";
wr.UserAgent = "Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36";
wr.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8";
wr.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6");
wr.Headers.Add("Accept-Encoding", "gzip,deflate,sdch");
//wr.Connection = "Keep-Alive";
wr.Host = "ib.nab.com.au";
wr.KeepAlive = true;
wr.CookieContainer = new CookieContainer();
//////////This part will get me to the correct login page at least////////////////////
// System.IO.Stream objStreamReceive ;
// System.Text.Encoding objEncoding;
// System.IO.StreamReader objStreamRead;
// WebResponse objResponse;
//string strOutput = string.Empty;
//objResponse = wr.GetResponse();
//objStreamReceive = objResponse.GetResponseStream();
//objEncoding = System.Text.Encoding.GetEncoding("utf-8");
//objStreamRead = new StreamReader(objStreamReceive, objEncoding); // Set function return value
//strOutput = objStreamRead.ReadToEnd();
///////////////////////////////
System.Net.HttpWebResponse wresp = (System.Net.HttpWebResponse)wr.GetResponse();
System.Windows.Forms.WebBrowser wb = new System.Windows.Forms.WebBrowser();
wb.DocumentStream = wresp.GetResponseStream();
wb.ScriptErrorsSuppressed = true;
wb.DocumentCompleted += (sndr, e) =>
{
/////////////After dumping the document text into a text file, I get a different page/////////////////
//////////////I get the normal website instead of login page////////////////////////
System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\temp\\test.txt");
Console.WriteLine(wb.DocumentText);
file.WriteLine(wb.DocumentText);
System.Windows.Forms.HtmlDocument d = wb.Document;
System.Windows.Forms.HtmlElementCollection ctrlCol = d.GetElementsByTagName("script");
foreach (System.Windows.Forms.HtmlElement tag in ctrlCol)
{
tag.SetAttribute("src", string.Format("https://ib.nab.com.au{0}", tag.GetAttribute("src")));
}
ctrlCol = d.GetElementsByTagName("input");
foreach (System.Windows.Forms.HtmlElement tag in ctrlCol)
{
if (tag.GetAttribute("name") == "userid")
{
tag.SetAttribute("value", "123456");
}
else if (tag.GetAttribute("name") == "password")
{
tag.SetAttribute("value", "nabPassword");
}
file.WriteLine(tag.GetAttribute("name"));
}
file.Close();
// object y = wb.Document.InvokeScript("validateLogin");
};
while (wb.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
{
System.Windows.Forms.Application.DoEvents();
}
}
catch(Exception e)
{
System.IO.StreamWriter file = new System.IO.StreamWriter("C:\\temp\\error.txt");
file.WriteLine(e.Message);
Console.WriteLine(string.Format("error: {0}", e.Message));
Console.ReadLine();
}
我从一个线程中调用了这个方法(你可能已经知道 webbrowser 需要是 STA 线程才能工作)。如代码中所述,我使用 httpwebresponse 方法正确获取了登录页面。但是当我尝试使用 documentstream 加载到 webbrowser 时,我到了另一个网站。
下一个问题是,进入登录页面后我接下来应该做什么,如何模拟点击和填写数据(我目前的理论是尝试使用 httpwebrequest 发布一些数据)。
请对此有所了解。非常感谢任何评论或信息。非常感谢您提前。