我正在嘗試創建一個C#Winforms應用程序,該應用程序將自動將我登錄到網站並下載數據。具體來說,我想讓我的應用程序自動登錄到我的網上銀行網站,登錄並下載我的交易記錄。我可以通過Web瀏覽器登錄並下載它來手動執行此操作。我正試圖自動化這一點。我知道我可能需要使用HttpWebRequest和HttpWebResponse。有沒有人有這樣的例子或我需要採取的步驟框架來完成這個?請記住它將是安全的站點(https),我將以某種方式收集會話信息並在會話期間保留會話信息。有什麼想法嗎?以編程方式自動化Web登錄
回答
看一看Selenium,與您可以自動化用戶和瀏覽器之間的交互序列。
雖然很多銀行正在轉向基於JavaScript的登錄表單來混淆密碼以防止木馬,但您可能很幸運能夠使用Web請求和登錄響應。見Citibank (AU)和Westpac (AU)。可能很難規避您可能不得不手動登錄並使GreaseMonkey腳本自動執行下載。
出於利益的考慮,也值得對銀行木馬以及他們如何代表用戶處理自動操作進行研究。請參閱Zeus Banking Trojan。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
namespace testSSL
{
public partial class FormDownload : Form
{
private bool success;
private const string filename = "file.txt";
private const string url_string = "https://some.url.com";
private Uri url;
public FormDownload()
{
InitializeComponent();
success = false;
url = new Uri(url_string);
}
public bool StartDownload()
{
this.ShowDialog();
return success;
}
private void Form1_Load(object sender, EventArgs e)
{
this.Activate();
progressBar1.Maximum = 100;
label1.Text = "Working";
WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(client_DownloadFileCompleted);
//possible fix for running on w2k
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
string user="user", pass="pass";
client.Credentials = new NetworkCredential(user, pass);
try
{
client.DownloadFileAsync(url, filename);
}
catch (Exception ue)
{
writeException(ue.Message);
}
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
writeException(e.Error.Message);
success = false;
}
else
{
label1.Text = "Done";
System.Threading.Thread.Sleep(100);
success = true;
}
this.Close();
}
void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
}
private void writeException(string ex)
{
ex = "Date: " + DateTime.Now.ToString() + " Exception: " + ex + "\r\n";
File.AppendAllText("downloadLog.txt", ex);
MessageBox.Show("An error has occurred; it has been logged");
this.Close();
}
}
}
與代碼很好的接觸。我只是想提一下,這是假設一個特定的登錄機制,而不是一個通用的解決方案。從NetworkCredential文檔http://msdn.microsoft.com/en-us/library/system.net.networkcredential.aspx:「NetworkCredential類是提供基於密碼的身份驗證方案(例如basic,摘要,NTLM和Kerberos。[...]該類不支持基於公共密鑰的身份驗證方法,如安全套接字層(SSL)客戶端身份驗證。「 – Triynko 2010-05-26 22:17:48
那麼,我用它來通過SSL進行通信...... – 2010-05-26 22:46:51
這裏要注意的關鍵是使用WebClient而不是HttpWebRequest和HttpWebResponse。如果Selenium出來了,我寧願WebClient通過HttpWebRequest/Response。 – 2010-05-28 21:52:36
瀏覽器自動化(請參閱下面的鏈接)可能會有用。
但請記住...登錄頁面實際上是一個複雜的客戶端應用程序,能夠形成一個複雜的,甚至加密的Web請求。所以,通過規避你可能認爲只是一個接口,你實際上繞過了整個客戶端應用程序(它可以制定一個簡單的HTTP POST,或者可以執行一些複雜的JavaScript操作,然後連接到Flash播放器,然後直接連接到登錄服務器,但你明白了)。登錄界面(現在可能是一個小應用程序)可以在任何時候大幅更新,使自動登錄軟件失效。
因此,您可能想要使用可以在高級別上自動運行的東西,使用可用的接口(而不是繞過它並嘗試制定自己的HTTP請求),並且類似http://seleniumhq.org/可能會有所幫助。
只要小心編寫軟件,將您的憑證盲目地發送到網頁。當頁面被劫持或者頁面由於某種原因突然未加密時,您不在那裏監控它。只是一個想法。
調查Open Financial Exchange規範。這就是Quicken/Money等從您的金融機構下載交易的方式。
好吧,如果這是不可能連接到一個銀行網站和下載交易程序(我可以向你保證這不是 - 幾乎任何可以由用戶來完成可以有足夠的聰明才智代碼來完成)是如何它存在的iOS應用程序可以做到這一點嗎?我知道,因爲我經常使用這些應用程序之一。此外,我認爲Quickbooks Enterprise能夠做到這一點(但不要在此引用我)。
我能想到的唯一一件事就表明,如果iOS應用程序創建者與所有不同的銀行和信用卡公司達成某種協議,您可能無法做到這一點。不知何故,我懷疑它,但我想這是可能的。
它不是不可能的。它通過Web服務工作。這些網絡服務由銀行創建。假設您在富國銀行有一個賬戶。您可以在手機上下載Wells Fargo銀行應用程序。手機上的應用程序使用其Web服務API與Wells Fargo進行通信。問題是,並非所有銀行都公開他們的API。所以你必須使用Fiddler這樣的東西來試圖弄清楚他們的API是如何工作的。 – Icemanind 2014-07-05 21:17:48
我對這些願望沒有很高的期望。銀行在防止利用方面非常積極,而且他們擁有世界上所有的錢都可以投資。你應該拿起針織什麼的。試圖通過銀行網站安全性會更好地利用你的時間。 ;-) – 2010-05-26 22:07:47
我不是想做非法或破解或任何事情。我只是想將我自己的金融交易下載到我的電腦上,這樣我就可以製作一個跟蹤我的支出的計劃。沒有什麼不同,那麼Microsoft Money或Quicken的功能 – Icemanind 2010-05-26 22:10:16
我並不是暗示你是。我在說銀行不喜歡並且不管意圖如何積極地阻止這種用法。你不會在這裏找到快樂。無論如何,祝你好運。 – 2010-05-26 22:14:44